ZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWI0NjE4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkYTY4YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpTVCBFbnRlcnByaXNlIFRlc3RzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SlNUIGVudGVycHJpc2UgdGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MzdmNzYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud3MudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cy5wZXJmb3JtYW5jZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLmF4aXMuY29uc3VtcHRpb24uY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZhYmZiNC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST4KLSAgIAotICA8TEk+Q29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAoQ0RETCkgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sIj5odHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwpPC9BPgotICA8L0xJPgotPC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMmVhNWUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYzk3MTguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpTVCBXZWIgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KU1QgV2ViIHRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLUp1bmUgMDYsIDIwMDdcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi0gICAgLSBDb21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc4OGU3NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4wLjEucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnRlc3RzLmVuY29kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlc3RzLnBlcmZvcm1hbmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamVtLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjQ0NTk4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+Ci0gICAgCi0gIDxMST5Db21tb24gRGV2ZWxvcG1lbnQgYW5kIERpc3RyaWJ1dGlvbiBMaWNlbnNlIChDRERMKSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LnN1bi5jb20vY2RkbC9jZGRsLmh0bWwiPmh0dHA6Ly93d3cuc3VuLmNvbS9jZGRsL2NkZGwuaHRtbCk8L0E+Ci0gIDwvTEk+Ci08L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzdmNDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImphdmF0ZXN0cy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ2bV90ZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0NjNhZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNTk1Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qZW0udGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZDA3NzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBBcHIgMTUgMjE6MTA6MDMgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMmRhZTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0jU2F0IE1hciAzMSAyMzoxNTo0OSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9MTUwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD0xNTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTVlMTM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jVHVlIEZlYiAyMSAxMDowOToxOCBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWZvcm1hdHRlcl9wcm9maWxlPV9qdmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTEwCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPWphdmE7amF2YXg7b3JnO29yZy5lY2xpcHNlLnd0cDtvcmcuZWNsaXBzZS5qZW07b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RtO29yZy5lY2xpcHNlLnZlLmludGVybmFsLmNkZTtvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5qY207b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuamF2YTtvcmcuZWNsaXBzZS52ZTtjb207Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9CZWFuSW5mbyBBbGxTdWl0ZXMgd2l0aCBSZW1vdGUgRGVidWcubGF1bmNoIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL0JlYW5JbmZvIEFsbFN1aXRlcyB3aXRoIFJlbW90ZSBEZWJ1Zy5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZTVjODEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL0JlYW5JbmZvIEFsbFN1aXRlcyB3aXRoIFJlbW90ZSBEZWJ1Zy5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnBkZS51aS5KdW5pdExhdW5jaENvbmZpZyI+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icHJvZHVjdCIgdmFsdWU9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLmlkZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImJvb3RzdHJhcCIgdmFsdWU9IiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VQcm9kdWN0IiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ2bWluc3RhbGwiIHZhbHVlPSJqZGsxLjQuMl8wNSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ0cmFjaW5nIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5DT05UQUlORVIiIHZhbHVlPSIiLz4KLTxtYXBBdHRyaWJ1dGUga2V5PSJ0cmFjaW5nT3B0aW9ucyI+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvY29tcGF0aWJpbGl0eS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9wYXJzaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvaW9jb25zb2xlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS9kZWJ1Zy9zZWFyY2giIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaC9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvZGVidWcvbG9jYXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9maWx0ZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvbW9uaXRvci9idWlsZGVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3BhY2thZ2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvc3VjY2VzcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2RlYnVnL2NvbnRleHQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9tb25pdG9yL2NsYXNzZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2luZGV4bWFuYWdlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvam9icyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL2N2c3Byb3RvY29sIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3VybC9kZWJ1Zy9jYWNoZWNvcHkiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9wcmVmaXhlcy9zdWNjZXNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9yZWdpc3RyeS9kZWJ1Zy9ldmVudHMvcGx1Z2luIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2J1aWxkZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvaGllcmFyY2h5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL21vbml0b3IvbGlzdGVuZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvcHJlZml4ZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS90cmVlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2Uva2V5QmluZGluZ3MudmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0vZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhZGVsdGEvdmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9yZWNvbmNpbGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvbWFzdGVydGFibGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3RpbWluZy9zdGFydHVwIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2NvbnRleHRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvYWN0aXZhdGVwbHVnaW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmRlYnVnL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvc2VsZWN0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9qb2JzL2Vycm9yb25kZWFkbG9jayIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9idWZmZXJtYW5hZ2VyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3dvcmtiZW5jaC5yZXN0b3JlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvZmlsdGVyL25hdGl2ZSIgdmFsdWU9IioiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL3NuYXBzaG90cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jb21waWxlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3RyYWNlL2FjdGl2YXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnVpL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9tZXRhZmlsZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1Zy9pbmZvcG9wIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9yZWdpc3RyeS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdXJsL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvbW9uaXRvcmJ1bmRsZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvdWlqb2IubG9uZ3dhcm5pbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9tZXRhaW5mbyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnL2ludGVybmFsZXJyb3Ivb3BlbkRpYWxvZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhbW9kZWwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1Zy9hbGxUeXBlc0NhY2hlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvZmFpbHVyZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0L2RlYnVnL0NvbnRlbnRBc3Npc3RTdWJqZWN0QWRhcHRlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9ldmVudHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuaW50cm8vdHJhY2UvcHJpbnRIVE1MIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvc2VydmljZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvdHlwZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9yZWdpc3RyeS9kZWJ1Zy9ldmVudHMvZXh0ZW5zaW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvZGVidWcvcGxhdGZvcm1hZG1pbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9kZWx0YSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2NvbmZpZ3VyYXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvcGFydC5hY3RpdmF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL25vdGltZW91dHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1Zy9lbWJlZGRlZEJyb3dzZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YWRlbHRhIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvbWFuaWZlc3QiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9zZWN1cml0eSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9rZXlCaW5kaW5ncyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL21hcmtlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3RpbWluZy9zaHV0ZG93biIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udWkvZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC53ZWJhcHAvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvdmV0aW1ldHJhY2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvcGFydC5jcmVhdGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xpdmV3aW5kb3ciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9jcmVhdGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9zdGFydGxldmVsIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvcHJlZml4ZXMvZmFpbHVyZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS93b3JrYmVuY2guc3RhcnQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvaGFuZGxlcnMudmVyYm9zZS5jb21tYW5kSWQiIHZhbHVlPSIiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmFudC5jb3JlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9kaXJ0eWNhY2hpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9tZXRhaW5mbyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2luc3RhbGxoYW5kbGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvYnVuZGxlVGltZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2ZpbHRlci9sb2FkZXIiIHZhbHVlPSIqIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9uZWVkYnVpbGQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1Zy9lbWJlZGRlZEJyb3dzZXIvaW5wcm9jZXNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvc3luY2luZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvaW52b2tpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9zeW5jY2hhbmdlZXZlbnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvYWN0aW9ucyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pbnRyby90cmFjZS9sb2dJbmZvIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9maWx0ZXIvcmVzb3VyY2UiIHZhbHVlPSIqIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9mYWlsdXJlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3dlYiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZWZyZXNoIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvbG9hZGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvbW9uaXRvci9hY3RpdmF0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2hhbmRsZXJzLnZlcmJvc2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9wYWNrYWdlYWRtaW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvc2VhcmNoIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS9zdHJlYW1zIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvcGFja2FnZWFkbWluL3RpbWluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvam9icy9iZWdpbmVuZCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9pbnN0YWxsIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvZGVidWd2bSIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2hpc3RvcnkiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL3htbHRleHQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3Bvc3RhY3Rpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS90aHJlYWRpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvemlwYWNjZXNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvZGVidWcvcGxhdGZvcm1hZG1pbi9yZXNvbHZlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL21hcmtlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy92bXRyYWNlb3V0IiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnVpL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS90cmVlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3dhcm5pbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2NvbnRlbnR0eXBlcy9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zL3RyYWNlUHJvcGVydHlSZXNvbHZpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3VybC9kZWJ1Zy9jYWNoZWxvb2t1cCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcmVnaXN0cnkvZGVidWcvZHVtcCIgdmFsdWU9IiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UucGRlLmJ1aWxkL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3ByZWZlcmVuY2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvdHJhY2UvY2xhc3NMb2FkaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9qb2JzL3RpbWluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvc3luY2luZm8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS90cmFjZS9maWx0ZXJzIiB2YWx1ZT0idHJhY2UucHJvcGVydGllcyIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJXQVJOSU5HIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9ncmFwaGljcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWcvQVNUUHJvdmlkZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9jb25maWcvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3VybC9kZWJ1Zy9jb25uZWN0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS9yZWZyZXNoam9iIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvcHJvcGVydGllcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9wYXJ0Lmxpc3RlbmVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gvc3NoX3Byb3RvY29sIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS9iYWNrZ3JvdW5kZXZlbnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9qb2JzL2xvY2tzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL25hdHVyZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvY29udGV4dHMudmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL21hc3RlcnRhYmxlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9wcmVmZXJlbmNlcy9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9wZXJzcGVjdGl2ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1Zy9qb2Iuc3RhbGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY3ByZXNvbHV0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvc25hcHNob3RzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2hhbmRsZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NvbXBsZXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9tb25pdG9yL3Jlc291cmNlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcC9kZWJ1Zy93b3JraW5nc2V0cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pbnRyby9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9kZWJ1Zy9wbHVnaW5zdG9wcGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvY29udmVydGVyL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAvZGVidWcvY29udGV4dCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcmVnaXN0cnkvZGVidWcvcmVzb2x2ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3RyYWNlL2ZpbGVuYW1lIiB2YWx1ZT0icnVudGltZS50cmFjZXMiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQvZGVidWcvQW5ub3RhdGlvblBhaW50ZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC9kZWJ1Zy9wcm90b2NvbHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9maWx0ZXIvY2xhc3MiIHZhbHVlPSIqIi8+Ci08L21hcEF0dHJpYnV0ZT4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJzZWxlY3RlZFBsdWdpbiIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS5wcm94eSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuS0VFUFJVTk5JTkdfQVRUUiIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS5wcm94eSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImFwcGxpY2F0aW9uIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLmp1bml0LnJ1bnRpbWUuY29yZXRlc3RhcHBsaWNhdGlvbiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhcndzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuTUFJTl9UWVBFIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLkJlYW5JbmZvU3VpdGUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJsb2NhdGlvbjEiIHZhbHVlPSJEOlxydW50aW1lLWp1bml0LXRlc3Qtd29ya3NwYWNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHQiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idm1hcmdzIiB2YWx1ZT0iIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icHJvZ2FyZ3MiIHZhbHVlPSItb3Mgd2luMzIgLXdzIHdpbjMyIC1hcmNoIHg4NiAtbmwgZW5fVVMiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuVEVTVE5BTUUiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS50ZXN0cyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhc2tjbGVhciIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJsb2NhdGlvbjAiIHZhbHVlPSJEOlxydW50aW1lLWp1bml0LXRlc3Qtd29ya3NwYWNlIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvQmVhbkluZm8gQWxsU3VpdGVzLmxhdW5jaCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9CZWFuSW5mbyBBbGxTdWl0ZXMubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDg3YThjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9CZWFuSW5mbyBBbGxTdWl0ZXMubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuSnVuaXRMYXVuY2hDb25maWciPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2R1Y3QiIHZhbHVlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5pZGUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlUHJvZHVjdCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idm1pbnN0YWxsIiB2YWx1ZT0iSjlfMTQyXzIwMDQwOTI2Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LkNPTlRBSU5FUiIgdmFsdWU9IiIvPgotPG1hcEF0dHJpYnV0ZSBrZXk9InRyYWNpbmdPcHRpb25zIj4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9jb21wYXRpYmlsaXR5L2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3BhcnNpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC5iYXNlL2RlYnVnL3NlYXJjaCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL2lvY29uc29sZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLnVpL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9kZWJ1Zy9sb2NhdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL2ZpbHRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9tb25pdG9yL2J1aWxkZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvcGFja2FnZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9zdWNjZXNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvZGVidWcvY29udGV4dCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL21vbml0b3IvY2xhc3NlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9pbmRleG1hbmFnZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9qb2JzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvY3ZzcHJvdG9jb2wiIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdXJsL2RlYnVnL2NhY2hlY29weSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL3ByZWZpeGVzL3N1Y2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3JlZ2lzdHJ5L2RlYnVnL2V2ZW50cy9wbHVnaW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvYnVpbGRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9oaWVyYXJjaHkiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9wcmVmaXhlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9tb25pdG9yL2xpc3RlbmVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL3RyZWUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2Uva2V5QmluZGluZ3MudmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3JlY29uY2lsZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YWRlbHRhL3ZlcmJvc2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9tYXN0ZXJ0YWJsZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdGltaW5nL3N0YXJ0dXAiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvY29udGV4dHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmRlYnVnL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9hY3RpdmF0ZXBsdWdpbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zZWxlY3Rpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2pvYnMvZXJyb3JvbmRlYWRsb2NrIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2J1ZmZlcm1hbmFnZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2Uvd29ya2JlbmNoLnJlc3RvcmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9maWx0ZXIvbmF0aXZlIiB2YWx1ZT0iKiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvc25hcHNob3RzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NvbXBpbGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51aS9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvdHJhY2UvYWN0aXZhdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL21ldGFmaWxlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLnVpL2RlYnVnL2luZm9wb3AiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3JlZ2lzdHJ5L2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9tb25pdG9yYnVuZGxlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1Zy91aWpvYi5sb25nd2FybmluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL21ldGFpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvaW50ZXJuYWxlcnJvci9vcGVuRGlhbG9nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhbW9kZWwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1Zy9hbGxUeXBlc0NhY2hlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9mYWlsdXJlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQvZGVidWcvQ29udGVudEFzc2lzdFN1YmplY3RBZGFwdGVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pbnRyby90cmFjZS9wcmludEhUTUwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9ldmVudHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9zZXJ2aWNlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy90eXBlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC5iYXNlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3JlZ2lzdHJ5L2RlYnVnL2V2ZW50cy9leHRlbnNpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9kZWJ1Zy9wbGF0Zm9ybWFkbWluIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL2RlbHRhIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvY29uZmlndXJhdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9wYXJ0LmFjdGl2YXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvbm90aW1lb3V0cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLnVpL2RlYnVnL2VtYmVkZGVkQnJvd3NlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhZGVsdGEiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9tYW5pZmVzdCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9rZXlCaW5kaW5ncyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3NlY3VyaXR5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvbWFya2VycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdGltaW5nL3NodXRkb3duIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAud2ViYXBwL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL3ZldGltZXRyYWNlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51aS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9wYXJ0LmNyZWF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvbGl2ZXdpbmRvdyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2NyZWF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3N0YXJ0bGV2ZWwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9wcmVmaXhlcy9mYWlsdXJlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3dvcmtiZW5jaC5zdGFydCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9oYW5kbGVycy52ZXJib3NlLmNvbW1hbmRJZCIgdmFsdWU9IiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuYW50LmNvcmUvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL2RpcnR5Y2FjaGluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL21ldGFpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvaW5zdGFsbGhhbmRsZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9idW5kbGVUaW1lIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvZmlsdGVyL2xvYWRlciIgdmFsdWU9IioiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL25lZWRidWlsZCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL3N5bmNpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAudWkvZGVidWcvZW1iZWRkZWRCcm93c2VyL2lucHJvY2VzcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9pbnZva2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL3N5bmNjaGFuZ2VldmVudHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9hY3Rpb25zIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmludHJvL3RyYWNlL2xvZ0luZm8iIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2ZpbHRlci9yZXNvdXJjZSIgdmFsdWU9IioiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3dlYiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9mYWlsdXJlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3JlZnJlc2giIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9sb2FkZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9tb25pdG9yL2FjdGl2YXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvaGFuZGxlcnMudmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3BhY2thZ2VhZG1pbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zZWFyY2giIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL3N0cmVhbXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2pvYnMvYmVnaW5lbmQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9wYWNrYWdlYWRtaW4vdGltaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2luc3RhbGwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy9kZWJ1Z3ZtIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2hpc3RvcnkiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL3htbHRleHQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvdGhyZWFkaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3Bvc3RhY3Rpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvemlwYWNjZXNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvbWFya2VycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnL3BsYXRmb3JtYWRtaW4vcmVzb2x2ZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy92bXRyYWNlb3V0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51aS9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvdHJlZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy93YXJuaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9jb250ZW50dHlwZXMvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy90cmFjZVByb3BlcnR5UmVzb2x2aW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWcvY2FjaGVsb29rdXAiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3JlZ2lzdHJ5L2RlYnVnL2R1bXAiIHZhbHVlPSIiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnBkZS5idWlsZC9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9wcmVmZXJlbmNlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3RyYWNlL2NsYXNzTG9hZGluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvam9icy90aW1pbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL3N5bmNpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvdHJhY2UvZmlsdGVycyIgdmFsdWU9InRyYWNlLnByb3BlcnRpZXMiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iV0FSTklORyIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvZ3JhcGhpY3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL2RlYnVnL0FTVFByb3ZpZGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvY29uZmlnL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWcvY29ubmVjdCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUvcmVmcmVzaGpvYiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL3Byb3BlcnRpZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvcGFydC5saXN0ZW5lcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoL3NzaF9wcm90b2NvbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUvYmFja2dyb3VuZGV2ZW50cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvam9icy9sb2NrcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9uYXR1cmVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2NvbnRleHRzLnZlcmJvc2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9tYXN0ZXJ0YWJsZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcHJlZmVyZW5jZXMvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvcGVyc3BlY3RpdmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvam9iLnN0YWxlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NwcmVzb2x1dGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL3NuYXBzaG90cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9oYW5kbGVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jb21wbGV0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvbW9uaXRvci9yZXNvdXJjZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC53ZWJhcHAvZGVidWcvd29ya2luZ3NldHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuaW50cm8vZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvZGVidWcvcGx1Z2luc3RvcHBlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2NvbnZlcnRlci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwL2RlYnVnL2NvbnRleHQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3JlZ2lzdHJ5L2RlYnVnL3Jlc29sdmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS90cmFjZS9maWxlbmFtZSIgdmFsdWU9InJ1bnRpbWUudHJhY2VzIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0L2RlYnVnL0Fubm90YXRpb25QYWludGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAvZGVidWcvcHJvdG9jb2xzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvZmlsdGVyL2NsYXNzIiB2YWx1ZT0iKiIvPgotPC9tYXBBdHRyaWJ1dGU+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ic2VsZWN0ZWRQbHVnaW4iIHZhbHVlPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LktFRVBSVU5OSU5HX0FUVFIiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNoZWNrZWQiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJhcHBsaWNhdGlvbiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS5qdW5pdC5ydW50aW1lLmNvcmV0ZXN0YXBwbGljYXRpb24iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJ3cyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLk1BSU5fVFlQRSIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5CZWFuSW5mb1N1aXRlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ibG9jYXRpb24xIiB2YWx1ZT0iRDpccnVudGltZS1qdW5pdC10ZXN0LXdvcmtzcGFjZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0IiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InZtYXJncyIgdmFsdWU9IiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2dhcmdzIiB2YWx1ZT0iLW9zIHdpbjMyIC13cyB3aW4zMiAtYXJjaCB4ODYgLW5sIGVuX1VTIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWciIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LlRFU1ROQU1FIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9KRUNUX0FUVFIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZW0udGVzdHMiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXNrY2xlYXIiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ibG9jYXRpb24wIiB2YWx1ZT0iRDpccnVudGltZS1qdW5pdC10ZXN0LXdvcmtzcGFjZSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL0phdmEgQWxsU3VpdGVzIHdpdGggUmVtb3RlIERlYnVnLmxhdW5jaCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9KYXZhIEFsbFN1aXRlcyB3aXRoIFJlbW90ZSBEZWJ1Zy5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDZjNTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL0phdmEgQWxsU3VpdGVzIHdpdGggUmVtb3RlIERlYnVnLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkp1bml0TGF1bmNoQ29uZmlnIj4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwcm9kdWN0IiB2YWx1ZT0ib3JnLmVjbGlwc2UucGxhdGZvcm0uaWRlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZVByb2R1Y3QiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ0cmFjaW5nIiB2YWx1ZT0idHJ1ZSIvPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9UWVBFUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSI0Ii8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LkNPTlRBSU5FUiIgdmFsdWU9IiIvPgotPG1hcEF0dHJpYnV0ZSBrZXk9InRyYWNpbmdPcHRpb25zIj4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvc3luY2NoYW5nZWV2ZW50cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5L2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy90cmFjZWV4cHJlc3Npb25zdGltZXRocmVzaG9sZCIgdmFsdWU9IjEwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcGVyZi9saXN0ZW5lcnMiIHZhbHVlPSI1MDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL25lZWRidWlsZCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS9kZWJ1Zy92aWV3ZXJzL3ZpZXdlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvbW9uaXRvci9hY3RpdmF0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9wZXJmL2NvbnRlbnRfYXNzaXN0L2V4dGVuc2lvbnMiIHZhbHVlPSIxMDAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pZGUvZGVidWcvZ2MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvY29udGVudHR5cGUvY2FjaGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvc2hvd1N5c3RlbUpvYnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy92bXRyYWNlb3V0IiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5qb2JzL2pvYnMvc2h1dGRvd24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3VybC9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL21vbml0b3IvY2xhc3NlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzL2dldCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9kZWJ1Zy9jb250ZXh0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUuam9icy9qb2JzL2xvY2tzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnL3N3dGRlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFtb2RlbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pbnRyby51bml2ZXJzYWwvdHJhY2UvbG9nSW5mbyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmludHJvL3RyYWNlL3ByaW50SFRNTCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5L2RlYnVnL2V2ZW50cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhZGVsdGEvdmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvdHJhY2VQcm9wZXJ0eVJlc29sdmluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy9wZXJmL3BhcnRpY2lwYW50cy9jaGVja0NvbmRpdGlvbnMiIHZhbHVlPSIzMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvcGVyZi9wZXJzcGVjdGl2ZS5saXN0ZW5lcnMiIHZhbHVlPSIyMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL3BlcmYvY29udGFpbmVyaW5pdGlhbGl6ZXIiIHZhbHVlPSI1MDAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3RyYWNlL2ZpbGVuYW1lIiB2YWx1ZT0icnVudGltZS50cmFjZXMiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3dlYiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvdHJhY2UvYWN0aXZhdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9wZXJmL3BlcnNwZWN0aXZlLnN3aXRjaCIgdmFsdWU9IjgwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvcGVyZi9wYXJ0LmlucHV0IiB2YWx1ZT0iMjAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0L2RlYnVnL0Fubm90YXRpb25QYWludGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcmVzb2x2ZXIvaW1wb3J0cyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3RyYWNlL2ZpbHRlcnMiIHZhbHVlPSJ0cmFjZS5wcm9wZXJ0aWVzIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnL3BsYXRmb3JtYWRtaW4vcmVzb2x2ZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1Zy9pbmZvcG9wIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51aS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzL2dlbmVyYWwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL3RocmVhZGluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvcGVyZi9zZWFyY2gvcGFydGljaXBhbnRzIiB2YWx1ZT0iMzAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9wZXJmL3BhcnQubGlzdGVuZXJzIiB2YWx1ZT0iMjAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3Jlc29sdmVyL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2luc3RhbGwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1Zy9lbWJlZGRlZEJyb3dzZXIvaW5wcm9jZXNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcHJvZmlsZS9pbXBsIiB2YWx1ZT0ib3JnLmVjbGlwc2Uub3NnaS5wcm9maWxlLkRlZmF1bHRQcm9maWxlTG9nZ2VyIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9wZXJmL3BhcnQuY29udHJvbCIgdmFsdWU9IjgwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9wcm9maWxlL2JlbmNobWFyayIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL2N2c3Byb3RvY29sIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvcG9zdGFjdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL25vdGltZW91dHMiIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL21hbmlmZXN0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL3BlcmYvc2VsZWN0aW9uIiB2YWx1ZT0iMzAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwL2RlYnVnL2NvbnRleHQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL3BlcmYvY29udGVudF9hc3Npc3Rfc29ydGVycy9leHRlbnNpb25zIiB2YWx1ZT0iIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9idWlsZGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcmVzb2x2ZXIvcmVxdWlyZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2hhbmRsZXJzLnZlcmJvc2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xpdmV3aW5kb3ciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvaW5zdGFsbGhhbmRsZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9zdGFydGxldmVsIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFkZWx0YSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9wcmVmZXJlbmNlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL3RyZWUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC9kZWJ1Zy9wcm90b2NvbHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcGVyZi9zYXZlLnBhcnRpY2lwYW50cyIgdmFsdWU9IjUwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvbmF0dXJlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UvZGVidWcvc2VhcmNoIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVmYXVsdHByb2ZpbGUvYnVmZmVyc2l6ZSIgdmFsdWU9IjI1NiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci9jeWNsZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvcGVyZi92YXJpYWJsZWluaXRpYWxpemVyIiB2YWx1ZT0iNTAwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkvZGVidWcvdmlld2Vycy9tb2RlbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9rZXlCaW5kaW5ncy52ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9wZXJmL3N1Y2Nlc3MiIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9jb250ZXh0cy5wZXJmb3JtYW5jZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvY29tcGF0aWJpbGl0eS9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1Zy9kZWNsYXJlZEltYWdlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5wZGUuYnVpbGQvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvZGVidWcvbG9jYXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvY29udGV4dHMudmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9saXN0ZW5lcnMvSVdvcmtiZW5jaFBhZ2UuSVBhcnRMaXN0ZW5lciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLmpvYnMvam9icyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9wZXJmL3BlcnNwZWN0aXZlLmNyZWF0ZSIgdmFsdWU9IjgwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2Uvc291cmNlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zdHJpbmdzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2xpc3RlbmVycy9JV29ya2JlbmNoUGFydFJlZmVyZW5jZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL21ldGFpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3BlcmYvcGFydC5hY3RpdmF0ZSIgdmFsdWU9IjIwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuaW50cm8udW5pdmVyc2FsL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3BlcmYiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvY29udGVudHR5cGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvY29udHJpYnV0aW9ucyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1Zy9qb2Iuc3RhbGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NvbXBsZXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvcGVyZi93b3JrYmVuY2guc3RhcnQiIHZhbHVlPSI0NTAwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9saXN0ZW5lcnMvSVdvcmtiZW5jaFdpbmRvdy5JUGFydExpc3RlbmVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2luZGV4bWFuYWdlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9saXN0ZW5lcnMvSVdvcmtiZW5jaFdpbmRvdy5JUGVyc3BlY3RpdmVMaXN0ZW5lciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL2xvYWRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWZhdWx0cHJvZmlsZS9sb2dzeW5jaHJvbm91c2x5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvdHJhY2UvY2xhc3NMb2FkaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQvZGVidWcvRmFzdFBhcnRpdGlvbmVyL1Bvc2l0aW9uQ2FjaGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvaGFuZGxlcnMucGVyZm9ybWFuY2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2hhbmRsZXJzLnZlcmJvc2UuY29tbWFuZElkIiB2YWx1ZT0iIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL2ZpbHRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWcvQVNUUHJvdmlkZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL3htbHRleHQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuY2RlL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC53ZWJhcHAvZGVidWcvd29ya2luZ3NldHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWZhdWx0cHJvZmlsZS9sb2dmaWxlbmFtZSIgdmFsdWU9IiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3VybC9kZWJ1Zy9jb25uZWN0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQvZGVidWcvQ29udGVudEFzc2lzdFN1YmplY3RBZGFwdGVycyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL21hcmtlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvZ3JhcGhpY3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvcmVzb2x1dGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gvc3NoX3Byb3RvY29sIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3BlcmYvc25hcHNob3QiIHZhbHVlPSI1MDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3BlcmYvcGFydC5pbml0IiB2YWx1ZT0iODAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pbnRyby90cmFjZS9sb2dQZXJmb3JtYW5jZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2NvbnZlcnRlci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9wZXJmL3BhcnQuY3JlYXRlIiB2YWx1ZT0iODAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnL3BsYXRmb3JtYWRtaW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC51aS9kZWJ1Zy9lbWJlZGRlZEJyb3dzZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcy9zZXQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL3N0cmVhbXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2Uva2V5QmluZGluZ3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvc3RhY2t0cmFjZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWcvVHlwZUNvbnN0cmFpbnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmNkZS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLmpvYnMvam9icy9iZWdpbmVuZCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9pbnRlcnJ1cHQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvcGVyZi9zaG93SGVhcFN0YXR1cyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3BlcmYvY29udGVudFR5cGVzIiB2YWx1ZT0iMjAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9jb21tYW5kcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9kZWx0YSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zZWFyY2giIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvcGVyZi9jb21wbGV0aW9uIiB2YWx1ZT0iMzAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9jb21waWxlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9qYXZhbW9kZWwvY2FjaGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvY29uZmlndXJhdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvY2xpcGJvYXJkdGV4dCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL21lc3NhZ2VCdW5kbGVzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS5tYW5pcHVsYXRpb24vZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9saXN0ZW5lcnMvSVdvcmtiZW5jaFdpbmRvdy5JUGFydExpc3RlbmVyMiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9saXN0ZW5lcnMvSVdvcmtiZW5jaFBhZ2UuSVBhcnRMaXN0ZW5lcjIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnVpL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvcGVyZi9yZWNvbmNpbGUiIHZhbHVlPSIxMDAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcC9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2hpZXJhcmNoeSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZWZyZXNoIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS9iYWNrZ3JvdW5kZXZlbnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nL3BlcmYvcGFydGljaXBhbnRzL2NyZWF0ZUNoYW5nZXMiIHZhbHVlPSIzMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NwcmVzb2x1dGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy93YXJuaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuY2RlL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3BhcnNpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL3BlcmYvZXhwbG9yZXIvbWFrZUFjdGlvbnMiIHZhbHVlPSIxMDAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL3N5bmNpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2xpc3RlbmVycy9JV29ya2JlbmNoV2luZG93LklQYWdlTGlzdGVuZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL3RocmVhZGluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdXJsL2RlYnVnL2NhY2hlbG9va3VwIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3JlY29uY2lsZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L2RlYnVnL3RyYWNlZXhwcmVzc2lvbnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9zZWN1cml0eSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL2RlYnVndm0iIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL3N5bmNpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcHJvZmlsZS9zdGFydHVwIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvc2VydmljZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9tYXJrZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9wcmVmZXJlbmNlcy9wbHVnaW4iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9tb25pdG9yL3Jlc291cmNlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvcmVtb3RlL2RlYnVnL2lvY29uc29sZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvdmV0aW1ldHJhY2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnVpL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5qb2JzL2pvYnMvdGltaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3NlbGVjdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWcvUmVzdWx0Q29sbGVjdG9yIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvc25hcHNob3RzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9wZXJmL2V4cGxvcmVyL2NyZWF0ZVBhcnRDb250cm9sIiB2YWx1ZT0iMTMwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9kaXJ0eWNhY2hpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvemlwYWNjZXNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnBkZS5jb3JlL2NhY2hlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS91cmwvZGVidWcvY2FjaGVjb3B5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvYnVuZGxlVGltZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9vcGVyYXRpb25zLnZlcmJvc2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9tZXRhZmlsZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3BlcmYvd29ya2JlbmNoLnJlc3RvcmUiIHZhbHVlPSIzMDAwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9ldmVudHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9tb25pdG9yYnVuZGxlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLmpvYnMvam9icy9lcnJvcm9uZGVhZGxvY2siIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuaWRlL2RlYnVnL2ludGVybmFsZXJyb3Ivb3BlbkRpYWxvZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pbnRyby51bml2ZXJzYWwvdHJhY2UvbG9nUGVyZm9ybWFuY2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvcGVyZi91aWpvYiIgdmFsdWU9IjIwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvc291cmNlbWFwcGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpL2RlYnVnL3ZpZXdlcnMvZGVsdGFzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcmVzb2x2ZXIvZ2VuZXJpY3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci93aXJpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvcGVyZi9qYXZhZGVsdGFsaXN0ZW5lciIgdmFsdWU9IjUwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9wcm9maWxlL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2NvbnRleHRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvaW52b2tpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnV0aWwvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJXQVJOSU5HIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9wZXJmL2J1aWxkZXJzIiB2YWx1ZT0iMTAwMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3R5cGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2Uvb3BlcmF0aW9ucyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9wZXJmL3BhZ2UubGlzdGVuZXJzIiB2YWx1ZT0iMjAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvcGVyZi9leHBsb3Jlci9SZWZhY3RvckFjdGlvbkdyb3VwIiB2YWx1ZT0iMTUwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9oaXN0b3J5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS9yZWZyZXNoam9iIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmludHJvL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS9kZWJ1Zy9SZXZpc2lvblJ1bGVyQ29sdW1uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvcGFja2FnZWFkbWluIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL2ZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvaGFuZGxlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvbGlzdGVuZXJzL0lXb3JrYmVuY2hQYWdlLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXIvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS90cmVlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAudWkvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZXN0b3JlL21ldGFpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvbWFzdGVydGFibGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UucGRlLmNvcmUvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9idWZmZXJtYW5hZ2VyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcmVzb2x2ZXIvZ3JvdXBpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuaWRlL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2Zvcm1hdHRlci9lbmFibGVfbmV3IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvbWFzdGVydGFibGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuaW50cm8vdHJhY2UvbG9nSW5mbyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9leHBlcmltZW50YWwvbWVudXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UucGRlLmNvcmUvY2xhc3NwYXRoIiB2YWx1ZT0iZmFsc2UiLz4KLTwvbWFwQXR0cmlidXRlPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ic2VsZWN0ZWRQbHVnaW4iIHZhbHVlPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LktFRVBSVU5OSU5HX0FUVFIiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ibG9jYXRpb24iIHZhbHVlPSJEOlxydW50aW1lLWp1bml0LXRlc3Qtd29ya3NwYWNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYXBwbGljYXRpb24iIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUuanVuaXQucnVudGltZS5jb3JldGVzdGFwcGxpY2F0aW9uIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJ3cyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLk1BSU5fVFlQRSIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5BbGxTdWl0ZXMiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJsb2NhdGlvbjEiIHZhbHVlPSJEOlxydW50aW1lLWp1bml0LXRlc3Qtd29ya3NwYWNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icGRlLnZlcnNpb24iIHZhbHVlPSIzLjJhIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9HUkFNX0FSR1VNRU5UUyIgdmFsdWU9Ii1vcyB3aW4zMiAtd3Mgd2luMzIgLWFyY2ggeDg2IC1ubCBlbl9VUyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0IiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuVEVTVE5BTUUiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS50ZXN0cyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhc2tjbGVhciIgdmFsdWU9InRydWUiLz4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfUEFUSFMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iL29yZy5lY2xpcHNlLmplbS50ZXN0cyIvPgotPC9saXN0QXR0cmlidXRlPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LlRFU1RfS0lORCIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5sb2FkZXIuanVuaXQzIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvSmF2YSBBbGxTdWl0ZXMubGF1bmNoIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL0phdmEgQWxsU3VpdGVzLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5Njc5MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvSmF2YSBBbGxTdWl0ZXMubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuSnVuaXRMYXVuY2hDb25maWciPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2R1Y3QiIHZhbHVlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5pZGUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlUHJvZHVjdCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJ0cnVlIi8+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1RZUEVTIj4KLTxsaXN0RW50cnkgdmFsdWU9IjQiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuQ09OVEFJTkVSIiB2YWx1ZT0iIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBBdHRyaWJ1dGUga2V5PSJ0cmFjaW5nT3B0aW9ucyI+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL3N5bmNjaGFuZ2VldmVudHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL3htbHRleHQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC53ZWJhcHAvZGVidWcvd29ya2luZ3NldHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWZhdWx0cHJvZmlsZS9sb2dmaWxlbmFtZSIgdmFsdWU9IiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9maWx0ZXIvbG9hZGVyIiB2YWx1ZT0iKiIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9hY3Rpb25zIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy90cmFjZWV4cHJlc3Npb25zdGltZXRocmVzaG9sZCIgdmFsdWU9IjEwMCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamZhY2UudGV4dC9kZWJ1Zy9Db250ZW50QXNzaXN0U3ViamVjdEFkYXB0ZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3BlcmYvbGlzdGVuZXJzIiB2YWx1ZT0iNTAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdXJsL2RlYnVnL2Nvbm5lY3QiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9tYXJrZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL25lZWRidWlsZCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2d0cmFjZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9ncmFwaGljcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9yZXNvbHV0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoL3NzaF9wcm90b2NvbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9wZXJmL3NuYXBzaG90IiB2YWx1ZT0iNTAwIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL21vbml0b3IvYWN0aXZhdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcmVnaXN0cnkvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9wYWNrYWdlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS9kZWJ1Zy9zaG93U3lzdGVtSm9icyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvcHJlZml4ZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy92bXRyYWNlb3V0IiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3VybC9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL21vbml0b3IvY2xhc3NlcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9kZWJ1Zy9jb250ZXh0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvY29udmVydGVyL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZWNsaXBzZWFkYXB0b3IvZGVidWcvcGxhdGZvcm1hZG1pbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLnVpL2RlYnVnL2VtYmVkZGVkQnJvd3NlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcHJlZmVyZW5jZXMvc2V0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnL3N3dGRlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFtb2RlbCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUvc3RyZWFtcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvam9icy9sb2NrcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9rZXlCaW5kaW5ncyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pbnRyby90cmFjZS9wcmludEhUTUwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3JlZ2lzdHJ5L2RlYnVnL2R1bXAiIHZhbHVlPSIiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC51aS9kZWJ1Zy9UeXBlQ29uc3RyYWludHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvamF2YWRlbHRhL3ZlcmJvc2UiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zL3RyYWNlUHJvcGVydHlSZXNvbHZpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3RyYWNlL2ZpbGVuYW1lIiB2YWx1ZT0icnVudGltZS50cmFjZXMiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3dlYiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcmVnaXN0cnkvZGVidWcvcmVzb2x2ZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL2J1aWxkL2RlbHRhIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvdHJhY2UvYWN0aXZhdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zZWFyY2giIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL2RlYnVnL2NoZWNrQ29yZUJpbmRpbmdJc0VxdWFsVG8iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xvZ3RyYWNlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY29tcGlsZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamZhY2UudGV4dC9kZWJ1Zy9Bbm5vdGF0aW9uUGFpbnRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWciIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcmVnaXN0cnkvZGVidWcvZXZlbnRzL3BsdWdpbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8vZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9jb25maWd1cmF0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3BhcnQuYWN0aXZhdGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci9pbXBvcnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAudWkvZGVidWcvaW5mb3BvcCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3RyYWNlL2ZpbHRlcnMiIHZhbHVlPSJ0cmFjZS5wcm9wZXJ0aWVzIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2VjbGlwc2VhZGFwdG9yL2RlYnVnL3BsYXRmb3JtYWRtaW4vcmVzb2x2ZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLmJlYW5pbmZvL2RlYnVnL2xvZ3RyYWNlZmlsZSIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9yZWdpc3RyeS9kZWJ1Zy9ldmVudHMvZXh0ZW5zaW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51aS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udWkvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcC9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2hpZXJhcmNoeSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9yZWZyZXNoIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jb3JlL2JhY2tncm91bmRldmVudHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvY3ByZXNvbHV0aW9uIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUvdGhyZWFkaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3dhcm5pbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2luc3RhbGwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvZGVidWcvaW50ZXJuYWxlcnJvci9vcGVuRGlhbG9nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9qb2JzL2Vycm9yb25kZWFkbG9jayIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLnVpL2RlYnVnL2VtYmVkZGVkQnJvd3Nlci9pbnByb2Nlc3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9wcm9maWxlL2ltcGwiIHZhbHVlPSJvcmcuZWNsaXBzZS5vc2dpLnByb2ZpbGUuRGVmYXVsdFByb2ZpbGVMb2dnZXIiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3Byb2ZpbGUvYmVuY2htYXJrIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3BhcnNpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3ByZWZlcmVuY2VzL2dlbmVyYWwiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9zeW5jaW5mbyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL2N2c3Byb3RvY29sIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LmNvcmUvZGVidWcvcG9zdGFjdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9wZXJzcGVjdGl2ZS5saXN0ZW5lcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamVtLnByb3h5L3JlbW90ZS9kZWJ1Zy9ub3RpbWVvdXRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnRlYW0uY29yZS90aHJlYWRpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3VybC9kZWJ1Zy9jYWNoZWxvb2t1cCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3BhY2thZ2VhZG1pbi90aW1pbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvcmVjb25jaWxlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3NlY3VyaXR5IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9kZWJ1Zy90cmFjZWV4cHJlc3Npb25zIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvZGVidWd2bSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL21hbmlmZXN0IiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAvZGVidWcvY29udGV4dCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9idWlsZGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcmVzb2x2ZXIvcmVxdWlyZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvc2F2ZS9zeW5jaW5mbyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS52ZS5qYXZhLmNvcmUvZGVidWcvbG9nbGV2ZWwiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2ZpbHRlci9yZXNvdXJjZSIgdmFsdWU9IioiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvcHJvZmlsZS9zdGFydHVwIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvc2VydmljZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9hY3RpdmF0ZXBsdWdpbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvaGFuZGxlcnMudmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL21hcmtlcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL2xpdmV3aW5kb3ciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvaW5zdGFsbGhhbmRsZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9zdGFydGxldmVsIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS5wcm94eS9yZW1vdGUvZGVidWcvaW9jb25zb2xlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvbW9uaXRvci9yZXNvdXJjZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudmUuamF2YS5jb3JlL2RlYnVnL3ZldGltZXRyYWNlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51aS9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2phdmFkZWx0YSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQuY29yZS9kZWJ1Zy9zZWxlY3Rpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS90cmVlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3ByZWZlcmVuY2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3dvcmtiZW5jaC5yZXN0b3JlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3BhcnQuY3JlYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAvZGVidWcvcHJvdG9jb2xzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvc25hcHNob3RzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL25hdHVyZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC5iYXNlL2RlYnVnL3NlYXJjaCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlL2RpcnR5Y2FjaGluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlZmF1bHRwcm9maWxlL2J1ZmZlcnNpemUiIHZhbHVlPSIyNTYiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS9kZWJ1Zy9sb2dsZXZlbCIgdmFsdWU9ImRlZmF1bHQiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9sb2FkZXIvZGVidWcvZmlsdGVyL25hdGl2ZSIgdmFsdWU9IioiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL3ppcGFjY2VzcyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvdXJsL2RlYnVnL2NhY2hlY29weSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL3Byb3BlcnRpZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci9jeWNsZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9jcmVhdGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvaW5jbHVkZS50aW1pbmdzIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2Uva2V5QmluZGluZ3MudmVyYm9zZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL2J1bmRsZVRpbWUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2pvYnMvYmVnaW5lbmQiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS9tZXRhZmlsZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3ByZWZlcmVuY2VzL2dldCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3BlcmYvc3VjY2VzcyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvZXZlbnRzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9jb21wYXRpYmlsaXR5L2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnL2RlY2xhcmVkSW1hZ2VzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVidWcvbW9uaXRvcmJ1bmRsZXMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9wcmVmaXhlcy9zdWNjZXNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnBkZS5idWlsZC9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0udXRpbC9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9kZWJ1Zy9sb2NhdGlvbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS90cmFjZS9jb250ZXh0cy52ZXJib3NlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmhlbHAuYmFzZS9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9kZWJ1Zy9wbHVnaW5zdG9wcGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9qb2JzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3dvcmtiZW5jaC5zdGFydCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvbG9ndHJhY2UiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvY29udGVudHR5cGVzL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3N0cmluZ3MiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuamR0LnVpL2RlYnVnL2NoZWNrQ29yZUJpbmRpbmdHZXRKYXZhRWxlbWVudCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL21ldGFpbmZvIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS90aW1pbmcvc3RhcnR1cCIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3Jlc29sdmVyL3dpcmluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL3Byb2ZpbGUvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3BlcmYiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvY29udGV4dHMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvYnVpbGQvaW52b2tpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9mYWlsdXJlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnL3Vpam9iLmxvbmd3YXJuaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmplbS51dGlsL2RlYnVnL2xvZ2xldmVsIiB2YWx1ZT0iV0FSTklORyIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvdHlwZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9wZXJmL2J1aWxkZXJzIiB2YWx1ZT0iMTAwMDAiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3BhZ2UubGlzdGVuZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnL2pvYi5zdGFsZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWcvYWxsVHlwZXNDYWNoZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZW0ucHJveHkvZGVidWcvbG9ndHJhY2VmaWxlIiB2YWx1ZT0iZGVmYXVsdCIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvaGlzdG9yeSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUvcmVmcmVzaGpvYiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS51aS5pbnRyby9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2NvbXBsZXRpb24iIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9lY2xpcHNlYWRhcHRvci9kZWJ1ZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuaGVscC9kZWJ1ZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL3BlcnNwZWN0aXZlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2luZGV4bWFuYWdlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL3BhY2thZ2VhZG1pbiIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5vc2dpL2RlYnVnL2xvYWRlciIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9idWlsZC9mYWlsdXJlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnVpL3RyYWNlL2hhbmRsZXJzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3NhdmUvdHJlZSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvY29uZmlnL2RlYnVnIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLm9zZ2kvZGVmYXVsdHByb2ZpbGUvbG9nc3luY2hyb25vdXNseSIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5oZWxwLnVpL2RlYnVnIiB2YWx1ZT0idHJ1ZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS90cmFjZS9jbGFzc0xvYWRpbmciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMvcmVzdG9yZS9tZXRhaW5mbyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy9zYXZlL21hc3RlcnRhYmxlIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9wZXJmL2ZhaWx1cmUiIHZhbHVlPSJ0cnVlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvZGVidWciIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvaGFuZGxlcnMudmVyYm9zZS5jb21tYW5kSWQiIHZhbHVlPSIiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5jb3JlL2RlYnVnL2J1ZmZlcm1hbmFnZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9kZWJ1Zy9maWx0ZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2Uub3NnaS9yZXNvbHZlci9ncm91cGluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5qZHQudWkvZGVidWcvQVNUUHJvdmlkZXIiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkvdHJhY2UvcGFydC5saXN0ZW5lcnMiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL2xvYWRlci9kZWJ1Zy9zdWNjZXNzIiB2YWx1ZT0iZmFsc2UiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzL3Jlc3RvcmUvbWFzdGVydGFibGUiIHZhbHVlPSJmYWxzZSIvPgotPG1hcEVudHJ5IGtleT0ib3JnLmVjbGlwc2UudWkuaW50cm8vdHJhY2UvbG9nSW5mbyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLnZlLmphdmEuY29yZS9kZWJ1Zy9sb2d0cmFjZWZpbGUiIHZhbHVlPSJkZWZhdWx0Ii8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL2ZpbHRlci9jbGFzcyIgdmFsdWU9IioiLz4KLTxtYXBFbnRyeSBrZXk9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS9qb2JzL3RpbWluZyIgdmFsdWU9ImZhbHNlIi8+Ci08bWFwRW50cnkga2V5PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvbG9hZGVyL2RlYnVnL3ByZWZpeGVzL2ZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgotPC9tYXBBdHRyaWJ1dGU+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ic2VsZWN0ZWRQbHVnaW4iIHZhbHVlPSJvcmcuZWNsaXBzZS5qZW0ucHJveHkiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LktFRVBSVU5OSU5HX0FUVFIiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idGltZXN0YW1wIiB2YWx1ZT0iMTE3MjA3OTM0NjkzNiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImxvY2F0aW9uIiB2YWx1ZT0iRDpccnVudGltZS1qdW5pdC10ZXN0LXdvcmtzcGFjZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImFwcGxpY2F0aW9uIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLmp1bml0LnJ1bnRpbWUuY29yZXRlc3RhcHBsaWNhdGlvbiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNvbmZpZ0xvY2F0aW9uIiB2YWx1ZT0iIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyd3MiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5NQUlOX1RZUEUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZW0udGVzdHMuQWxsU3VpdGVzIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ibG9jYXRpb24xIiB2YWx1ZT0iRDpccnVudGltZS1qdW5pdC10ZXN0LXdvcmtzcGFjZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPR1JBTV9BUkdVTUVOVFMiIHZhbHVlPSItb3Mgd2luMzIgLXdzIHdpbjMyIC1hcmNoIHg4NiAtbmwgZW5fVVMiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0IiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuVEVTVE5BTUUiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS50ZXN0cyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhc2tjbGVhciIgdmFsdWU9InRydWUiLz4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfUEFUSFMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iL29yZy5lY2xpcHNlLmplbS50ZXN0cyIvPgotPC9saXN0QXR0cmlidXRlPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LlRFU1RfS0lORCIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5sb2FkZXIuanVuaXQzIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZDliYWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmplbS50ZXN0czsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4yLjQucXVhbGlmaWVyCi1CdW5kbGUtQ2xhc3NQYXRoOiBqYXZhdGVzdHMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVRlc3RzUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBpbml0UGFyc2VyVGVzdDQ2Mzc2O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuamVtLnRlc3RzLAotIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iYXNpYywKLSBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8sCi0gb3JnLmVjbGlwc2UuamVtLnRlc3RzLmluc3RhbnRpYXRpb24sCi0gb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLAotIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eSwKLSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaWRlLAotIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLAotIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUsCi0gb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LnJlbW90ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmplbS5wcm94eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSJbMy44LjEsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5hbnQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMS4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0uYmVhbmluZm87YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW07YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNlYTU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+PGhlYWQ+PHRpdGxlPkFib3V0PC90aXRsZT4KLQotCi0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPjwvaGVhZD48Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxQPkp1bmUsIDIwMDg8L1A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5pbmkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTMxNDg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5tYXBwaW5ncyBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2Fib3V0LnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyOWVhNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLnRlc3RzLmdpdC90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYWJvdXQucHJvcGVydGllcyx2ICQKLSMgJFJldmlzaW9uOiAxLjggJCAgJERhdGU6IDIwMDYvMDUvMTggMTk6MDk6NTYgJAotIwotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1KYXZhIEVNRiBNb2RlbCBUZXN0c1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycy4gMjAwMCwgMjAwNi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3ZlcApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwMWIzNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgamF2YXRlc3RzLmphcixcCi0gICAgICAgICAgICAgICB2bS90ZXN0cy5qYXIsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB0ZXN0ZGF0YS8sXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLnBuZyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLWphcnMuY29tcGlsZS5vcmRlciA9IHZtL3Rlc3RzLmphcixcCi0gICAgICAgICAgICAgICAgICAgICBqYXZhdGVzdHMuamFyCi1zb3VyY2Uudm0vdGVzdHMuamFyID0gdm1fdGVzdHMvCi1zb3VyY2UuamF2YXRlc3RzLmphciA9IGphdmF0ZXN0cy8KLXNyYy5pbmNsdWRlcyA9IHByb3h5LmphcnMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9lY2xpcHNlMzIucG5nIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGZhYzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL0luaXRQYXJzZXJUZXN0NDYzNzYuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvSW5pdFBhcnNlclRlc3Q0NjM3Ni5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzM2YWRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvSW5pdFBhcnNlclRlc3Q0NjM3Ni5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogSW5pdFBhcnNlclRlc3Q0NjM3Ni5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLSAKLS8qKgotICogVGhpcyBpcyB0byB0ZXN0IGZvciBkZWZlY3QgWzQ2Mzc2XS4KLSAqIAotICogU2FtZU5hbWUgdGVzdC4gVGhpcyBpcyB0ZXN0IHdoZXJlIHlvdSBoYXZlIHRoaXM6Ci0gKiAJaW5pdFBhcnNlclRlc3Q0NjM3Ni5TYW1lTmFtZVRlc3RDbGFzcy5qYXZhCi0gKiAJSW5pdFBhcnNlclRlc3Q0NjM3Ni5qYXZhCi0gKiAgCi0gKiBCZWZvcmUgWzQ2Mzc2XSB0aGUgU3RhdGljIHBhcnNlciB3b3VsZCBmaW5kIHRocm93IE5vQ2xhc3NEZWZGb3VuZEVycm9yIG9uIGluaXRQYXJzZXJUZXN0NDYzNzYgd2hlbiBsb29raW5nIGZvcgotICogU2FtZU5hbWVUZXN0Q2xhc3MgYW5kIG5ldmVyIGZpbmQgdGhlIGNsYXNzLgotICogCi0gKiBUbyBjb21waWxlIGluIEVjbGlwc2Ugd2UgbmVlZCB0byBoYXZlIG9uZSBvZiB0aGUgY2xhc3NlcyBiZSBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlLiBFY2xpcHNlIGNvbXBsYWlucyBpZiB3ZSBkaWRuJ3QuCi0gKiBCdXQgdGhlcmUgaXMgbm90aGluZyB0byBzdG9wIHRoaXMgZnJvbSBoYXBwZW5pbmcgd2l0aCBwYWNrYWdlcyB0b28gaWYgdGhleSBhcmUgc3ByZWFkIGFjcm9zcyBjb21waWxlIGdyb3Vwcy4gIAotICovCi1wdWJsaWMgY2xhc3MgSW5pdFBhcnNlclRlc3Q0NjM3NiB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvaW5pdFBhcnNlclRlc3Q0NjM3Ni9TYW1lTmFtZVRlc3RDbGFzcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9pbml0UGFyc2VyVGVzdDQ2Mzc2L1NhbWVOYW1lVGVzdENsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMWY3YjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9pbml0UGFyc2VyVGVzdDQ2Mzc2L1NhbWVOYW1lVGVzdENsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGluaXRQYXJzZXJUZXN0NDYzNzY7Ci0vKgotICogICRSQ1NmaWxlOiBTYW1lTmFtZVRlc3RDbGFzcy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU1ICQgCi0gKi8KLS8qKgotICogVGhpcyBpcyB0byB0ZXN0IGZvciBkZWZlY3QgWzQ2Mzc2XS4KLSAqIAotICogU2FtZU5hbWUgdGVzdC4gVGhpcyBpcyB0ZXN0IHdoZXJlIHlvdSBoYXZlIHRoaXM6Ci0gKiAJSW5pdFBhcnNlclRlc3Q0NjM3Ni5TYW1lTmFtZVRlc3RDbGFzcy5qYXZhCi0gKiAJSW5pdFBhcnNlclRlc3Q0NjM3Ni5qYXZhCi0gKiAKLSAqIGFuZAotICogCi0gKiAJbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLlNhbWVOYW1lVGVzdENsYXNzLlJlYWxDbGFzcygpCi0gKiAKLSAqIEJlZm9yZSBbNDYzNzZdIHRoZSBTdGF0aWMgcGFyc2VyIHdvdWxkIGZpbmQgU2FtZU5hbWVUZXN0Q2xhc3MuamF2YSBpbnN0ZWFkIG9mIHRoZSBSZWFsQ2xhc3MgYW5kIHdvdWxkIG9mIGZhaWxlZC4KLSAqIFRvIGNvbXBpbGUgaW4gRWNsaXBzZSB3ZSBuZWVkIHRvIGhhdmUgb25lIG9mIHRoZSBjbGFzc2VzIGJlIGluIHRoZSBkZWZhdWx0IHBhY2thZ2UuIEVjbGlwc2UgY29tcGxhaW5zIGlmIHdlIGRpZG4ndC4KLSAqIEJ1dCB0aGVyZSBpcyBub3RoaW5nIHRvIHN0b3AgdGhpcyBmcm9tIGhhcHBlbmluZyB3aXRoIHBhY2thZ2VzIHRvbyBpZiB0aGV5IGFyZSBzcHJlYWQgYWNyb3NzIGNvbXBpbGUgZ3JvdXBzLiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBTYW1lTmFtZVRlc3RDbGFzcyB7Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotCQkvLyBUbyBtYWtlIHRlc3QgZWFzaWVyLCB3ZSBzaW1wbHkgbG9va2luZyBpZiBib3RoIG9mIHNhbWUgdHlwZS4KLQkJcmV0dXJuIG90aGVyICE9IG51bGwgJiYgb3RoZXIuZ2V0Q2xhc3MoKSA9PSBTYW1lTmFtZVRlc3RDbGFzcy5jbGFzczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjUwMTE2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9BbGxTdWl0ZXMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL0FsbFN1aXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGVkOTc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL0FsbFN1aXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHM7Ci0vKgotICogICRSQ1NmaWxlOiBBbGxTdWl0ZXMuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDcvMDMvMTQgMDE6MjI6MDYgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iYXNpYy5CYXNpY1N1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5CZWFuSW5mb1N1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5pbnN0YW50aWF0aW9uLkluc3RhbnRpYXRpb25TdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuTGlzdGVuZXJzU3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmlkZS5JREVQcm94eVN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLkluaXRQYXJzZXJTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLkFTVFBhcnNlclN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5yZW1vdGUuUmVtb3RlUHJveHlTdWl0ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBBbGxTdWl0ZXMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCS8vIFRlc3RhIGNhc2VzIHRvIGJlIGluY2x1ZGUgaW4gdGhlIHN1aXRlCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3Mgc3VpdGVzTGlzdFtdID0gewotCQlCYXNpY1N1aXRlLmNsYXNzLAotCQlKREs1UmVmbGVjdGlvblN1aXRlLmNsYXNzLAotCQlJbml0UGFyc2VyU3VpdGUuY2xhc3MsICAKLQkJQVNUUGFyc2VyU3VpdGUuY2xhc3MsCi0JCVJlbW90ZVByb3h5U3VpdGUuY2xhc3MsCi0JCUlERVByb3h5U3VpdGUuY2xhc3MsCi0JCUJlYW5JbmZvU3VpdGUuY2xhc3MsCi0JCUluc3RhbnRpYXRpb25TdWl0ZS5jbGFzcywKLQkJTGlzdGVuZXJzU3VpdGUuY2xhc3MsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBrZ05hbWUgPSAiSmF2YSBFTUYgTW9kZWwgalVuaXQgVGVzdCBTdWl0ZSIgOwotICAgIAotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWNrYWdlU3VpdGUuCi0JICovCi0JcHVibGljIEFsbFN1aXRlcygpIHsKLQkJc3VwZXIoKTsKLQkJcG9wdWxhdGVTdWl0ZSgpIDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFja2FnZVN1aXRlLgotCSAqIEBwYXJhbSB0aGVDbGFzcwotCSAqLwotCXB1YmxpYyBBbGxTdWl0ZXMoQ2xhc3MgdGhlQ2xhc3MpIHsKLQkJc3VwZXIodGhlQ2xhc3MpOwotCQlwb3B1bGF0ZVN1aXRlKCkgOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWNrYWdlU3VpdGUuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQWxsU3VpdGVzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQlwb3B1bGF0ZVN1aXRlKCkgOwotCX0KLQotICAgIHByaXZhdGUgdm9pZCBwb3B1bGF0ZVN1aXRlICgpIHsKLSAgICAJZm9yIChpbnQgaT0wOyBpPHN1aXRlc0xpc3QubGVuZ3RoOyBpKyspCi0gICAgCSAgdHJ5IHsKLQkJCVRlc3QgdHMgPSAoVGVzdCkgc3VpdGVzTGlzdFtpXS5uZXdJbnN0YW5jZSgpIDsKLQkJCWFkZFRlc3QodHMpIDsKLQkJICB9Ci0JCSAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQkJIAotICAgIH0KLSAgICAKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgQWxsU3VpdGVzKHBrZ05hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvSkRLNUJpblJlZmxlY3Rpb25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvSkRLNUJpblJlZmxlY3Rpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGRjZjQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL0pESzVCaW5SZWZsZWN0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHM7Ci0KLQotLyoqCi0gKiBUZXN0IGNhc2UgZm9yIHRlc3RpbmcgdGhlIHJlZmxlY3Rpb24gb2YgY29uY2VwdHMKLSAqIGZyb20gSkRLIDUgd2hlbiBzb3VyY2UgaXMgbm90IGF2YWlsYWJsZS4KLSAqIEBzaW5jZSAxLjIuMgotICoKLSAqLwotcHVibGljIGNsYXNzIEpESzVCaW5SZWZsZWN0aW9uVGVzdHMgZXh0ZW5kcyBKREs1UmVmbGVjdGlvblRlc3RzIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBKREs1QmluUmVmbGVjdGlvblRlc3RzKCkgewotCQlpc1JlZmxlY3RpbmdTb3VyY2UgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBKREs1QmluUmVmbGVjdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQlpc1JlZmxlY3RpbmdTb3VyY2UgPSBmYWxzZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9KREs1UmVmbGVjdGlvblN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9KREs1UmVmbGVjdGlvblN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNzc5NjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvSkRLNVJlZmxlY3Rpb25TdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBKREs1UmVmbGVjdGlvblN1aXRlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDYvMTAvMjcgMTk6MzY6MzMgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5leHRlbnNpb25zLlRlc3RTZXR1cDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFRoaXMgaXMgYmFzaWMgSkVNIEpESzUgdG9sZXJhdGlvbiBtb2RlIHRlc3RzLgotICogCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSkRLNVJlZmxlY3Rpb25TdWl0ZSBleHRlbmRzIFRlc3RTZXR1cCB7Ci0KLQkvLyBUZXN0IGNhc2VzIHRvIGJlIGluY2x1ZGUgaW4gdGhlIHN1aXRlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgdGVzdHNMaXN0W10gPSB7IEpESzVSZWZsZWN0aW9uVGVzdHMuY2xhc3MsIEpESzVCaW5SZWZsZWN0aW9uVGVzdHMuY2xhc3N9OwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEpESzVSZWZsZWN0aW9uU3VpdGUoKSB7Ci0JCXRoaXMoIlRlc3QgQmFzaWMgSkVNIEpESzUgdG9sZXJhdGlvbiBtb2RlIFN1aXRlIik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgSkRLNVJlZmxlY3Rpb25TdWl0ZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuZXcgVGVzdFN1aXRlKG5hbWUpIHsKLQkJCXsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RzTGlzdC5sZW5ndGg7IGkrKykgewotCQkJCQlhZGRUZXN0U3VpdGUodGVzdHNMaXN0W2ldKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IEpESzVSZWZsZWN0aW9uU3VpdGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9KREs1UmVmbGVjdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9KREs1UmVmbGVjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YWU4NTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvSkRLNVJlZmxlY3Rpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFKRE9NQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLQotLyoqCi0gKiBUZXN0IGNhc2UgZm9yIHRlc3RpbmcgdGhlIHJlZmxlY3Rpb24gb2YgY29uY2VwdHMKLSAqIGZyb20gSkRLIDUuCi0gKiBAc2luY2UgMS4yLjIKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKREs1UmVmbGVjdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUUgPSAiSkRLNVRlc3RzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCXByaXZhdGUgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQ7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG9sZEF1dG9CdWlsZGluZ1N0YXRlOyAvLyBhdXRvQnVpbGRpbmcgc3RhdGUgYmVmb3JlIHdlIHN0YXJ0ZWQuCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlZmxlY3RpbmdTb3VyY2U7Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEpESzVSZWZsZWN0aW9uVGVzdHMoKSB7Ci0JCWlzUmVmbGVjdGluZ1NvdXJjZSA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgSkRLNVJlZmxlY3Rpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJaXNSZWZsZWN0aW5nU291cmNlID0gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJaWYgKGlzUmVmbGVjdGluZ1NvdXJjZSkKLQkJCXNldFVwRm9yU291cmNlKCk7Ci0JCWVsc2UKLQkJCXNldFVwRm9yTm9Tb3VyY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcEZvclNvdXJjZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJb2xkQXV0b0J1aWxkaW5nU3RhdGUgPSBKYXZhUHJvamVjdFV0aWwuc2V0QXV0b0J1aWxkKHRydWUpOwotCQlVUkwgaW5zdGFsbFVSTCA9IEphdmFUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOwotCQlTdHJpbmdbXSB6aXBQYXRocyA9IG5ldyBTdHJpbmdbMV07Ci0JCXppcFBhdGhzWzBdID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKG5ldyBVUkwoaW5zdGFsbFVSTCwgInRlc3RkYXRhL0pESzVUZXN0cy56aXAiKSkuZ2V0RmlsZSgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0KLQkJCUphdmFQcm9qZWN0VXRpbC5pbXBvcnRQcm9qZWN0cygKLQkJCQluZXcgU3RyaW5nW10geyBQUk9KRUNUX05BTUUgfSwKLQkJCQl6aXBQYXRocyk7Ci0JCWFzc2VydE5vdE51bGwocHJvamVjdHNbMF0pOwotCQlKYXZhUHJvamVjdFV0aWwud2FpdEZvckF1dG9CdWlsZCgpOwotCQlqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0c1swXSk7Ci0JCWphdmFQcm9qZWN0LnNldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCAiMS41Iik7Ci0JCXJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCQlyZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5KGphdmFQcm9qZWN0KSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBGb3JOb1NvdXJjZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJb2xkQXV0b0J1aWxkaW5nU3RhdGUgPSBKYXZhUHJvamVjdFV0aWwuc2V0QXV0b0J1aWxkKHRydWUpOwotCQlVUkwgaW5zdGFsbFVSTCA9IEphdmFUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpOwotCQlTdHJpbmdbXSBqYXJQYXRocyA9IG5ldyBTdHJpbmdbMV07Ci0JCWphclBhdGhzWzBdID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKG5ldyBVUkwoaW5zdGFsbFVSTCwgInRlc3RkYXRhL0pESzVCaW5UZXN0cy5qYXIiKSkuZ2V0RmlsZSgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gSmF2YVByb2plY3RVdGlsLmNyZWF0ZUVtcHR5SmF2YVByb2plY3QoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLCBuZXcgUGF0aChQUk9KRUNUX05BTUUpLCBudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm9qZWN0KTsKLQkJSmF2YVByb2plY3RVdGlsLndhaXRGb3JBdXRvQnVpbGQoKTsKLQkJamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCWphdmFQcm9qZWN0LnNldE9wdGlvbihKYXZhQ29yZS5DT01QSUxFUl9DT01QTElBTkNFLCAiMS41Iik7Ci0JCUFycmF5TGlzdCBjbGFzc3BhdGggPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCkpKTsKLQkJY2xhc3NwYXRoLmFkZChKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkobmV3IFBhdGgoamFyUGF0aHNbMF0pLCBudWxsLCBudWxsKSk7Ci0JCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aCgoSUNsYXNzcGF0aEVudHJ5W10pIGNsYXNzcGF0aC50b0FycmF5KG5ldyBJQ2xhc3NwYXRoRW50cnlbMF0pLCBudWxsKTsJCi0JCUphdmFQcm9qZWN0VXRpbC53YWl0Rm9yQXV0b0J1aWxkKCk7Ci0JCXJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCQlyZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5KGphdmFQcm9qZWN0KSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlKYXZhUHJvamVjdFV0aWwuZGVsZXRlUHJvamVjdChqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkJfQotCQl9LCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCAwLCBudWxsKTsKLQotCQlKYXZhUHJvamVjdFV0aWwuc2V0QXV0b0J1aWxkKG9sZEF1dG9CdWlsZGluZ1N0YXRlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhSGVscGVycyByZWZsZWN0Q2xhc3MoU3RyaW5nIHF1YWxpZmllZE5hbWUpIHsKLQkJcmV0dXJuIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZShxdWFsaWZpZWROYW1lLCByZXNvdXJjZVNldCk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgbWV0aG9kIHRlc3QxIGZyb20gVGVzdCBjbGFzcy4KLQkgKiAKLQkgKiBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IHRlc3QxKCkKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QxKCkgewotIAkJSmF2YUhlbHBlcnMgdGVzdEhlbHBlciA9IHJlZmxlY3RDbGFzcygidGVzdC5tZS5UZXN0Iik7Ci0JCWFzc2VydEZhbHNlKHRlc3RIZWxwZXIuaXNQcmltaXRpdmUoKSk7Ci0JCUphdmFDbGFzcyB0ZXN0Q2xhc3MgPSAoSmF2YUNsYXNzKSB0ZXN0SGVscGVyOwotCQlhc3NlcnRUcnVlKCh0ZXN0Q2xhc3MpLmlzRXhpc3RpbmdUeXBlKCkpOwotCQkKLQkJTWV0aG9kIG1ldGhvZCA9IHRlc3RDbGFzcy5nZXRNZXRob2QoInRlc3QxIiwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLQkJSmF2YUhlbHBlcnMgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIsIHJldHVyblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDb2xsZWN0aW9uIiwgcmV0dXJuVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IG1ldGhvZCB0ZXN0MiBmcm9tIFRlc3QgY2xhc3MuCi0JICogCi0JICogcHVibGljIHZvaWQgdGVzdDIoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSUZvbz4gYUNvbGxlY3Rpb24pIAotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDIoKSB7Ci0JCUphdmFIZWxwZXJzIHRlc3RIZWxwZXIgPSByZWZsZWN0Q2xhc3MoInRlc3QubWUuVGVzdCIpOwotCQlKYXZhQ2xhc3MgdGVzdENsYXNzID0gKEphdmFDbGFzcykgdGVzdEhlbHBlcjsKLQkJYXNzZXJ0VHJ1ZSgodGVzdENsYXNzKS5pc0V4aXN0aW5nVHlwZSgpKTsKLQkJCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlMaXN0IG1ldGhvZHMgPSB0ZXN0Q2xhc3MuZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLQkJCW1ldGhvZCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJ0ZXN0MiIpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCW1ldGhvZCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLQkJSmF2YUhlbHBlcnMgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwocmV0dXJuVHlwZSk7IC8vdm9pZAotCQlMaXN0IHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCWFzc2VydFRydWUocGFyYW1zLnNpemUoKSA9PSAxKTsKLQkJSmF2YVBhcmFtZXRlciBwYXJhbSA9IChKYXZhUGFyYW1ldGVyKSBwYXJhbXMuZ2V0KDApOwotCQlpZiAoaXNSZWZsZWN0aW5nU291cmNlKQotCQkJYXNzZXJ0VHJ1ZShwYXJhbS5nZXROYW1lKCkuZXF1YWxzKCJhQ29sbGVjdGlvbiIpKTsKLQkJSmF2YUhlbHBlcnMgcGFyYW1UeXBlID0gcGFyYW0uZ2V0SmF2YVR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChwYXJhbVR5cGUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIsIHBhcmFtVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNvbGxlY3Rpb24iLCBwYXJhbVR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IG1ldGhvZCB0ZXN0MyBmcm9tIFRlc3QgY2xhc3MuCi0JICogCi0JICogcHVibGljIDxUIGV4dGVuZHMgSUZvbz4gVCB0ZXN0MyhDbGFzczxUPiBhQ2xhc3MsIFN0cmluZyBzLCBMaXN0PEludGVnZXI+IGFMaXN0KSAKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QzKCkgewotCQlKYXZhSGVscGVycyB0ZXN0SGVscGVyID0gcmVmbGVjdENsYXNzKCJ0ZXN0Lm1lLlRlc3QiKTsKLQkJSmF2YUNsYXNzIHRlc3RDbGFzcyA9IChKYXZhQ2xhc3MpIHRlc3RIZWxwZXI7Ci0JCWFzc2VydFRydWUoKHRlc3RDbGFzcykuaXNFeGlzdGluZ1R5cGUoKSk7Ci0JCQotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJTGlzdCBtZXRob2RzID0gdGVzdENsYXNzLmdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKSBtZXRob2RzLmdldChpKTsKLQkJCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygidGVzdDMiKSkgewotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQltZXRob2QgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0JCQotCQkvL1ZlcmlmeSByZXR1cm4gdHlwZS4JCQotCQlKYXZhSGVscGVycyByZXR1cm5UeXBlID0gbWV0aG9kLmdldFJldHVyblR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXR1cm5UeXBlKTsgCi0JCQotCQlhc3NlcnRFcXVhbHMoInRlc3QuZGVwZW5kZW50cy5JRm9vIiwgcmV0dXJuVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIklGb28iLCByZXR1cm5UeXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQotCQkvL1ZlcmlmeSBwYXJhbWV0ZXJzCi0JCUxpc3QgcGFyYW1zID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJhbXMuc2l6ZSgpID09IDMpOwotCQkKLQkJLy9WZXJpZnkgQ2xhc3M8VD4gYUNsYXNzCi0JCUphdmFQYXJhbWV0ZXIgcGFyYW0xID0gKEphdmFQYXJhbWV0ZXIpIHBhcmFtcy5nZXQoMCk7Ci0JCWlmIChpc1JlZmxlY3RpbmdTb3VyY2UpCi0JCQlhc3NlcnRUcnVlKHBhcmFtMS5nZXROYW1lKCkuZXF1YWxzKCJhQ2xhc3MiKSk7Ci0JCUphdmFIZWxwZXJzIHBhcmFtMVR5cGUgPSBwYXJhbTEuZ2V0SmF2YVR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChwYXJhbTFUeXBlKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5DbGFzcyIsIHBhcmFtMVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDbGFzcyIsIHBhcmFtMVR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJCi0JCS8vVmVyaWZ5IFN0cmluZyBzCi0JCUphdmFQYXJhbWV0ZXIgcGFyYW0yID0gKEphdmFQYXJhbWV0ZXIpIHBhcmFtcy5nZXQoMSk7Ci0JCWlmIChpc1JlZmxlY3RpbmdTb3VyY2UpCi0JCQlhc3NlcnRFcXVhbHMoInMiLCBwYXJhbTIuZ2V0TmFtZSgpKTsKLQkJSmF2YUhlbHBlcnMgcGFyYW0yVHlwZSA9IHBhcmFtMi5nZXRKYXZhVHlwZSgpOwotCQlhc3NlcnROb3ROdWxsKHBhcmFtMlR5cGUpOwotCi0JCS8vVmVyaWZ5IExpc3Q8SW50ZWdlcj4gYUxpc3QKLQkJSmF2YUhlbHBlcnMgbGlzdFR5cGUgPSByZWZsZWN0Q2xhc3MoImphdmEudXRpbC5MaXN0Iik7Ci0JCUphdmFQYXJhbWV0ZXIgcGFyYW0zID0gKEphdmFQYXJhbWV0ZXIpIHBhcmFtcy5nZXQoMik7Ci0JCWlmIChpc1JlZmxlY3RpbmdTb3VyY2UpCi0JCQlhc3NlcnRFcXVhbHMoImFMaXN0IiwgcGFyYW0zLmdldE5hbWUoKSk7Ci0JCUphdmFIZWxwZXJzIHBhcmFtM1R5cGUgPSBwYXJhbTMuZ2V0SmF2YVR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChwYXJhbTNUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3RUeXBlLCBwYXJhbTNUeXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBtZXRob2QgdGVzdDQgZnJvbSBUZXN0IGNsYXNzLgotCSAqIAotCSAqIHB1YmxpYyBNYXA8SW50ZWdlciwgU3RyaW5nPiB0ZXN0NChJbnRlZ2VyIGFuSW50ZWdlcikgCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0NCgpIHsKLQkJSmF2YUhlbHBlcnMgdGVzdEhlbHBlciA9IHJlZmxlY3RDbGFzcygidGVzdC5tZS5UZXN0Iik7Ci0JCUphdmFDbGFzcyB0ZXN0Q2xhc3MgPSAoSmF2YUNsYXNzKSB0ZXN0SGVscGVyOwotCQlhc3NlcnRUcnVlKCh0ZXN0Q2xhc3MpLmlzRXhpc3RpbmdUeXBlKCkpOwotCQkKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUxpc3QgbWV0aG9kcyA9IHRlc3RDbGFzcy5nZXRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJbWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kcy5nZXQoaSk7Ci0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoInRlc3Q0IikpIHsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJbWV0aG9kID0gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCQkKLQkJLy9WZXJpZnkgcmV0dXJuIHR5cGUuCQkKLQkJSmF2YUhlbHBlcnMgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwocmV0dXJuVHlwZSk7IAotCQkKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwIiwgcmV0dXJuVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1hcCIsIHJldHVyblR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBtZXRob2QgdGVzdDUgZnJvbSBUZXN0IGNsYXNzLgotCSAqIAotCSAqIHB1YmxpYyB2b2lkIHRlc3Q1KExpc3Q8PyBzdXBlciBJRm9vPiBhTGlzdCkKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Q1KCkgewotCQlKYXZhSGVscGVycyB0ZXN0SGVscGVyID0gcmVmbGVjdENsYXNzKCJ0ZXN0Lm1lLlRlc3QiKTsKLQkJSmF2YUNsYXNzIHRlc3RDbGFzcyA9IChKYXZhQ2xhc3MpIHRlc3RIZWxwZXI7Ci0JCWFzc2VydFRydWUoKHRlc3RDbGFzcykuaXNFeGlzdGluZ1R5cGUoKSk7Ci0JCQotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJTGlzdCBtZXRob2RzID0gdGVzdENsYXNzLmdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKSBtZXRob2RzLmdldChpKTsKLQkJCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygidGVzdDUiKSkgewotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQltZXRob2QgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0JCQotCQkvL1ZlcmlmeSBwYXJhbWV0ZXJzCi0JCUxpc3QgcGFyYW1zID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJhbXMuc2l6ZSgpID09IDEpOwotCQkKLQkJSmF2YVBhcmFtZXRlciBwYXJhbTEgPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldCgwKTsKLQkJaWYgKGlzUmVmbGVjdGluZ1NvdXJjZSkKLQkJCWFzc2VydFRydWUocGFyYW0xLmdldE5hbWUoKS5lcXVhbHMoImFMaXN0IikpOwotCQlKYXZhSGVscGVycyBwYXJhbTFUeXBlID0gcGFyYW0xLmdldEphdmFUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwocGFyYW0xVHlwZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0IiwgcGFyYW0xVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxpc3QiLCBwYXJhbTFUeXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBtZXRob2QgdGVzdDYgZnJvbSBUZXN0IGNsYXNzLgotCSAqIAotCSAqIHB1YmxpYyA8VD4gdm9pZCB0ZXN0NihDbGFzczxUPltdIGFDbGFzc0FycmF5LCBMaXN0PFN0cmluZz5bXSBhbkFycmF5T2ZMaXN0c09mU3RyaW5nLCBDbGFzczw/PltdIGFXaWxkY2FyZENsYXNzQXJyYXksIENsYXNzPD8+W11bXVtdIGFNdWx0aURpbVdpbGRjYXJkQXJyYXkpCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0NigpIHsKLQkJSmF2YUhlbHBlcnMgdGVzdEhlbHBlciA9IHJlZmxlY3RDbGFzcygidGVzdC5tZS5UZXN0Iik7Ci0JCUphdmFDbGFzcyB0ZXN0Q2xhc3MgPSAoSmF2YUNsYXNzKSB0ZXN0SGVscGVyOwotCQlhc3NlcnRUcnVlKCh0ZXN0Q2xhc3MpLmlzRXhpc3RpbmdUeXBlKCkpOwotCQkKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUxpc3QgbWV0aG9kcyA9IHRlc3RDbGFzcy5nZXRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJbWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kcy5nZXQoaSk7Ci0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoInRlc3Q2IikpIHsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJbWV0aG9kID0gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCQkKLQkJLy9WZXJpZnkgcGFyYW1ldGVycwotCQlMaXN0IHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBwYXJhbXMuc2l6ZSgpKTsKLQkJCi0JCS8vIFZlcmlmeSBDbGFzczxUPltdIGFDbGFzc0FycmF5Ci0JCUphdmFQYXJhbWV0ZXIgcGFyYW0xID0gKEphdmFQYXJhbWV0ZXIpIHBhcmFtcy5nZXQoMCk7Ci0JCWlmIChpc1JlZmxlY3RpbmdTb3VyY2UpCi0JCQlhc3NlcnRUcnVlKHBhcmFtMS5nZXROYW1lKCkuZXF1YWxzKCJhQ2xhc3NBcnJheSIpKTsKLQkJSmF2YUhlbHBlcnMgcGFyYW0xVHlwZSA9IHBhcmFtMS5nZXRKYXZhVHlwZSgpOwotCQlhc3NlcnROb3ROdWxsKHBhcmFtMVR5cGUpOwotCQlhc3NlcnRUcnVlKCgoQXJyYXlUeXBlKXBhcmFtMVR5cGUpLmdldEFycmF5RGltZW5zaW9ucygpID09IDEpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5DbGFzc1tdIiwgcGFyYW0xVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNsYXNzW10iLCBwYXJhbTFUeXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsYXNzIiwgKChBcnJheVR5cGUpcGFyYW0xVHlwZSkuZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDbGFzcyIsICgoQXJyYXlUeXBlKXBhcmFtMVR5cGUpLmdldENvbXBvbmVudFR5cGVBc0hlbHBlcigpLmdldFNpbXBsZU5hbWUoKSk7Ci0KLQkJLy8gVmVyaWZ5IExpc3Q8U3RyaW5nPltdIGFuQXJyYXlPZkxpc3RzT2ZTdHJpbmcKLQkJSmF2YVBhcmFtZXRlciBwYXJhbTIgPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldCgxKTsKLQkJaWYgKGlzUmVmbGVjdGluZ1NvdXJjZSkKLQkJCWFzc2VydFRydWUocGFyYW0yLmdldE5hbWUoKS5lcXVhbHMoImFuQXJyYXlPZkxpc3RzT2ZTdHJpbmciKSk7Ci0JCUphdmFIZWxwZXJzIHBhcmFtMlR5cGUgPSBwYXJhbTIuZ2V0SmF2YVR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChwYXJhbTJUeXBlKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFycmF5VHlwZSlwYXJhbTJUeXBlKS5nZXRBcnJheURpbWVuc2lvbnMoKSA9PSAxKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdFtdIiwgcGFyYW0yVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxpc3RbXSIsIHBhcmFtMlR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdCIsICgoQXJyYXlUeXBlKXBhcmFtMlR5cGUpLmdldENvbXBvbmVudFR5cGVBc0hlbHBlcigpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTGlzdCIsICgoQXJyYXlUeXBlKXBhcmFtMlR5cGUpLmdldENvbXBvbmVudFR5cGVBc0hlbHBlcigpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQotCQkvLyBWZXJpZnkgQ2xhc3M8Pz5bXSBhV2lsZGNhcmRDbGFzc0FycmF5Ci0JCUphdmFQYXJhbWV0ZXIgcGFyYW0zID0gKEphdmFQYXJhbWV0ZXIpIHBhcmFtcy5nZXQoMik7Ci0JCWlmIChpc1JlZmxlY3RpbmdTb3VyY2UpCi0JCQlhc3NlcnRUcnVlKHBhcmFtMy5nZXROYW1lKCkuZXF1YWxzKCJhV2lsZGNhcmRDbGFzc0FycmF5IikpOwotCQlKYXZhSGVscGVycyBwYXJhbTNUeXBlID0gcGFyYW0zLmdldEphdmFUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwocGFyYW0zVHlwZSk7Ci0JCWFzc2VydFRydWUoKChBcnJheVR5cGUpcGFyYW0zVHlwZSkuZ2V0QXJyYXlEaW1lbnNpb25zKCkgPT0gMSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsYXNzW10iLCBwYXJhbTNUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ2xhc3NbXSIsIHBhcmFtM1R5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuQ2xhc3MiLCAoKEFycmF5VHlwZSlwYXJhbTNUeXBlKS5nZXRDb21wb25lbnRUeXBlQXNIZWxwZXIoKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNsYXNzIiwgKChBcnJheVR5cGUpcGFyYW0zVHlwZSkuZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQotCQkvLyBWZXJpZnkgQ2xhc3M8Pz5bXVtdW10gYU11bHRpRGltV2lsZGNhcmRBcnJheQotCQlKYXZhUGFyYW1ldGVyIHBhcmFtNCA9IChKYXZhUGFyYW1ldGVyKSBwYXJhbXMuZ2V0KDMpOwotCQlpZiAoaXNSZWZsZWN0aW5nU291cmNlKQotCQkJYXNzZXJ0VHJ1ZShwYXJhbTQuZ2V0TmFtZSgpLmVxdWFscygiYU11bHRpRGltV2lsZGNhcmRBcnJheSIpKTsKLQkJSmF2YUhlbHBlcnMgcGFyYW00VHlwZSA9IHBhcmFtNC5nZXRKYXZhVHlwZSgpOwotCQlhc3NlcnROb3ROdWxsKHBhcmFtNFR5cGUpOwotCQlhc3NlcnRUcnVlKCgoQXJyYXlUeXBlKXBhcmFtNFR5cGUpLmdldEFycmF5RGltZW5zaW9ucygpID09IDMpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5DbGFzc1tdW11bXSIsIHBhcmFtNFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDbGFzc1tdW11bXSIsIHBhcmFtNFR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJSmF2YUhlbHBlcnMgY29tcG9uZW50VHlwZSA9ICgoQXJyYXlUeXBlKXBhcmFtNFR5cGUpLmdldENvbXBvbmVudFR5cGVBc0hlbHBlcigpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5DbGFzc1tdW10iLCBjb21wb25lbnRUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ2xhc3NbXVtdIiwgY29tcG9uZW50VHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCQljb21wb25lbnRUeXBlID0gKChBcnJheVR5cGUpIGNvbXBvbmVudFR5cGUpLmdldENvbXBvbmVudFR5cGVBc0hlbHBlcigpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5DbGFzc1tdIiwgY29tcG9uZW50VHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNsYXNzW10iLCBjb21wb25lbnRUeXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0JCWNvbXBvbmVudFR5cGUgPSAoKEFycmF5VHlwZSkgY29tcG9uZW50VHlwZSkuZ2V0Q29tcG9uZW50VHlwZUFzSGVscGVyKCk7Ci0JCQotCX0JCi0KLQkvKioKLQkgKiBUZXN0IG1ldGhvZCB0ZXN0NyBmcm9tIFRlc3QgY2xhc3MuCi0JICogCi0JICogcHVibGljIDxUPiB2b2lkIHRlc3Q3KExpc3Q8TGlzdDxTdHJpbmc+PiBhTGlzdE9mTGlzdE9mU3RyaW5nLCBMaXN0PExpc3Q8VD4+IGFMaXN0T2ZMaXN0T2ZULCBNYXA8SUZvbywgTGlzdDxNYXA8SUJhciwgVD4+PiBhTWFwKQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDcoKSB7Ci0JCUphdmFIZWxwZXJzIHRlc3RIZWxwZXIgPSByZWZsZWN0Q2xhc3MoInRlc3QubWUuVGVzdCIpOwotCQlKYXZhQ2xhc3MgdGVzdENsYXNzID0gKEphdmFDbGFzcykgdGVzdEhlbHBlcjsKLQkJYXNzZXJ0VHJ1ZSgodGVzdENsYXNzKS5pc0V4aXN0aW5nVHlwZSgpKTsKLQkJCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlMaXN0IG1ldGhvZHMgPSB0ZXN0Q2xhc3MuZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLQkJCW1ldGhvZCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJ0ZXN0NyIpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCW1ldGhvZCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLQkJCi0JCS8vVmVyaWZ5IHBhcmFtZXRlcnMKLQkJTGlzdCBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOwotCQlhc3NlcnRUcnVlKHBhcmFtcy5zaXplKCkgPT0gMyk7Ci0KLQkJCi0JCS8vIFZlcmlmeSBMaXN0PExpc3Q8U3RyaW5nPj4gYUxpc3RPZkxpc3RPZlN0cmluZwotCQlKYXZhUGFyYW1ldGVyIHBhcmFtMSA9IChKYXZhUGFyYW1ldGVyKSBwYXJhbXMuZ2V0KDApOwotCQlpZiAoaXNSZWZsZWN0aW5nU291cmNlKQotCQkJYXNzZXJ0VHJ1ZShwYXJhbTEuZ2V0TmFtZSgpLmVxdWFscygiYUxpc3RPZkxpc3RPZlN0cmluZyIpKTsKLQkJSmF2YUhlbHBlcnMgcGFyYW0xVHlwZSA9IHBhcmFtMS5nZXRKYXZhVHlwZSgpOwotCQlhc3NlcnROb3ROdWxsKHBhcmFtMVR5cGUpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0IiwgcGFyYW0xVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxpc3QiLCBwYXJhbTFUeXBlLmdldFNpbXBsZU5hbWUoKSk7Ci0KLQkJLy8gVmVyaWZ5IExpc3Q8TGlzdDxUPj4gYUxpc3RPZkxpc3RPZlQKLQkJSmF2YVBhcmFtZXRlciBwYXJhbTIgPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldCgxKTsKLQkJaWYgKGlzUmVmbGVjdGluZ1NvdXJjZSkKLQkJCWFzc2VydFRydWUocGFyYW0yLmdldE5hbWUoKS5lcXVhbHMoImFMaXN0T2ZMaXN0T2ZUIikpOwotCQlKYXZhSGVscGVycyBwYXJhbTJUeXBlID0gcGFyYW0yLmdldEphdmFUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwocGFyYW0yVHlwZSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3QiLCBwYXJhbTJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTGlzdCIsIHBhcmFtMlR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQotCQkvLyBWZXJpZnkgTWFwPElGb28sIExpc3Q8TWFwPElCYXIsIFQ+Pj4gYU1hcAotCQlKYXZhUGFyYW1ldGVyIHBhcmFtMyA9IChKYXZhUGFyYW1ldGVyKSBwYXJhbXMuZ2V0KDIpOwotCQlpZiAoaXNSZWZsZWN0aW5nU291cmNlKQotCQkJYXNzZXJ0VHJ1ZShwYXJhbTMuZ2V0TmFtZSgpLmVxdWFscygiYU1hcCIpKTsKLQkJSmF2YUhlbHBlcnMgcGFyYW0zVHlwZSA9IHBhcmFtMy5nZXRKYXZhVHlwZSgpOwotCQlhc3NlcnROb3ROdWxsKHBhcmFtM1R5cGUpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAiLCBwYXJhbTNUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTWFwIiwgcGFyYW0zVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBtZXRob2QgdGVzdDggZnJvbSBUZXN0IGNsYXNzLgotCSAqIAotCSAqIHB1YmxpYyB2b2lkIHRlc3Q4KExpc3Q8PyBleHRlbmRzIExpc3Q8U3RyaW5nPj4gYUxpc3QpCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0OCgpIHsKLQkJSmF2YUhlbHBlcnMgdGVzdEhlbHBlciA9IHJlZmxlY3RDbGFzcygidGVzdC5tZS5UZXN0Iik7Ci0JCUphdmFDbGFzcyB0ZXN0Q2xhc3MgPSAoSmF2YUNsYXNzKSB0ZXN0SGVscGVyOwotCQlhc3NlcnRUcnVlKCh0ZXN0Q2xhc3MpLmlzRXhpc3RpbmdUeXBlKCkpOwotCQkKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUxpc3QgbWV0aG9kcyA9IHRlc3RDbGFzcy5nZXRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJbWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kcy5nZXQoaSk7Ci0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoInRlc3Q4IikpIHsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJbWV0aG9kID0gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCQkKLQkJLy9WZXJpZnkgcGFyYW1ldGVycwotCQlMaXN0IHBhcmFtcyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJzKCk7Ci0JCWFzc2VydFRydWUocGFyYW1zLnNpemUoKSA9PSAxKTsKLQkJCi0JCS8vIFZlcmlmeSBMaXN0PD8gZXh0ZW5kcyBMaXN0PFN0cmluZz4+IGFMaXN0Ci0JCUphdmFQYXJhbWV0ZXIgcGFyYW0xID0gKEphdmFQYXJhbWV0ZXIpIHBhcmFtcy5nZXQoMCk7Ci0JCWlmIChpc1JlZmxlY3RpbmdTb3VyY2UpCi0JCQlhc3NlcnRUcnVlKHBhcmFtMS5nZXROYW1lKCkuZXF1YWxzKCJhTGlzdCIpKTsKLQkJSmF2YUhlbHBlcnMgcGFyYW0xVHlwZSA9IHBhcmFtMS5nZXRKYXZhVHlwZSgpOwotCQlhc3NlcnROb3ROdWxsKHBhcmFtMVR5cGUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdCIsIHBhcmFtMVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMaXN0IiwgcGFyYW0xVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBtZXRob2QgdGVzdDkgZnJvbSBUZXN0IGNsYXNzLgotCSAqIFRoaXMgaXMgdGhlIHNhbWUgdGVzdCBhcyB0ZXN0NyBidXQgd2l0aCBxdWFsaWZpZWQgbmFtZXMuCi0JICogCi0JICogcHVibGljIDxUPiB2b2lkIHRlc3Q5KGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+PiBhTGlzdE9mTGlzdE9mU3RyaW5nLCBqYXZhLnV0aWwuTGlzdDxqYXZhLnV0aWwuTGlzdDxUPj4gYUxpc3RPZkxpc3RPZlQsIGphdmEudXRpbC5NYXA8dGVzdC5kZXBlbmRlbnRzLklGb28sIGphdmEudXRpbC5MaXN0PGphdmEudXRpbC5NYXA8dGVzdC5kZXBlbmRlbnRzLklCYXIsIFQ+Pj4gYU1hcCkKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3Q5KCkgewotCQlKYXZhSGVscGVycyB0ZXN0SGVscGVyID0gcmVmbGVjdENsYXNzKCJ0ZXN0Lm1lLlRlc3QiKTsKLQkJSmF2YUNsYXNzIHRlc3RDbGFzcyA9IChKYXZhQ2xhc3MpIHRlc3RIZWxwZXI7Ci0JCWFzc2VydFRydWUoKHRlc3RDbGFzcykuaXNFeGlzdGluZ1R5cGUoKSk7Ci0JCQotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJTGlzdCBtZXRob2RzID0gdGVzdENsYXNzLmdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKSBtZXRob2RzLmdldChpKTsKLQkJCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygidGVzdDkiKSkgewotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQltZXRob2QgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0JCQotCQkvL1ZlcmlmeSBwYXJhbWV0ZXJzCi0JCUxpc3QgcGFyYW1zID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJhbXMuc2l6ZSgpID09IDMpOwotCQotCQkKLQkJLy8gVmVyaWZ5IExpc3Q8TGlzdDxTdHJpbmc+PiBhTGlzdE9mTGlzdE9mU3RyaW5nCi0JCUphdmFQYXJhbWV0ZXIgcGFyYW0xID0gKEphdmFQYXJhbWV0ZXIpIHBhcmFtcy5nZXQoMCk7Ci0JCWlmIChpc1JlZmxlY3RpbmdTb3VyY2UpCi0JCQlhc3NlcnRUcnVlKHBhcmFtMS5nZXROYW1lKCkuZXF1YWxzKCJhTGlzdE9mTGlzdE9mU3RyaW5nIikpOwotCQlKYXZhSGVscGVycyBwYXJhbTFUeXBlID0gcGFyYW0xLmdldEphdmFUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwocGFyYW0xVHlwZSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3QiLCBwYXJhbTFUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTGlzdCIsIHBhcmFtMVR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQkKLQkJLy8gVmVyaWZ5IExpc3Q8TGlzdDxUPj4gYUxpc3RPZkxpc3RPZlQKLQkJSmF2YVBhcmFtZXRlciBwYXJhbTIgPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldCgxKTsKLQkJaWYgKGlzUmVmbGVjdGluZ1NvdXJjZSkKLQkJCWFzc2VydFRydWUocGFyYW0yLmdldE5hbWUoKS5lcXVhbHMoImFMaXN0T2ZMaXN0T2ZUIikpOwotCQlKYXZhSGVscGVycyBwYXJhbTJUeXBlID0gcGFyYW0yLmdldEphdmFUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwocGFyYW0yVHlwZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdCIsIHBhcmFtMlR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMaXN0IiwgcGFyYW0yVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCQotCQkvLyBWZXJpZnkgTWFwPElGb28sIExpc3Q8TWFwPElCYXIsIFQ+Pj4gYU1hcAotCQlKYXZhUGFyYW1ldGVyIHBhcmFtMyA9IChKYXZhUGFyYW1ldGVyKSBwYXJhbXMuZ2V0KDIpOwotCQlpZiAoaXNSZWZsZWN0aW5nU291cmNlKQotCQkJYXNzZXJ0VHJ1ZShwYXJhbTMuZ2V0TmFtZSgpLmVxdWFscygiYU1hcCIpKTsKLQkJSmF2YUhlbHBlcnMgcGFyYW0zVHlwZSA9IHBhcmFtMy5nZXRKYXZhVHlwZSgpOwotCQlhc3NlcnROb3ROdWxsKHBhcmFtM1R5cGUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwIiwgcGFyYW0zVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1hcCIsIHBhcmFtM1R5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBtZXRob2QgdGVzdDEwIGZyb20gVGVzdCBjbGFzcy4KLQkgKiAKLQkgKiBwdWJsaWMgPFQgZXh0ZW5kcyBUZXN0ZXI+IFQgdGVzdDEwKExpc3Q8SW50ZWdlcj4gbGlzdCkKLQkgKgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QxMCgpIHsKLQkJSmF2YUhlbHBlcnMgdGVzdEhlbHBlciA9IHJlZmxlY3RDbGFzcygidGVzdC5tZS5UZXN0Iik7Ci0JCUphdmFDbGFzcyB0ZXN0Q2xhc3MgPSAoSmF2YUNsYXNzKSB0ZXN0SGVscGVyOwotCQlhc3NlcnRUcnVlKCh0ZXN0Q2xhc3MpLmlzRXhpc3RpbmdUeXBlKCkpOwotCQkKLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7Ci0JCUxpc3QgbWV0aG9kcyA9IHRlc3RDbGFzcy5nZXRNZXRob2RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5zaXplKCk7IGkrKykgewotCQkJbWV0aG9kID0gKE1ldGhvZCkgbWV0aG9kcy5nZXQoaSk7Ci0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoInRlc3QxMCIpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCW1ldGhvZCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLQkJCi0JCUphdmFIZWxwZXJzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LmRlcGVuZGVudHMuVGVzdGVyIiwgcmV0dXJuVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RlciIsIHJldHVyblR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJCi0JCS8vVmVyaWZ5IHBhcmFtZXRlcnMKLQkJTGlzdCBwYXJhbXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVycygpOwotCQlhc3NlcnRUcnVlKHBhcmFtcy5zaXplKCkgPT0gMSk7Ci0JCi0JCQotCQkvLyBWZXJpZnkgTGlzdDxMaXN0PFN0cmluZz4+IGFMaXN0T2ZMaXN0T2ZTdHJpbmcKLQkJSmF2YVBhcmFtZXRlciBwYXJhbTEgPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldCgwKTsKLQkJaWYgKGlzUmVmbGVjdGluZ1NvdXJjZSkKLQkJCWFzc2VydFRydWUocGFyYW0xLmdldE5hbWUoKS5lcXVhbHMoImxpc3QiKSk7Ci0JCUphdmFIZWxwZXJzIHBhcmFtMVR5cGUgPSBwYXJhbTEuZ2V0SmF2YVR5cGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChwYXJhbTFUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTGlzdCIsIHBhcmFtMVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMaXN0IiwgcGFyYW0xVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IG1ldGhvZCB0ZXN0MTEgZnJvbSBUZXN0IGNsYXNzLgotCSAqIAotCSAqIHB1YmxpYyA8VCBleHRlbmRzIFRlc3Rlcj4gVFtdIHRlc3QxMSgpCi0JICoKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MTEoKSB7Ci0JCUphdmFIZWxwZXJzIHRlc3RIZWxwZXIgPSByZWZsZWN0Q2xhc3MoInRlc3QubWUuVGVzdCIpOwotCQlKYXZhQ2xhc3MgdGVzdENsYXNzID0gKEphdmFDbGFzcykgdGVzdEhlbHBlcjsKLQkJYXNzZXJ0VHJ1ZSgodGVzdENsYXNzKS5pc0V4aXN0aW5nVHlwZSgpKTsKLQkJCi0JCU1ldGhvZCBtZXRob2QgPSBudWxsOwotCQlMaXN0IG1ldGhvZHMgPSB0ZXN0Q2xhc3MuZ2V0TWV0aG9kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMuc2l6ZSgpOyBpKyspIHsKLQkJCW1ldGhvZCA9IChNZXRob2QpIG1ldGhvZHMuZ2V0KGkpOwotCQkJaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJ0ZXN0MTEiKSkgewotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQltZXRob2QgPSBudWxsOwotCQkJfQotCQl9Ci0JCS8vVE9ETyBuZWVkIHRvIHJldmlzaXQKLS8vCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0vLwkJCi0vLwkJSmF2YUhlbHBlcnMgcmV0dXJuVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LmRlcGVuZGVudHMuVGVzdGVyW10iLCByZXR1cm5UeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJUZXN0ZXJbXSIsIHJldHVyblR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IG1ldGhvZCB0ZXN0MTEgZnJvbSBUZXN0IGNsYXNzLgotCSAqIAotCSAqIHB1YmxpYyA8VCBleHRlbmRzIFRlc3Rlcj4gVFtdW11bXSB0ZXN0MTEoKQotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDEyKCkgewotCQlKYXZhSGVscGVycyB0ZXN0SGVscGVyID0gcmVmbGVjdENsYXNzKCJ0ZXN0Lm1lLlRlc3QiKTsKLQkJSmF2YUNsYXNzIHRlc3RDbGFzcyA9IChKYXZhQ2xhc3MpIHRlc3RIZWxwZXI7Ci0JCWFzc2VydFRydWUoKHRlc3RDbGFzcykuaXNFeGlzdGluZ1R5cGUoKSk7Ci0JCQotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJTGlzdCBtZXRob2RzID0gdGVzdENsYXNzLmdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKSBtZXRob2RzLmdldChpKTsKLQkJCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygidGVzdDEyIikpIHsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJbWV0aG9kID0gbnVsbDsKLQkJCX0KLQkJfQotCQkvL1RPRE8gbmVlZCB0byByZXZpc2l0Ci0vLwkJYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotLy8JCQotLy8JCUphdmFIZWxwZXJzIHJldHVyblR5cGUgPSBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygidGVzdC5kZXBlbmRlbnRzLlRlc3RlcltdW11bXSIsIHJldHVyblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIlRlc3RlcltdW11bXSIsIHJldHVyblR5cGUuZ2V0U2ltcGxlTmFtZSgpKTsKLQl9Ci0JLyoqCi0JICogVGVzdCBtZXRob2QgdGVzdDEzIGZyb20gVGVzdCBjbGFzcy4KLQkgKiAKLQkgKiBwdWJsaWMgdm9pZCB0ZXN0MTMoWSBwYXJhbSkgKHdoZXJlIFkgaXMgYSBjbGFzcy1sZXZlbCB0eXBlIHBhcmFtZXRlcgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDEzKCkgewotCQlKYXZhSGVscGVycyB0ZXN0SGVscGVyID0gcmVmbGVjdENsYXNzKCJ0ZXN0Lm1lLlRlc3QiKTsKLQkJSmF2YUNsYXNzIHRlc3RDbGFzcyA9IChKYXZhQ2xhc3MpIHRlc3RIZWxwZXI7Ci0JCWFzc2VydFRydWUoKHRlc3RDbGFzcykuaXNFeGlzdGluZ1R5cGUoKSk7Ci0JCQotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJTGlzdCBtZXRob2RzID0gdGVzdENsYXNzLmdldE1ldGhvZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RzLnNpemUoKTsgaSsrKSB7Ci0JCQltZXRob2QgPSAoTWV0aG9kKSBtZXRob2RzLmdldChpKTsKLQkJCWlmIChtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygidGVzdDEzIikpIHsKLQkJCQlicmVhazsKLQkJCX0gZWxzZSB7Ci0JCQkJbWV0aG9kID0gbnVsbDsKLQkJCX0KLQkJfQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0JCQotCQkvL1ZlcmlmeSBwYXJhbWV0ZXJzCi0JCUxpc3QgcGFyYW1zID0gbWV0aG9kLmdldFBhcmFtZXRlcnMoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJhbXMuc2l6ZSgpID09IDEpOwotCQotCQkKLQkJLy8gVmVyaWZ5IFkgcGFyYW0KLQkJSmF2YVBhcmFtZXRlciBwYXJhbTEgPSAoSmF2YVBhcmFtZXRlcikgcGFyYW1zLmdldCgwKTsKLQkJaWYgKGlzUmVmbGVjdGluZ1NvdXJjZSkKLQkJCWFzc2VydFRydWUocGFyYW0xLmdldE5hbWUoKS5lcXVhbHMoInBhcmFtIikpOwotCQlKYXZhSGVscGVycyBwYXJhbTFUeXBlID0gcGFyYW0xLmdldEphdmFUeXBlKCk7Ci0JCWFzc2VydE5vdE51bGwocGFyYW0xVHlwZSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5pby5TZXJpYWxpemFibGUiLCBwYXJhbTFUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiU2VyaWFsaXphYmxlIiwgcGFyYW0xVHlwZS5nZXRTaW1wbGVOYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL0phdmFQcm9qZWN0VXRpbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvSmF2YVByb2plY3RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZTA0MWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvSmF2YVByb2plY3RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0czsKLS8qCi0gKiAgJFJDU2ZpbGU6IEphdmFQcm9qZWN0VXRpbC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xNiAkICAkRGF0ZTogMjAwNy8wNC8wMSAwMzoyODoxOCAkIAotICovCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5Qcm94eVBsdWdpbjsKLQotLyoqCi0gKiBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIGJlIGEgdXRpbGl0eSBmb3IgbWFuaXB1bGF0aW5nL3BvcHVsYXRpbmcgamF2YSBwcm9qZWN0cy4KLSAqICAxKSBHZXQgYSBqYXZhIHByb2plY3QgYXMgb25lIG9mIHRoZSByZXNvdXJjZXMuCi0gKiAgMikgQ3JlYXRlIGEgcHJvamVjdCBmcm9tIGEgZGlyZWN0b3J5LiBUaGUgZGlyZWN0b3J5IG5lZWRzIHRvIGJlIGFsbCBzZXQgdXAgdG8gYmUgYSBwcm9qZWN0IGFscmVhZHkuIFR5cGljYWxseQotICogICAgIGZyb20gYW4gdW56aXAuCi0gKi8KLQotcHVibGljIGNsYXNzIEphdmFQcm9qZWN0VXRpbCB7CQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCXJldHVybiAocHJvamVjdC5leGlzdHMoKSkgPyBwcm9qZWN0OiBudWxsOwotCX0KLQkKLQkKLQkvKioKLQkgKiBDcmVhdGUgYSBwcm9qZWN0IGZyb20gdGhlIHBhdGguIFRoZSBwYXRoIHdpbGwgYmUgYSBjb21wbGV0ZSBwcm9qZWN0LCBpbmNsdWRpbmcgYSAucHJvamVjdCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSB3b3Jrc3BhY2UKLQkgKiBAcGFyYW0gcHJvamVjdFBhdGggTmVlZHMgdG8gYmUgYSBjb21wbGV0ZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0uIFRoZSBkaXJlY3RvcnkgbXVzdCBiZSBhIGNvbXBsZXRlIHByb2plY3QgaW5jbHVkaW5nIC5wcm9qZWN0IGZpbGUuCi0JICogQHBhcmFtIHBtCi0JICogQHJldHVybiBUaGUgbmV3IElQcm9qZWN0LgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlUHJvamVjdChJV29ya3NwYWNlIHdvcmtzcGFjZSwgSVBhdGggcHJvamVjdFBhdGgsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2plY3REZXNjcmlwdGlvbiBuZXdEZXNjcmlwdGlvbiA9IG51bGw7Ci0JCQotCQlGaWxlIHByb2plY3RGaWxlID0gbmV3IEZpbGUocHJvamVjdFBhdGgudG9GaWxlKCksIElQcm9qZWN0RGVzY3JpcHRpb24uREVTQ1JJUFRJT05fRklMRV9OQU1FKTsKLQkJaWYgKCFwcm9qZWN0RmlsZS5leGlzdHMoKSkKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSmF2YVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCAwLCAiUHJvamVjdCBmaWxlIG5vdCBpbiBwcm9qZWN0IGRpcmVjdG9yeS4gQ291bGRuJ3QgY3JlYXRlIHByb2plY3QgXCIiK3Byb2plY3RQYXRoLnRvU3RyaW5nKCkrIlwiIiwgbnVsbCkpOwotCi0KLQkJSVBhdGggcHJvamVjdEZpbGVQYXRoID0gbmV3IFBhdGgocHJvamVjdEZpbGUuZ2V0UGF0aCgpKTsKLQkJbmV3RGVzY3JpcHRpb24gPSB3b3Jrc3BhY2UubG9hZFByb2plY3REZXNjcmlwdGlvbihwcm9qZWN0RmlsZVBhdGgpOwotCQkKLQkJLy8gY3JlYXRlIHRoZSBuZXcgcHJvamVjdCBvcGVyYXRpb24KLQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChuZXdEZXNjcmlwdGlvbi5nZXROYW1lKCkpOwkJCi0JCWZpbmFsIElQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewkJCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJcHJvamVjdC5jcmVhdGUoZGVzY3JpcHRpb24sIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCkpOwotCQkJCXByb2plY3Qub3BlbihuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMDApKTsJCQkJCi0JCQl9Ci0JCX0sIHByb2plY3QsIDAsIHBtKTsKLQkJCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBlbXB0eSBwcm9qZWN0IGluIHRoZSB3b3Jrc3BhY2Ugcm9vdC4gSWYgdGhlcmUgaXMgYSAucHJvamVjdCBmaWxlIGFscmVhZHkgdGhlcmUsIHRoZW4gdXNlIGl0LgotCSAqIEBwYXJhbSB3b3Jrc3BhY2UgVGhlIHdvcmtzcGFjZSB0byBjcmVhdGUgcHJvamVjIGluLgotCSAqIEBwYXJhbSBwcm9qZWN0UGF0aCBUaGUgbmFtZSBvZiB0aGUgcHJvamVjdC4gSXQgc2hvdWxkIG9ubHkgYmUgb25lIHNlZ21lbnQgbG9uZywgYW5kIHRoYXQgd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdC4KLQkgKiBAcGFyYW0gcG0KLQkgKiBAcmV0dXJuIFRoZSBwcm9qZWN0LgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgY3JlYXRlRW1wdHlKYXZhUHJvamVjdChJV29ya3NwYWNlIHdvcmtzcGFjZSwgSVBhdGggcHJvamVjdFBhdGgsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcHJvamVjdFBhdGggPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZ1bGxQYXRoKCkuYXBwZW5kKHByb2plY3RQYXRoKTsJLy8gUHV0IGl0IGludG8gdGhlIHdvcmtzcGFjZSByZWxhdGl2ZS4KLQkJRmlsZSBwcm9qZWN0RmlsZSA9IG5ldyBGaWxlKHByb2plY3RQYXRoLnRvRmlsZSgpLCBJUHJvamVjdERlc2NyaXB0aW9uLkRFU0NSSVBUSU9OX0ZJTEVfTkFNRSk7Ci0JCWlmIChwcm9qZWN0RmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBjcmVhdGVQcm9qZWN0KHdvcmtzcGFjZSwgcHJvamVjdFBhdGgsIHBtKTsJLy8gTGV0IGl0IGJlIGNyZWF0ZWQgbm9ybWFsbHkuCi0KLQkJLy8gY3JlYXRlIHRoZSBuZXcgcHJvamVjdCBvcGVyYXRpb24KLQkJZmluYWwgSVByb2plY3QgcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0UGF0aC5sYXN0U2VnbWVudCgpKTsJCQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7CQkKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlwcm9qZWN0LmNyZWF0ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMDApKTsKLQkJCQlwcm9qZWN0Lm9wZW4obmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlTdHJpbmdbXSBuYXR1cmVpZHMgPSBkZXNjcmlwdGlvbi5nZXROYXR1cmVJZHMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5hdHVyZWlkcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAobmF0dXJlaWRzW2ldLmVxdWFscygib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIpKQotCQkJCQkJcmV0dXJuOwkvLyBBbHJlYWR5IGhhcyBuYXR1cmUuCi0JCQkJfQotCQkJCVN0cmluZ1tdIG5ld05hdHVyZWlkcyA9IG5ldyBTdHJpbmdbbmF0dXJlaWRzLmxlbmd0aCsxXTsKLQkJCQluZXdOYXR1cmVpZHNbMF0gPSAib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSI7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShuYXR1cmVpZHMsIDAsIG5ld05hdHVyZWlkcywgMSwgbmF0dXJlaWRzLmxlbmd0aCk7Ci0JCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZWlkcyk7Ci0JCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDAwKSk7Ci0JCQkJLy8gTmVlZCB0byBwdXQgb3V0IGEgY2xhc3NmaWxlIHRvby4gV2UgbmVlZCBhIHNyYyBhbmQgYSBiaW4gZGlyZWN0b3J5IGZvciB0aGUgY2xhc3NwYXRoLgotCQkJCUlGb2xkZXIgc2YgPSBwcm9qZWN0LmdldEZvbGRlcigic3JjIik7Ci0JCQkJc2YuY3JlYXRlKHRydWUsIHRydWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCkpOwotCQkJCUlGb2xkZXIgYmYgPSBwcm9qZWN0LmdldEZvbGRlcigiYmluIik7Ci0JCQkJYmYuY3JlYXRlKHRydWUsIHRydWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwMCkpOwotCQkJCUlGaWxlIGNwID0gcHJvamVjdC5nZXRGaWxlKCIuY2xhc3NwYXRoIik7IAotCQkJCXRyeSB7Ci0JCQkJCWNwLmNyZWF0ZShnZXRDbGFzcygpLmdldFJlc291cmNlKCIuY2xhc3NwYXRoIikub3BlblN0cmVhbSgpLCB0cnVlLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMDApKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9LCB3b3Jrc3BhY2UuZ2V0Um9vdCgpLCAwLCBwbSk7Ci0JCQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0JCi0JLyoqCi0JICogRGVsZXRlIGEgcHJvamVjdCBhbmQgYWxsIGZpbGVzIGZyb20gdGhlIHByb2plY3QuCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCXByb2plY3QuZGVsZXRlKHRydWUsIGZhbHNlLCBudWxsKTsgLy8gR2V0IHJpZCBvZiB0aGUgcHJvamVjdCBhbmQgdGhlIGZpbGVzIHRoZW1zZWx2ZXMuCi0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBUaGlzIHNldHMgdGhlIHdvcmtzcGFjZSBhdXRvYnVpbGQgdG8gdGhlIHNwZWNpZmllZCBzdGF0ZS4gSXQgcmV0dXJucyB3aGF0Ci0JICogdGhlIHN0YXRlIHdhcyBwcmV2aW91c2x5IHNvIHRoYXQgaXQgY2FuIGJlIGxhdGVyIHJlc3RvcmVkLgotCSAqIEBwYXJhbSBhdXRvQnVpbGQKLQkgKiBAcmV0dXJuIFByZXZpb3VzIGF1dG9CdWlsZCBzdGF0ZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0QXV0b0J1aWxkKGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlpZiAoYXV0b0J1aWxkICE9IHdvcmtzcGFjZS5pc0F1dG9CdWlsZGluZygpKSB7Ci0JCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSB3b3Jrc3BhY2UuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWRlc2NyaXB0aW9uLnNldEF1dG9CdWlsZGluZyh0cnVlKTsKLQkJCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCQlyZXR1cm4gIWF1dG9CdWlsZDsJLy8gSXQgd2Fzbid0IHRoaXMgc3RhdGUuCQkJCi0JCX0gZWxzZQotCQkJcmV0dXJuIGF1dG9CdWlsZDsJLy8gSXQgYWxyZWFkeSBpcyB0aGlzIHN0YXRlLiAJCQotCX0KLQkKLQkvKioKLQkgKiBJbXBvcnQgdGhlIGdpdmVuIHByb2plY3RzIGZyb20gdGhlIGdpdmVuIHppcGZpbGVzIGludG8gdGhlIGN1cnJlbnQgd29ya3NwYWNlIHJvb3QuCi0JICogQHBhcmFtIHByb2plY3ROYW1lcyBUaGUgYXJyYXkgb2YgcHJvamVjdCBuYW1lcyB0byBjcmVhdGUKLQkgKiBAcGFyYW0gemlwRmlsZXMgVGhlIHppcGZpbGVzIGNvbnRhaW5pbmcgZWFjaCBwcm9qZWN0LiBJdCBtdXN0IGJlIGEgY29tcGxldGUgcHJvamVjdC4gCi0JICogICAgICAgICAgICAgICAgIFRoZSBmaXJzdCBkaXJlY3RvcnkgaW4gdGhlIHppcCBtdXN0IGJlIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS4gCi0JICogICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgdGhlIHNhbWUgbmFtZSBhcyBmcm9tIHByb2plY3ROYW1lcy4gQWxzbyBpdCBtdXN0IGluY2x1ZGUgYSAucHJvamVjdCBmaWxlCi0JICogICAgICAgICAgICAgICAgIGluIHRoYXQgZGlyZWN0b3J5LgotCSAqIEByZXR1cm4gVGhlIGFycmF5IG9mIElQcm9qZWN0cyB0aGF0IHdlcmUgY3JlYXRlZC4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0W10gaW1wb3J0UHJvamVjdHMoZmluYWwgU3RyaW5nW10gcHJvamVjdE5hbWVzLCBmaW5hbCBTdHJpbmdbXSB6aXBGaWxlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBEZWxldGUvY3JlYXRlL3BvcHVsYXRlIHdpdGhpbiBhIHJ1bm5hYmxlIHNvIHRoYXQgdGhlIGJ1aWxkIGlzIGRvbmUgb25seSBhZnRlciBhbGwgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZS4KLQkJLy8gTWFrZSBzdXJlIGF1dG9idWlsZCBpcyBvbi4KLQkJZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCWZpbmFsIElQcm9qZWN0W10gcmVzdWx0ID0gbmV3IElQcm9qZWN0W3Byb2plY3ROYW1lcy5sZW5ndGhdOwotCQl3b3Jrc3BhY2UucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJLy8gRmlyc3QgaW1wb3J0IGFsbCwgdGhlbiBhZnRlciB0aGF0LCBjcmVhdGUgdGhlIHByb2plY3RzLgotCQkJCUlQYXRoIHJvb3RMb2NhdGlvbiA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgYW50RmlsZSA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChKYXZhVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoInRlc3RkYXRhL3VuemlwLnhtbCIpKS5nZXRGaWxlKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgemlwRmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCS8vIEZpcnN0IGNyZWF0ZS9yZWNyZWF0ZSB0aGUgcHJvamVjdC4KLQkJCQkJCUlQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KHByb2plY3ROYW1lc1tpXSk7Ci0JCQkJCQlpZiAocCAhPSBudWxsKQotCQkJCQkJCXAuZGVsZXRlKHRydWUsIHRydWUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNTApKTsgLy8gR2V0IHJpZCBvZiBpdCwgd2Ugd2FudCBhIGNsZWFuIG9uZSBmb3IgdGVzdGluZy4KLQkJCQkJCi0JCQkJCQkvLyBOb3cgaW1wb3J0IHRoZSByZXF1ZXN0ZWQgZmlsZXMuCi0JCQkJCQlBbnRSdW5uZXIgYW50ID0gbmV3IEFudFJ1bm5lcigpOwotCQkJCQkJYW50LnNldEJ1aWxkRmlsZUxvY2F0aW9uKGFudEZpbGUpOwotCQkJCQkJYW50LnNldEFyZ3VtZW50cyhuZXcgU3RyaW5nW10geyAiLUR6aXBmcm9tPSIgKyB6aXBGaWxlc1tpXSwgIi1EemlwdG89IiArIHJvb3RMb2NhdGlvbi50b1N0cmluZygpfSk7Ci0JCQkJCQlhbnQucnVuKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNTApKTsKLQkJCQkJfQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHppcEZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlyZXN1bHRbaV0gPSBjcmVhdGVQcm9qZWN0KHdvcmtzcGFjZSwgcm9vdExvY2F0aW9uLmFwcGVuZChwcm9qZWN0TmFtZXNbaV0pLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDUwKSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0sIHdvcmtzcGFjZS5nZXRSb290KCksIDAsIG51bGwpOwotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgaW50IGNmU3VmZml4ID0gMDsKLQkvKioKLQkgKiBBZGQgYSBwYXRoIHRvIHBsdWdpbiBqYXIgdG8gdGhlIGphdmEgcHJvamVjdCdzIGNsYXNzIHBhdGguCi0JICogQHBhcmFtIGJ1bmRsZSBUaGUgcGx1Z2luIHdoZXJlIHRoZSBqYXIgaXMgbG9jYXRlZC4KLQkgKiBAcGFyYW0gcGF0aFRvSmFyIFBhdGggdG8gdGhlIGphciB3aXRoaW4gdGhlIGFib3ZlIHBsdWdpbgotCSAqIEBwYXJhbSBwcm9qZWN0IGphdmEgcHJvamVjdCB0byBhZGQgdG8uCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZEJ1bmRsZUphclRvUGF0aChCdW5kbGUgYnVuZGxlLCBTdHJpbmcgcGF0aFRvSmFyLCBmaW5hbCBJSmF2YVByb2plY3QgcHJvamVjdCwgSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlmaW5hbCBJUGF0aCBhY3R1YWxQYXRoID0gbmV3IFBhdGgoUHJveHlQbHVnaW4uZ2V0UGx1Z2luKCkubG9jYWxpemVGcm9tQnVuZGxlQW5kRnJhZ21lbnRzKGJ1bmRsZSwgcGF0aFRvSmFyKSk7Ci0JCWlmIChhY3R1YWxQYXRoLmlzRW1wdHkoKSkKLQkJCXJldHVybjsJLy8gRGlkbid0IGV4aXN0LgotCQkKLQkJZmluYWwgSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCXdvcmtzcGFjZS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJCQotCQkJCWlmIChhY3R1YWxQYXRoLnRvRmlsZSgpLmlzRmlsZSgpKSB7Ci0JCQkJCS8vIEl0IGlzIGEgamFyLCB0aGlzIHdpbGwgYmUgZHVyaW5nIHJ1bnRpbWUKLQkJCQkJLy8gQ3JlYXRlIGFuIGV4dGVybmFsIGphciBlbnRyeS4KLQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gcmF3ID0gcHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKTsKLQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gbmV3UmF3ID0gbmV3IElDbGFzc3BhdGhFbnRyeVtyYXcubGVuZ3RoKzFdOwotCQkJCQluZXdSYXdbcmF3Lmxlbmd0aF0gPSBKYXZhQ29yZS5uZXdMaWJyYXJ5RW50cnkoYWN0dWFsUGF0aCwgbnVsbCwgbnVsbCk7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkocmF3LCAwLCBuZXdSYXcsIDAsIHJhdy5sZW5ndGgpOwotCQkJCQlwcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdSYXcsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwKSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gSXQgaXMgYSBwYXRoIHRvIGNsYXNzIGZvbGRlciwgdGhpcyB3aWxsIGJlIGR1cmluZyBkZXZlbG9wbWVudCB0aW1lLgotCQkJCQkvLyBCdXQgY2xhc3Nmb2xkZXJzIE1VU1QgZXhpc3QgaW4gdGhlIHdvcmtzcGFjZS4gSkRUIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGVtIG91dHNpZGUgd29ya3NwYWNlLAotCQkJCQkvLyBzbyB3ZSB3aWxsIGxpbmsgaXQgaW50byB0aGUgcHJvamVjdC4KLQkJCQkJSUZvbGRlciBjZiA9IHByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigibGlua2JpbiIrKCsrY2ZTdWZmaXgpKTsKLQkJCQkJY2YuY3JlYXRlTGluayhhY3R1YWxQYXRoLCAwLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEwMCkpOwotCQkJCQkvLyBDcmVhdGUgY2xhc3MgZm9sZGVyIGVudHJ5LgotCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSByYXcgPSBwcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdSYXcgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W3Jhdy5sZW5ndGgrMV07Ci0JCQkJCW5ld1Jhd1tyYXcubGVuZ3RoXSA9IEphdmFDb3JlLm5ld0xpYnJhcnlFbnRyeShjZi5nZXRGdWxsUGF0aCgpLCBudWxsLCBudWxsKTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShyYXcsIDAsIG5ld1JhdywgMCwgcmF3Lmxlbmd0aCk7Ci0JCQkJCXByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKG5ld1JhdywgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxMDApKTsKLQkJCQl9Ci0JCQl9Ci0JCX0sIHdvcmtzcGFjZS5nZXRSb290KCksIDAsIHBtKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdhaXRGb3JBdXRvQnVpbGQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlKb2JNYW5hZ2VyIGpvYk1hbmFnZXIgPSBKb2IuZ2V0Sm9iTWFuYWdlcigpOwotCQlpZiAoam9iTWFuYWdlci5maW5kKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCkubGVuZ3RoID4gMCkgewotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQl0cnkgewotCQkJCQlqb2JNYW5hZ2VyLmpvaW4oUmVzb3VyY2VzUGx1Z2luLkZBTUlMWV9BVVRPX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvSmF2YVRlc3RzUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9KYXZhVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FkNjJhZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9KYXZhVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzOwotLyoKLSAqICAkUkNTZmlsZTogSmF2YVRlc3RzUGx1Z2luLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjYgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVGVzdHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YVRlc3RzUGx1Z2luIFBMVUdJTjsKLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBKYXZhVGVzdHNQbHVnaW4oKSB7Ci0JCVBMVUdJTiA9IHRoaXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSmF2YVRlc3RzUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIFBMVUdJTjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL1VJVGVzdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9VSVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MThhNzY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL1VJVGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzOwotCi0vKioKLSAqIFRoaXMgaXMgdXNlZCB0byBtYWtlIHRoZSBKRU0gdGVzdHMgcnVuIGluIFVJIG1vZGUgaW5zdGVhZCBvZiBIRUFETEVTUyBtb2RlLAotICogZXZlbiB0aG91Z2ggYSBVSSBpcyBub3QgYXZhaWxhYmxlLiBUaGUgdGVzdHMgd2lsbCBub3JtYWxseSBuZWVkIHRoYXQgbW9kZS4KLSAqLwotcHVibGljIGNsYXNzIFVJVGVzdGVyIGltcGxlbWVudHMgb3JnLmVjbGlwc2UuamVtLnV0aWwuVUlUZXN0ZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS53dHAuY29tbW9uLlVJVGVzdGVyI2lzQ3VycmVudENvbnRleHRVSSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDdXJyZW50Q29udGV4dFVJKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2Jhc2ljL0Jhc2ljU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2Jhc2ljL0Jhc2ljU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY0ZmZiOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iYXNpYy9CYXNpY1N1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEJhc2ljU3VpdGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNi8wNS8xNyAyMDoxMzo1NiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iYXNpYzsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFQcm9qZWN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVRlc3RzUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgaXMgYmFzaWMgSkVNIHRlc3Rpbmcgbm90IGNvdmVyZWQgYnkgc3BlY2lmaWMgY29tcG9uZW50cyB0ZXN0cy4KLSAqIAotICogQGF1dGhvciByaWNoa3VscAotICoKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljU3VpdGUgZXh0ZW5kcyBUZXN0U2V0dXAgewotCi0JLy8gVGVzdCBjYXNlcyB0byBiZSBpbmNsdWRlIGluIHRoZSBzdWl0ZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIHRlc3RzTGlzdFtdID0geyBUZXN0V29ya2JlbmNoVXRpbHMxMTI2NzguY2xhc3N9OwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJhc2ljU3VpdGUoKSB7Ci0JCXRoaXMoIlRlc3QgQmFzaWMgSkVNIFN1aXRlIik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQmFzaWNTdWl0ZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuZXcgVGVzdFN1aXRlKG5hbWUpIHsKLQkJCXsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RzTGlzdC5sZW5ndGg7IGkrKykgewotCQkJCQlhZGRUZXN0U3VpdGUodGVzdHNMaXN0W2ldKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IEJhc2ljU3VpdGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0JBU0lDX1BST0pFQ1QgPSAiVGVzdCBCYXNpYyI7CS8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIGJvb2xlYW4gb2xkQXV0b0J1aWxkaW5nU3RhdGU7IC8vIGF1dG9CdWlsZGluZyBzdGF0ZSBiZWZvcmUgd2Ugc3RhcnRlZC4JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCItLSBJbml0aWFsaXppbmcgdGhlIEJhc2ljIHRlc3QgZGF0YSAtLSIpOyAvLyROT04tTkxTLTEkCi0JCW9sZEF1dG9CdWlsZGluZ1N0YXRlID0gSmF2YVByb2plY3RVdGlsLnNldEF1dG9CdWlsZCh0cnVlKTsKLQkJVVJMIGluc3RhbGxVUkwgPSBKYXZhVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLQkJU3RyaW5nW10gemlwUGF0aHMgPSBuZXcgU3RyaW5nWzFdOwotCQl6aXBQYXRoc1swXSA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChuZXcgVVJMKGluc3RhbGxVUkwsICJ0ZXN0ZGF0YS90ZXN0YmFzaWMuemlwIikpLmdldEZpbGUoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9Ci0JCQlKYXZhUHJvamVjdFV0aWwuaW1wb3J0UHJvamVjdHMoCi0JCQkJbmV3IFN0cmluZ1tdIHsgVEVTVF9CQVNJQ19QUk9KRUNUIH0sCi0JCQkJemlwUGF0aHMpOwotCQlhc3NlcnROb3ROdWxsKHByb2plY3RzWzBdKTsKLQkJSmF2YVByb2plY3RVdGlsLndhaXRGb3JBdXRvQnVpbGQoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCItLSBEYXRhIGluaXRpYWxpemVkIC0tIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlKYXZhUHJvamVjdFV0aWwuZGVsZXRlUHJvamVjdChKYXZhUHJvamVjdFV0aWwuZ2V0UHJvamVjdChURVNUX0JBU0lDX1BST0pFQ1QpKTsKLQkJCX0KLQkJfSwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgMCwgbnVsbCk7Ci0KLQkJSmF2YVByb2plY3RVdGlsLnNldEF1dG9CdWlsZChvbGRBdXRvQnVpbGRpbmdTdGF0ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iYXNpYy9UZXN0V29ya2JlbmNoVXRpbHMxMTI2NzguamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2Jhc2ljL1Rlc3RXb3JrYmVuY2hVdGlsczExMjY3OC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQzODQ4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2Jhc2ljL1Rlc3RXb3JrYmVuY2hVdGlsczExMjY3OC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RXb3JrYmVuY2hVdGlsczExMjY3OC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA1LzEwLzE0IDIwOjU3OjMwICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJhc2ljOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuV3JhcHBlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZTsKLSAKLQotLyoqCi0gKiBUZXN0IGJ1ZzogIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTI2NzgKLSAqIEBzaW5jZSAxLjIuMAotICovCi1wdWJsaWMgY2xhc3MgVGVzdFdvcmtiZW5jaFV0aWxzMTEyNjc4IGV4dGVuZHMgVGVzdENhc2UgewotCi0JLyoqCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIFRlc3RXb3JrYmVuY2hVdGlsczExMjY3OCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyBUZXN0V29ya2JlbmNoVXRpbHMxMTI2NzgoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUkVTT1VSQ0VfUEFUSCA9ICJUZXN0IEJhc2ljL3dvcmtiZW5jaFV0aWwvRmlsZVJlc291cmNlLnhtaSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0ZPVU5EX0ZJTEVfUkVTT1VSQ0VfUEFUSCA9ICJUZXN0IEJhc2ljL3dvcmtiZW5jaFV0aWwvTm9GaWxlUmVzb3VyY2UueG1pIjsKLQkKLQkvKioKLQkgKiBUZXN0IHtAbGluayBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UjZ2V0SUZpbGUoVVJJKX0gd2l0aCBwbGF0Zm9ybSByZXNvdXJjZSB1cmkuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldElGaWxlUGxhdGZvcm1SZXNvdXJjZSgpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKEZJTEVfUkVTT1VSQ0VfUEFUSCk7Ci0JCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0SUZpbGUodXJpKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWxlKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlLmV4aXN0cygpKTsKLQotCQl1cmkgPSBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSShOT1RfRk9VTkRfRklMRV9SRVNPVVJDRV9QQVRIKTsKLQkJZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRJRmlsZSh1cmkpOwotCQlhc3NlcnROb3ROdWxsKGZpbGUpOwotCQlhc3NlcnRGYWxzZShmaWxlLmV4aXN0cygpKTsKLQkJCi0JCS8vIFRlc3QgYSByZWxhdGl2ZSBmb3JtIHRoYXQgaXMgbm90IGEgdmFsaWQgcHJvamVjdC4KLQkJdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoIk5vdFByb2plY3QvZmlsZS54bWkiKTsgCQotCQlmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldElGaWxlKHVyaSk7Ci0JCWFzc2VydE51bGwoZmlsZSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB7QGxpbmsgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlI2dldElGaWxlKFVSSSl9IHdpdGggYSByZWxhdGl2ZSB1cmkgKGUuZy4gInByb2plY3QvZmlsZSIpLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRJRmlsZVByb2plY3RSZWxhdGl2ZVJlc291cmNlKCkgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShGSUxFX1JFU09VUkNFX1BBVEgpOwotCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldElGaWxlKHVyaSk7Ci0JCWFzc2VydE5vdE51bGwoZmlsZSk7Ci0JCWFzc2VydFRydWUoZmlsZS5leGlzdHMoKSk7Ci0KLQkJdXJpID0gVVJJLmNyZWF0ZVVSSShOT1RfRk9VTkRfRklMRV9SRVNPVVJDRV9QQVRIKTsKLQkJZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRJRmlsZSh1cmkpOwotCQlhc3NlcnROb3ROdWxsKGZpbGUpOwotCQlhc3NlcnRGYWxzZShmaWxlLmV4aXN0cygpKTsKLQkJCi0JCS8vIFRlc3QgYSByZWxhdGl2ZSBmb3JtIHRoYXQgaXMgbm90IGEgdmFsaWQgcHJvamVjdC4KLQkJdXJpID0gVVJJLmNyZWF0ZVVSSSgiTm90UHJvamVjdC9maWxlLnhtaSIpOyAJCi0JCWZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0SUZpbGUodXJpKTsKLQkJYXNzZXJ0TnVsbChmaWxlKTsKLQkJCi0JfQotCQotCS8qKgotCSAqIFRlc3Qge0BsaW5rIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZSNnZXRJRmlsZShVUkkpfSB3aXRoIGEgbm9uLXBsYXRmb3JtIHJlc291cmNlIHVyaS4KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4yLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SUZpbGVOb3RQbGF0Zm9ybVJlc291cmNlKCkgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSSgicGxhdGZvcm06L3BsdWdpbi94eXovYWJjIik7Ci0JCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0SUZpbGUodXJpKTsKLQkJYXNzZXJ0TnVsbChmaWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB7QGxpbmsgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlI2dldFJlc291cmNlKFVSSSl9IHdpdGggYSBwbGF0Zm9ybSByZXNvdXJjZSB1cmkuCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldFJlc291cmNlUGxhdGZvcm1SZXNvdXJjZSgpIHsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKEZJTEVfUkVTT1VSQ0VfUEFUSCk7Ci0JCVJlc291cmNlIHJlcyA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5nZXRSZXNvdXJjZSh1cmkpOwotCQlhc3NlcnROb3ROdWxsKHJlcyk7Ci0JCWFzc2VydFRydWUocmVzLmlzTG9hZGVkKCkpOwotCQkKLQkJdXJpID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoTk9UX0ZPVU5EX0ZJTEVfUkVTT1VSQ0VfUEFUSCk7Ci0JCWJvb2xlYW4gZ29vZCA9IGZhbHNlOwotCQl0cnkgewotCQkJcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlKHVyaSk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZSkgewotCQkJZ29vZCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShnb29kKTsKLQotCQkvLyBUZXN0IGEgcmVsYXRpdmUgZm9ybSB0aGF0IGlzIG5vdCBhIHZhbGlkIHByb2plY3QuCi0JCXVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKCJOb3RQcm9qZWN0L2ZpbGUueG1pIik7IAkKLQkJcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlKHVyaSk7Ci0JCWFzc2VydE51bGwocmVzKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdCB7QGxpbmsgV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlI2dldFJlc291cmNlKFVSSSl9IHdpdGggYSByZWxhdGl2ZSB1cmkgKGUuZy4gInByb2plY3QvZmlsZSIpLgotCSAqIAotCSAqIAotCSAqIEBzaW5jZSAxLjIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXNvdXJjZVByb2plY3RSZWxhdGl2ZVJlc291cmNlKCkgewotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShGSUxFX1JFU09VUkNFX1BBVEgpOwotCQlSZXNvdXJjZSByZXMgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UodXJpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXMpOwotCQlhc3NlcnRUcnVlKHJlcy5pc0xvYWRlZCgpKTsKLQkJCi0JCWJvb2xlYW4gZ29vZCA9IGZhbHNlOwotCQl1cmkgPSBVUkkuY3JlYXRlVVJJKE5PVF9GT1VORF9GSUxFX1JFU09VUkNFX1BBVEgpOwotCQl0cnkgewotCQkJcmVzID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlLmdldFJlc291cmNlKHVyaSk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gZSkgewotCQkJZ29vZCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShnb29kKTsKLQotCQkvLyBUZXN0IGEgcmVsYXRpdmUgZm9ybSB0aGF0IGlzIG5vdCBhIHZhbGlkIHByb2plY3QuCi0JCXVyaSA9IFVSSS5jcmVhdGVVUkkoIk5vdFByb2plY3QvZmlsZS54bWkiKTsgCQotCQlyZXMgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlckJhc2UuZ2V0UmVzb3VyY2UodXJpKTsKLQkJYXNzZXJ0TnVsbChyZXMpOwotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL0Fic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNGQyOGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbzsKLS8qCi0gKiAgJFJDU2ZpbGU6IEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLkltcGxpY2l0SXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVByb2plY3RVdGlsOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBCZWFuaW5mb05hdHVyZSBuYXR1cmU7Ci0JcHJvdGVjdGVkIFJlc291cmNlU2V0IHJzZXQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyAKLQkJVEVTVF9CRUFOSU5GT19QUk9KRUNUID0gIlRlc3QgQmVhbkluZm8iLAkvLyROT04tTkxTLTEkCi0JCVRFU1RfQkVBTklORk9fQkVBTklORk9TX1BST0pFQ1QgPSAiVGVzdCBCZWFuSW5mbyBCZWFuSW5mb3MiLCAvLyROT04tTkxTLTEkCi0JCVRFU1RfQkVBTklORk9fUFJFUkVRX1BST0pFQ1QgPSAiVGVzdCBCZWFuSW5mbyBQcmVyZXEiOyAvLyROT04tTkxTLTEkCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCUlQcm9qZWN0IGJpUHJvamVjdCA9IEphdmFQcm9qZWN0VXRpbC5nZXRQcm9qZWN0KFRFU1RfQkVBTklORk9fUFJPSkVDVCk7Ci0JCWFzc2VydE5vdE51bGwoYmlQcm9qZWN0KTsgCi0JCW5hdHVyZSA9IEJlYW5pbmZvTmF0dXJlLmdldFJ1bnRpbWUoYmlQcm9qZWN0KTsKLQkJYXNzZXJ0Tm90TnVsbChuYXR1cmUpOwotCQlyc2V0ID0gbmF0dXJlLmdldFJlc291cmNlU2V0KCk7Ci0JCWFzc2VydE5vdE51bGwocnNldCk7Ci0JCS8vIFdlIGFsc28gd2FudCB0byByZW1vdmUgYW55IGJlYW5pbmZvcyBmcm9tIHRoZSBzZWFyY2ggcGF0aCB0aGF0IGFyZW4ndCBmcm9tIHRlc3Rpbmcgc28gdGhhdCB3ZSBkb24ndCBnZXQgYW55IHdlaXJkIHNpZGUtZWZmZWN0cy4KLQkJUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSBuYXR1cmUuZ2V0UmVnaXN0cnkoKTsKLQkJSUFycmF5QmVhblByb3h5IHNwID0gVXRpbGl0aWVzLmdldEJlYW5JbmZvU2VhcmNoUGF0aChyZWdpc3RyeSk7Ci0JCS8vIHJlbW92ZSBhbnkgdGhhdCBkb24ndCBzdGFydCB3aXRoIG9yZy5lY2xpcHNlLmplbS50ZXN0cy4KLQkJaW50IGxlbiA9IHNwLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlTdHJpbmcgcGF0aCA9ICgoSVN0cmluZ0JlYW5Qcm94eSkgc3AuZ2V0KGkpKS5zdHJpbmdWYWx1ZSgpOwotCQkJaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLmplbS50ZXN0cyIpKQotCQkJCVV0aWxpdGllcy5yZW1vdmVCZWFuSW5mb1BhdGgocmVnaXN0cnksIHBhdGgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgb2JqRmVhdHVyZXMsIG9iak5vblByb3BlcnRpZXM7CS8vIE9iamVjdCBmZWF0dXJlcyBjb3VudCBhbmQgT2JqZWN0IG5vbi1wcm9wZXJ0aWVzIGNvdW50LiBUaGlzIGlzIG9ubHkgaW5pdGlhbGl6ZWQgYXMgbmVlZGVkLgotCXByb3RlY3RlZCBTZXQgb2JqRmVhdHVyZXNTZXQ7Ci0JLyoqCi0JICogVG8gaW5pdGlhbGl6ZSB0aGUgb2JqRmVhdHVyZXMgYW5kIG9iak5vblByb3BlcnRpZXMgY291bnRzIHdoZW4gbmVjZXNzYXJ5LiBOb3QgbmVlZGVkIGZvciBhbGwgdGVzdHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2JqRmVhdHVyZXNTZXR1cCgpIHsKLQkJLy8gR2V0IHRoZSBudW1iZXIgb2YgZmVhdHVyZXMgdGhhdCBqYXZhLmxhbmcuT2JqZWN0IGhhczoKLQkJSmF2YUNsYXNzIG9iakNsYXNzID0gKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L2phdmEubGFuZyNPYmplY3QiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJb2JqRmVhdHVyZXNTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlvYmpGZWF0dXJlcyA9IG9iakNsYXNzLmdldFByb3BlcnRpZXMoKS5zaXplKCk7Ci0JCS8vIEZpbmQgdGhlIG51bWJlciBvZiBhbHdheXMgaW5oZXJpdGVkIHByb3BlcnRpZXMuCi0JCW9iak5vblByb3BlcnRpZXMgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0cjAgPSBvYmpDbGFzcy5nZXRQcm9wZXJ0aWVzKCkuaXRlcmF0b3IoKTsgaXRyMC5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgcCA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0cjAubmV4dCgpOwotCQkJb2JqRmVhdHVyZXNTZXQuYWRkKHApOwotCQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IocCk7Ci0JCQlpZiAoIHBkID09IG51bGwgfHwgKHBkLmdldEltcGxpY2l0RGVjb3JhdG9yRmxhZygpID09IEltcGxpY2l0SXRlbS5OT1RfSU1QTElDSVRfTElURVJBTCAmJiAhcGQuaXNNZXJnZUludHJvc3BlY3Rpb24oKSkpCi0JCQkJb2JqTm9uUHJvcGVydGllcysrOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9CZWFuSW5mb1N1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9CZWFuSW5mb1N1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZmJiZGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vQmVhbkluZm9TdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm87Ci0vKgotICogICRSQ1NmaWxlOiBCZWFuSW5mb1N1aXRlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEzICQgICREYXRlOiAyMDA3LzAzLzE0IDE3OjI2OjU5ICQgCi0gKi8KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5leHRlbnNpb25zLlRlc3RTZXR1cDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5CZWFuaW5mb05hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVByb2plY3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhVGVzdHNQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICoKLSAqIFRoaXMgaXMgdGhlIHRydWUgdGVzdCBzdWl0ZSBmb3IgQmVhbmluZm8gVGVzdGluZy4KLSAqLwotcHVibGljIGNsYXNzIEJlYW5JbmZvU3VpdGUgZXh0ZW5kcyBUZXN0U2V0dXAgewotCi0JLy8gVGVzdCBjYXNlcyB0byBiZSBpbmNsdWRlIGluIHRoZSBzdWl0ZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzIHRlc3RzTGlzdFtdID0KLQkJeyBUZXN0UmVmbGVjdGlvbi5jbGFzcywgLy8gTk9URTogVGhpcyBvbmUgbXVzdCBhbHdheXMgYmUgZmlyc3QgYmVjYXVzZSBpdCBkb2VzIHNvbWUgdGVzdHMgdGhhdCBkZXBlbmQgb24gdGhpcy4KLQkJVGVzdFN0YW5kYXJkLmNsYXNzLCAvKlRlc3RBV1RTd2luZ1VJLmNsYXNzKi8gfTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBCZWFuSW5mb1N1aXRlLgotCSAqLwotCXB1YmxpYyBCZWFuSW5mb1N1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5ldyBUZXN0U3VpdGUobmFtZSkgewotCQkJewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdHNMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFkZFRlc3RTdWl0ZSh0ZXN0c0xpc3RbaV0pOwotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEJlYW5JbmZvU3VpdGUoKSB7Ci0JCXRoaXMoIlRlc3QgQmVhbkluZm8gU3VpdGUiKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgQmVhbkluZm9TdWl0ZSgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBvbGRBdXRvQnVpbGRpbmdTdGF0ZTsgLy8gYXV0b0J1aWxkaW5nIHN0YXRlIGJlZm9yZSB3ZSBzdGFydGVkLgotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gSW5pdGlhbGl6aW5nIHRoZSBCZWFuSW5mbyB0ZXN0IGRhdGEgLS0iKTsgLy8kTk9OLU5MUy0xJAotCQlvbGRBdXRvQnVpbGRpbmdTdGF0ZSA9IEphdmFQcm9qZWN0VXRpbC5zZXRBdXRvQnVpbGQodHJ1ZSk7Ci0JCVVSTCBpbnN0YWxsVVJMID0gSmF2YVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7Ci0JCVN0cmluZ1tdIHppcFBhdGhzID0gbmV3IFN0cmluZ1szXTsKLQkJemlwUGF0aHNbMF0gPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwobmV3IFVSTChpbnN0YWxsVVJMLCAidGVzdGRhdGEvdGVzdGJlYW5pbmZvLnppcCIpKS5nZXRGaWxlKCk7Ci0JCXppcFBhdGhzWzFdID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKG5ldyBVUkwoaW5zdGFsbFVSTCwgInRlc3RkYXRhL3Rlc3RiZWFuaW5mb2JlYW5pbmZvcy56aXAiKSkuZ2V0RmlsZSgpOwotCQl6aXBQYXRoc1syXSA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChuZXcgVVJMKGluc3RhbGxVUkwsICJ0ZXN0ZGF0YS90ZXN0YmVhbmluZm9wcmVxLnppcCIpKS5nZXRGaWxlKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPQotCQkJSmF2YVByb2plY3RVdGlsLmltcG9ydFByb2plY3RzKAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCUFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5URVNUX0JFQU5JTkZPX1BST0pFQ1QsCi0JCQkJCUFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5URVNUX0JFQU5JTkZPX0JFQU5JTkZPU19QUk9KRUNULAotCQkJCQlBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUkVSRVFfUFJPSkVDVCB9LAotCQkJCXppcFBhdGhzKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm9qZWN0c1swXSk7Ci0JCWFzc2VydE5vdE51bGwocHJvamVjdHNbMV0pOwotCQlhc3NlcnROb3ROdWxsKHByb2plY3RzWzJdKTsKLQkJSmF2YVByb2plY3RVdGlsLndhaXRGb3JBdXRvQnVpbGQoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCItLSBEYXRhIGluaXRpYWxpemVkIC0tIik7IC8vJE5PTi1OTFMtMSQKLQotCQlCZWFuaW5mb05hdHVyZSBuYXR1cmUgPSBCZWFuaW5mb05hdHVyZS5nZXRSdW50aW1lKHByb2plY3RzWzBdKTsKLQkJYXNzZXJ0Tm90TnVsbChuYXR1cmUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlKYXZhUHJvamVjdFV0aWwuZGVsZXRlUHJvamVjdChKYXZhUHJvamVjdFV0aWwuZ2V0UHJvamVjdChBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUk9KRUNUKSk7Ci0JCQkJSmF2YVByb2plY3RVdGlsLmRlbGV0ZVByb2plY3QoSmF2YVByb2plY3RVdGlsLmdldFByb2plY3QoQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLlRFU1RfQkVBTklORk9fQkVBTklORk9TX1BST0pFQ1QpKTsKLQkJCQlKYXZhUHJvamVjdFV0aWwuZGVsZXRlUHJvamVjdChKYXZhUHJvamVjdFV0aWwuZ2V0UHJvamVjdChBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUkVSRVFfUFJPSkVDVCkpOwotCQkJfQotCQl9LCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCAwLCBudWxsKTsKLQotCQlKYXZhUHJvamVjdFV0aWwuc2V0QXV0b0J1aWxkKG9sZEF1dG9CdWlsZGluZ1N0YXRlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL1Rlc3RBV1RTd2luZ1VJLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9UZXN0QVdUU3dpbmdVSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjlhNTA0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL1Rlc3RBV1RTd2luZ1VJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm87Ci0vKgotICogICRSQ1NmaWxlOiBUZXN0QVdUU3dpbmdVSS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS44ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU1ICQgCi0gKi8KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLk1ldGhvZFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5Qcm9wZXJ0eURlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhVGVzdHNQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICoKLSAqIEFXVC9Td2luZyB0ZXN0cwotICovCi1wdWJsaWMgY2xhc3MgVGVzdEFXVFN3aW5nVUkgZXh0ZW5kcyBBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFRlc3RBV1RTd2luZ1VJKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFRlc3RBV1RTd2luZ1VJKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvKgotCSAqIFRoZSBudW1iZXIgb2YgcHJvcGVydGllcyBrZWVwIGluY3JlYXNpbmcgYnkgdmVyc2lvbiwKLQkgKiBidXQgdGhlcmUgaXMgYSBtaW5pbWFsIHNldC4gVGhpcyBtaW5pbWFsIHNldCB3aWxsIGJlCi0JICogc3RvcmVkIGluIGEgZmlsZSBhbmQgY2FuIGJlIGxvYWRlZCBieSB0aGlzIG1ldGhvZC4KLQkgKiBUaGlzIHNldCBjYW4gYmUgdXNlZCB0byBtYWtlIHN1cmUgdGhhdCBhdCBsZWFzdCB0aGUKLQkgKiByZXF1aXJlZCBwcm9wZXJ0aWVzIGFyZSB0aGVyZS4KLQkgKiAKLQkgKiBUaGUgZmlsZW5hbWUgaGFzIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSB0ZXN0cyBwbHVnaW4uCi0JICovCi0JcHJvdGVjdGVkIFNldCBnZXROYW1lcyhTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVNldCBuYW1lcyA9IG5ldyBIYXNoU2V0KDUwKTsKLQkJVVJMIHVybCA9IEphdmFUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRFbnRyeShmaWxlbmFtZSk7Ci0JCWFzc2VydE5vdE51bGwodXJsKTsKLQkJQnVmZmVyZWRSZWFkZXIgcmRyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcih1cmwub3BlblN0cmVhbSgpKSk7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbGluZSA9IG51bGw7Ci0JCQl3aGlsZSAoKGxpbmUgPSByZHIucmVhZExpbmUoKSkgIT0gbnVsbCkKLQkJCQluYW1lcy5hZGQobGluZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZHIuY2xvc2UoKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCQotCS8qCi0JICogVGVzdCB0aGUgbmFtZXMgYWdhaW5zdCB0aGUgc2V0LiBQcmludCB0aG9zZSBub3QgZm91bmQgaW4gdGhlIHNldCwgCi0JICogb3IgdGhvc2UgaW4gdGhlIGFnYWluc3RTZXQgdGhhdCB3ZXJlbid0IGZvdW5kLiBUaHJvdyBhc3NlcnQgZXJyb3IgaWYKLQkgKiBhbnkgZnJvbSBhZ2FpbnN0IHNldCBub3QgZm91bmQuIAotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlc3RJbmNsdWRlc0FsbE5hbWVzKFN0cmluZyBpZCwgTGlzdCB0ZXN0TmFtZXMsIFNldCBhZ2FpbnN0U2V0LCBTZXQgZXhjbHVkZSkgewotCQlTZXQgd29ya2luZ0FnYWluc3QgPSBuZXcgSGFzaFNldChhZ2FpbnN0U2V0LnNpemUoKSk7Ci0JCXdvcmtpbmdBZ2FpbnN0LmFkZEFsbChhZ2FpbnN0U2V0KTsJLy8gVGhlcmUgbWF5IGJlIGR1cCB0ZXN0TmFtZXMgKGxpa2UgZm9yIG9wZXJhdGlvbnMpLCBzbyBpbiB0aGF0IGNhc2Ugd2UgbGVhdmUgYWdhaW5zdFNldCBhbG9uZS4KLQkJYm9vbGVhbiB3cm90ZUFueSA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHRlc3ROYW1lcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJRU5hbWVkRWxlbWVudCB0ZXN0TmFtZSA9IChFTmFtZWRFbGVtZW50KSBpdHIubmV4dCgpOwotCQkJaWYgKGV4Y2x1ZGUuY29udGFpbnModGVzdE5hbWUpKQotCQkJCWNvbnRpbnVlOwkvLyBUaGlzIGlzIG9uZSB3ZSB3YW50IHRvIGlnbm9yZQotCQkJaWYgKGFnYWluc3RTZXQuY29udGFpbnModGVzdE5hbWUuZ2V0TmFtZSgpKSkKLQkJCQl3b3JraW5nQWdhaW5zdC5yZW1vdmUodGVzdE5hbWUuZ2V0TmFtZSgpKTsJLy8gR2V0IHJpZCBvZiBpdCBzaW5jZSBmb3VuZC4KLQkJCWVsc2UgewotCQkJCWlmICghd3JvdGVBbnkpIHsKLQkJCQkJd3JvdGVBbnkgPSB0cnVlOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5hbWVzIGluIGxpc3QgdGhhdCBhcmUgbmV3IGZvciAiICsgaWQgKyAnOicpOwotCQkJCX0KLQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgICIpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0TmFtZS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JCWlmICh3cm90ZUFueSkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRW5kIG9mIG5ldyBuYW1lcy4iKTsKLQkJCi0JCWlmICghd29ya2luZ0FnYWluc3QuaXNFbXB0eSgpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5hbWVzIHRoYXQgc2hvdWxkIG9mIGJlZW4gZm91bmQsIGJ1dCB3ZXJlbid0IGZvciAiICsgaWQgKyAnOicpOwotCQkJZm9yIChJdGVyYXRvciBpdHIgPSB3b3JraW5nQWdhaW5zdC5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgaXRyLm5leHQoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgICIpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihuYW1lKTsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRW5kIG9mIG1pc3NpbmcgbmFtZXMiKTsKLQkJCWZhaWwoIk1pc3Npbmcgc29tZSByZXF1aXJlZCBuYW1lcyBmb3IgIitpZCsnLicpOwotCQl9Ci0JfQotCQotCS8qCi0JICogV3JpdGUgdGhlIG5hbWVzIG91dC4gQ2FsbCBvbmx5IHdoZW4gd2FudCB0byB1cGRhdGUgbGlzdC4gRmlsZW5hbWUgbXVzdAotCSAqIGJlIGEgbG9jYWwgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZU5hbWVzKFN0cmluZyBmaWxlbmFtZSwgTGlzdCBwcm9wcywgU2V0IGV4Y2x1ZGluZykgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCVByaW50V3JpdGVyIHByID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGVuYW1lKSk7Ci0JCXRyeSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHByb3BzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQkJRU5hbWVkRWxlbWVudCBlbGVtZW50ID0gKEVOYW1lZEVsZW1lbnQpIGl0ci5uZXh0KCk7Ci0JCQkJaWYgKGV4Y2x1ZGluZyAhPSBudWxsICYmIGV4Y2x1ZGluZy5jb250YWlucyhlbGVtZW50KSkKLQkJCQkJY29udGludWU7Ci0JCQkJcHIucHJpbnRsbihlbGVtZW50LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlwci5jbG9zZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlZmxlY3QgdGhlIGVudGlyZSBzdXBlciB0eXBlIGhpZXJhcmNoeSBvZiB0aGUgY2xhc3MgcGFzc2VkIGluLCBpbmNsdWRpbmcgdGhlIGNsYXNzIGl0c2VsZi4KLQkgKiBAcGFyYW0gamNsYXNzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmbGVjdEhpZXJhY2h5KEphdmFDbGFzcyBqY2xhc3MpIHsKLQkJSmF2YUNsYXNzIGxvb3BDbGFzcyA9IGpjbGFzczsKLQkJd2hpbGUgKGxvb3BDbGFzcyAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlZmxlY3RpbmcgZm9yICIgKyBsb29wQ2xhc3MuZ2V0UXVhbGlmaWVkTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJbG9vcENsYXNzLmlzRmluYWwoKTsgLy8gVGhpcyBjYXVzZXMgcmVmbGVjdGlvbi4KLQkJCWxvb3BDbGFzcyA9IGxvb3BDbGFzcy5nZXRTdXBlcnR5cGUoKTsKLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIFVzZSB3aGVuIHRoZSBjb21wYXJlcyBkb24ndCBtYXRjaCB0byBnZXQgYSBzb3J0ZWQgbGlzdCBvZiBvcGVyYXRpb25zIHNvIHRoYXQKLQkgKiBtYW51YWxseSB2ZXJpZnkgdGhlIGNvdW50LgotCSAqIEBwYXJhbSBqY2xhc3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U29ydGVkT3BlcmF0aW9ucyhKYXZhQ2xhc3MgamNsYXNzKSB7Ci0JCQkgTGlzdCBhbGxCID0gamNsYXNzLmdldEVBbGxPcGVyYXRpb25zKCk7Ci0JCQkgU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW2FsbEIuc2l6ZSgpXTsKLQkJCSBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJIG5hbWVzW2ldID0gKChNZXRob2RQcm94eSkgYWxsQi5nZXQoaSkpLmdldE1ldGhvZCgpLmdldE1ldGhvZEVsZW1lbnRTaWduYXR1cmUoKTsKLQkJCSB9Ci0JCQkgQXJyYXlzLnNvcnQobmFtZXMpOwotCQkJIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tIExpc3Qgb2YgT3BlcmF0aW9ucyBmb3IgIiArIGpjbGFzcy50b1N0cmluZygpKTsKLQkJCSBmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJIFN5c3RlbS5vdXQucHJpbnRsbihuYW1lc1tpXSk7Ci0JCQkgfQkJCi0JfQotCQotCS8qKgotCSAqIFVzZSB3aGVuIHRoZSBjb21wYXJlcyBkb24ndCBtYXRjaCB0byBnZXQgYSBzb3J0ZWQgbGlzdCBvZiBwcm9wZXJ0aWVzIHNvIHRoYXQKLQkgKiBtYW51YWxseSB2ZXJpZnkgdGhlIGNvdW50LgotCSAqIEBwYXJhbSBqY2xhc3MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzaG93U29ydGVkUHJvcGVydGllcyhKYXZhQ2xhc3MgamNsYXNzKSB7Ci0JCUxpc3QgYWxsUCA9IGpjbGFzcy5nZXRBbGxQcm9wZXJ0aWVzKCk7Ci0JCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1thbGxQLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCW5hbWVzW2ldID0gKChFU3RydWN0dXJhbEZlYXR1cmUpIGFsbFAuZ2V0KGkpKS5nZXROYW1lKCk7Ci0JCX0KLQkJQXJyYXlzLnNvcnQobmFtZXMpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLSBMaXN0IG9mIHByb3BlcnRpZXMgZm9yICIgKyBqY2xhc3MudG9TdHJpbmcoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihuYW1lc1tpXSk7Ci0JCX0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldEJ1dHRvbigpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9qYXZhLmF3dCNCdXR0b24iKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldEpMYWJlbCgpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9qYXZheC5zd2luZyNKTGFiZWwiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEV4dGVybmFsSmFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJb2JqRmVhdHVyZXNTZXR1cCgpOwotCQkKLQkJLy8gVGhpcyB0ZXN0cyBnZXR0aW5nIGJlYW5pbmZvIG91dCBvZiBqYXIuIFRoZSBqYXIgaXMgd2l0aGluIHRoZSBwcm9qZWN0LiBJdCBjb250YWlucyBCdXR0b25CZWFuSW5mby4KLQkJSmF2YUNsYXNzIGJ1dHRvbiA9IGdldEJ1dHRvbigpOwotCQlyZWZsZWN0SGllcmFjaHkoYnV0dG9uKTsJLy8gRmlyc3QgcmVmbGVjdCBhbGwgcGFyZW50cyAobm90IGludHJvc3BlY3QpLgotCQkvLyBOb3cgY2F1c2UgaW50cm9zcGVjdGlvbi4KLQkJCi0JCS8vIFRvIHdyaXRlIG91dCB0aGUgbmFtZXMgaWYgd2FudCBuZXcgc2V0LgotLy8JCXdyaXRlTmFtZXMoImQ6L3RlbXAvZXh0amFycHJvcHMudHh0IiwgYnV0dG9uLmdldEFsbFByb3BlcnRpZXMoKSwgb2JqRmVhdHVyZXNTZXQpOwkJCi0JCQotCQlTZXQgbmFtZXMgPSBnZXROYW1lcygidGVzdGRhdGEvZXh0amFycHJvcHMudHh0Iik7Ci0JCXRlc3RJbmNsdWRlc0FsbE5hbWVzKCJCdXR0b24iLCBidXR0b24uZ2V0QWxsUHJvcGVydGllcygpLCBuYW1lcywgb2JqRmVhdHVyZXNTZXQpOwotCi0JCS8vIFRvIHdyaXRlIG91dCB0aGUgbmFtZXMgaWYgd2FudCBuZXcgc2V0LgotLy8JCXdyaXRlTmFtZXMoImQ6L3RlbXAvZXh0amFyb3BzLnR4dCIsIGJ1dHRvbi5nZXRFT3BlcmF0aW9ucygpLCBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOwkJCi0JCQotCQluYW1lcyA9IGdldE5hbWVzKCJ0ZXN0ZGF0YS9leHRqYXJvcHMudHh0Iik7Ci0JCXRlc3RJbmNsdWRlc0FsbE5hbWVzKCJCdXR0b24iLCBidXR0b24uZ2V0RU9wZXJhdGlvbnMoKSwgbmFtZXMsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7Ci0JCQotLy8JCXNob3dTb3J0ZWRQcm9wZXJ0aWVzKGJ1dHRvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKTGFiZWwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlvYmpGZWF0dXJlc1NldHVwKCk7Ci0JCQotCQkvLyBUaGlzIHRlc3RzIEpMYWJlbCBiZWFuaW5mbyBvdXQgb2YgY3VycmVudCBwcm9qZWN0LCBidXQgdGhyb3VnaCBzZWFyY2ggcGF0aC4KLQkJSmF2YUNsYXNzIGpsYWJlbCA9IGdldEpMYWJlbCgpOwotCQlyZWZsZWN0SGllcmFjaHkoamxhYmVsKTsJLy8gRmlyc3QgcmVmbGVjdCBhbGwgcGFyZW50cyAobm90IGludHJvc3BlY3QpLgotCQkvLyBOb3cgY2F1c2UgaW50cm9zcGVjdGlvbi4KLQkKLQkJLy8gVG8gd3JpdGUgb3V0IHRoZSBuYW1lcyBpZiB3YW50IG5ldyBzZXQuCi0vLwkJd3JpdGVOYW1lcygiZDovdGVtcC9qbGFiZWxwcm9wcy50eHQiLCBqbGFiZWwuZ2V0QWxsUHJvcGVydGllcygpLCBvYmpGZWF0dXJlc1NldCk7Ci0JCQotCQlTZXQgbmFtZXMgPSBnZXROYW1lcygidGVzdGRhdGEvamxhYmVscHJvcHMudHh0Iik7Ci0JCXRlc3RJbmNsdWRlc0FsbE5hbWVzKCJKTGFiZWwiLCBqbGFiZWwuZ2V0QWxsUHJvcGVydGllcygpLCBuYW1lcywgb2JqRmVhdHVyZXNTZXQpOwotCQkKLQkJLy8gVG8gd3JpdGUgb3V0IHRoZSBuYW1lcyBpZiB3YW50IG5ldyBzZXQuCi0vLwkJd3JpdGVOYW1lcygiZDovdGVtcC9qbGFiZWxvcHMudHh0IiwgamxhYmVsLmdldEVBbGxPcGVyYXRpb25zKCksIENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7CQkKLQotCQluYW1lcyA9IGdldE5hbWVzKCJ0ZXN0ZGF0YS9qbGFiZWxvcHMudHh0Iik7Ci0JCXRlc3RJbmNsdWRlc0FsbE5hbWVzKCJKTGFiZWwiLCBqbGFiZWwuZ2V0RUFsbE9wZXJhdGlvbnMoKSwgbmFtZXMsIENvbGxlY3Rpb25zLkVNUFRZX1NFVCk7Ci0JCQotLy8JCXNob3dTb3J0ZWRQcm9wZXJ0aWVzKGpsYWJlbCk7Ci0vLwkJc2hvd1NvcnRlZE9wZXJhdGlvbnMoamxhYmVsKTsKLQkJCi0JCS8vIFRlc3QgdGhhdCBpc1ByZWZlcnJlZCB3b3JrcyBib3RoIGZvciAxLjMgSlZNIGFuZCAxLjQgYW5kIGxhdGVyIHNpbmNlIHRoZXJlIHdhcyBhIGJ1ZyBpbiAxLjMuCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlbmFibGVkU0YgPSBqbGFiZWwuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJlbmFibGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IoZW5hYmxlZFNGKTsKLQkJYXNzZXJ0VHJ1ZShwZC5pc1ByZWZlcnJlZCgpKTsKLQl9Ci0JCi0JLyoKLQkgKiBBdCB0aW1lIG9mIHRoaXMgdGVzdCBjcmVhdGlvbiwgdGhpcyBpcyB0aGUgc29ydGVkIGxpc3RzIGZvciBjb21wYXJpc29uIHB1cnBvc2VzLgotCSAqIAotCQktLS0gTGlzdCBvZiBwcm9wZXJ0aWVzIGZvciBqYXZhLmF3dC5CdXR0b24KLQkJYWN0aW9uQ29tbWFuZAotCQlhbGlnbm1lbnRYCi0JCWFsaWdubWVudFkKLQkJYmFja2dyb3VuZAotCQlib3VuZHMKLQkJY2xhc3MKLQkJY29sb3JNb2RlbAotCQljb21wb25lbnRPcmllbnRhdGlvbgotCQljdXJzb3IKLQkJZW5hYmxlZAotCQlldmVudHMKLQkJZm9jdXNUcmF2ZXJzYWJsZQotCQlmb250Ci0JCWZvcmVncm91bmQKLQkJZ3JhcGhpY3MKLQkJaW1wbGljaXQKLQkJaW5pdGlhbGl6YXRpb25TdHJpbmcKLQkJaW5zdGFudGlhdGVVc2luZwotCQlsYWJlbAotCQlsb2NhbGUKLQkJbG9jYXRpb24KLQkJbG9jYXRpb25PblNjcmVlbgotCQltYXhpbXVtU2l6ZQotCQltaW5pbXVtU2l6ZQotCQluYW1lCi0JCXBhcmVudAotCQlwcmVmZXJyZWRTaXplCi0JCXNlcmlhbGl6ZURhdGEKLQkJc2hvd2luZwotCQlzaXplCi0JCXRvb2xraXQKLQkJdHJlZUxvY2sKLQkJdmFsaWQKLQkJdmlzaWJsZQotCQkKLQkJLS0tIExpc3Qgb2YgcHJvcGVydGllcyBmb3IgamF2YXguc3dpbmcuSkxhYmVsCi0JCWFsaWdubWVudFgKLQkJYWxpZ25tZW50WQotCQlhdXRvc2Nyb2xscwotCQliYWNrZ3JvdW5kCi0JCWJvcmRlcgotCQlib3VuZHMKLQkJY2xhc3MKLQkJY29sb3JNb2RlbAotCQljb21wb25lbnRDb3VudAotCQljb21wb25lbnRPcmllbnRhdGlvbgotCQljb21wb25lbnRzCi0JCWN1cnNvcgotCQlkZWJ1Z0dyYXBoaWNzT3B0aW9ucwotCQlkaXNhYmxlZEljb24KLQkJZGlzcGxheWVkTW5lbW9uaWMKLQkJZG91YmxlQnVmZmVyZWQKLQkJZW5hYmxlZAotCQlldmVudHMKLQkJZm9jdXNDeWNsZVJvb3QKLQkJZm9jdXNUcmF2ZXJzYWJsZQotCQlmb250Ci0JCWZvcmVncm91bmQKLQkJZ3JhcGhpY3MKLQkJaGVpZ2h0Ci0JCWhvcml6b250YWxBbGlnbm1lbnQKLQkJaG9yaXpvbnRhbFRleHRQb3NpdGlvbgotCQlpY29uCi0JCWljb25UZXh0R2FwCi0JCWltcGxpY2l0Ci0JCWluaXRpYWxpemF0aW9uU3RyaW5nCi0JCWluc2V0cwotCQlpbnN0YW50aWF0ZVVzaW5nCi0JCWxhYmVsRm9yCi0JCWxheW91dAotCQlsb2NhbGUKLQkJbG9jYXRpb24KLQkJbG9jYXRpb25PblNjcmVlbgotCQltYW5hZ2luZ0ZvY3VzCi0JCW1heGltdW1TaXplCi0JCW1pbmltdW1TaXplCi0JCW5hbWUKLQkJbmV4dEZvY3VzYWJsZUNvbXBvbmVudAotCQlvcGFxdWUKLQkJb3B0aW1pemVkRHJhd2luZ0VuYWJsZWQKLQkJcGFpbnRpbmdUaWxlCi0JCXBhcmVudAotCQlwcmVmZXJyZWRTaXplCi0JCXJlZ2lzdGVyZWRLZXlTdHJva2VzCi0JCXJlcXVlc3RGb2N1c0VuYWJsZWQKLQkJcm9vdFBhbmUKLQkJc2VyaWFsaXplRGF0YQotCQlzaG93aW5nCi0JCXNpemUKLQkJdGV4dAotCQl0b29sVGlwVGV4dAotCQl0b29sa2l0Ci0JCXRvcExldmVsQW5jZXN0b3IKLQkJdHJlZUxvY2sKLQkJdmFsaWQKLQkJdmFsaWRhdGVSb290Ci0JCXZlcnRpY2FsQWxpZ25tZW50Ci0JCXZlcnRpY2FsVGV4dFBvc2l0aW9uCi0JCXZpc2libGUKLQkJdmlzaWJsZVJlY3QKLQkJd2lkdGgKLQkJeAotCQl5Ci0JCi0JCS0tLSBMaXN0IG9mIE9wZXJhdGlvbnMgZm9yIGphdmF4LnN3aW5nLkpMYWJlbAotCQlhZGQoamF2YS5hd3QuQ29tcG9uZW50KQotCQlhZGQoamF2YS5hd3QuQ29tcG9uZW50LGludCkKLQkJYWRkKGphdmEuYXd0LkNvbXBvbmVudCxqYXZhLmxhbmcuT2JqZWN0KQotCQlhZGQoamF2YS5hd3QuQ29tcG9uZW50LGphdmEubGFuZy5PYmplY3QsaW50KQotCQlhZGQoamF2YS5hd3QuUG9wdXBNZW51KQotCQlhZGQoamF2YS5sYW5nLlN0cmluZyxqYXZhLmF3dC5Db21wb25lbnQpCi0JCWFkZE5vdGlmeSgpCi0JCWNoZWNrSW1hZ2UoamF2YS5hd3QuSW1hZ2UsamF2YS5hd3QuaW1hZ2UuSW1hZ2VPYnNlcnZlcikKLQkJY29tcHV0ZVZpc2libGVSZWN0KGphdmEuYXd0LlJlY3RhbmdsZSkKLQkJY29udGFpbnMoaW50LGludCkKLQkJY29udGFpbnMoamF2YS5hd3QuUG9pbnQpCi0JCWNyZWF0ZUltYWdlKGludCxpbnQpCi0JCWNyZWF0ZUltYWdlKGphdmEuYXd0LmltYWdlLkltYWdlUHJvZHVjZXIpCi0JCWNyZWF0ZVRvb2xUaXAoKQotCQlkaXNwYXRjaEV2ZW50KGphdmEuYXd0LkFXVEV2ZW50KQotCQlkb0xheW91dCgpCi0JCWVxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCQlmaXJlUHJvcGVydHlDaGFuZ2UoamF2YS5sYW5nLlN0cmluZyxib29sZWFuLGJvb2xlYW4pCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZShqYXZhLmxhbmcuU3RyaW5nLGNoYXIsY2hhcikKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKGphdmEubGFuZy5TdHJpbmcsZG91YmxlLGRvdWJsZSkKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKGphdmEubGFuZy5TdHJpbmcsZmxvYXQsZmxvYXQpCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZShqYXZhLmxhbmcuU3RyaW5nLGludCxpbnQpCi0JCWZpcmVQcm9wZXJ0eUNoYW5nZShqYXZhLmxhbmcuU3RyaW5nLGxvbmcsbG9uZykKLQkJZmlyZVByb3BlcnR5Q2hhbmdlKGphdmEubGFuZy5TdHJpbmcsc2hvcnQsc2hvcnQpCi0JCWdldEFjY2Vzc2libGVDb250ZXh0KCkKLQkJZ2V0QWN0aW9uRm9yS2V5U3Ryb2tlKGphdmF4LnN3aW5nLktleVN0cm9rZSkKLQkJZ2V0QWxpZ25tZW50WCgpCi0JCWdldEFsaWdubWVudFkoKQotCQlnZXRBdXRvc2Nyb2xscygpCi0JCWdldEJhY2tncm91bmQoKQotCQlnZXRCb3JkZXIoKQotCQlnZXRCb3VuZHMoKQotCQlnZXRCb3VuZHMoamF2YS5hd3QuUmVjdGFuZ2xlKQotCQlnZXRDbGFzcygpCi0JCWdldENsaWVudFByb3BlcnR5KGphdmEubGFuZy5PYmplY3QpCi0JCWdldENvbG9yTW9kZWwoKQotCQlnZXRDb21wb25lbnQoaW50KQotCQlnZXRDb21wb25lbnRBdChpbnQsaW50KQotCQlnZXRDb21wb25lbnRBdChqYXZhLmF3dC5Qb2ludCkKLQkJZ2V0Q29tcG9uZW50Q291bnQoKQotCQlnZXRDb21wb25lbnRzKCkKLQkJZ2V0Q29uZGl0aW9uRm9yS2V5U3Ryb2tlKGphdmF4LnN3aW5nLktleVN0cm9rZSkKLQkJZ2V0Q3Vyc29yKCkKLQkJZ2V0RGlzYWJsZWRJY29uKCkKLQkJZ2V0RGlzcGxheWVkTW5lbW9uaWMoKQotCQlnZXRGb250KCkKLQkJZ2V0Rm9udE1ldHJpY3MoamF2YS5hd3QuRm9udCkKLQkJZ2V0Rm9yZWdyb3VuZCgpCi0JCWdldEdyYXBoaWNzKCkKLQkJZ2V0SGVpZ2h0KCkKLQkJZ2V0SG9yaXpvbnRhbEFsaWdubWVudCgpCi0JCWdldEhvcml6b250YWxUZXh0UG9zaXRpb24oKQotCQlnZXRJY29uKCkKLQkJZ2V0SWNvblRleHRHYXAoKQotCQlnZXRJbnNldHMoKQotCQlnZXRMYWJlbEZvcigpCi0JCWdldExheW91dCgpCi0JCWdldExvY2FsZSgpCi0JCWdldExvY2F0aW9uKCkKLQkJZ2V0TG9jYXRpb24oamF2YS5hd3QuUG9pbnQpCi0JCWdldExvY2F0aW9uT25TY3JlZW4oKQotCQlnZXRNYXhpbXVtU2l6ZSgpCi0JCWdldE1pbmltdW1TaXplKCkKLQkJZ2V0TmFtZSgpCi0JCWdldE5leHRGb2N1c2FibGVDb21wb25lbnQoKQotCQlnZXRQYXJlbnQoKQotCQlnZXRQcmVmZXJyZWRTaXplKCkKLQkJZ2V0UmVnaXN0ZXJlZEtleVN0cm9rZXMoKQotCQlnZXRSb290UGFuZSgpCi0JCWdldFNpemUoKQotCQlnZXRTaXplKGphdmEuYXd0LkRpbWVuc2lvbikKLQkJZ2V0VGV4dCgpCi0JCWdldFRvb2xUaXBUZXh0KCkKLQkJZ2V0VG9vbGtpdCgpCi0JCWdldFRvcExldmVsQW5jZXN0b3IoKQotCQlnZXRUcmVlTG9jaygpCi0JCWdldFVJKCkKLQkJZ2V0VmVydGljYWxBbGlnbm1lbnQoKQotCQlnZXRWZXJ0aWNhbFRleHRQb3NpdGlvbigpCi0JCWdldFZpc2libGVSZWN0KCkKLQkJZ2V0V2lkdGgoKQotCQlnZXRYKCkKLQkJZ2V0WSgpCi0JCWdyYWJGb2N1cygpCi0JCWhhc0ZvY3VzKCkKLQkJaGFzaENvZGUoKQotCQlpbnZhbGlkYXRlKCkKLQkJaXNBbmNlc3Rvck9mKGphdmEuYXd0LkNvbXBvbmVudCkKLQkJaXNEb3VibGVCdWZmZXJlZCgpCi0JCWlzRW5hYmxlZCgpCi0JCWlzRm9jdXNDeWNsZVJvb3QoKQotCQlpc0ZvY3VzVHJhdmVyc2FibGUoKQotCQlpc01hbmFnaW5nRm9jdXMoKQotCQlpc09wYXF1ZSgpCi0JCWlzT3B0aW1pemVkRHJhd2luZ0VuYWJsZWQoKQotCQlpc1JlcXVlc3RGb2N1c0VuYWJsZWQoKQotCQlpc1Nob3dpbmcoKQotCQlpc1ZhbGlkKCkKLQkJaXNWYWxpZGF0ZVJvb3QoKQotCQlpc1Zpc2libGUoKQotCQlsaXN0KCkKLQkJbGlzdChqYXZhLmlvLlByaW50U3RyZWFtKQotCQlsaXN0KGphdmEuaW8uUHJpbnRTdHJlYW0saW50KQotCQlsaXN0KGphdmEuaW8uUHJpbnRXcml0ZXIsaW50KQotCQlub3RpZnkoKQotCQlub3RpZnlBbGwoKQotCQlwYWludChqYXZhLmF3dC5HcmFwaGljcykKLQkJcGFpbnRBbGwoamF2YS5hd3QuR3JhcGhpY3MpCi0JCXBhaW50SW1tZWRpYXRlbHkoamF2YS5hd3QuUmVjdGFuZ2xlKQotCQlwcmVwYXJlSW1hZ2UoamF2YS5hd3QuSW1hZ2UsamF2YS5hd3QuaW1hZ2UuSW1hZ2VPYnNlcnZlcikKLQkJcHJpbnQoamF2YS5hd3QuR3JhcGhpY3MpCi0JCXByaW50QWxsKGphdmEuYXd0LkdyYXBoaWNzKQotCQlwdXRDbGllbnRQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LGphdmEubGFuZy5PYmplY3QpCi0JCXJlbW92ZShpbnQpCi0JCXJlbW92ZShqYXZhLmF3dC5Db21wb25lbnQpCi0JCXJlbW92ZShqYXZhLmF3dC5NZW51Q29tcG9uZW50KQotCQlyZW1vdmVBbGwoKQotCQlyZW1vdmVOb3RpZnkoKQotCQlyZXBhaW50KCkKLQkJcmVwYWludChqYXZhLmF3dC5SZWN0YW5nbGUpCi0JCXJlcXVlc3REZWZhdWx0Rm9jdXMoKQotCQlyZXF1ZXN0Rm9jdXMoKQotCQlyZXNldEtleWJvYXJkQWN0aW9ucygpCi0JCXJldmFsaWRhdGUoKQotCQlzY3JvbGxSZWN0VG9WaXNpYmxlKGphdmEuYXd0LlJlY3RhbmdsZSkKLQkJc2V0QWxpZ25tZW50WChmbG9hdCkKLQkJc2V0QWxpZ25tZW50WShmbG9hdCkKLQkJc2V0QXV0b3Njcm9sbHMoYm9vbGVhbikKLQkJc2V0QmFja2dyb3VuZChqYXZhLmF3dC5Db2xvcikKLQkJc2V0Qm9yZGVyKGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXIpCi0JCXNldEJvdW5kcyhpbnQsaW50LGludCxpbnQpCi0JCXNldEJvdW5kcyhqYXZhLmF3dC5SZWN0YW5nbGUpCi0JCXNldEN1cnNvcihqYXZhLmF3dC5DdXJzb3IpCi0JCXNldERlYnVnR3JhcGhpY3NPcHRpb25zKGludCkKLQkJc2V0RGlzYWJsZWRJY29uKGphdmF4LnN3aW5nLkljb24pCi0JCXNldERpc3BsYXllZE1uZW1vbmljKGNoYXIpCi0JCXNldERvdWJsZUJ1ZmZlcmVkKGJvb2xlYW4pCi0JCXNldEVuYWJsZWQoYm9vbGVhbikKLQkJc2V0Rm9udChqYXZhLmF3dC5Gb250KQotCQlzZXRGb3JlZ3JvdW5kKGphdmEuYXd0LkNvbG9yKQotCQlzZXRIb3Jpem9udGFsQWxpZ25tZW50KGludCkKLQkJc2V0SG9yaXpvbnRhbFRleHRQb3NpdGlvbihpbnQpCi0JCXNldEljb24oamF2YXguc3dpbmcuSWNvbikKLQkJc2V0SWNvblRleHRHYXAoaW50KQotCQlzZXRMYWJlbEZvcihqYXZhLmF3dC5Db21wb25lbnQpCi0JCXNldExheW91dChqYXZhLmF3dC5MYXlvdXRNYW5hZ2VyKQotCQlzZXRMb2NhbGUoamF2YS51dGlsLkxvY2FsZSkKLQkJc2V0TG9jYXRpb24oaW50LGludCkKLQkJc2V0TG9jYXRpb24oamF2YS5hd3QuUG9pbnQpCi0JCXNldE1heGltdW1TaXplKGphdmEuYXd0LkRpbWVuc2lvbikKLQkJc2V0TWluaW11bVNpemUoamF2YS5hd3QuRGltZW5zaW9uKQotCQlzZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JCXNldE5leHRGb2N1c2FibGVDb21wb25lbnQoamF2YS5hd3QuQ29tcG9uZW50KQotCQlzZXRPcGFxdWUoYm9vbGVhbikKLQkJc2V0UHJlZmVycmVkU2l6ZShqYXZhLmF3dC5EaW1lbnNpb24pCi0JCXNldFJlcXVlc3RGb2N1c0VuYWJsZWQoYm9vbGVhbikKLQkJc2V0U2l6ZShpbnQsaW50KQotCQlzZXRTaXplKGphdmEuYXd0LkRpbWVuc2lvbikKLQkJc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKQotCQlzZXRUb29sVGlwVGV4dChqYXZhLmxhbmcuU3RyaW5nKQotCQlzZXRVSShqYXZheC5zd2luZy5wbGFmLkxhYmVsVUkpCi0JCXNldFZlcnRpY2FsQWxpZ25tZW50KGludCkKLQkJc2V0VmVydGljYWxUZXh0UG9zaXRpb24oaW50KQotCQlzZXRWaXNpYmxlKGJvb2xlYW4pCi0JCXRvU3RyaW5nKCkKLQkJdHJhbnNmZXJGb2N1cygpCi0JCXVucmVnaXN0ZXJLZXlib2FyZEFjdGlvbihqYXZheC5zd2luZy5LZXlTdHJva2UpCi0JCXVwZGF0ZShqYXZhLmF3dC5HcmFwaGljcykKLQkJdXBkYXRlVUkoKQotCQl2YWxpZGF0ZSgpCi0JCXdhaXQoKQotCQl3YWl0KGxvbmcpCi0JCXdhaXQobG9uZyxpbnQpCi0JCQkKLQkgKi8KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vVGVzdFJlZmxlY3Rpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL1Rlc3RSZWZsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMTExODMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vVGVzdFJlZmxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbzsKLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RSZWZsZWN0aW9uLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEwICQgICREYXRlOiAyMDA3LzAzLzI4IDAyOjQzOjQ1ICQgCi0gKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uUHJvcGVydHlEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuVHlwZUtpbmQ7Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICogVGhpcyBvbmUgaXMgZm9yIHRlc3RpbmcgcmVmbGVjdGlvbi4gSXQgaXMgc2VwYXJhdGUgc28gdGhhdAotICogdGVzdCBzdWl0ZSBjYW4gZ3VhcmVudGVlIHRoYXQgaXQgaXMgZmlyc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0UmVmbGVjdGlvbiBleHRlbmRzIEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVGVzdFJlZmxlY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRlc3RSZWZsZWN0aW9uKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVmbGVjdGlvbigpIHsKLQkJLy8gVGVzdCBvbmUgd2l0aG91dCBhIGJlYW5pbmZvLiBUaGlzIHdpbGwgZG8gcmVmbGVjdGlvbi4KLQkJSmF2YUNsYXNzIHRlc3QxQ2xhc3MgPQotCQkJKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MUNsYXNzIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQotCQlhc3NlcnRTYW1lKFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwsIHRlc3QxQ2xhc3MuZ2V0S2luZCgpKTsKLQkJCi0JCS8vIFRlc3QgdGhhdCB0aGUgcmVmbGVjdGlvbiBrZXkgY2FuIGZpbmQgZmVhdHVyZXMgdGhhdCBhcmVuJ3QgeWV0IGxvYWRlZC4KLQkJT2JqZWN0IGZvbyA9IHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDFDbGFzcy9mb28iKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChmb28pOwotCQkKLQkJLy8gVGVzdCB0aGF0IHRoZSByZWZsZWN0aW9uIGtleSBjYW4gZmluZCBvcGVyYXRpb25zIHRoYXQgYXJlbid0IHlldCBsb2FkZWQuCi0JCU9iamVjdCBnZXRGb28gPQotCQkJcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MUNsYXNzL29wZXJhdGlvbi9nZXRGb28iKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChnZXRGb28pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lclJlZmxlY3Rpb25JbkRlZmF1bHQoKSB7Ci0JCS8vIFRlc3QgdGhhdCBhIHByb3BlcnR5IG9mIGNsYXNzICh0aHJvdWdoIHJlZmxlY3Rpb24pIGlzIGFuIGlubmVyIGNsYXNzLCBhbmQgdGhlIGNsYXNzIGlzIHJlc29sdmVkIGNvcnJlY3RseS4KLQkJSmF2YUNsYXNzIHRlc3RJbm5lckNsYXNzID0KLQkJCShKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi8jVGVzdERlZmF1bHRJbm5lciIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJYXNzZXJ0U2FtZShUeXBlS2luZC5DTEFTU19MSVRFUkFMLCB0ZXN0SW5uZXJDbGFzcy5nZXRLaW5kKCkpOwotCQkKLQkJRUxpc3QgcHJvcGVydGllcyA9IHRlc3RJbm5lckNsYXNzLmdldFByb3BlcnRpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBwZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnRpZXMuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoInByb3BlcnR5SW5uZXIiLCBwZi5nZXROYW1lKCkpOwotCQkKLQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IocGYpOwotCQlhc3NlcnROb3ROdWxsKHBkKTsKLQkJCi0JCUphdmFDbGFzcyBwZFR5cGUgPSAoSmF2YUNsYXNzKSBwZC5nZXRQcm9wZXJ0eVR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0RGVmYXVsdElubmVyJElubmVyIiwgcGRUeXBlLmdldE5hbWUoKSk7IAotCQlhc3NlcnRTYW1lKFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwsIHBkVHlwZS5nZXRLaW5kKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJSZWZsZWN0aW9uSW5QYWNrYWdlKCkgewotCQkvLyBUZXN0IHRoYXQgYSBwcm9wZXJ0eSBvZiBjbGFzcyAodGhyb3VnaCByZWZsZWN0aW9uKSBpcyBhbiBpbm5lciBjbGFzcywgYW5kIHRoZSBjbGFzcyBpcyByZXNvbHZlZCBjb3JyZWN0bHkuCi0JCUphdmFDbGFzcyB0ZXN0SW5uZXJDbGFzcyA9Ci0JCQkoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3RJbm5lciIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJYXNzZXJ0U2FtZShUeXBlS2luZC5DTEFTU19MSVRFUkFMLCB0ZXN0SW5uZXJDbGFzcy5nZXRLaW5kKCkpOwotCQkKLQkJRUxpc3QgcHJvcGVydGllcyA9IHRlc3RJbm5lckNsYXNzLmdldFByb3BlcnRpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBwZiA9IChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BlcnRpZXMuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoInByb3BlcnR5SW5uZXIiLCBwZi5nZXROYW1lKCkpOwotCQkKLQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IocGYpOwotCQlhc3NlcnROb3ROdWxsKHBkKTsKLQkJCi0JCUphdmFDbGFzcyBwZFR5cGUgPSAoSmF2YUNsYXNzKSBwZC5nZXRQcm9wZXJ0eVR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0SW5uZXIkSW5uZXIiLCBwZFR5cGUuZ2V0TmFtZSgpKTsgCi0JCWFzc2VydFNhbWUoVHlwZUtpbmQuQ0xBU1NfTElURVJBTCwgcGRUeXBlLmdldEtpbmQoKSk7Ci0JfQotCQotCXByaXZhdGUgTGlzdCBnZXRSZWFsUHJvcHMoTGlzdCBwcm9wcykgewotCQlpbnQgc2l6ZSA9IHByb3BzLnNpemUoKTsKLQkJTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJZm9yIChpbnQgaT0wOyBpPHNpemU7IGkrKykgewotCQkJRVN0cnVjdHVyYWxGZWF0dXJlIGYgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBwcm9wcy5nZXQoaSk7Ci0JCQlpZiAoVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKGYpICE9IG51bGwpCi0JCQkJbmV3TGlzdC5hZGQoZik7Ci0JCX0KLQkJcmV0dXJuIG5ld0xpc3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlcmZhY2VQcm9wZXJ0eVJlZmxlY3Rpb24oKSB7Ci0JCS8vIFRlc3QgdGhlIHJlZmxlY3Rpb24gb2YgaW50ZXJmYWNlcyB3aXRoIG11bHRpcGxlIGV4dGVuZHMgb24gdGhlbSBzbyB0aGF0IHByb3Blcml0aWVzIGFyZSBjb3JyZWN0LgotCQlKYXZhQ2xhc3MgdGVzdFByb3BDbGFzcyA9Ci0JCQkoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLnRlc3QjTm90VG9wR3V5IiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0VHJ1ZSh0ZXN0UHJvcENsYXNzLmlzSW50ZXJmYWNlKCkpOwotCQkKLQkJLy8gVGVzdCB0aGF0IHdlIGRvbid0IHBpY2sgdXAgdGhlIGV4dGVuZHMgc3R1ZmYKLQkJTGlzdCBwcm9wcyA9IGdldFJlYWxQcm9wcyh0ZXN0UHJvcENsYXNzLmdldFByb3BlcnRpZXMoKSk7Ci0JCS8vIEZvcmdvdCB0aGVyZSBtYXkgYmUgbm9uLXByb3BlcnRpZXMgcHJvcGVydGllcy4KLQkJYXNzZXJ0RXF1YWxzKDEsIHByb3BzLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygibnVtYmVyIiwgKChFU3RydWN0dXJhbEZlYXR1cmUpIHByb3BzLmdldCgwKSkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIFRlc3QgdGhhdCB3ZSBwaWNrIHVwIHRoZSBleHRlbmRzIHN0dWZmCi0JCXByb3BzID0gZ2V0UmVhbFByb3BzKHRlc3RQcm9wQ2xhc3MuZ2V0QWxsUHJvcGVydGllcygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHByb3BzLnNpemUoKSk7Ci0JCUxpc3QgdmFsaWROYW1lcyA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsibnVtYmVyIiwgIm9iamVjdCIsICJpbnRlZ2VyIn0pOwotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IHByb3BzLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGl0ci5uZXh0KCk7Ci0JCQlhc3NlcnRUcnVlKCJFeHRyYSBmZWF0dXJlOiIrZmVhdHVyZS5nZXROYW1lKCksIHZhbGlkTmFtZXMuY29udGFpbnMoZmVhdHVyZS5nZXROYW1lKCkpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZXJmYWNlRXZlbnRSZWZsZWN0aW9uKCkgewotCQkvLyBUZXN0IHRoZSByZWZsZWN0aW9uIG9mIGludGVyZmFjZXMgd2l0aCBtdWx0aXBsZSBleHRlbmRzIG9uIHRoZW0gc28gdGhhdCBldmVudHMgYXJlIGNvcnJlY3QuCi0JCUphdmFDbGFzcyB0ZXN0RXZlbnRDbGFzcyA9Ci0JCQkoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLnRlc3QjTm90VG9wR3V5IiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkJYXNzZXJ0VHJ1ZSh0ZXN0RXZlbnRDbGFzcy5pc0ludGVyZmFjZSgpKTsKLQkJCi0JCS8vIFRlc3QgdGhhdCB3ZSBkb24ndCBwaWNrIHVwIHRoZSBleHRlbmRzIHN0dWZmCi0JCUxpc3QgZXZlbnRzID0gdGVzdEV2ZW50Q2xhc3MuZ2V0RXZlbnRzKCk7Ci0JCWFzc2VydFRydWUoZXZlbnRzLmlzRW1wdHkoKSk7Ci0JCQotCQkvLyBUZXN0IHRoYXQgd2UgcGljayB1cCB0aGUgZXh0ZW5kcyBzdHVmZgotCQlldmVudHMgPSB0ZXN0RXZlbnRDbGFzcy5nZXRBbGxFdmVudHMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGV2ZW50cy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QxQ2xhc3NFdmVudCIsICgoSmF2YUV2ZW50KSBldmVudHMuZ2V0KDApKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZXJmYWNlT3BlcmF0aW9uc1JlZmxlY3Rpb24oKSB7Ci0JCS8vIFRlc3QgdGhlIHJlZmxlY3Rpb24gb2YgaW50ZXJmYWNlcyB3aXRoIG11bHRpcGxlIGV4dGVuZHMgb24gdGhlbSBzbyB0aGF0IHByb3Blcml0aWVzIGFyZSBjb3JyZWN0LgotCQlKYXZhQ2xhc3MgdGVzdE9wQ2xhc3MgPQotCQkJKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby50ZXN0I05vdFRvcEd1eSIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFzc2VydFRydWUodGVzdE9wQ2xhc3MuaXNJbnRlcmZhY2UoKSk7Ci0JCQotCQkvLyBUZXN0IHRoYXQgd2UgZG9uJ3QgcGljayB1cCB0aGUgZXh0ZW5kcyBzdHVmZgotCQlMaXN0IG9wcyA9IHRlc3RPcENsYXNzLmdldEVPcGVyYXRpb25zKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvcHMuc2l6ZSgpKTsKLQkJTGlzdCB2YWxpZE5hbWVzID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyJnZXROdW1iZXIiLCAic2V0TnVtYmVyIn0pOwotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IG9wcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJRU9wZXJhdGlvbiBvcCA9IChFT3BlcmF0aW9uKSBpdHIubmV4dCgpOwotCQkJYXNzZXJ0VHJ1ZSgiRXh0cmEgb3BlcmF0aW9uOiIrb3AuZ2V0TmFtZSgpLCB2YWxpZE5hbWVzLmNvbnRhaW5zKG9wLmdldE5hbWUoKSkpOwotCQl9Ci0JCQotCQkKLQkJLy8gVGVzdCB0aGF0IHdlIHBpY2sgdXAgdGhlIGV4dGVuZHMgc3R1ZmYKLQkJb3BzID0gdGVzdE9wQ2xhc3MuZ2V0RUFsbE9wZXJhdGlvbnMoKTsKLQkJYXNzZXJ0RXF1YWxzKDgsIG9wcy5zaXplKCkpOwotCQl2YWxpZE5hbWVzID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyJnZXROdW1iZXIiLCAic2V0TnVtYmVyIiwgImdldE9iamVjdCIsICJzZXRPYmplY3QiLCAiZ2V0SW50ZWdlciIsICJzZXRJbnRlZ2VyIiwgImFkZFRlc3QxQ2xhc3NFdmVudExpc3RlbmVyIiwgInJlbW92ZVRlc3QxQ2xhc3NFdmVudExpc3RlbmVyIn0pOwotCQlmb3IgKEl0ZXJhdG9yIGl0ciA9IG9wcy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykgewotCQkJRU9wZXJhdGlvbiBvcCA9IChFT3BlcmF0aW9uKSBpdHIubmV4dCgpOwotCQkJYXNzZXJ0VHJ1ZSgiRXh0cmEgb3BlcmF0aW9uOiIrb3AuZ2V0TmFtZSgpLCB2YWxpZE5hbWVzLmNvbnRhaW5zKG9wLmdldE5hbWUoKSkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRlc3QgZm9yIHJlZ3Jlc3Npb24gZm9yIHRoaXMgYnVnLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MzE1MAotCSAqCi0JICovCi0JLyogc2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzkwMjMgLSB3ZSBuZWVkIHRvIHJ1biBIRUFETEVTUyB0ZXN0cyBhcyBIRUFETEVTUywgYW5kIHRoaXMgdGVzdCByZXF1aXJlcyBVSQotCXB1YmxpYyB2b2lkIHRlc3QxNTMxNTAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRoaXMgdGVzdHMgdGhhdCB3aXRoaW4gYSBwbGF0Zm9ybSBydW5uYWJsZSwgdGhhdCBpZiBhIGNsYXNzIGlzIHJlZmxlY3RlZCBhcyBub3QgZm91bmQsIHRoZW4gaXMgY3JlYXRlZCBhbmQgc291cmNlIHR5cGUgdGVzdGVkIHRoYXQKLQkJLy8gaXQgd2lsbCBub3cgcmVmbGVjdCBhcyBmb3VuZC4gVGhlIHNvdXJjZSB0eXBlIHRlc3QgZm9yY2VzIGEgZmx1c2ggaWYgdGhlIHR5cGUgaXMgbm93IGZvdW5kLiBIb3dldmVyLCBpZiBkaWRuJ3QgZG8gc291cmNlIHR5cGUgdGVzdAotCQkvLyBidXQgZGlkIGp1c3QgcmVmbGVjdGlvbiB3ZSB3b3VsZG4ndCBzZWUgdGhlIG5ldyBjbGFzcyB1bnRpbCBhZnRlciBub3RpZmljYXRpb24uIFRoaXMgYnVnIGRvZXNuJ3QgYWRkcmVzcyB0aGF0IHByb2JsZW0uCi0JCQotCQkvLyBOZWVkIHRvIGhhdmUgYSBmb2xkZXIgKHBhY2thZ2UpIGFscmVhZHkgZXhpc3QgZm9yIHRoaXMgdGVzdCB0byB3b3JrLiBJZiB0aGUgcGFja2FnZSB3YXMgY3JlYXRlZCBhdCB0aGUgc2FtZSB0aW1lCi0JCS8vIGFzIHRoZSBjbGFzcywgdGhlbiBpdCB3b24ndCBiZSBmb3VuZCB1bnRpbCBhZnRlciB0aGUgbm90aWZpY2F0aW9uIGlzIGRvbmUuIEJ1dCB0aGlzIGZpeCB3YXMgZm9yIGEgbmV3IGNsYXNzIGluIGFuCi0JCS8vIGV4aXN0aW5nIHBhY2thZ2UuCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnMSA9IChJUGFja2FnZUZyYWdtZW50KSBKYXZhQ29yZS5jcmVhdGUobmF0dXJlLmdldFByb2plY3QoKSkuZmluZEVsZW1lbnQobmV3IFBhdGgoIm9yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mbyIpKTsKLQkJZmluYWwgSUZvbGRlciBmb2xkZXIgPSAoKElGb2xkZXIpIHBrZzEuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCkpLmdldEZvbGRlcigidDE1MzE1MCIpOwotCQlpZiAoIWZvbGRlci5leGlzdHMoKSkKLQkJCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJZmluYWwgSUNvbXBpbGF0aW9uVW5pdFtdIHRlc3RDVSA9IG5ldyBJQ29tcGlsYXRpb25Vbml0WzFdOwotCQl0cnkgewotCQkJSmF2YUNvcmUucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlKYXZhQ2xhc3MgdGVzdDFDbGFzcyA9Ci0JCQkJCQkoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLnQxNTMxNTAjVGVzdDE1MzE1MENsYXNzIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCWFzc2VydEVxdWFscygiU2hvdWxkIG5vdCBiZSBkZWZpbmVkLiIsIFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMLCB0ZXN0MUNsYXNzLmdldEtpbmQoKSk7Ci0KLQkJCQkJLy8gTm93IGNyZWF0ZSB0aGUgY2xhc3MuCi0JCQkJCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gKElQYWNrYWdlRnJhZ21lbnQpIEphdmFDb3JlLmNyZWF0ZShmb2xkZXIpOwotCQkJCQl0ZXN0Q1VbMF0gPSBwa2cuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJUZXN0MTUzMTUwQ2xhc3MuamF2YSIsICJwdWJsaWMgY2xhc3MgVGVzdDE1MzE1MENsYXNzIHt9IiwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJCQkJYXNzZXJ0RXF1YWxzKCJJdCBzaG91bGQgc3RpbGwgcmVmbGVjdCBhcyBub3QgZm91bmQuIiwgVHlwZUtpbmQuVU5ERUZJTkVEX0xJVEVSQUwsIHRlc3QxQ2xhc3MuZ2V0S2luZCgpKTsKLQkJCQkJCi0JCQkJCS8vIE5vdyBkbyB0aGUgZ2V0IHNvdXJjZSB0eXBlLiBUaGlzIHNob3VsZCByZXNldCBvdXIgZmxhZ3MuCi0JCQkJCWFzc2VydFRydWUoIkl0IHNob3VsZCBoYXZlIGEgc291cmNlIHR5cGUuIiwgdGVzdDFDbGFzcy5pc0V4aXN0aW5nVHlwZSgpKTsKLQkJCQkJCi0JCQkJCS8vIE5vdyBpdCBzaG91bGQgcmVmbGVjdC4KLQkJCQkJYXNzZXJ0RXF1YWxzKCJJdCBzaG91bGQgbm93IHJlZmxlY3QgYXMgZm91bmQuIiwgVHlwZUtpbmQuQ0xBU1NfTElURVJBTCwgdGVzdDFDbGFzcy5nZXRLaW5kKCkpOwotCQkJCX0KLQkJCX0sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHRlc3RDVVswXSAhPSBudWxsKSB7Ci0JCQkJdGVzdENVWzBdLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJfQotCX0KLQkqLwotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vVGVzdFN0YW5kYXJkLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9UZXN0U3RhbmRhcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjOTJiMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9UZXN0U3RhbmRhcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvOwotLyoKLSAqICAkUkNTZmlsZTogVGVzdFN0YW5kYXJkLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjE0ICQgICREYXRlOiAyMDA2LzA1LzE3IDIwOjEzOjU2ICQgCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuVXRpbGl0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuKjsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICogU3RhbmRhcmQgQmVhbkluZm8gdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0U3RhbmRhcmQgZXh0ZW5kcyBBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UgewotCi0JcHVibGljIFRlc3RTdGFuZGFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdFN0YW5kYXJkKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdEFycmF5Q2xhc3NUeXBlKCkgewotCQkvLyBUZXN0IG9uZSBkaW1lbnNpb24gYXJyYXkgdHlwZSBmb3IgYSBjbGFzcyBhcyBmaW5hbCBjb21wb25lbnQKLQkJSmF2YUNsYXNzIGF0ID0gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uVGVzdDFDbGFzc1tdIiwgcnNldCk7Ci0JCQotCQlhc3NlcnRUcnVlKGF0LmlzQXJyYXkoKSk7Ci0JCWFzc2VydFNhbWUoVHlwZUtpbmQuQ0xBU1NfTElURVJBTCwgYXQuZ2V0S2luZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsICgoQXJyYXlUeXBlKSBhdCkuZ2V0QXJyYXlEaW1lbnNpb25zKCkpOwotCQlhc3NlcnRUcnVlKGF0LmlzUHVibGljKCkpOwotCQlhc3NlcnRUcnVlKCJqYXZhLmxhbmcuT2JqZWN0Ii5lcXVhbHMoYXQuZ2V0U3VwZXJ0eXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5zaXplKCkgPT0gMik7Ci0JCWFzc2VydFRydWUoYXQuZ2V0TWV0aG9kcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0RmllbGRzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRFdmVudHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEVPcGVyYXRpb25zKCkuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlQcmltaXRpdmVUeXBlKCkgewotCQkvLyBUZXN0IG9uZSBkaW1lbnNpb24gYXJyYXkgdHlwZSBmb3IgYSBjbGFzcyBhcyBmaW5hbCBjb21wb25lbnQKLQkJSmF2YUNsYXNzIGF0ID0gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKCJpbnRbXSIsIHJzZXQpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhdC5pc0FycmF5KCkpOwotCQlhc3NlcnRTYW1lKFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwsIGF0LmdldEtpbmQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCAoKEFycmF5VHlwZSkgYXQpLmdldEFycmF5RGltZW5zaW9ucygpKTsJCQotCQlhc3NlcnRUcnVlKGF0LmlzUHVibGljKCkpOwotCQlhc3NlcnRUcnVlKCJqYXZhLmxhbmcuT2JqZWN0Ii5lcXVhbHMoYXQuZ2V0U3VwZXJ0eXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0SW1wbGVtZW50c0ludGVyZmFjZXMoKS5zaXplKCkgPT0gMik7Ci0JCWFzc2VydFRydWUoYXQuZ2V0TWV0aG9kcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0RmllbGRzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRFdmVudHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEVPcGVyYXRpb25zKCkuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlVbmRlZmluZWQoKSB7Ci0JCS8vIFRlc3Qgb25lIGRpbWVuc2lvbiBhcnJheSB0eXBlIGZvciBhIGNsYXNzIGFzIGZpbmFsIGNvbXBvbmVudCB0aGF0IGlzIHVuZGVmaW5lZC4KLQkJSmF2YUNsYXNzIGF0ID0gKEphdmFDbGFzcykgSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKCJYWVpbXSIsIHJzZXQpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhdC5pc0FycmF5KCkpOwotCQlhc3NlcnRTYW1lKFR5cGVLaW5kLlVOREVGSU5FRF9MSVRFUkFMLCBhdC5nZXRLaW5kKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUNsYXNzVHlwZTJEaW0oKSB7Ci0JCS8vIFRlc3Qgb25lIGRpbWVuc2lvbiBhcnJheSB0eXBlIGZvciBhIGNsYXNzIGFzIGZpbmFsIGNvbXBvbmVudAotCQlKYXZhQ2xhc3MgYXQgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5UZXN0MUNsYXNzW11bXSIsIHJzZXQpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhdC5pc0FycmF5KCkpOwotCQlhc3NlcnRTYW1lKFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwsIGF0LmdldEtpbmQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKEFycmF5VHlwZSkgYXQpLmdldEFycmF5RGltZW5zaW9ucygpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5pc1B1YmxpYygpKTsKLQkJYXNzZXJ0VHJ1ZSgiamF2YS5sYW5nLk9iamVjdCIuZXF1YWxzKGF0LmdldFN1cGVydHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkuc2l6ZSgpID09IDIpOwotCQlhc3NlcnRUcnVlKGF0LmdldE1ldGhvZHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEZpZWxkcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0UHJvcGVydGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0RXZlbnRzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRFT3BlcmF0aW9ucygpLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5UHJpbWl0aXZlVHlwZTJEaW0oKSB7Ci0JCS8vIFRlc3Qgb25lIGRpbWVuc2lvbiBhcnJheSB0eXBlIGZvciBhIGNsYXNzIGFzIGZpbmFsIGNvbXBvbmVudAotCQlKYXZhQ2xhc3MgYXQgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoImludFtdW10iLCByc2V0KTsKLQkJCi0JCWFzc2VydFRydWUoYXQuaXNBcnJheSgpKTsKLQkJYXNzZXJ0U2FtZShUeXBlS2luZC5DTEFTU19MSVRFUkFMLCBhdC5nZXRLaW5kKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgKChBcnJheVR5cGUpIGF0KS5nZXRBcnJheURpbWVuc2lvbnMoKSk7CQkKLQkJYXNzZXJ0VHJ1ZShhdC5pc1B1YmxpYygpKTsKLQkJYXNzZXJ0VHJ1ZSgiamF2YS5sYW5nLk9iamVjdCIuZXF1YWxzKGF0LmdldFN1cGVydHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkuc2l6ZSgpID09IDIpOwotCQlhc3NlcnRUcnVlKGF0LmdldE1ldGhvZHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEZpZWxkcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0UHJvcGVydGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0RXZlbnRzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRFT3BlcmF0aW9ucygpLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5VW5kZWZpbmVkMkRpbSgpIHsKLQkJLy8gVGVzdCBvbmUgZGltZW5zaW9uIGFycmF5IHR5cGUgZm9yIGEgY2xhc3MgYXMgZmluYWwgY29tcG9uZW50IHRoYXQgaXMgdW5kZWZpbmVkLgotCQlKYXZhQ2xhc3MgYXQgPSAoSmF2YUNsYXNzKSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUoIlhZWltdW10iLCByc2V0KTsKLQkJCi0JCWFzc2VydFRydWUoYXQuaXNBcnJheSgpKTsKLQkJYXNzZXJ0U2FtZShUeXBlS2luZC5VTkRFRklORURfTElURVJBTCwgYXQuZ2V0S2luZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJbm5lckNsYXNzVHlwZSgpIHsKLQkJLy8gVGVzdCBvbmUgZGltZW5zaW9uIGFycmF5IHR5cGUgZm9yIGEgY2xhc3MgYXMgZmluYWwgY29tcG9uZW50Ci0JCUphdmFDbGFzcyBhdCA9IChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLkN1c3RvbWVyJEFjY291bnRbXSIsIHJzZXQpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhdC5pc0FycmF5KCkpOwotCQlhc3NlcnRTYW1lKFR5cGVLaW5kLkNMQVNTX0xJVEVSQUwsIGF0LmdldEtpbmQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCAoKEFycmF5VHlwZSkgYXQpLmdldEFycmF5RGltZW5zaW9ucygpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5pc1B1YmxpYygpKTsKLQkJYXNzZXJ0VHJ1ZSgiamF2YS5sYW5nLk9iamVjdCIuZXF1YWxzKGF0LmdldFN1cGVydHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEltcGxlbWVudHNJbnRlcmZhY2VzKCkuc2l6ZSgpID09IDIpOwotCQlhc3NlcnRUcnVlKGF0LmdldE1ldGhvZHMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGF0LmdldEZpZWxkcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0UHJvcGVydGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoYXQuZ2V0RXZlbnRzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdC5nZXRFT3BlcmF0aW9ucygpLmlzRW1wdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCZWFuRGVjb3JhdG9yUmVmbGVjdGVkKCkgewotCQlKYXZhQ2xhc3MgdGVzdDFDbGFzcyA9IGdldFRlc3QxQ2xhc3MoKTsKLQotCQkvLyBUZXN0IHRoZSBiZWFuIGRlY29yYXRvci4KLQkJQmVhbkRlY29yYXRvciBiZCA9IFV0aWxpdGllcy5nZXRCZWFuRGVjb3JhdG9yKHRlc3QxQ2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QxQ2xhc3MiLCBiZC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE51bGwoYmQuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0VGVzdDFDbGFzcygpIHsKLQkJSmF2YUNsYXNzIHRlc3QxQ2xhc3MgPQotCQkJKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MUNsYXNzIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB0ZXN0MUNsYXNzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYWxSZWZsZWN0ZWRQcm9wZXJ0aWVzKCkgewotCQlFTGlzdCBhbGxMb2NhbEZlYXR1cmVzID0gZ2V0VGVzdDFDbGFzcygpLmdldFByb3BlcnRpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGFsbExvY2FsRmVhdHVyZXMuc2l6ZSgpKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ciA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0aWVzSXRlcmF0b3IoYWxsTG9jYWxGZWF0dXJlcyk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCVByb3BlcnR5RGVjb3JhdG9yIHBkID0gKFByb3BlcnR5RGVjb3JhdG9yKSBpdHIubmV4dCgpOwotCQkJaWYgKHBkLmdldE5hbWUoKS5lcXVhbHMoImZvbyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYXNzZXJ0VHJ1ZShwZCBpbnN0YW5jZW9mIEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcik7Ci0JCQkJSW5kZXhlZFByb3BlcnR5RGVjb3JhdG9yIGlwID0gKEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcikgcGQ7Ci0JCQkJSmF2YUhlbHBlcnMgdHlwZSA9IChKYXZhSGVscGVycykgaXAuZ2V0UHJvcGVydHlUeXBlKCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nW10iLCB0eXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQkJaWYgKCF0eXBlLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoImphdmEubGFuZy5TdHJpbmdbXSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkKLQkJCQlNZXRob2QgbXRoZCA9IGlwLmdldFJlYWRNZXRob2QoKTsKLQkJCQlhc3NlcnRTYW1lKHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDFDbGFzcy5nZXRGb28oIiksIHRydWUpLCBtdGhkKTsKLQkJCQkKLQkJCQltdGhkID0gaXAuZ2V0V3JpdGVNZXRob2QoKTsKLQkJCQlhc3NlcnRTYW1lKHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDFDbGFzcy5zZXRGb28oamF2YS5sYW5nLlN0cmluZ1tdIiksIHRydWUpLCBtdGhkKTsKLQkJCQkKLQkJCQltdGhkID0gaXAuZ2V0SW5kZXhlZFJlYWRNZXRob2QoKTsKLQkJCQlhc3NlcnRTYW1lKHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDFDbGFzcy5nZXRGb28oaW50IiksIHRydWUpLCBtdGhkKTsKLQkJCQkKLQkJCQltdGhkID0gaXAuZ2V0SW5kZXhlZFdyaXRlTWV0aG9kKCk7Ci0JCQkJYXNzZXJ0U2FtZShyc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QxQ2xhc3Muc2V0Rm9vKGludCxqYXZhLmxhbmcuU3RyaW5nIiksIHRydWUpLCBtdGhkKTsKLQkJCQkKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydFRydWUoZm91bmQpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhbFJlZmxlY3RlZE9wZXJhdGlvbnMoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzID0gZ2V0VGVzdDFDbGFzcygpOwotCQkKLQkJLy8gVGVzdCBsb2NhbCBvcGVyYXRpb25zLgotCQlFTGlzdCBhbGxMb2NhbE9wZXJhdGlvbnMgPSB0ZXN0MUNsYXNzLmdldEVPcGVyYXRpb25zKCk7Ci0JCWFzc2VydEVxdWFscygxMCwgYWxsTG9jYWxPcGVyYXRpb25zLnNpemUoKSk7Ci0JCUl0ZXJhdG9yIGl0ciA9IGFsbExvY2FsT3BlcmF0aW9ucy5pdGVyYXRvcigpOwotCQkvLyBUaGlzIGlzIHRoZSBkZXNpcmVkIG1ldGhvZCB0aGF0IHRoZSBvcGVyYXRpb24gb2YgaW50ZXJlc3QgcG9pbnRzIHRvLgotCQlNZXRob2QgZGVzaXJlZCA9Ci0JCQkoTWV0aG9kKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgKLQkJCQkiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QxQ2xhc3Muc2V0Rm9vKGludCxqYXZhLmxhbmcuU3RyaW5nIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCU1ldGhvZFByb3h5IGJoYXYgPSAoTWV0aG9kUHJveHkpIGl0ci5uZXh0KCk7Ci0JCQlpZiAoYmhhdi5nZXRNZXRob2QoKSA9PSBkZXNpcmVkKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCUxpc3QgcGFybXMgPSBVdGlsaXRpZXMuZ2V0TWV0aG9kRGVjb3JhdG9yKGJoYXYpLmdldFBhcmFtZXRlckRlc2NyaXB0b3JzKCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDIsIHBhcm1zLnNpemUoKSk7Ci0JCQkJUGFyYW1ldGVyRGVjb3JhdG9yIHBtZCA9IChQYXJhbWV0ZXJEZWNvcmF0b3IpIHBhcm1zLmdldCgwKTsKLQkJCQlhc3NlcnRFcXVhbHMoImluZGV4IiwgcG1kLmdldE5hbWUoKSk7Ci0JCQkJCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShmb3VuZCk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExvY2FsUmVmbGVjdGVkRXZlbnRzKCkgewotCQlKYXZhQ2xhc3MgdGVzdDFDbGFzcyA9IGdldFRlc3QxQ2xhc3MoKTsKLQkJCi0JCS8vIFRlc3QgZXZlbnQgc2V0IHJlZmxlY3RlZC4KLQkJTGlzdCBldmVudHMgPSB0ZXN0MUNsYXNzLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMiwgZXZlbnRzLnNpemUoKSk7Ci0JCUl0ZXJhdG9yIGl0ciA9IGV2ZW50cy5pdGVyYXRvcigpOwotCQlib29sZWFuIGZvdW5kZXZ0MSA9IGZhbHNlLCBmb3VuZGV2dDIgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ci5oYXNOZXh0KCkpIHsKLQkJCUphdmFFdmVudCBldmVudCA9IChKYXZhRXZlbnQpIGl0ci5uZXh0KCk7Ci0JCQlpZiAoInRlc3QxQ2xhc3NFdmVudCIuZXF1YWxzKGV2ZW50LmdldE5hbWUoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWZvdW5kZXZ0MSA9IHRydWU7Ci0JCQkJRXZlbnRTZXREZWNvcmF0b3IgZWRlYyA9IFV0aWxpdGllcy5nZXRFdmVudFNldERlY29yYXRvcihldmVudCk7Ci0JCQkJTGlzdCBtbGlzdCA9IGVkZWMuZ2V0TGlzdGVuZXJNZXRob2RzKCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDIsIG1saXN0LnNpemUoKSk7Ci0JCQl9IGVsc2UgaWYgKCJ0ZXN0MUNsYXNzVW5pY2FzdEV2ZW50Ii5lcXVhbHMoZXZlbnQuZ2V0TmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmRldnQyID0gdHJ1ZTsKLQkJCQlFdmVudFNldERlY29yYXRvciBlZGVjID0gVXRpbGl0aWVzLmdldEV2ZW50U2V0RGVjb3JhdG9yKGV2ZW50KTsKLQkJCQlhc3NlcnRUcnVlKGVkZWMuaXNVbmljYXN0KCkpOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZm91bmRldnQxKTsKLQkJYXNzZXJ0VHJ1ZShmb3VuZGV2dDIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldFRlc3QyQ2xhc3NCKCkgewotCQlyZXR1cm4gKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MkNsYXNzQiIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCZWFuRGVjb3JhdG9ySW50cm9zcGVjdGVkKCkgewotCQkvLyBUZXN0IG9uZSB3aXRoIGEgYmVhbmluZm8uCi0JCUphdmFDbGFzcyB0ZXN0MkNsYXNzQiA9IGdldFRlc3QyQ2xhc3NCKCk7Ci0JCUJlYW5EZWNvcmF0b3IgYmQgPSBVdGlsaXRpZXMuZ2V0QmVhbkRlY29yYXRvcih0ZXN0MkNsYXNzQik7Ci0JCWFzc2VydEVxdWFscygiVGVzdDJDbGFzc0IiLCBiZC5nZXROYW1lKCkpOwotCQkKLQkJLy8gVGhlIGZvbGxvd2luZyB3aWxsIHRlc3QgaWYgc2VhcmNoIGFjcm9zcyBiZWFuaW5mbyBzZWFyY2ggcGF0aCB3b3JrZWQuIEl0IHdvdWxkIGZhaWwgaWYgaXQgZGlkbid0IHdvcmsuCi0JCWFzc2VydEVxdWFscygiQSBuYW1lIGZvciB0aGlzIGNsYXNzLiIsIGJkLmdldERpc3BsYXlOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEZhbHNlKGJkLmlzRXhwZXJ0KCkpOwotCQkvLyBDdXN0b21pemVyIGNsYXNzIHNldCBpbiBCZWFuSW5mbywgYnV0IGJvZ3VzIGZvciBub3cgdG8gc2FtZSBjbGFzcyBhcyBiZWluZyBpbnRyb3NwZWN0ZWQuCi0JCWFzc2VydFNhbWUodGVzdDJDbGFzc0IsIGJkLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExvY2FsSW50cm9zcGVjdGVkUHJvcGVydGllcygpIHsKLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3NCID0gZ2V0VGVzdDJDbGFzc0IoKTsKLQkJRUxpc3QgYWxsTG9jYWxGZWF0dXJlcyA9IHRlc3QyQ2xhc3NCLmdldFByb3BlcnRpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGFsbExvY2FsRmVhdHVyZXMuc2l6ZSgpKTsKLQkJCi0JCUl0ZXJhdG9yIGl0ciA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0aWVzSXRlcmF0b3IoYWxsTG9jYWxGZWF0dXJlcyk7Ci0JCWJvb2xlYW4gZ290U2V0ID0gZmFsc2UsIGdvdEZvbyA9IGZhbHNlOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSAoUHJvcGVydHlEZWNvcmF0b3IpIGl0ci5uZXh0KCk7Ci0JCQlNZXRob2QgbXRoZCA9IG51bGw7Ci0JCQlpZiAocGQuZ2V0TmFtZSgpLmVxdWFscygic2V0QSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlnb3RTZXQgPSB0cnVlOwotCQkJCW10aGQgPSBwZC5nZXRSZWFkTWV0aG9kKCk7Ci0JCQkJYXNzZXJ0U2FtZShyc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QyQ2xhc3NCLmlzU2V0QSgiKSwgdHJ1ZSksIG10aGQpOwotCQkJfSBlbHNlIGlmIChwZC5nZXROYW1lKCkuZXF1YWxzKCJmb28iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZ290Rm9vID0gdHJ1ZTsKLQkJCQlJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IgaXBkID0gKEluZGV4ZWRQcm9wZXJ0eURlY29yYXRvcikgcGQ7Ci0JCQkJbXRoZCA9IGlwZC5nZXRJbmRleGVkUmVhZE1ldGhvZCgpOwotCQkJCWFzc2VydFNhbWUocnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MkNsYXNzQi5nZXRGb28oaW50IiksIHRydWUpLCBtdGhkKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGdvdFNldCk7Ci0JCWFzc2VydFRydWUoZ290Rm9vKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExvY2FsSW50cm9zcGVjdGVkT3BlcmF0aW9ucygpIHsKLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3NCID0gZ2V0VGVzdDJDbGFzc0IoKTsKLQkJCi0JCUVMaXN0IGFsbExvY2FsT3BlcmF0aW9ucyA9IHRlc3QyQ2xhc3NCLmdldEVPcGVyYXRpb25zKCk7Ci0JCWFzc2VydEVxdWFscygyLCBhbGxMb2NhbE9wZXJhdGlvbnMuc2l6ZSgpKTsgCi0KLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlJdGVyYXRvciBpdHIgPSB0ZXN0MkNsYXNzQi5nZXRFT3BlcmF0aW9ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlFT3BlcmF0aW9uIGJoYXYgPSAoRU9wZXJhdGlvbikgaXRyLm5leHQoKTsKLQkJCWlmIChiaGF2LmdldE5hbWUoKS5lcXVhbHMoInNldFNldEEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJTGlzdCBwYXJtcyA9IFV0aWxpdGllcy5nZXRNZXRob2REZWNvcmF0b3IoYmhhdikuZ2V0UGFyYW1ldGVyRGVzY3JpcHRvcnMoKTsKLQkJCQlhc3NlcnRFcXVhbHMoMSwgcGFybXMuc2l6ZSgpKTsKLQkJCQlQYXJhbWV0ZXJEZWNvcmF0b3IgcG1kID0gKFBhcmFtZXRlckRlY29yYXRvcikgcGFybXMuZ2V0KDApOwotCQkJCWFzc2VydEVxdWFscygiYUJvb2xlYW5TZXR0aW5nIiwgcG1kLmdldE5hbWUoKSk7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZm91bmQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYWxJbnRyb3NwZWN0ZWRFdmVudHMoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MkNsYXNzQiA9IGdldFRlc3QyQ2xhc3NCKCk7Ci0JCQotCQkvLyBUZXN0IGV2ZW50IHNldCBpbnRyb3NwZWN0ZWQuCi0JCUVMaXN0IGV2ZW50cyA9IHRlc3QyQ2xhc3NCLmdldEV2ZW50cygpOwotCQlhc3NlcnRFcXVhbHMoMSwgZXZlbnRzLnNpemUoKSk7Ci0JCUphdmFFdmVudCBldmVudCA9IChKYXZhRXZlbnQpIGV2ZW50cy5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygib3ZlcnJpZGVOYW1lIiwgZXZlbnQuZ2V0TmFtZSgpKTsgIC8vJE5PTi1OTFMtMSQKLQkJRXZlbnRTZXREZWNvcmF0b3IgZWRlYyA9IFV0aWxpdGllcy5nZXRFdmVudFNldERlY29yYXRvcihldmVudCk7Ci0JCWFzc2VydEVxdWFscygiSVRlc3QxQ2xhc3NFdmVudExpc3RlbmVyIiwgZWRlYy5nZXRMaXN0ZW5lclR5cGUoKS5nZXROYW1lKCkpOwotCQlMaXN0IG1saXN0ID0gZWRlYy5nZXRMaXN0ZW5lck1ldGhvZHMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG1saXN0LnNpemUoKSk7Ci0JCU1ldGhvZFByb3h5IG1wcm94eSA9IChNZXRob2RQcm94eSkgbWxpc3QuZ2V0KDApOwotCQlNZXRob2REZWNvcmF0b3IgbWRlYyA9IFV0aWxpdGllcy5nZXRNZXRob2REZWNvcmF0b3IobXByb3h5KTsKLQkJYXNzZXJ0RXF1YWxzKCJldmVudDEiLCBtZGVjLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKCJFdmVudCAxIiwgbWRlYy5nZXREaXNwbGF5TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3VwZXJUeXBlcygpIHsKLQkJSmF2YUNsYXNzIHRlc3RDbGFzcyA9IGdldFRlc3QxQ2xhc3MoKTsKLQkJb2JqRmVhdHVyZXNTZXR1cCgpOwkvLyBHZXQgbnVtYmVyIG9mIGZlYXR1cmVzIGZvciBPYmplY3QuIFRoaXMgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIGV4dGVuc2lvbnMsIHNvIHRoYXQgaXMgd2h5IHdlIGNvbXB1dGUgaXQuCi0JCQotCQkvLyBOb3cgZG8gdGhlIHRlc3Rpbmcgb2YgbWVyZ2luZyB3aXRoIHN1cGVyIHR5cGVzLgotCQlhc3NlcnRFcXVhbHMoMitvYmpGZWF0dXJlcywgdGVzdENsYXNzLmdldEFsbFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQlKYXZhQ2xhc3MgdGVzdDFDbGFzc0EgPSBnZXRUZXN0MUNsYXNzQSgpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwodGVzdDFDbGFzc0EpOwotCQlhc3NlcnRFcXVhbHMoMytvYmpGZWF0dXJlcywgdGVzdDFDbGFzc0EuZ2V0QWxsUHJvcGVydGllcygpLnNpemUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRUZXN0MUNsYXNzQSgpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDFDbGFzc0EiKSwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdXBlclR5cGVzRXZlbnRzKCkgewotCQlKYXZhQ2xhc3MgdGVzdDFDbGFzc0EgPSBnZXRUZXN0MUNsYXNzQSgpOyAKLQkJCQotCQkvLyBUZXN0IG1lcmdpbmcgc3VwZXJ0eXBlcyBldmVudCBzZXQuCi0JCUxpc3QgZXZlbnRzID0gdGVzdDFDbGFzc0EuZ2V0QWxsRXZlbnRzKCk7Ci0JCWFzc2VydEVxdWFscygyLCBldmVudHMuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXRyID0gZXZlbnRzLml0ZXJhdG9yKCk7Ci0JCWJvb2xlYW4gZm91bmRldnQxID0gZmFsc2U7Ci0JCWJvb2xlYW4gZm91bmRldnQyID0gZmFsc2U7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhRXZlbnQgZXZlbnQgPSAoSmF2YUV2ZW50KSBpdHIubmV4dCgpOwotCQkJaWYgKCJ0ZXN0MUNsYXNzRXZlbnQiLmVxdWFscyhldmVudC5nZXROYW1lKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3VuZGV2dDEgPSB0cnVlOwotCQkJCUV2ZW50U2V0RGVjb3JhdG9yIGVkZWMgPSBVdGlsaXRpZXMuZ2V0RXZlbnRTZXREZWNvcmF0b3IoZXZlbnQpOwotCQkJCUxpc3QgbWxpc3QgPSBlZGVjLmdldExpc3RlbmVyTWV0aG9kcygpOwotCQkJCWFzc2VydEVxdWFscygyLCBtbGlzdC5zaXplKCkpOwotCQkJfSBlbHNlIGlmICgidGVzdDFDbGFzc1VuaWNhc3RFdmVudCIuZXF1YWxzKGV2ZW50LmdldE5hbWUoKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWZvdW5kZXZ0MiA9IHRydWU7Ci0JCQkJRXZlbnRTZXREZWNvcmF0b3IgZWRlYyA9IFV0aWxpdGllcy5nZXRFdmVudFNldERlY29yYXRvcihldmVudCk7Ci0JCQkJYXNzZXJ0VHJ1ZShlZGVjLmlzVW5pY2FzdCgpKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGZvdW5kZXZ0MSk7Ci0JCWFzc2VydFRydWUoZm91bmRldnQyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFDbGFzcyBnZXRUZXN0MkNsYXNzKCkgewotCQlyZXR1cm4gKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MkNsYXNzIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0VGVzdDJDbGFzc0EoKSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QyQ2xhc3NBIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3VwZXJUeXBlSGlkZVByb3BlcnR5KCkgewotCQlKYXZhQ2xhc3MgdGVzdDJDbGFzcyA9IGdldFRlc3QyQ2xhc3MoKTsKLQkJb2JqRmVhdHVyZXNTZXR1cCgpOwotCQkKLQkJLy8gVGVzdDJDbGFzc0JlYW5JbmZvIGV4cGxpY2l0bHkgaGlkZXMgT2JqZWN0IChzdXBlcikgZnJvbSBpdHMgQmVhbkluZm8sIHNvIG9ubHkgdGhlIG5vbi1CZWFuSW5mbyBwcm9wZXJ0aWVzIHdpbGwgc2hvdy4JCQotCQlhc3NlcnRFcXVhbHMoMitvYmpOb25Qcm9wZXJ0aWVzLCB0ZXN0MkNsYXNzLmdldEFsbFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQkKLQkJLy8gVHJ5IHdpdGggc3ViY2xhc3Nlcy4gTWFrZSBzdXJlIHRoYXQgVGVzdDJDbGFzc0JlYW5JbmZvIGlzIHVzZWQgd2l0aCB0aGUgc3ViY2xhc3Nlcy4KLQkJSmF2YUNsYXNzIHRlc3QyQ2xhc3NBID0gZ2V0VGVzdDJDbGFzc0EoKTsJCQotCQlhc3NlcnRFcXVhbHMoMytvYmpOb25Qcm9wZXJ0aWVzLCB0ZXN0MkNsYXNzQS5nZXRBbGxQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJCi0JCUphdmFDbGFzcyB0ZXN0MkNsYXNzQiA9IGdldFRlc3QyQ2xhc3NCKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKDQrb2JqTm9uUHJvcGVydGllcywgdGVzdDJDbGFzc0IuZ2V0QWxsUHJvcGVydGllcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleGVkQmVhbkluZm8oKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MkNsYXNzID0gZ2V0VGVzdDJDbGFzcygpOwotCQkKLQkJLy8gVGVzdCB0aGF0IEluZGV4ZWQgdGhydSBiZWFuaW5mbyB3b3JrcwotCQlJdGVyYXRvciBpdHIgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydGllc0l0ZXJhdG9yKHRlc3QyQ2xhc3MuZ2V0UHJvcGVydGllcygpKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewkJCi0JCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IChQcm9wZXJ0eURlY29yYXRvcikgaXRyLm5leHQoKTsJCQkKLQkJCWlmIChwZC5nZXROYW1lKCkuZXF1YWxzKCJmb29CYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWFzc2VydFRydWUocGQgaW5zdGFuY2VvZiBJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IpOwotCQkJCUluZGV4ZWRQcm9wZXJ0eURlY29yYXRvciBpcCA9IChJbmRleGVkUHJvcGVydHlEZWNvcmF0b3IpIHBkOwotCQkJCUphdmFIZWxwZXJzIHR5cGUgPSAoSmF2YUhlbHBlcnMpIGlwLmdldFByb3BlcnR5VHlwZSgpOwotCQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZ1tdIiwgdHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJTWV0aG9kIG10aGQgPSBpcC5nZXRSZWFkTWV0aG9kKCk7Ci0JCQkJYXNzZXJ0U2FtZShyc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QyQ2xhc3MuZ2V0Rm9vQmFyKCIpLCB0cnVlKSwgbXRoZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQltdGhkID0gaXAuZ2V0V3JpdGVNZXRob2QoKTsKLQkJCQlhc3NlcnRTYW1lKHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdDJDbGFzcy5zZXRGb29CYXIoamF2YS5sYW5nLlN0cmluZ1tdIiksIHRydWUpLCBtdGhkKTsgLy8kTk9OLU5MUy0xJAotCQkJCW10aGQgPSBpcC5nZXRJbmRleGVkUmVhZE1ldGhvZCgpOwotCQkJCWFzc2VydFNhbWUocnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MkNsYXNzLmdldEZvb0JhcihpbnQiKSwgdHJ1ZSksIG10aGQpOyAvLyROT04tTkxTLTEkCi0JCQkJbXRoZCA9IGlwLmdldEluZGV4ZWRXcml0ZU1ldGhvZCgpOwotCQkJCWFzc2VydFNhbWUocnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0MkNsYXNzLnNldEZvb0JhcihpbnQsamF2YS5sYW5nLlN0cmluZyIpLCB0cnVlKSwgbXRoZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydFRydWUoZm91bmQpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0VGVzdDJDbGFzc0MoKSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3QyQ2xhc3NDIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCZWFuSW5mb1Byb2plY3QoKSB7Ci0JCUphdmFDbGFzcyB0ZXN0MkNsYXNzQyA9IGdldFRlc3QyQ2xhc3NDKCk7Ci0JCQotCQkvLyBUaGlzIHdpbGwgdGVzdCB0aGF0IHdlIGNvdWxkIGZpbmQgVGVzdDJDbGFzc0MgQmVhbkluZm8gdGhhdCBpcyBpbiBhbm90aGVyIEJlYW5JbmZvIHByb2plY3QgKGkuZS4gYSBwcm9qZWN0Ci0JCS8vIHRoYXQgaXMgc3BlY2lmaWNhbGx5IGZvciBCZWFuSW5mbydzIGZvciBhIHNwZWNpZmljIGNvZGUgcHJvamVjdCkuCi0JCUJlYW5EZWNvcmF0b3IgYmQgPSBVdGlsaXRpZXMuZ2V0QmVhbkRlY29yYXRvcih0ZXN0MkNsYXNzQyk7Ci0JCWFzc2VydE5vdE51bGwoYmQpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QyQ2xhc3NDIGZyb20gQmVhbkluZm8iLCBiZC5nZXREaXNwbGF5TmFtZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkZSgpIHsKLQkJCi0JCS8vIFRlc3QgdGhhdCB0aGUgbG9jYWwgcHJvcGVydHkgaXMgZXhwZXJ0IGJlY2F1c2UgaXQgb3ZlcnJvZGUgZnJvbSBUZXN0MkNsYXNzQiBhbmQgbWFkZSBpdCBleHBlcnQuCi0JCUphdmFDbGFzcyB0ZXN0MkNsYXNzQiA9IGdldFRlc3QyQ2xhc3NCKCk7Ci0JCQotCQkvLyBUZXN0IHRoYXQgdGhlIGxvY2FsIHByb3BlcnR5IGlzIG5vdCBleHBlcnQgaW4gVGVzdDJDbGFzc0IuCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBwID0gdGVzdDJDbGFzc0IuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJzZXRBIik7Ci0JCWFzc2VydE5vdE51bGwocCk7Ci0JCVByb3BlcnR5RGVjb3JhdG9yIHBkID0gVXRpbGl0aWVzLmdldFByb3BlcnR5RGVjb3JhdG9yKHApOwotCQlhc3NlcnRGYWxzZShwZC5pc0V4cGVydCgpKTsKLQotCQkvLyBOb3cgZ2V0IHN1YmNsYXNzIHdpdGggb3ZlcnJpZGUuCi0JCUphdmFDbGFzcyB0ZXN0MkNsYXNzQyA9IGdldFRlc3QyQ2xhc3NDKCk7Ci0JCQotCQkvLyBUZXN0IHRoYXQgdGhlIGxvY2FsIHByb3BlcnR5IGlzIG5vdyBleHBlcnQgYmVjYXVzZSBpdCBvdmVycm9kZSBmcm9tIFRlc3QyQ2xhc3NCIGFuZCBtYWRlIGl0IGV4cGVydC4KLQkJcCA9IHRlc3QyQ2xhc3NDLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgic2V0QSIpOwotCQlhc3NlcnROb3ROdWxsKHApOwotCQlwZCA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0eURlY29yYXRvcihwKTsKLQkJYXNzZXJ0VHJ1ZShwZC5pc0V4cGVydCgpKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldFRlc3QyQ2xhc3NQcmVxKCkgewotCQlyZXR1cm4gKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5wcmVyZXEjVGVzdDJDbGFzc1ByZXEiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RQcmVyZXFlZFByb2plY3RzKCkgewotCQlKYXZhQ2xhc3MgdGVzdDJDbGFzc1ByZXJlcSA9IGdldFRlc3QyQ2xhc3NQcmVxKCk7Ci0JCW9iakZlYXR1cmVzU2V0dXAoKTsKLQkJIAotCQkvLyBUZXN0IGZpbmRpbmcgYmVhbmluZm9zIGZvciBjbGFzc2VzIGluIGFub3RoZXIgcHJvamVjdCAocHJlLXJlcWVkIHByb2plY3QpLgkJCi0JCWFzc2VydEVxdWFscygxK29iakZlYXR1cmVzLCB0ZXN0MkNsYXNzUHJlcmVxLmdldEFsbFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQkvLyBWZXJpZnkgQmVhbkluZm8gYW5kIG5vdCBqc3V0IGludHJvc3BlY3Rpb24uCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmID0gdGVzdDJDbGFzc1ByZXJlcS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoImFTZXQiKTsKLQkJYXNzZXJ0Tm90TnVsbChmKTsKLQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IoZik7Ci0JCWFzc2VydFRydWUocGQuaXNFeHBlcnQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQcm9wUmVidWlsZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJb2JqRmVhdHVyZXNTZXR1cCgpOwotCQkKLQkJLy8gVGVzdCByZW1vdmluZyBhIHByb3BlcnR5IGRpcmVjdGx5IGZyb20gYSBzdXBlciBjbGFzcyBjYXVzZXMgdGhlIHN1YmNsYXNzZXMgdG8gcmUtYnVpbGQgdGhlaXIgcHJvcGVydGllcy4KLQkJSmF2YUNsYXNzIHRlc3QxQ2xhc3MgPSBnZXRUZXN0MUNsYXNzKCk7Ci0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzQSA9IGdldFRlc3QxQ2xhc3NBKCk7Ci0JCS8vIEdldCBhbmQgdGVzdCB0aGUgcHJvcGVydGllcyBmaXJzdCB0byBjYXVzZSBpbnRyb3NwZWN0aW9uIGZvciBib3RoIEJFRk9SRSB0aGUgbW9kaWZpY2F0aW9uLgotCQlhc3NlcnRFcXVhbHMoMitvYmpGZWF0dXJlcywgdGVzdDFDbGFzcy5nZXRBbGxQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMrb2JqRmVhdHVyZXMsIHRlc3QxQ2xhc3NBLmdldEFsbFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQl0cnkgewotCQkJdGVzdDFDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkucmVtb3ZlKDApOyAvLyBSZW1vdmUgdGhlIGZpcnN0IG9uZS4gVGhleSBzaG91bGQgYm90aCBub3cgcmVidWlsZC4KLQkJCWFzc2VydEVxdWFscygxK29iakZlYXR1cmVzLCB0ZXN0MUNsYXNzLmdldEFsbFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQkJYXNzZXJ0RXF1YWxzKDIrb2JqRmVhdHVyZXMsIHRlc3QxQ2xhc3NBLmdldEFsbFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gTmVlZCB0byBjbG9zZSBhbmQgcmVvcGVuIHRoZSBwcm9qZWN0IHNvIHRoYXQgdG8gcmVzdG9yZSB0aGUgY29ycmVjdCBzaGFwZSBmb3IgdGVzdDFDbGFzcyBmb3Igb3RoZXIgdGVzdHMuCi0JCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBuYXR1cmUuZ2V0UHJvamVjdCgpOwotCQkJSVNjaGVkdWxpbmdSdWxlIHByb2plY3RSdWxlID0gd29ya3NwYWNlLmdldFJ1bGVGYWN0b3J5KCkubW9kaWZ5UnVsZShwcm9qZWN0KTsKLQkJCXdvcmtzcGFjZS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSAoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlwcm9qZWN0LmNsb3NlKG1vbml0b3IpOwotCQkJCQlwcm9qZWN0Lm9wZW4obW9uaXRvcik7Ci0JCQkJfQotCQkJfSwgcHJvamVjdFJ1bGUsIDAsIG51bGwpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFdmVudFJlYnVpbGQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgcmVtb3ZpbmcgYW4gZXZlbnQgZGlyZWN0bHkgZnJvbSBhIHN1cGVyIGNsYXNzIGNhdXNlcyB0aGUgc3ViY2xhc3NlcyB0byByZS1idWlsZCB0aGVpciBhbGxFdmVudHMuCi0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzID0gZ2V0VGVzdDFDbGFzcygpOwotCQlKYXZhQ2xhc3MgdGVzdDFDbGFzc0EgPSBnZXRUZXN0MUNsYXNzQSgpOwotCQkvLyBHZXQgYW5kIHRlc3QgdGhlIGV2ZW50cyBmaXJzdCB0byBjYXVzZSBpbnRyb3NwZWN0aW9uIGZvciBib3RoIEJFRk9SRSB0aGUgbW9kaWZpY2F0aW9uLgotCQlhc3NlcnRFcXVhbHMoMiwgdGVzdDFDbGFzcy5nZXRBbGxFdmVudHMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGVzdDFDbGFzc0EuZ2V0QWxsRXZlbnRzKCkuc2l6ZSgpKTsJCQotCQl0cnkgewotCQkJdGVzdDFDbGFzcy5nZXRFdmVudHMoKS5yZW1vdmUoMCk7IC8vIFJlbW92ZSB0aGUgZmlyc3Qgb25lLiBUaGV5IHNob3VsZCBub3cgYm90aCByZWJ1aWxkLgotCQkJYXNzZXJ0RXF1YWxzKDEsIHRlc3QxQ2xhc3MuZ2V0QWxsRXZlbnRzKCkuc2l6ZSgpKTsKLQkJCWFzc2VydEVxdWFscygxLCB0ZXN0MUNsYXNzQS5nZXRBbGxFdmVudHMoKS5zaXplKCkpOwkJCQotCQl9IGZpbmFsbHkgewotCQkJLy8gTmVlZCB0byBjbG9zZSBhbmQgcmVvcGVuIHRoZSBwcm9qZWN0IHNvIHRoYXQgdG8gcmVzdG9yZSB0aGUgY29ycmVjdCBzaGFwZSBmb3IgdGVzdDFDbGFzcyBmb3Igb3RoZXIgdGVzdHMuCi0JCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gbmF0dXJlLmdldFByb2plY3QoKTsKLQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJSVNjaGVkdWxpbmdSdWxlIHByb2plY3RSdWxlID0gd29ya3NwYWNlLmdldFJ1bGVGYWN0b3J5KCkubW9kaWZ5UnVsZShwcm9qZWN0KTsKLQkJCXdvcmtzcGFjZS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSAoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlwcm9qZWN0LmNsb3NlKG1vbml0b3IpOwotCQkJCQlwcm9qZWN0Lm9wZW4obW9uaXRvcik7Ci0JCQkJfQotCQkJfSwgcHJvamVjdFJ1bGUsIDAsIG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0Q3VzdG9tZXIoKSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI0N1c3RvbWVyIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lckNsYXNzKCkgewotCQlKYXZhQ2xhc3MgY3VzdG9tZXIgPSBnZXRDdXN0b21lcigpOwotCQkKLQkJLy8gTm93IHRlc3QgY3VzdG9tZXIgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaW50cm9zcGVjdHMgY29ycmVjdGx5LCBwbHVzIHRoZSBpbm5lciBjbGFzcyBvZiBvbmUgb2YgaXRzIHByb3BlcnRpZXMgZG9lcyB0b28uCi0JCUxpc3QgYWxsTG9jYWxGZWF0dXJlcyA9IGN1c3RvbWVyLmdldFByb3BlcnRpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGFsbExvY2FsRmVhdHVyZXMuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaXRyID0gYWxsTG9jYWxGZWF0dXJlcy5pdGVyYXRvcigpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlFU3RydWN0dXJhbEZlYXR1cmUgZWEgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBpdHIubmV4dCgpOwotCQkJaWYgKCJzYXZpbmdzIi5lcXVhbHMoZWEuZ2V0TmFtZSgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJZm91bmQgPSB0cnVlOwotCQkJCUphdmFDbGFzcyBpbm5lckNsYXNzID0gKEphdmFDbGFzcykgZWEuZ2V0RVR5cGUoKTsJLy8gVGhpcyBwcm9wZXJ0eSB0eXBlIGlzIGFuIGlubmVyY2xhc3Mgb2YgQ3VzdG9tZXIKLQkJCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyJEFjY291bnQiLCBpbm5lckNsYXNzLmdldE5hbWUoKSk7Ci0JCQkJYWxsTG9jYWxGZWF0dXJlcyA9IGlubmVyQ2xhc3MuZ2V0UHJvcGVydGllcygpOwotCQkJCWFzc2VydEVxdWFscygyLCBhbGxMb2NhbEZlYXR1cmVzLnNpemUoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoZm91bmQpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0VGVzdEJvdW5kTm90Qm91bmQoKSB7Ci0JCXJldHVybiAoSmF2YUNsYXNzKSByc2V0LmdldEVPYmplY3QoVVJJLmNyZWF0ZVVSSSgiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvI1Rlc3RCb3VuZE5vdEJvdW5kIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROb3RCb3VuZFJlZmxlY3Rpb24oKSB7Ci0JCUphdmFDbGFzcyB0ZXN0Qm91bmROb3RCb3VuZCA9IGdldFRlc3RCb3VuZE5vdEJvdW5kKCk7Ci0JCQotCQkvLyBOb3cgdGVzdCB0aGF0IHByb3BlcnRpZXMgYXJlIGJvdW5kIGNvcnJlY3RseSBvbiByZWZsZWN0aW9uLiBGaXJzdCB0ZXN0IHJlZmxlY3Qgbm90IGJvdW5kIGNvcnJlY3QuCi0JCS8vIFRoaXMgaXMgZGV0ZXJtaW5lZCBieSBubyBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG1ldGhvZCBvbiBjbGFzcy4JCQotCQlMaXN0IGFsbExvY2FsRmVhdHVyZXMgPSB0ZXN0Qm91bmROb3RCb3VuZC5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBhbGxMb2NhbEZlYXR1cmVzLnNpemUoKSk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBlYSA9IChFU3RydWN0dXJhbEZlYXR1cmUpIGFsbExvY2FsRmVhdHVyZXMuZ2V0KDApOwotCQlQcm9wZXJ0eURlY29yYXRvciBwZCA9IFV0aWxpdGllcy5nZXRQcm9wZXJ0eURlY29yYXRvcihlYSk7Ci0JCWFzc2VydE5vdE51bGwocGQpOwotCQlhc3NlcnRGYWxzZShwZC5pc0JvdW5kKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUNsYXNzIGdldFRlc3RCb3VuZFN1cGVyKCkgewotCQlyZXR1cm4gKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0Qm91bmRTdXBlciIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Qm91bmRSZWZsZWN0aW9uKCkgewotCQlKYXZhQ2xhc3MgdGVzdEJvdW5kU3VwZXIgPSBnZXRUZXN0Qm91bmRTdXBlcigpOwotCQkKLQkJLy8gVGVzdCB0aGF0IHJlZmxlY3Rpb24gY2FuIGZpbmQgYm91bmQgcHJvcGVydHkuCi0JCS8vIFRoaXMgaXMgZGV0ZXJtaW5lZCBieSBmaW5kaW5nIGFkZC9yZW1vdmUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBtZXRob2Qgb24gY2xhc3MuCQkKLQkJTGlzdCBhbGxMb2NhbEZlYXR1cmVzID0gdGVzdEJvdW5kU3VwZXIuZ2V0UHJvcGVydGllcygpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWxsTG9jYWxGZWF0dXJlcy5zaXplKCkpOwotCQlFU3RydWN0dXJhbEZlYXR1cmUgZWEgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBhbGxMb2NhbEZlYXR1cmVzLmdldCgwKTsKLQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IoZWEpOwotCQlhc3NlcnROb3ROdWxsKHBkKTsKLQkJYXNzZXJ0VHJ1ZShwZC5pc0JvdW5kKCkpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0VGVzdEJvdW5kU3ViKCkgewotCQlyZXR1cm4gKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0Qm91bmRTdWIiKSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJvdW5kUmVmbGVjdGlvblN1YmNsYXNzKCkgewotCQlKYXZhQ2xhc3MgdGVzdEJvdW5kU3ViID0gZ2V0VGVzdEJvdW5kU3ViKCk7Ci0KLQkJLy8gVGVzdCB0aGF0IHJlZmxlY3Rpb24gY2FuIGZpbmQgYm91bmQgcHJvcGVydHkgZHVlIHRvIGluaGVyaXQgZnJvbSBhIGJvdW5kIGNsYXNzLgotCQkvLyBUaGlzIGlzIGRldGVybWluZWQgYnkgZmluZGluZyBhZGQvcmVtb3ZlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbWV0aG9kIG9uIGNsYXNzIChidXQgZnJvbSBhIHN1cGVyIGNsYXNzKS4JCQkJCQkKLQkJTGlzdCBhbGxMb2NhbEZlYXR1cmVzID0gdGVzdEJvdW5kU3ViLmdldFByb3BlcnRpZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFsbExvY2FsRmVhdHVyZXMuc2l6ZSgpKTsJCQotCQlFU3RydWN0dXJhbEZlYXR1cmUgZWEgPSAoRVN0cnVjdHVyYWxGZWF0dXJlKSBhbGxMb2NhbEZlYXR1cmVzLmdldCgwKTsKLQkJUHJvcGVydHlEZWNvcmF0b3IgcGQgPSBVdGlsaXRpZXMuZ2V0UHJvcGVydHlEZWNvcmF0b3IoZWEpOwotCQlhc3NlcnROb3ROdWxsKHBkKTsKLQkJYXNzZXJ0VHJ1ZShwZC5pc0JvdW5kKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGVzRmlsZSgpIHsKLQkJLy8gVGVzdCB0aGF0IG92ZXJyaWRlIGZpbGVzIGdldCBhcHBsaWVkIGNvcnJlY3RseS4KLQkJSmF2YUNsYXNzIHRlc3RPdmVycmlkZSA9IChKYXZhQ2xhc3MpIHJzZXQuZ2V0RU9iamVjdChVUkkuY3JlYXRlVVJJKCJqYXZhOi9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8jVGVzdE92ZXJyaWRlcyIpLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKHRlc3RPdmVycmlkZSk7Ci0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSB4eXogPSB0ZXN0T3ZlcnJpZGUuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJ4eXoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh4eXopOwotCQkvLyBUZXN0IHRoYXQgaXQgaGFzIHRoZSBjb3JyZWN0IHR5cGUgc28gdGhhdCB3ZSBrbm93IGl0IHdhcyByZWZsZWN0ZWQgY29ycmVjdGx5LgotCQlhc3NlcnRFcXVhbHMocnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6LyNpbnQiKSwgdHJ1ZSksIHh5ei5nZXRFVHlwZSgpKTsKLQkJCi0JCS8vIFRlc3QgdGhhdCB3ZSBoYXZlIHRoZSBhbm5vdGF0aW9uIHdlIGFkZGVkLgotCQlhc3NlcnROb3ROdWxsKHh5ei5nZXRFQW5ub3RhdGlvbigiT3ZlcnJpZGUgQW5ub3RhdGlvbiIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDc5MDgzKCkgewotCQkvLyBUZXN0IGJ1ZyA3OTA4MzogTnVsbCBFVHlwZXMgZnJvbSBvdmVycmlkZXMgdGhhdCBkaWRuJ3QgaGF2ZSBhIHJlZmxlY3Rpb24gdG8gZ2l2ZSBpdCB0aGUgdHlwZS4gQmVhbkluZm8gc2hvdWxkIG1ha2UgaXQgRU9iamVjdCB0eXBlLgotCQlKYXZhQ2xhc3MgdGVzdE92ZXJyaWRlID0gKEphdmFDbGFzcykgcnNldC5nZXRFT2JqZWN0KFVSSS5jcmVhdGVVUkkoImphdmE6L29yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbyNUZXN0T3ZlcnJpZGVzIiksIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwodGVzdE92ZXJyaWRlKTsKLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHRlc3Q3OTA4MyA9IHRlc3RPdmVycmlkZS5nZXRFU3RydWN0dXJhbEZlYXR1cmUoInRlc3Q3OTA4MyIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3Q3OTA4Myk7Ci0JCWFzc2VydEVxdWFscyhFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVPYmplY3QoKSwgdGVzdDc5MDgzLmdldEVUeXBlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2luc3RhbnRpYXRpb24vSW5zdGFudGlhdGlvblN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9pbnN0YW50aWF0aW9uL0luc3RhbnRpYXRpb25TdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWMwYjk2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2luc3RhbnRpYXRpb24vSW5zdGFudGlhdGlvblN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLmluc3RhbnRpYXRpb247Ci0vKgotICogICRSQ1NmaWxlOiBJbnN0YW50aWF0aW9uU3VpdGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NTYgJCAKLSAqLwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvTmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uLmJhc2UuSmF2YUluc3RhbnRpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFQcm9qZWN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVRlc3RzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5BYnN0cmFjdEJlYW5JbmZvVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICoKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbnRpYXRpb25TdWl0ZSBleHRlbmRzIFRlc3RTZXR1cCB7Ci0KLQkvLyBUZXN0IGNhc2VzIHRvIGJlIGluY2x1ZGUgaW4gdGhlIHN1aXRlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgdGVzdHNMaXN0W10gPSB7IFRlc3RTdGFuZGFyZC5jbGFzcywgfTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJbnN0YW50aWF0aW9uU3VpdGUoKSB7Ci0JCXRoaXMoIlRlc3QgSW5zdGFudGlhdGlvbiBTdWl0ZSIpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEluc3RhbnRpYXRpb25TdWl0ZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuZXcgVGVzdFN1aXRlKG5hbWUpIHsKLQkJCXsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RzTGlzdC5sZW5ndGg7IGkrKykgewotCQkJCQlhZGRUZXN0U3VpdGUodGVzdHNMaXN0W2ldKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IEluc3RhbnRpYXRpb25TdWl0ZSgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBvbGRBdXRvQnVpbGRpbmdTdGF0ZTsgLy8gYXV0b0J1aWxkaW5nIHN0YXRlIGJlZm9yZSB3ZSBzdGFydGVkLgkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tIEluaXRpYWxpemluZyB0aGUgSW5zdGFudGlhdGlvbiB0ZXN0IGRhdGEgLS0iKTsgLy8kTk9OLU5MUy0xJAotCQlvbGRBdXRvQnVpbGRpbmdTdGF0ZSA9IEphdmFQcm9qZWN0VXRpbC5zZXRBdXRvQnVpbGQodHJ1ZSk7Ci0JCVVSTCBpbnN0YWxsVVJMID0gSmF2YVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7Ci0JCVN0cmluZ1tdIHppcFBhdGhzID0gbmV3IFN0cmluZ1syXTsKLQkJemlwUGF0aHNbMF0gPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwobmV3IFVSTChpbnN0YWxsVVJMLCAidGVzdGRhdGEvdGVzdGJlYW5pbmZvLnppcCIpKS5nZXRGaWxlKCk7Ci0JCXppcFBhdGhzWzFdID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKG5ldyBVUkwoaW5zdGFsbFVSTCwgInRlc3RkYXRhL3Rlc3RiZWFuaW5mb3ByZXEuemlwIikpLmdldEZpbGUoKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9Ci0JCQlKYXZhUHJvamVjdFV0aWwuaW1wb3J0UHJvamVjdHMoCi0JCQkJbmV3IFN0cmluZ1tdIHsgQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLlRFU1RfQkVBTklORk9fUFJPSkVDVCwgQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLlRFU1RfQkVBTklORk9fUFJFUkVRX1BST0pFQ1QgfSwKLQkJCQl6aXBQYXRocyk7Ci0JCWFzc2VydE5vdE51bGwocHJvamVjdHNbMF0pOwotCQlhc3NlcnROb3ROdWxsKHByb2plY3RzWzFdKTsKLQkJSmF2YVByb2plY3RVdGlsLndhaXRGb3JBdXRvQnVpbGQoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCItLSBEYXRhIGluaXRpYWxpemVkIC0tIik7IC8vJE5PTi1OTFMtMSQKLQotCQlCZWFuaW5mb05hdHVyZSBuYXR1cmUgPSBCZWFuaW5mb05hdHVyZS5nZXRSdW50aW1lKHByb2plY3RzWzBdKTsKLQkJYXNzZXJ0Tm90TnVsbChuYXR1cmUpOwotCQlKYXZhSW5zdGFudGlhdGlvbi5pbml0aWFsaXplKG5hdHVyZS5nZXRSZXNvdXJjZVNldCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJSmF2YVByb2plY3RVdGlsLmRlbGV0ZVByb2plY3QoSmF2YVByb2plY3RVdGlsLmdldFByb2plY3QoQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlLlRFU1RfQkVBTklORk9fUFJPSkVDVCkpOwotCQkJCUphdmFQcm9qZWN0VXRpbC5kZWxldGVQcm9qZWN0KEphdmFQcm9qZWN0VXRpbC5nZXRQcm9qZWN0KEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5URVNUX0JFQU5JTkZPX1BSRVJFUV9QUk9KRUNUKSk7Ci0JCQl9Ci0JCX0sIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIDAsIG51bGwpOwotCi0JCUphdmFQcm9qZWN0VXRpbC5zZXRBdXRvQnVpbGQob2xkQXV0b0J1aWxkaW5nU3RhdGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvaW5zdGFudGlhdGlvbi9UZXN0U3RhbmRhcmQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL2luc3RhbnRpYXRpb24vVGVzdFN0YW5kYXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMmE3YjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvaW5zdGFudGlhdGlvbi9UZXN0U3RhbmRhcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5pbnN0YW50aWF0aW9uOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci0vL2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uYWRhcHRlcnMuQmVhbmluZm9OYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5pdFN0cmluZ0FsbG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uSW5zdGFudGlhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YURhdGFUeXBlSW5zdGFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS5JSmF2YU9iamVjdEluc3RhbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFQcm9qZWN0VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgVGVzdFN0YW5kYXJkIGV4dGVuZHMgVGVzdENhc2UgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFRlc3RTdGFuZGFyZCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBUZXN0U3RhbmRhcmQoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJlYW5pbmZvTmF0dXJlIG5hdHVyZTsKLQlwcm90ZWN0ZWQgUmVzb3VyY2VTZXQgcnNldDsKLQlwcm90ZWN0ZWQgSmF2YUhlbHBlcnMgYm9vbFR5cGU7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCUlQcm9qZWN0IGJpUHJvamVjdCA9IEphdmFQcm9qZWN0VXRpbC5nZXRQcm9qZWN0KEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5URVNUX0JFQU5JTkZPX1BST0pFQ1QpOwotCQlhc3NlcnROb3ROdWxsKGJpUHJvamVjdCk7Ci0JCW5hdHVyZSA9IEJlYW5pbmZvTmF0dXJlLmdldFJ1bnRpbWUoYmlQcm9qZWN0KTsKLQkJYXNzZXJ0Tm90TnVsbChuYXR1cmUpOwotCQlyc2V0ID0gbmF0dXJlLmdldFJlc291cmNlU2V0KCk7Ci0JCWFzc2VydE5vdE51bGwocnNldCk7Ci0JCWJvb2xUeXBlID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLnJlZmxlY3RUeXBlKCJib29sZWFuIiwgcnNldCk7Ci0JCWFzc2VydE5vdE51bGwoYm9vbFR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ2xhc3MgZ2V0VGVzdDFDbGFzcygpIHsKLQkJcmV0dXJuIChKYXZhQ2xhc3MpIEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5yZWZsZWN0VHlwZSgib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLlRlc3QxQ2xhc3MiLCByc2V0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbml0KCkgewotCQlKYXZhQ2xhc3MgdGVzdDFDbGFzcyA9IGdldFRlc3QxQ2xhc3MoKTsKLQotCQkvLyBUZXN0IGluc3RhbnRpYXRlIGFuIGluc3RhbmNlLgotCQlJSmF2YU9iamVjdEluc3RhbmNlIGppMSA9IChJSmF2YU9iamVjdEluc3RhbmNlKSB0ZXN0MUNsYXNzLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpLmNyZWF0ZSh0ZXN0MUNsYXNzKTsKLQkJamkxLnNldEFsbG9jYXRpb24oSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCJuZXcgVGVzdDFDbGFzcygpIikpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEluaXQoamkxKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXNzZXJ0SW5pdChJSmF2YU9iamVjdEluc3RhbmNlIGppMSkgewotCQkvLyBIZXJlIGJlY2F1c2UgdHdvIHRlc3RzIHdpbGwgZG8gc2FtZSB0ZXN0IHNlcXVlbmNlLgotCQlhc3NlcnRUcnVlKGppMS5pc1NldEFsbG9jYXRpb24oKSk7Ci0JCUluaXRTdHJpbmdBbGxvY2F0aW9uIGFsbG9jID0gKEluaXRTdHJpbmdBbGxvY2F0aW9uKSBqaTEuZ2V0QWxsb2NhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoIm5ldyBUZXN0MUNsYXNzKCkiLCBhbGxvYy5nZXRJbml0U3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5QWNjZXNzKCkgewotCQlKYXZhQ2xhc3MgdGVzdDFDbGFzcyA9IGdldFRlc3QxQ2xhc3MoKTsKLQkJSUphdmFPYmplY3RJbnN0YW5jZSBqaTEgPSAoSUphdmFPYmplY3RJbnN0YW5jZSkgdGVzdDFDbGFzcy5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKS5jcmVhdGUodGVzdDFDbGFzcyk7Ci0JCWppMS5zZXRBbGxvY2F0aW9uKEluc3RhbnRpYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJbml0U3RyaW5nQWxsb2NhdGlvbigibmV3IFRlc3QxQ2xhc3MoKSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFRlc3QgcHJvcGVydHkgc2V0L2dldCBvZiBhIGR5bmFtaWMgcHJvcGVydHkuCi0JCUVTdHJ1Y3R1cmFsRmVhdHVyZSBzZXRTRiA9IHRlc3QxQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlKCJzZXQiKTsKLQkJYXNzZXJ0Tm90TnVsbChzZXRTRik7Ci0JCWFzc2VydFNhbWUoYm9vbFR5cGUsIHNldFNGLmdldEVUeXBlKCkpOwotCQlJSmF2YURhdGFUeXBlSW5zdGFuY2Ugc2V0dGluZyA9IChJSmF2YURhdGFUeXBlSW5zdGFuY2UpIHNldFNGLmdldEVUeXBlKCkuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKChFQ2xhc3MpIHNldFNGLmdldEVUeXBlKCkpOwotCQlzZXR0aW5nLnNldEFsbG9jYXRpb24oSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCJ0cnVlIikpOyAvLyROT04tTkxTLTEkCi0JCWppMS5lU2V0KAotCQkJc2V0U0YsCi0JCQlzZXR0aW5nKTsKLQkJYXNzZXJ0UHJvcGVydHkoamkxKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXNzZXJ0UHJvcGVydHkoSUphdmFPYmplY3RJbnN0YW5jZSBqaTEpIHsKLQkJLy8gSGVyZSBiZWNhdXNlIHR3byB0ZXN0cyB3aWxsIGRvIHNhbWUgdGVzdCBzZXF1ZW5jZS4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHNldFNGID0gamkxLmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgic2V0Iik7Ci0JCU9iamVjdCB2ID0gamkxLmVHZXQoc2V0U0YpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRUcnVlKHYgaW5zdGFuY2VvZiBJSmF2YURhdGFUeXBlSW5zdGFuY2UpOwotCQlJSmF2YURhdGFUeXBlSW5zdGFuY2UgZHR2ID0gKElKYXZhRGF0YVR5cGVJbnN0YW5jZSkgdjsKLQkJYXNzZXJ0U2FtZShib29sVHlwZSwgZHR2LmdldEphdmFUeXBlKCkpOwotCQlhc3NlcnRUcnVlKGR0di5pc1NldEFsbG9jYXRpb24oKSk7Ci0JCUluaXRTdHJpbmdBbGxvY2F0aW9uIGFsbG9jID0gKEluaXRTdHJpbmdBbGxvY2F0aW9uKSBkdHYuZ2V0QWxsb2NhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoInRydWUiLCBhbGxvYy5nZXRJbml0U3RyaW5nKCkpOwotCX0KLQotCXByb3RlY3RlZCBJSmF2YU9iamVjdEluc3RhbmNlIHNldHVwSW5zdGFuY2UoKSB7Ci0JCS8vIFNldHVwIHRoZSBzdGFuZGFyZCB0ZXN0IGluc3RhbmNlIHdpdGhvdXQgdGhlIGFzc2VydGlvbnMuIEZvciB1c2UgaW4gb3RoZXIgdGVzdHMuCi0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzID0gZ2V0VGVzdDFDbGFzcygpOwotCQlJSmF2YU9iamVjdEluc3RhbmNlIGppMSA9IChJSmF2YU9iamVjdEluc3RhbmNlKSB0ZXN0MUNsYXNzLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpLmNyZWF0ZSh0ZXN0MUNsYXNzKTsKLQkJamkxLnNldEFsbG9jYXRpb24oSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCJuZXcgVGVzdDFDbGFzcygpIikpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gVGVzdCBwcm9wZXJ0eSBzZXQvZ2V0IG9mIGEgZHluYW1pYyBwcm9wZXJ0eS4KLQkJRVN0cnVjdHVyYWxGZWF0dXJlIHNldFNGID0gdGVzdDFDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmUoInNldCIpOwotCQlJSmF2YURhdGFUeXBlSW5zdGFuY2Ugc2V0dGluZyA9IChJSmF2YURhdGFUeXBlSW5zdGFuY2UpIHNldFNGLmdldEVUeXBlKCkuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKChFQ2xhc3MpIHNldFNGLmdldEVUeXBlKCkpOwotCQlzZXR0aW5nLnNldEFsbG9jYXRpb24oSW5zdGFudGlhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaXRTdHJpbmdBbGxvY2F0aW9uKCJ0cnVlIikpOyAvLyROT04tTkxTLTEkCi0JCWppMS5lU2V0KAotCQkJc2V0U0YsCi0JCQlzZXR0aW5nKTsKLQkJcmV0dXJuIGppMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNldHVwUmVzb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJSmF2YU9iamVjdEluc3RhbmNlIGppMSA9IHNldHVwSW5zdGFuY2UoKTsKLQotCQkvLyBXcml0ZSBpdCBvdXQsIHNlZSBpZiBpdCBpcyB3aGF0IGl0IHNob3VsZCBiZSwgdGhlbiByZWFkIGl0IGluIGFuZCBzZWUgaWYgaXQgbG9hZHMgY29ycmVjdGx5LgotCQlSZXNvdXJjZVNldCByc3dvcmsxID0gbmF0dXJlLm5ld1Jlc291cmNlU2V0KCk7IC8vIFJzb3VyY2Ugc2V0IHRvIHdyaXRlIGZyb20KLQotCQlSZXNvdXJjZSByID0gcnN3b3JrMS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCJmLnhtaSIpKTsgLy8kTk9OLU5MUy0xJAotCQlyLmdldENvbnRlbnRzKCkuYWRkKGppMSk7Ci0JCS8vIEJpdCBvZiBhIGtsdWRnZSwgYnV0IGFsbCByZWZlcmVuY2VzIGluIGphdmEgbW9kZWwgYXJlIHNoYXJlZCwgc28gdG8gc2VyaWFsaXplIHdlIG5lZWQgdG8gZ2V0IHRoZSAKLQkJLy8gInNldCIgc2V0dGluZyBhbmQgYWRkIHRvIHRoZSByZXNvdXJjZSBzbyB0aGF0IGl0IGlzIGNvbnRhaW5lZCBzb21ld2hlcmUuCi0JCXIuZ2V0Q29udGVudHMoKS5hZGQoamkxLmVHZXQoamkxLmVDbGFzcygpLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZSgic2V0IikpKTsKLQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXIuc2F2ZShibywgQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJcmV0dXJuIGJvLnRvU3RyaW5nKCk7Ci0JfQotCi0vKgotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVGVzdCB0aGUgc2VyaWFsaXphdGlvbiB0aGF0IGl0IHByb2R1Y2VzIGNvcnJlY3Qgb3V0cHV0IHN0cmluZy4KLQkJU3RyaW5nIG91dCA9IHNldHVwUmVzb3VyY2UoKTsKLQkJLy8gTmVlZCB0byBjcmVhdGUgYSBwcmludCBzdHJlYW0gc28gdGhhdCB3ZSBnZXQgdGhlIGNvcnJlY3QgbG9jYWwgbmV3bGluZSBjaGFycyBpbiB0byBtYXRjaCBmcm9tIHRoZSByZXNvdXJjZS4KLQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcihvdXQubGVuZ3RoKCkgKyA1MCk7Ci0JCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQkJcHcucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiQVNDSUlcIj8+Iik7Ci0JCXB3LnByaW50bG4oCi0JCQkiPHhtaTpYTUkgeG1pOnZlcnNpb249XCIyLjBcIiB4bWxuczp4bWk9XCJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JXCIgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIiB4bWxuczpfLWphdmFwcmltPVwiamF2YTovXCIgeG1sbnM6b3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb249XCJodHRwOi8vL29yZy9lY2xpcHNlL2plbS9pbnRlcm5hbC9pbnN0YW50aWF0aW9uLmVjb3JlXCIgeG1sbnM6b3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvPVwiamF2YTovb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvXCI+Iik7Ci0JCXB3LnByaW50bG4oIiAgPG9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mbzpUZXN0MUNsYXNzIHNldD1cIi8xXCI+Iik7Ci0JCXB3LnByaW50bG4oIiAgICA8YWxsb2NhdGlvbiB4c2k6dHlwZT1cIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5pbnN0YW50aWF0aW9uOkluaXRTdHJpbmdBbGxvY2F0aW9uXCIgaW5pdFN0cmluZz1cIm5ldyBUZXN0MUNsYXNzKClcIi8+Iik7Ci0JCXB3LnByaW50bG4oIiAgPC9vcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm86VGVzdDFDbGFzcz4iKTsKLQkJcHcucHJpbnRsbigiICA8Xy1qYXZhcHJpbTpib29sZWFuPiIpOwotCQlwdy5wcmludGxuKCIgICAgPGFsbG9jYXRpb24geHNpOnR5cGU9XCJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbjpJbml0U3RyaW5nQWxsb2NhdGlvblwiIGluaXRTdHJpbmc9XCJ0cnVlXCIvPiIpOwotCQlwdy5wcmludGxuKCIgIDwvXy1qYXZhcHJpbTpib29sZWFuPiIpOwotCQlwdy5wcmludGxuKCI8L3htaTpYTUk+Iik7Ci0JCXB3LmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscyhzdy50b1N0cmluZygpLCBvdXQpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdFJlYWRpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBUZXN0IHJlYWRpbmcgc2VyaWFsaXphdGlvbiBiYWNrIGluIHByb2R1Y2VzIGNvcnJlY3Qgb2JqZWN0cy4KLQkJLy8gUmVydW4gdGVzdHMuCi0JCVN0cmluZyBvdXQgPSBzZXR1cFJlc291cmNlKCk7Ci0KLQkJUmVzb3VyY2VTZXQgcnN3b3JrMiA9IG5hdHVyZS5uZXdSZXNvdXJjZVNldCgpOyAvLyBSZXNvdXJjZSBzZXQgdG8gcmVhZCBpbnRvCi0JCVJlc291cmNlIHJJbiA9IHJzd29yazIuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiZjEueG1pIikpOyAvLyROT04tTkxTLTEkCi0JCXJJbi5sb2FkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQuZ2V0Qnl0ZXMoKSksIENvbGxlY3Rpb25zLkVNUFRZX01BUCk7Ci0JCUphdmFDbGFzcyB0ZXN0MUNsYXNzID0gZ2V0VGVzdDFDbGFzcygpOwotCQlJSmF2YU9iamVjdEluc3RhbmNlIGppMSA9IChJSmF2YU9iamVjdEluc3RhbmNlKSBFY29yZVV0aWwuZ2V0T2JqZWN0QnlUeXBlKHJJbi5nZXRDb250ZW50cygpLCB0ZXN0MUNsYXNzKTsKLQkJYXNzZXJ0Tm90TnVsbChqaTEpOwotCQlhc3NlcnRJbml0KGppMSk7Ci0JCWFzc2VydFByb3BlcnR5KGppMSk7Ci0JfQotKi8KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvSUxpc3RlbmVyVGVzdGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9JTGlzdGVuZXJUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNlNTY2Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9JTGlzdGVuZXJUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IElMaXN0ZW5lclRlc3Rlci5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU1ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotIAotCi0vKioKLSAqIEZvciBtYW55IG9mIHRoZSBsaXN0ZW5lciB0ZXN0cywgdGhlIGFjdHVhbCBBc3NlcnQgaXMgZG9uZSBvbiBhIHNhZmUgcnVubmFibGUgc28gdGhhdCBpdCBjYW4ndCBiZSAKLSAqIG5vcm1hbGx5IHNlbnQuIFNvIHdlIHdpbGwgaGF2ZSBhIGxpc3RlbmVyIHRlc3RlciB0aGF0IHdpbGwgcmV0cmlldmUgdGhlIGV4Y2VwdGlvbiBhbmQgd2lsbAotICogYmUgY2FsbGVkIHRvIGdldCBpdCBmcm9tIHRoZSBtYWluIHRocmVhZC4KLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMaXN0ZW5lclRlc3RlciB7Ci0KLQlwdWJsaWMgdm9pZCBpc0V4Y2VwdGlvbigpIHRocm93cyBBc3NlcnRpb25GYWlsZWRFcnJvcjsKLQlwdWJsaWMgdm9pZCBpc0NvbXBsZXRlKCkgdGhyb3dzIEFzc2VydGlvbkZhaWxlZEVycm9yOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvTGlzdGVuZXJzU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL0xpc3RlbmVyc1N1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNTQxMzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvTGlzdGVuZXJzU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnM7Ci0vKgotICogICRSQ1NmaWxlOiBMaXN0ZW5lcnNTdWl0ZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA2LzA1LzE3IDIwOjEzOjU2ICQgCi0gKi8KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5leHRlbnNpb25zLlRlc3RTZXR1cDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhUHJvamVjdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFUZXN0c1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uQWJzdHJhY3RCZWFuSW5mb1Rlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lcnNTdWl0ZSBleHRlbmRzIFRlc3RTZXR1cCB7Ci0KLQkvLyBUZXN0IGNhc2VzIHRvIGJlIGluY2x1ZGUgaW4gdGhlIHN1aXRlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgdGVzdHNMaXN0W10gPSB7IFRlc3RKRU0uY2xhc3MsIFRlc3RCZWFuSW5mby5jbGFzc307Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXJzU3VpdGUoKSB7Ci0JCXRoaXMoIlRlc3QgTGlzdGVuZXJzIFN1aXRlIik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXJzU3VpdGUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmV3IFRlc3RTdWl0ZShuYW1lKSB7Ci0JCQl7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0c0xpc3QubGVuZ3RoOyBpKyspIHsKLQkJCQkJYWRkVGVzdFN1aXRlKHRlc3RzTGlzdFtpXSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0ZW5lcnNTdWl0ZSgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBvbGRBdXRvQnVpbGRpbmdTdGF0ZTsgLy8gYXV0b0J1aWxkaW5nIHN0YXRlIGJlZm9yZSB3ZSBzdGFydGVkLgkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tIEluaXRpYWxpemluZyB0aGUgTGlzdGVuZXJzIHRlc3QgZGF0YSAtLSIpOyAvLyROT04tTkxTLTEkCi0JCW9sZEF1dG9CdWlsZGluZ1N0YXRlID0gSmF2YVByb2plY3RVdGlsLnNldEF1dG9CdWlsZCh0cnVlKTsKLQkJVVJMIGluc3RhbGxVUkwgPSBKYXZhVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLQkJU3RyaW5nW10gemlwUGF0aHMgPSBuZXcgU3RyaW5nWzJdOwotCQl6aXBQYXRoc1swXSA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChuZXcgVVJMKGluc3RhbGxVUkwsICJ0ZXN0ZGF0YS90ZXN0YmVhbmluZm8uemlwIikpLmdldEZpbGUoKTsKLQkJemlwUGF0aHNbMV0gPSBGaWxlTG9jYXRvci50b0ZpbGVVUkwobmV3IFVSTChpbnN0YWxsVVJMLCAidGVzdGRhdGEvdGVzdGJlYW5pbmZvcHJlcS56aXAiKSkuZ2V0RmlsZSgpOwotCQlJUHJvamVjdFtdIHByb2plY3RzID0KLQkJCUphdmFQcm9qZWN0VXRpbC5pbXBvcnRQcm9qZWN0cygKLQkJCQluZXcgU3RyaW5nW10geyBBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUk9KRUNULCBBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUkVSRVFfUFJPSkVDVCB9LAotCQkJCXppcFBhdGhzKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm9qZWN0c1swXSk7Ci0JCWFzc2VydE5vdE51bGwocHJvamVjdHNbMV0pOwotCQlKYXZhUHJvamVjdFV0aWwud2FpdEZvckF1dG9CdWlsZCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tIERhdGEgaW5pdGlhbGl6ZWQgLS0iKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCUphdmFQcm9qZWN0VXRpbC5kZWxldGVQcm9qZWN0KEphdmFQcm9qZWN0VXRpbC5nZXRQcm9qZWN0KEFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZS5URVNUX0JFQU5JTkZPX1BST0pFQ1QpKTsKLQkJCQlKYXZhUHJvamVjdFV0aWwuZGVsZXRlUHJvamVjdChKYXZhUHJvamVjdFV0aWwuZ2V0UHJvamVjdChBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUkVSRVFfUFJPSkVDVCkpOwotCQkJfQotCQl9LCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLCAwLCBudWxsKTsKLQotCQlKYXZhUHJvamVjdFV0aWwuc2V0QXV0b0J1aWxkKG9sZEF1dG9CdWlsZGluZ1N0YXRlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RCZWFuSW5mby5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvVGVzdEJlYW5JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOWQwZDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvVGVzdEJlYW5JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBUZXN0QmVhbkluZm8uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTAgJCAgJERhdGU6IDIwMDYvMDkvMTggMjI6NTc6NTUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvTW9kZWxTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmNvcmUuSUJlYW5pbmZvU3VwcGxpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci0gCi0KLS8qKgotICogVGhpcyBpcyBmb3IgdGVzdGluZyB0aGUgSkVNIFJlZmxlY3Rpb24gbGlzdGVuZXJzCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RCZWFuSW5mbyBleHRlbmRzIFRlc3RMaXN0ZW5lcnMgewotCQotCUJlYW5pbmZvTW9kZWxTeW5jaHJvbml6ZXIgc3luYzsKLQlUZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeSBmYWN0b3J5OwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmYWN0b3J5ID0gbmV3IFRlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5KG5ldyBJQmVhbmluZm9TdXBwbGllcigpIHsKLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5JQmVhbmluZm9TdXBwbGllciNnZXRSZWdpc3RyeSgpCi0JCQkgKi8KLQkJCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5JQmVhbmluZm9TdXBwbGllciNpc1JlZ2lzdHJ5Q3JlYXRlZCgpCi0JCQkgKi8KLQkJCXB1YmxpYyBib29sZWFuIGlzUmVnaXN0cnlDcmVhdGVkKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5JQmVhbmluZm9TdXBwbGllciNjbG9zZVJlZ2lzdHJ5KCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgY2xvc2VSZWdpc3RyeSgpIHsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqIAotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYmVhbmluZm8uY29yZS5JQmVhbmluZm9TdXBwbGllciNnZXRQcm9qZWN0KCkKLQkJCSAqLwotCQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIGpwLmdldFByb2plY3QoKTsKLQkJCX0KLQotCQkJcHVibGljIFByb2plY3RSZXNvdXJjZVNldCBnZXROZXdSZXNvdXJjZVNldCgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIFJlc291cmNlU2V0IGdldFByb2plY3RSZXNvdXJjZVNldCgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSk7CS8vIE5lZWRzIHRvIGJlIHNldCBmaXJzdCBzbyB0aGF0IHN1cGVyLnNldFVQKCkgY2FsbHMgdG8gc3BlY2lhbCBzZXR1cHMgd2lsbCBoYXZlIGEgZmFjdG9yeS4KLQkJc3VwZXIuc2V0VXAoKTsJLy8gQ2FsbGVkIGZpcnN0IHNvIHRoYXQgYW55IHNldHVwIHdvbid0IGZpcmUgb3VyIHN5bmNocm9uaXplci4KLQkJCi0JCS8vIEJhc2ljIGZvciB0aGlzIGlzIGFkZCBvdXIgc3BlY2lhbCBsaXN0ZW5lci4gKERvbid0IG5lZWQgZnVsbCBKRU0gbW9kZWwgY2x1dHRlcmluZyB0aGluZ3MgdXApLgkJCi0JCXN5bmMgPSBuZXcgQmVhbmluZm9Nb2RlbFN5bmNocm9uaXplcihmYWN0b3J5LCBqcCk7Ci0JCXNldFRlc3RlcihmYWN0b3J5KTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0VXBDbG9zZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBDbG9zZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcENsb3NlKCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbMF0sIG5ldyBPYmplY3RbMF0pOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcE9wZW4oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwT3BlbigpIHsKLQkJc3VwZXIuc2V0VXBPcGVuKCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbMF0sIG5ldyBPYmplY3RbMF0pOwkJCi0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwQWRkTWV0aG9kSW5Xb3JraW5nQ29weSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBBZGRNZXRob2RJbldvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwQWRkTWV0aG9kSW5Xb3JraW5nQ29weSgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50WzBdLCBuZXcgT2JqZWN0WzBdKTsJCQotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcFNhdmVGcm9tV29ya2luZ0NvcHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwU2F2ZUZyb21Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcFNhdmVGcm9tV29ya2luZ0NvcHkoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFtdIHtUZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeS5NQVJLX1NUQUxFX0lOVFJPU1BFQ1RJT05fUExVU19JTk5FUn0sIG5ldyBPYmplY3RbXSB7bmV3IE9iamVjdFtdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLlRlc3QxQ2xhc3MiLCBCb29sZWFuLkZBTFNFfX0pOyAJCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcFJldmVydCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBSZXZlcnQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXBSZXZlcnQoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFswXSwgbmV3IE9iamVjdFswXSk7CQkKLQl9Ci0JCi0vLwkvKiAobm9uLUphdmFkb2MpCi0vLwkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldHVwRGVsZXRlTWV0aG9kTm9Xb3JraW5nQ29weSgpCi0vLwkgKi8KLS8vCXByb3RlY3RlZCB2b2lkIHNldHVwRGVsZXRlTWV0aG9kTm9Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotLy8JCXN1cGVyLnNldHVwRGVsZXRlTWV0aG9kTm9Xb3JraW5nQ29weSgpOwotLy8JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbXSB7VGVzdEJlYW5pbmZvQWRhcHRlckZhY3RvcnkuTUFSS19TVEFMRV9JTlRST1NQRUNUSU9OX1BMVVNfSU5ORVJ9LCBuZXcgT2JqZWN0W10ge25ldyBPYmplY3RbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5UZXN0MUNsYXNzIiwgQm9vbGVhbi5GQUxTRX19KTsJCQotLy8JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldHVwQWRkQ2xhc3MoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwQWRkQ2xhc3MoKSB7Ci0JCXN1cGVyLnNldHVwQWRkQ2xhc3MoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFtdIHtUZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeS5NQVJLX1NUQUxFX0lOVFJPU1BFQ1RJT05fUExVU19JTk5FUn0sIG5ldyBPYmplY3RbXSB7bmV3IE9iamVjdFtdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLk5ld0NsYXNzIiwgQm9vbGVhbi5UUlVFfX0pOwkJCQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0dXBEZWxldGVDbGFzc1dpdGhXb3JraW5nQ29weSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBEZWxldGVDbGFzc1dpdGhXb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXR1cERlbGV0ZUNsYXNzV2l0aFdvcmtpbmdDb3B5KCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbXSB7VGVzdEJlYW5pbmZvQWRhcHRlckZhY3RvcnkuTUFSS19TVEFMRV9JTlRST1NQRUNUSU9OX1BMVVNfSU5ORVIsIFRlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5Lk1BUktfU1RBTEVfSU5UUk9TUEVDVElPTl9QTFVTX0lOTkVSfSwgbmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0W10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uTmV3Q2xhc3MiLCBCb29sZWFuLkZBTFNFfSwgbmV3IE9iamVjdFtdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLk5ld0NsYXNzIiwgQm9vbGVhbi5UUlVFfX0pOwkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwRGVsZXRlQ2xhc3NOb1dvcmtpbmdDb3B5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcERlbGV0ZUNsYXNzTm9Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcERlbGV0ZUNsYXNzTm9Xb3JraW5nQ29weSgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50W10ge1Rlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5Lk1BUktfU1RBTEVfSU5UUk9TUEVDVElPTl9QTFVTX0lOTkVSfSwgbmV3IE9iamVjdFtdIHtuZXcgT2JqZWN0W10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uTmV3Q2xhc3MiLCBCb29sZWFuLlRSVUV9fSk7CQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0VXBBZGRQYWNrYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcEFkZFBhY2thZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXBBZGRQYWNrYWdlKCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbXSB7VGVzdEJlYW5pbmZvQWRhcHRlckZhY3RvcnkuTUFSS19QQUNLQUdFX1NUQUxFfSwgbmV3IE9iamVjdFtdIHsidGVzdCJ9KTsJCQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcERlbGV0ZVBhY2thZ2UoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwRGVsZXRlUGFja2FnZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcERlbGV0ZVBhY2thZ2UoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFtdIHtUZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeS5NQVJLX1BBQ0tBR0VfU1RBTEV9LCBuZXcgT2JqZWN0W10geyJ0ZXN0In0pOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN5bmMuc3RvcFN5bmNocm9uaXplcih0cnVlKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvVGVzdEJlYW5pbmZvQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlZDcyOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDYvMDkvMTggMjI6NTc6NTUgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnRpb25GYWlsZWRFcnJvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5CZWFuaW5mb0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5jb3JlLklCZWFuaW5mb1N1cHBsaWVyOwotCi0vKioKLSAqIFRlc3QgZmFjdG9yeSB0byBoYW5kbGUgdGhlIGNhbGxzIGZyb20gdGhlIGxpc3RlbmVyIGR1cmluZyBvdXIgdGVzdHMuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEJlYW5pbmZvQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBCZWFuaW5mb0FkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUxpc3RlbmVyVGVzdGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBzdXBwbGllcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBUZXN0QmVhbmluZm9BZGFwdGVyRmFjdG9yeShJQmVhbmluZm9TdXBwbGllciBzdXBwbGllcikgewotCQlzdXBlcihzdXBwbGllcik7Ci0JfQotCQotCWludCBjYWxsSW5kZXggPSAtMTsgLy8gSW5kZXggb2YgY2FsbHMgaW50byBjb250cm9sIGxpc3QuCi0KLQlBc3NlcnRpb25GYWlsZWRFcnJvciBleGNlcHRpb247IC8vIFNldCBpZiBleGNlcHRpb24gb2NjdXJlZC4KLQotCXByb3RlY3RlZCBpbnRbXSBjYWxsVHlwZXM7IC8vIE9yZGVyIG9mIHBlcm1pdHRlZCBjYWxsdHlwZXMuIElmIGFueSBjb21lIG91dCBvZiBvcmRlciwgdGhlbiBlcnJvci4KLQotCXByb3RlY3RlZCBPYmplY3RbXSBjYWxsQXJnczsgLy8gQ29ycmVzcG9uZGluZyBhcmdzIGZvciBlYWNoIGNhbGwgdHlwZXMuIEVhY2ggdHlwZSBzcGVjaWZpYy4KLQotCXB1YmxpYyB2b2lkIHNldFRlc3RDYXNlcyhpbnRbXSBjYWxsVHlwZXMsIE9iamVjdFtdIGNhbGxBcmdzKSB7Ci0JCXRoaXMuY2FsbFR5cGVzID0gY2FsbFR5cGVzOwotCQl0aGlzLmNhbGxBcmdzID0gY2FsbEFyZ3M7Ci0JfQotCi0JcHVibGljIHZvaWQgaXNFeGNlcHRpb24oKSB0aHJvd3MgQXNzZXJ0aW9uRmFpbGVkRXJyb3IgewotCQlpZiAoZXhjZXB0aW9uICE9IG51bGwpCi0JCQl0aHJvdyBleGNlcHRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgaXNDb21wbGV0ZSgpIHRocm93cyBBc3NlcnRpb25GYWlsZWRFcnJvciB7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIkRpZCBub3QgY29tcGxldGUgYWxsIG5vdGlmY2F0aW9ucy4gIiwgY2FsbFR5cGVzLmxlbmd0aCwgY2FsbEluZGV4ICsgMSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFSS19BTExfU1RBTEUgPSAwLCBNQVJLX1NUQUxFX0lOVFJPU1BFQ1RJT04gPSAxLCBNQVJLX1NUQUxFX0lOVFJPU1BFQ1RJT05fUExVU19JTk5FUiA9IDIsIE1BUktfUEFDS0FHRV9TVEFMRSA9IDM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBjYWxsVHlwZU5hbWVzID0gbmV3IFN0cmluZ1tdIHsgIk1BUktfQUxMX1NUQUxFIiwgIk1BUktfU1RBTEVfSU5UUk9TUEVDVElPTiIsICJNQVJLX1NUQUxFX0lOVFJPU1BFQ1RJT05fUExVU19JTk5FUiIsCi0JCQkiTUFSS19QQUNLQUdFX1NUQUxFIiwgCi0JCQkiVU5SRUdJU1RFUl9JTlRST1NQRUNUSU9OIiwgIlVOUkVHSVNURVJfSU5UUk9TUEVDVElPTl9QTFVTX0lOTkVSIn07Ci0KLQkvKgotCSAqIFRlc3QgdGhlIG5leHQgY2FsbCB0eXBlLCBpZiBub3QgdmFsaWQsIHJldHVybiBmYWxzZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0ZXN0Q2FsbFR5cGUoaW50IGNhbGxUeXBlKSB7Ci0JCWlmIChleGNlcHRpb24gIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy8gQWxyZWFkeSBoYWQgYW4gZXJyb3IKLQkJdHJ5IHsKLQkJCWlmICgrK2NhbGxJbmRleCA+PSBjYWxsVHlwZXMubGVuZ3RoKQotCQkJCUFzc2VydC5mYWlsKCJBbiBleHRyYSBub3RpZmljYXRpb24gb2YgdHlwZSAiICsgY2FsbFR5cGVOYW1lc1tjYWxsVHlwZV0gKyAiIHJlY2VpdmVkLiIpOwotCQkJaWYgKGNhbGxUeXBlc1tjYWxsSW5kZXhdICE9IGNhbGxUeXBlKQotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoY2FsbFR5cGVOYW1lc1tjYWxsVHlwZXNbY2FsbEluZGV4XV0sIGNhbGxUeXBlTmFtZXNbY2FsbFR5cGVdKTsKLQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotCQkJZXhjZXB0aW9uID0gZTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5CZWFuaW5mb0FkYXB0ZXJGYWN0b3J5I21hcmtBbGxTdGFsZSgpCi0JICovCi0JcHVibGljIHZvaWQgbWFya0FsbFN0YWxlKCkgewotCQl0ZXN0Q2FsbFR5cGUoTUFSS19BTExfU1RBTEUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvQWRhcHRlckZhY3RvcnkjbWFya1N0YWxlSW50cm9zcGVjdGlvbihqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtTdGFsZUludHJvc3BlY3Rpb24oU3RyaW5nIHNvdXJjZU5hbWUsIGJvb2xlYW4gY2xlYXJSZXN1bHRzKSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoTUFSS19TVEFMRV9JTlRST1NQRUNUSU9OKSkgewotCQkJdHJ5IHsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKChTdHJpbmcpICgoT2JqZWN0W10pIGNhbGxBcmdzW2NhbGxJbmRleF0pWzBdLCBzb3VyY2VOYW1lKTsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCgoQm9vbGVhbikgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMV0pLmJvb2xlYW5WYWx1ZSgpLCBjbGVhclJlc3VsdHMpOyAKLQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLQkJCQlleGNlcHRpb24gPSBlOwotCQkJfQkJCQotCQl9CQkKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5iZWFuaW5mby5hZGFwdGVycy5CZWFuaW5mb0FkYXB0ZXJGYWN0b3J5I21hcmtTdGFsZUludHJvc3BlY3Rpb25QbHVzSW5uZXIoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrU3RhbGVJbnRyb3NwZWN0aW9uUGx1c0lubmVyKFN0cmluZyBzb3VyY2VOYW1lLCBib29sZWFuIGNsZWFyUmVzdWx0cykgewotCQlpZiAodGVzdENhbGxUeXBlKE1BUktfU1RBTEVfSU5UUk9TUEVDVElPTl9QTFVTX0lOTkVSKSkgewotCQkJdHJ5IHsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKChTdHJpbmcpICgoT2JqZWN0W10pIGNhbGxBcmdzW2NhbGxJbmRleF0pWzBdLCBzb3VyY2VOYW1lKTsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCgoQm9vbGVhbikgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMV0pLmJvb2xlYW5WYWx1ZSgpLCBjbGVhclJlc3VsdHMpOyAKLQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLQkJCQlleGNlcHRpb24gPSBlOwotCQkJfQkJCQotCQl9CQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmJlYW5pbmZvLmFkYXB0ZXJzLkJlYW5pbmZvQWRhcHRlckZhY3RvcnkjbWFya1BhY2thZ2VTdGFsZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtQYWNrYWdlU3RhbGUoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoTUFSS19QQUNLQUdFX1NUQUxFKSkgewotCQkJdHJ5IHsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKChTdHJpbmcpICgoT2JqZWN0W10pIGNhbGxBcmdzW2NhbGxJbmRleF0pWzBdLCBwYWNrYWdlTmFtZSk7Ci0JCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0JCQkJZXhjZXB0aW9uID0gZTsKLQkJCX0JCQkKLQkJfQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvVGVzdEpFTS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvVGVzdEpFTS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjI1MDA0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RKRU0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RKRU0uamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuOCAkICAkRGF0ZTogMjAwNi8wOS8xOCAyMjoxODowMiAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyOwotIAotCi0vKioKLSAqIFRoaXMgaXMgZm9yIHRlc3RpbmcgdGhlIEpFTSBSZWZsZWN0aW9uIGxpc3RlbmVycwotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0SkVNIGV4dGVuZHMgVGVzdExpc3RlbmVycyB7Ci0JCi0JSmF2YVJlZmxlY3Rpb25TeW5jaHJvbml6ZXIgc3luYzsKLQlUZXN0SmF2YUpET01BZGFwdGVyRmFjdG9yeSBmYWN0b3J5OwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmYWN0b3J5ID0gbmV3IFRlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5KCk7CS8vIE5lZWRzIHRvIGJlIHNldCBmaXJzdCBzbyB0aGF0IHN1cGVyLnNldFVQKCkgY2FsbHMgdG8gc3BlY2lhbCBzZXR1cHMgd2lsbCBoYXZlIGEgZmFjdG9yeS4KLQkJc3VwZXIuc2V0VXAoKTsJLy8gQ2FsbGVkIGZpcnN0IHNvIHRoYXQgYW55IHNldHVwIHdvbid0IGZpcmUgb3VyIHN5bmNocm9uaXplci4KLQkJCi0JCS8vIEJhc2ljIGZvciB0aGlzIGlzIGFkZCBvdXIgc3BlY2lhbCBsaXN0ZW5lci4gKERvbid0IG5lZWQgZnVsbCBKRU0gbW9kZWwgY2x1dHRlcmluZyB0aGluZ3MgdXApLgkJCi0JCWZhY3Rvcnkuc2V0SmF2YVByb2plY3QoanApOwotCQlzeW5jID0gZmFjdG9yeS5nZXRTeW5jaHJvbml6ZXIoKTsKLQkJc2V0VGVzdGVyKGZhY3RvcnkpOwotCX0KLQkKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXRVcENsb3NlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcENsb3NlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwQ2xvc2UoKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFswXSwgbmV3IE9iamVjdFswXSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwT3BlbigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBPcGVuKCkgewotCQlzdXBlci5zZXRVcE9wZW4oKTsKLQkJZmFjdG9yeS5zZXRUZXN0Q2FzZXMobmV3IGludFswXSwgbmV3IE9iamVjdFswXSk7CQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0VXBBZGRNZXRob2RJbldvcmtpbmdDb3B5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcEFkZE1ldGhvZEluV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXBBZGRNZXRob2RJbldvcmtpbmdDb3B5KCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbMF0sIG5ldyBPYmplY3RbMF0pOwkJCi0JfQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwU2F2ZUZyb21Xb3JraW5nQ29weSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBTYXZlRnJvbVdvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwU2F2ZUZyb21Xb3JraW5nQ29weSgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50W10ge1Rlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LkZMVVNIX1JFRkxFQ1RJT05fUExVU19JTk5FUl9OT19OT1RJRklDQVRJT059LCBuZXcgT2JqZWN0W10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uVGVzdDFDbGFzcyJ9KTsgCQkKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0VXBSZXZlcnQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwUmV2ZXJ0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwUmV2ZXJ0KCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbMF0sIG5ldyBPYmplY3RbMF0pOwkJCi0JfQotCQotLy8JLyogKG5vbi1KYXZhZG9jKQotLy8JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXR1cERlbGV0ZU1ldGhvZE5vV29ya2luZ0NvcHkoKQotLy8JICovCi0vLwlwcm90ZWN0ZWQgdm9pZCBzZXR1cERlbGV0ZU1ldGhvZE5vV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLS8vCQlzdXBlci5zZXR1cERlbGV0ZU1ldGhvZE5vV29ya2luZ0NvcHkoKTsKLS8vCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50W10ge1Rlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LkZMVVNIX1JFRkxFQ1RJT05fTk9fTk9USUZJQ0FUSU9OLCBUZXN0SmF2YUpET01BZGFwdGVyRmFjdG9yeS5GTFVTSF9SRUZMRUNUSU9OX1BMVVNfSU5ORVJfTk9fTk9USUZJQ0FUSU9OfSwgbmV3IE9iamVjdFtdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLlRlc3QxQ2xhc3MiLCAib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLlRlc3QxQ2xhc3MifSk7CQkKLS8vCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMubW9kZWxMaXN0ZW5lcnMuVGVzdExpc3RlbmVycyNzZXR1cEFkZENsYXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cEFkZENsYXNzKCkgewotCQlzdXBlci5zZXR1cEFkZENsYXNzKCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbXSB7VGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkuRElTQVNTT0NJQVRFX1NPVVJDRV9QTFVTX0lOTkVSX05PVElGWX0sIG5ldyBPYmplY3RbXSB7bmV3IE9iamVjdFtdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLk5ld0NsYXNzIiwgQm9vbGVhbi5GQUxTRX19KTsJCQkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldHVwRGVsZXRlQ2xhc3NXaXRoV29ya2luZ0NvcHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldHVwRGVsZXRlQ2xhc3NXaXRoV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0dXBEZWxldGVDbGFzc1dpdGhXb3JraW5nQ29weSgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50W10ge1Rlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LkZMVVNIX1JFRkxFQ1RJT05fUExVU19JTk5FUl9OT19OT1RJRklDQVRJT04sIFRlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LkRJU0FTU09DSUFURV9TT1VSQ0VfUExVU19JTk5FUl9OT1RJRll9LCBuZXcgT2JqZWN0W10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uTmV3Q2xhc3MiLCBuZXcgT2JqZWN0W10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMuYmVhbmluZm8uTmV3Q2xhc3MiLCBCb29sZWFuLkZBTFNFfX0pOwkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwRGVsZXRlQ2xhc3NOb1dvcmtpbmdDb3B5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcERlbGV0ZUNsYXNzTm9Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcERlbGV0ZUNsYXNzTm9Xb3JraW5nQ29weSgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50W10ge1Rlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LkRJU0FTU09DSUFURV9TT1VSQ0VfUExVU19JTk5FUl9OT1RJRll9LCBuZXcgT2JqZWN0W10ge25ldyBPYmplY3RbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5iZWFuaW5mby5OZXdDbGFzcyIsIEJvb2xlYW4uRkFMU0V9fSk7CQkKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzLlRlc3RMaXN0ZW5lcnMjc2V0VXBBZGRQYWNrYWdlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcEFkZFBhY2thZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXBBZGRQYWNrYWdlKCk7Ci0JCWZhY3Rvcnkuc2V0VGVzdENhc2VzKG5ldyBpbnRbXSB7VGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkuRkxVU0hfUEFDS0FHRV9OT19OT1RJRklDQVRJT059LCBuZXcgT2JqZWN0W10ge25ldyBPYmplY3RbXSB7InRlc3QiLCBCb29sZWFuLkZBTFNFfX0pOwkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVycy5UZXN0TGlzdGVuZXJzI3NldFVwRGVsZXRlUGFja2FnZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBEZWxldGVQYWNrYWdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwRGVsZXRlUGFja2FnZSgpOwotCQlmYWN0b3J5LnNldFRlc3RDYXNlcyhuZXcgaW50W10ge1Rlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LkZMVVNIX1BBQ0tBR0V9LCBuZXcgT2JqZWN0W10ge25ldyBPYmplY3RbXSB7InRlc3QiLCBCb29sZWFuLkZBTFNFfX0pOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN5bmMuc3RvcFN5bmNocm9uaXplcigpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0SmF2YUpET01BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODIyYjdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL21vZGVsTGlzdGVuZXJzL1Rlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogVGVzdEphdmFKRE9NQWRhcHRlckZhY3RvcnkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NSAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5tb2RlbExpc3RlbmVyczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydGlvbkZhaWxlZEVycm9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhSkRPTUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyOwotIAotCi0vKioKLSAqIEEgdGVzdCB2ZXJzaW9uIG9mIHRoaXMgc28gdGhhdCBpdCB3b3JrcyB3aXRoIG91ciB0ZXN0IGNhc2VzIHdpdGhvdXQgaGF2aW5nIGZ1bGxibG93biBKRU0gbW9kZWwgdXAgYW5kIHJ1bm5pbmcuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RKYXZhSkRPTUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSmF2YUpET01BZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElMaXN0ZW5lclRlc3RlciB7Ci0JCi0JaW50IGNhbGxJbmRleCA9IC0xOwkvLyBJbmRleCBvZiBjYWxscyBpbnRvIGNvbnRyb2wgbGlzdC4KLQlBc3NlcnRpb25GYWlsZWRFcnJvciBleGNlcHRpb247IC8vIFNldCBpZiBleGNlcHRpb24gb2NjdXJlZC4KLQkKLQlwcm90ZWN0ZWQgaW50W10gY2FsbFR5cGVzOwkvLyBPcmRlciBvZiBwZXJtaXR0ZWQgY2FsbHR5cGVzLiBJZiBhbnkgY29tZSBvdXQgb2Ygb3JkZXIsIHRoZW4gZXJyb3IuCi0JcHJvdGVjdGVkIE9iamVjdFtdIGNhbGxBcmdzOwkvLyBDb3JyZXNwb25kaW5nIGFyZ3MgZm9yIGVhY2ggY2FsbCB0eXBlcy4gRWFjaCB0eXBlIHNwZWNpZmljLgotCQotCXB1YmxpYyB2b2lkIHNldFRlc3RDYXNlcyhpbnRbXSBjYWxsVHlwZXMsIE9iamVjdFtdIGNhbGxBcmdzKSB7Ci0JCXRoaXMuY2FsbFR5cGVzID0gY2FsbFR5cGVzOwotCQl0aGlzLmNhbGxBcmdzID0gY2FsbEFyZ3M7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGlzRXhjZXB0aW9uKCkgdGhyb3dzIEFzc2VydGlvbkZhaWxlZEVycm9yIHsKLQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQotCQkJdGhyb3cgZXhjZXB0aW9uOwotCX0KLQkJCi0JcHVibGljIHZvaWQgaXNDb21wbGV0ZSgpIHRocm93cyBBc3NlcnRpb25GYWlsZWRFcnJvciB7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIkRpZCBub3QgY29tcGxldGUgYWxsIG5vdGlmY2F0aW9ucy4gIiwgY2FsbFR5cGVzLmxlbmd0aCwgY2FsbEluZGV4KzEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMVVNIX0FMTCA9IDAsIEZMVVNIX0FMTF9OT19OT1RJRklDQVRJT04gPSAxLCBGTFVTSF9QQUNLQUdFID0gMiwgRkxVU0hfUEFDS0FHRV9OT19OT1RJRklDQVRJT04gPSAzLCAKLQkJRkxVU0hfUkVGTEVDVElPTiA9IDQsIEZMVVNIX1JFRkxFQ1RJT05fTk9fTk9USUZJQ0FUSU9OID0gNSwgRkxVU0hfUkVGTEVDVElPTl9QTFVTX0lOTkVSX05PX05PVElGSUNBVElPTiA9IDYsIE5PVElGWV9DT05URU5UX0NIQU5HRUQgPSA3LAotCQlESVNBU1NPQ0lBVEVfU09VUkNFX05PVElGWSA9IDgsIERJU0FTU09DSUFURV9TT1VSQ0UgPSA5LCBESVNBU1NPQ0lBVEVfU09VUkNFX1BMVVNfSU5ORVJfTk9USUZZID0gMTAsIERJU0FTU09DSUFURV9TT1VSQ0VfUExVU19JTk5FUiA9IDExOyAKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBjYWxsVHlwZU5hbWVzID0gbmV3IFN0cmluZ1tdIHsiRkxVU0hfQUxMIiwgIkZMVVNIX0FMTF9OT19OT1RJRklDQVRJT04iLCAiRkxVU0hfUEFDS0FHRSIsICJGTFVTSF9QQUNLQUdFX05PX05PVElGSUNBVElPTiIsIAotCQkJIkZMVVNIX1JFRkxFQ1RJT04iLCAiRkxVU0hfUkVGTEVDVElPTl9OT19OT1RJRklDQVRJT04iLCAiRkxVU0hfUkVGTEVDVElPTl9QTFVTX0lOTkVSX05PX05PVElGSUNBVElPTiIsICJOT1RJRllfQ09OVEVOVF9DSEFOR0VEIiwKLQkJCSJESVNBU1NPQ0lBVEVfU09VUkNFX05PVElGWSIsICJESVNBU1NPQ0lBVEVfU09VUkNFIiwgIkRJU0FTU09DSUFURV9TT1VSQ0VfUExVU19JTk5FUl9OT1RJRlkiLCAiRElTQVNTT0NJQVRFX1NPVVJDRV9QTFVTX0lOTkVSIn07CQotCS8qCi0JICogVGVzdCB0aGUgbmV4dCBjYWxsIHR5cGUsIGlmIG5vdCB2YWxpZCwgcmV0dXJuIGZhbHNlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHRlc3RDYWxsVHlwZShpbnQgY2FsbFR5cGUpIHsKLQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwkvLyBBbHJlYWR5IGhhZCBhbiBlcnJvcgotCQl0cnkgewotCQkJaWYgKCsrY2FsbEluZGV4ID49IGNhbGxUeXBlcy5sZW5ndGgpCi0JCQkJQXNzZXJ0LmZhaWwoIkFuIGV4dHJhIG5vdGlmaWNhdGlvbiBvZiB0eXBlICIgKyBjYWxsVHlwZU5hbWVzW2NhbGxUeXBlXSArICIgcmVjZWl2ZWQuIik7Ci0JCQlpZiAoY2FsbFR5cGVzW2NhbGxJbmRleF0gIT0gY2FsbFR5cGUpCi0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscyhjYWxsVHlwZU5hbWVzW2NhbGxUeXBlc1tjYWxsSW5kZXhdXSwgY2FsbFR5cGVOYW1lc1tjYWxsVHlwZV0pOwotCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0JCQlleGNlcHRpb24gPSBlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YS5hZGFwdGVycy5KYXZhUmVmbGVjdGlvbkFkYXB0ZXJGYWN0b3J5I2ZsdXNoQWxsKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmbHVzaEFsbCgpIHsKLQkJdGVzdENhbGxUeXBlKEZMVVNIX0FMTCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFKRE9NQWRhcHRlckZhY3RvcnkjZmx1c2hBbGxOb05vdGlmaWNhdGlvbigpCi0JICovCi0JcHVibGljIExpc3QgZmx1c2hBbGxOb05vdGlmaWNhdGlvbigpIHsKLQkJdGVzdENhbGxUeXBlKEZMVVNIX0FMTF9OT19OT1RJRklDQVRJT04pOwotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmFkYXB0ZXJzLmpkb20uSmF2YUpET01BZGFwdGVyRmFjdG9yeSNmbHVzaFBhY2thZ2UoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBmbHVzaFBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIG5vRmx1c2hJZlNvdXJjZUZvdW5kKSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoRkxVU0hfUEFDS0FHRSkpIHsKLQkJCXRyeSB7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoU3RyaW5nKSAoKE9iamVjdFtdKSBjYWxsQXJnc1tjYWxsSW5kZXhdKVswXSwgcGFja2FnZU5hbWUpOwotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKChCb29sZWFuKSAoKE9iamVjdFtdKSBjYWxsQXJnc1tjYWxsSW5kZXhdKVsxXSkuYm9vbGVhblZhbHVlKCksIG5vRmx1c2hJZlNvdXJjZUZvdW5kKTsgCi0JCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0JCQkJZXhjZXB0aW9uID0gZTsKLQkJCX0JCQkKLQkJfQotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhSkRPTUFkYXB0ZXJGYWN0b3J5I2ZsdXNoUGFja2FnZU5vTm90aWZpY2F0aW9uKGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIExpc3QgZmx1c2hQYWNrYWdlTm9Ob3RpZmljYXRpb24oU3RyaW5nIHBhY2thZ2VOYW1lLCBib29sZWFuIG5vRmx1c2hJZlNvdXJjZUZvdW5kKSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoRkxVU0hfUEFDS0FHRV9OT19OT1RJRklDQVRJT04pKSB7Ci0JCQl0cnkgewotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKFN0cmluZykgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMF0sIHBhY2thZ2VOYW1lKTsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCgoQm9vbGVhbikgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMV0pLmJvb2xlYW5WYWx1ZSgpLCBub0ZsdXNoSWZTb3VyY2VGb3VuZCk7IAotCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9CQkJCi0JCX0JCQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSNmbHVzaFJlZmxlY3Rpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBmbHVzaFJlZmxlY3Rpb24oU3RyaW5nIHNvdXJjZSkgewotCQlpZiAodGVzdENhbGxUeXBlKEZMVVNIX1JFRkxFQ1RJT04pKSB7Ci0JCQl0cnkgewotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKFN0cmluZykgY2FsbEFyZ3NbY2FsbEluZGV4XSwgc291cmNlKTsgCi0JCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0JCQkJZXhjZXB0aW9uID0gZTsKLQkJCX0JCQkKLQkJfQkJCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5hZGFwdGVycy5qZG9tLkphdmFKRE9NQWRhcHRlckZhY3RvcnkjZmx1c2hSZWZsZWN0aW9uTm9Ob3RpZmljYXRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uIGZsdXNoUmVmbGVjdGlvbk5vTm90aWZpY2F0aW9uKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKHRlc3RDYWxsVHlwZShGTFVTSF9SRUZMRUNUSU9OX05PX05PVElGSUNBVElPTikpIHsKLQkJCXRyeSB7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoU3RyaW5nKSBjYWxsQXJnc1tjYWxsSW5kZXhdLCBzb3VyY2UpOyAKLQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLQkJCQlleGNlcHRpb24gPSBlOwotCQkJfQkJCQotCQl9CQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhSkRPTUFkYXB0ZXJGYWN0b3J5I2ZsdXNoUmVmbGVjdGlvblBsdXNJbm5lck5vTm90aWZpY2F0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbiBmbHVzaFJlZmxlY3Rpb25QbHVzSW5uZXJOb05vdGlmaWNhdGlvbihTdHJpbmcgc291cmNlKSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoRkxVU0hfUkVGTEVDVElPTl9QTFVTX0lOTkVSX05PX05PVElGSUNBVElPTikpIHsKLQkJCXRyeSB7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoU3RyaW5nKSBjYWxsQXJnc1tjYWxsSW5kZXhdLCBzb3VyY2UpOyAKLQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLQkJCQlleGNlcHRpb24gPSBlOwotCQkJfQkJCQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuYWRhcHRlcnMuamRvbS5KYXZhSkRPTUFkYXB0ZXJGYWN0b3J5I25vdGlmeUNvbnRlbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q29udGVudENoYW5nZWQoSUNvbXBpbGF0aW9uVW5pdCB0YXJnZXRDVSkgewotCQlpZiAodGVzdENhbGxUeXBlKE5PVElGWV9DT05URU5UX0NIQU5HRUQpKSB7Ci0JCQl0cnkgewotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKFN0cmluZykgY2FsbEFyZ3NbY2FsbEluZGV4XSwgdGFyZ2V0Q1UuZ2V0RWxlbWVudE5hbWUoKSk7IAotCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9CQkJCi0JCX0JCQkKLQl9Ci0JCi0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSNkaXNBc3NvY2lhdGVTb3VyY2UoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uIGRpc0Fzc29jaWF0ZVNvdXJjZShTdHJpbmcgc291cmNlLCBib29sZWFuIGRvTm90aWZ5KSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoRElTQVNTT0NJQVRFX1NPVVJDRV9OT1RJRlkpKSB7Ci0JCQl0cnkgewotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKFN0cmluZykgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMF0sIHNvdXJjZSk7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoKEJvb2xlYW4pICgoT2JqZWN0W10pIGNhbGxBcmdzW2NhbGxJbmRleF0pWzFdKS5ib29sZWFuVmFsdWUoKSwgZG9Ob3RpZnkpOyAKLQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLQkJCQlleGNlcHRpb24gPSBlOwotCQkJfQkJCQotCQl9CQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmFkYXB0ZXJzLkphdmFSZWZsZWN0aW9uQWRhcHRlckZhY3RvcnkjZGlzQXNzb2NpYXRlU291cmNlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbiBkaXNBc3NvY2lhdGVTb3VyY2UoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAodGVzdENhbGxUeXBlKERJU0FTU09DSUFURV9TT1VSQ0UpKSB7Ci0JCQl0cnkgewotCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoKFN0cmluZykgY2FsbEFyZ3NbY2FsbEluZGV4XSwgc291cmNlKTsgCi0JCQl9IGNhdGNoIChBc3NlcnRpb25GYWlsZWRFcnJvciBlKSB7Ci0JCQkJZXhjZXB0aW9uID0gZTsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSNkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoamF2YS5sYW5nLlN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uIGRpc0Fzc29jaWF0ZVNvdXJjZVBsdXNJbm5lcihTdHJpbmcgc291cmNlLCBib29sZWFuIGRvTm90aWZ5KSB7Ci0JCWlmICh0ZXN0Q2FsbFR5cGUoRElTQVNTT0NJQVRFX1NPVVJDRV9QTFVTX0lOTkVSX05PVElGWSkpIHsKLQkJCXRyeSB7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoU3RyaW5nKSAoKE9iamVjdFtdKSBjYWxsQXJnc1tjYWxsSW5kZXhdKVswXSwgc291cmNlKTsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCgoQm9vbGVhbikgKChPYmplY3RbXSkgY2FsbEFyZ3NbY2FsbEluZGV4XSlbMV0pLmJvb2xlYW5WYWx1ZSgpLCBkb05vdGlmeSk7IAotCQkJfSBjYXRjaCAoQXNzZXJ0aW9uRmFpbGVkRXJyb3IgZSkgewotCQkJCWV4Y2VwdGlvbiA9IGU7Ci0JCQl9CQkJCi0JCX0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmEuYWRhcHRlcnMuSmF2YVJlZmxlY3Rpb25BZGFwdGVyRmFjdG9yeSNkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNBc3NvY2lhdGVTb3VyY2VQbHVzSW5uZXIoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAodGVzdENhbGxUeXBlKERJU0FTU09DSUFURV9TT1VSQ0VfUExVU19JTk5FUikpIHsKLQkJCXRyeSB7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygoU3RyaW5nKSBjYWxsQXJnc1tjYWxsSW5kZXhdLCBzb3VyY2UpOyAKLQkJCX0gY2F0Y2ggKEFzc2VydGlvbkZhaWxlZEVycm9yIGUpIHsKLQkJCQlleGNlcHRpb24gPSBlOwotCQkJfQkJCQotCQl9CQkKLQl9Ci0JCi0JcHVibGljIEphdmFSZWZsZWN0aW9uU3luY2hyb25pemVyIGdldFN5bmNocm9uaXplcigpIHsKLQkJcmV0dXJuIHN5bmNocm9uaXplcjsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0TGlzdGVuZXJzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9tb2RlbExpc3RlbmVycy9UZXN0TGlzdGVuZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0OTM1NTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvbW9kZWxMaXN0ZW5lcnMvVGVzdExpc3RlbmVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogVGVzdExpc3RlbmVycy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA2LzA1LzE3IDIwOjEzOjU2ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLm1vZGVsTGlzdGVuZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhUHJvamVjdFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvLkFic3RyYWN0QmVhbkluZm9UZXN0Q2FzZTsKLSAKLQotLyoqCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVzdExpc3RlbmVycyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGpwOwotCi0JLy8gVGhlIGluZGV4ZXMgb2YgdGhlc2UgbG9va3VwcyBhcmUgZm91bmQgaW4gdGhlIHNldHVwIGFuZCB0ZWFyZG93biBtZXRob2RzLiBUaGV5IG11c3QgYmUga2VwdCBpbiBzeW5jLgotCXByb3RlY3RlZCBMaXN0IHNldHVwU3BlY2lhbHMgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ0ZXN0T3BlbiIsICJ0ZXN0Q2xvc2UiLCAidGVzdEFkZE1ldGhvZEluV29ya2NvcHkiLCAidGVzdFNhdmVGcm9tV29ya2luZ0NvcHkiLAotCQkJInRlc3RSZXZlcnQiLCAidGVzdERlbGV0ZU1ldGhvZE5vV29ya2luZ0NvcHktb2Jzb2xldGUsIHJlbW92ZWQiLCAidGVzdEFkZENsYXNzIiwgInRlc3REZWxldGVDbGFzc1dpdGhXb3JraW5nQ29weSIsCi0JCQkidGVzdERlbGV0ZUNsYXNzTm9Xb3JraW5nQ29weSIsICJ0ZXN0QWRkUGFja2FnZSIsICJ0ZXN0RGVsZXRlUGFja2FnZSJ9KTsKLQkKLQlwcm90ZWN0ZWQgSUxpc3RlbmVyVGVzdGVyIHRlc3RlcjsKLQkJCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlqcCA9IEphdmFDb3JlLmNyZWF0ZShKYXZhUHJvamVjdFV0aWwuZ2V0UHJvamVjdChBYnN0cmFjdEJlYW5JbmZvVGVzdENhc2UuVEVTVF9CRUFOSU5GT19QUk9KRUNUKSk7Ci0JCVN0cmluZyB0ZXN0bmFtZSA9IGdldE5hbWUoKTsKLQkJaW50IGluZGV4ID0gc2V0dXBTcGVjaWFscy5pbmRleE9mKHRlc3RuYW1lKTsKLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSAwOgotCQkJCXNldFVwT3BlbigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCXNldFVwQ2xvc2UoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlzZXRVcEFkZE1ldGhvZEluV29ya2luZ0NvcHkoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQlzZXRVcFNhdmVGcm9tV29ya2luZ0NvcHkoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNDoKLQkJCQlzZXRVcFJldmVydCgpOwotCQkJCWJyZWFrOwotLy8JCQljYXNlIDU6Ci0vLwkJCQlzZXR1cERlbGV0ZU1ldGhvZE5vV29ya2luZ0NvcHkoKTsKLS8vCQkJCWJyZWFrOwotCQkJY2FzZSA2OgotCQkJCXNldHVwQWRkQ2xhc3MoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNzoKLQkJCQlzZXR1cERlbGV0ZUNsYXNzV2l0aFdvcmtpbmdDb3B5KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDg6Ci0JCQkJc2V0VXBEZWxldGVDbGFzc05vV29ya2luZ0NvcHkoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgOToKLQkJCQlzZXRVcEFkZFBhY2thZ2UoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTA6Ci0JCQkJc2V0VXBEZWxldGVQYWNrYWdlKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdGVzdG5hbWUgPSBnZXROYW1lKCk7Ci0JCWludCBpbmRleCA9IHNldHVwU3BlY2lhbHMuaW5kZXhPZih0ZXN0bmFtZSk7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJCWNhc2UgMDoKLQkJCQl0ZWFyRG93bk9wZW4oKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQl0ZWFyRG93bkNsb3NlKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJdGVhckRvd25BZGRNZXRob2RJbldvcmtpbmdDb3B5KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0JCQkJdGVhckRvd25TYXZlRnJvbVdvcmtpbmdDb3B5KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQ6Ci0JCQkJdGVhckRvd25SZXZlcnQoKTsKLQkJCQlicmVhazsKLS8vCQkJY2FzZSA1OgotLy8JCQkJdGVhckRvd25EZWxldGVNZXRob2ROb1dvcmtpbmdDb3B5KCk7Ci0vLwkJCQlicmVhazsKLQkJCWNhc2UgNjoKLQkJCQl0ZWFyRG93bkFkZENsYXNzKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDc6Ci0JCQkJdGVhckRvd25EZWxldGVDbGFzc1dpdGhXb3JraW5nQ29weSgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSA4OgotCQkJCXRlYXJEb3duRGVsZXRlQ2xhc3NOb1dvcmtpbmdDb3B5KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDk6Ci0JCQkJdGVhckRvd25BZGRQYWNrYWdlKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEwOgotCQkJCXRlYXJEb3duRGVsZXRlUGFja2FnZSgpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQkJCi0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQkKLQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGVzdGVyKElMaXN0ZW5lclRlc3RlciB0ZXN0ZXIpIHsKLQkJdGhpcy50ZXN0ZXIgPSB0ZXN0ZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwT3BlbigpIHsJCi0JfQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3BlbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkvLyBUZXN0IG9wZW4gYSB3b3JraW5nIGNvcHkuCi0JCXRlc3RDVSA9IChJQ29tcGlsYXRpb25Vbml0KSBqcC5maW5kRWxlbWVudChuZXcgUGF0aCgib3JnL2VjbGlwc2UvamVtL3Rlc3RzL2JlYW5pbmZvL1Rlc3QxQ2xhc3MuamF2YSIpKTsKLQkJdGVzdENVLmJlY29tZVdvcmtpbmdDb3B5KG51bGwsIG51bGwpOwotCQl0ZXN0ZXIuaXNFeGNlcHRpb24oKTsKLQkJdGVzdGVyLmlzQ29tcGxldGUoKTsJLy8gSXQgc2hvdWxkIG9mIGJlZW4gY29tcGxldGUuCi0JfQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duT3BlbigpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAodGVzdENVICE9IG51bGwpCi0JCQl0ZXN0Q1UuZGlzY2FyZFdvcmtpbmdDb3B5KCk7CQkKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgdGVzdENVOwotCXByb3RlY3RlZCB2b2lkIHNldFVwQ2xvc2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGVzdENVID0gKElDb21waWxhdGlvblVuaXQpIGpwLmZpbmRFbGVtZW50KG5ldyBQYXRoKCJvcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vVGVzdDFDbGFzcy5qYXZhIikpOwotCQl0ZXN0Q1UuYmVjb21lV29ya2luZ0NvcHkobnVsbCwgbnVsbCk7CQkKLQl9CQotCXB1YmxpYyB2b2lkIHRlc3RDbG9zZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkvLyBUZXN0IGNsb3NlIGEgd29ya2luZyBjb3B5LgotCQl0ZXN0Q1UuZGlzY2FyZFdvcmtpbmdDb3B5KCk7Ci0JCXRlc3Rlci5pc0V4Y2VwdGlvbigpOwotCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd25DbG9zZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAodGVzdENVICE9IG51bGwpCi0JCQl0ZXN0Q1UuZGlzY2FyZFdvcmtpbmdDb3B5KCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwQWRkTWV0aG9kSW5Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0ZXN0Q1UgPSAoSUNvbXBpbGF0aW9uVW5pdCkganAuZmluZEVsZW1lbnQobmV3IFBhdGgoIm9yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9UZXN0MUNsYXNzLmphdmEiKSk7Ci0JCXRlc3RDVS5iZWNvbWVXb3JraW5nQ29weShudWxsLCBudWxsKTsJCQotCX0JCi0JcHVibGljIHZvaWQgdGVzdEFkZE1ldGhvZEluV29ya2NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGVzdENVLmdldFR5cGVzKClbMF0uY3JlYXRlTWV0aG9kKCJwcml2YXRlIHZvaWQgZ2V0U29tZXRoaW5nKCkge30iLCBudWxsLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJdGVzdGVyLmlzRXhjZXB0aW9uKCk7Ci0JCXRlc3Rlci5pc0NvbXBsZXRlKCk7CS8vIEl0IHNob3VsZCBvZiBiZWVuIGNvbXBsZXRlLgotCX0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bkFkZE1ldGhvZEluV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHRlc3RDVSAhPSBudWxsKQotCQkJdGVzdENVLmRpc2NhcmRXb3JraW5nQ29weSgpOwkJCi0JfQkKLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcFNhdmVGcm9tV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGVzdENVID0gKElDb21waWxhdGlvblVuaXQpIGpwLmZpbmRFbGVtZW50KG5ldyBQYXRoKCJvcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vVGVzdDFDbGFzcy5qYXZhIikpOwotCQl0ZXN0Q1UuYmVjb21lV29ya2luZ0NvcHkobnVsbCwgbnVsbCk7CQkKLQkJdGVzdENVLmdldFR5cGVzKClbMF0uY3JlYXRlTWV0aG9kKCJwcml2YXRlIHZvaWQgZ2V0U29tZXRoaW5nKCkge30iLCBudWxsLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsJCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U2F2ZUZyb21Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0ZXN0Q1UuY29tbWl0V29ya2luZ0NvcHkodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXRlc3Rlci5pc0V4Y2VwdGlvbigpOwotCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4JCQotCX0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93blNhdmVGcm9tV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHRlc3RDVSAhPSBudWxsKQotCQkJdGVzdENVLmRpc2NhcmRXb3JraW5nQ29weSgpOwkJCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXBSZXZlcnQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGVzdENVID0gKElDb21waWxhdGlvblVuaXQpIGpwLmZpbmRFbGVtZW50KG5ldyBQYXRoKCJvcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8vVGVzdDFDbGFzcy5qYXZhIikpOwotCQl0ZXN0Q1UuYmVjb21lV29ya2luZ0NvcHkobnVsbCwgbnVsbCk7CQkKLQkJdGVzdENVLmdldFR5cGVzKClbMF0uY3JlYXRlTWV0aG9kKCJwcml2YXRlIHZvaWQgZ2V0U29tZXRoaW5nKCkge30iLCBudWxsLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsJCQkJCi0JfQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJ0KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXRlc3RDVS5yZXN0b3JlKCk7Ci0JCXRlc3Rlci5pc0V4Y2VwdGlvbigpOwotCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4JCQotCX0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93blJldmVydCgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlpZiAodGVzdENVICE9IG51bGwpCi0JCQl0ZXN0Q1UuZGlzY2FyZFdvcmtpbmdDb3B5KCk7CQkJCQotCX0KLQkKLS8vIFdpdGggMy4yTTYgZGVsZXRlIHdpdGggbm8gd29ya2luZyBjb3B5IGdvdCB3YXkgdG8gY29tcGxleC4gRG9pbmcgdGhpcyB0aHJvdWdoIHJlZmFjdG9yaW5nIGFuZCBvdGhlciBzdHVmZi4gSnVzdCB0b28gY29tcGxpY2F0ZWQKLS8vIHRvIGV2ZW4gdHJ5IHRvIGZpZ3VyZSBvdXQuIFNvIGp1c3QgcHVsbGluZyBpdCBvdXQuCi0JCi0vLwlwcm90ZWN0ZWQgdm9pZCBzZXR1cERlbGV0ZU1ldGhvZE5vV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLS8vCQl0ZXN0Q1UgPSAoSUNvbXBpbGF0aW9uVW5pdCkganAuZmluZEVsZW1lbnQobmV3IFBhdGgoIm9yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mby9UZXN0MUNsYXNzLmphdmEiKSk7Ci0vLwkJSU1ldGhvZCBtID0gdGVzdENVLmdldFR5cGVzKClbMF0uZ2V0TWV0aG9kKCJnZXRTb21ldGhpbmciLCBuZXcgU3RyaW5nWzBdKTsKLS8vCQlpZiAobS5leGlzdHMoKSkKLS8vCQkJbS5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0vLwkJdGVzdENVLmdldFR5cGVzKClbMF0uY3JlYXRlTWV0aG9kKCJwcml2YXRlIHZvaWQgZ2V0U29tZXRoaW5nKCkge30iLCBudWxsLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsJCQkJCQkKLS8vCX0KLS8vCXB1YmxpYyB2b2lkIHRlc3REZWxldGVNZXRob2ROb1dvcmtpbmdDb3B5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotLy8JCUphdmFDb3JlLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotLy8JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJCQkvLyBBY3R1YWxseSB0aGVyZSB3aWxsIGJlIGEgd29ya2luZyBjb3B5LiBUaGlzIGlzIHRvIHNpbXVsYXRlIHdoYXQgZGVsZXRlIG1ldGhvZCBmcm9tIG1lbWJlciBsaXN0Ci0vLwkJCQkvLyB3aXRoIG5vIG9wZW4gZWRpdG9yLiBUaGlzIGlzIGRvbmUgYnkgYmF0Y2hpbmcgZXZlcnl0aGluZyB1cCwgYnV0IHRoZXJlIGlzIGEgd29ya2luZyBjb3B5IGNyZWF0ZWQuCi0vLwkJCQkvLyBCdXQgaXQgY2hhbmdlcyB0aGUgZmlsZSBkaXJlY3RseSB0aGVuLiAoQ29uZnVzaW5nLCBubz8gQnV0IHRoYXQgaXMgdGhlIHdheSBpdCBkb2VzIGl0IGluIEpEVCkuCi0vLwkJCQl0ZXN0Q1UuYmVjb21lV29ya2luZ0NvcHkobnVsbCwgbnVsbCk7Ci0vLwkJCQlJTWV0aG9kIG1ldGhvZCA9IHRlc3RDVS5nZXRUeXBlcygpWzBdLmdldE1ldGhvZCgiZ2V0U29tZXRoaW5nIiwgbmV3IFN0cmluZ1tdIHt9KTsKLS8vCQkJCUlCdWZmZXIgY3VCdWZmZXIgPSB0ZXN0Q1UuZ2V0QnVmZmVyKCk7Ci0vLwkJCQlJU291cmNlUmFuZ2Ugc3IgPSBtZXRob2QuZ2V0U291cmNlUmFuZ2UoKTsKLS8vCQkJCWN1QnVmZmVyLnJlcGxhY2Uoc3IuZ2V0T2Zmc2V0KCksIHNyLmdldExlbmd0aCgpLCIiKTsKLS8vCQkJCWN1QnVmZmVyLnNhdmUobW9uaXRvciwgdHJ1ZSk7Ci0vLwkJCQl0ZXN0Q1UuZGlzY2FyZFdvcmtpbmdDb3B5KCk7Ci0vLwkJCX0KLS8vCQl9LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLS8vCQl0ZXN0ZXIuaXNFeGNlcHRpb24oKTsKLS8vCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4JCQkJCi0vLwl9Ci0vLwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bkRlbGV0ZU1ldGhvZE5vV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLS8vCQlpZiAodGVzdENVICE9IG51bGwpCi0vLwkJCXRlc3RDVS5kaXNjYXJkV29ya2luZ0NvcHkoKTsJCQkJCQkKLS8vCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cEFkZENsYXNzKCkgewotCQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEFkZENsYXNzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gKElQYWNrYWdlRnJhZ21lbnQpIGpwLmZpbmRFbGVtZW50KG5ldyBQYXRoKCJvcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8iKSk7Ci0JCXRlc3RDVSA9IHBrZy5jcmVhdGVDb21waWxhdGlvblVuaXQoIk5ld0NsYXNzLmphdmEiLCAicHVibGljIGNsYXNzIE5ld0NsYXNzIHt9IiwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXRlc3Rlci5pc0V4Y2VwdGlvbigpOwotCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4JCQkJCi0JfQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duQWRkQ2xhc3MoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHRlc3RDVSAhPSBudWxsKSB7Ci0JCQl0ZXN0Q1UuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldHVwRGVsZXRlQ2xhc3NXaXRoV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhY2thZ2VGcmFnbWVudCBwa2cgPSAoSVBhY2thZ2VGcmFnbWVudCkganAuZmluZEVsZW1lbnQobmV3IFBhdGgoIm9yZy9lY2xpcHNlL2plbS90ZXN0cy9iZWFuaW5mbyIpKTsKLQkJdGVzdENVID0gcGtnLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiTmV3Q2xhc3MuamF2YSIsICJwdWJsaWMgY2xhc3MgTmV3Q2xhc3Mge30iLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJdGVzdENVLmJlY29tZVdvcmtpbmdDb3B5KG51bGwsIG51bGwpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlQ2xhc3NXaXRoV29ya2luZ0NvcHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCS8vIE5lZWQgdG8gcnVuIHRoaXMgd2F5IHRvIHNpbXVsYXRlIHdoYXQgaGFwcGVucyBmb3IgcmVhbC4KLQkJCQl0ZXN0Q1UuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5jaGVja3BvaW50KHRydWUpOwotCQkJCXRlc3RDVS5kaXNjYXJkV29ya2luZ0NvcHkoKTsKLQkJCX0KLQkJfSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXRlc3Rlci5pc0V4Y2VwdGlvbigpOwotCQl0ZXN0ZXIuaXNDb21wbGV0ZSgpOwkvLyBJdCBzaG91bGQgb2YgYmVlbiBjb21wbGV0ZS4JCi0JCXRlc3RDVSA9IG51bGw7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duRGVsZXRlQ2xhc3NXaXRoV29ya2luZ0NvcHkoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHRlc3RDVSAhPSBudWxsICYmIHRlc3RDVS5leGlzdHMoKSkgewotCQkJdGVzdENVLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwRGVsZXRlQ2xhc3NOb1dvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gKElQYWNrYWdlRnJhZ21lbnQpIGpwLmZpbmRFbGVtZW50KG5ldyBQYXRoKCJvcmcvZWNsaXBzZS9qZW0vdGVzdHMvYmVhbmluZm8iKSk7Ci0JCXRlc3RDVSA9IHBrZy5jcmVhdGVDb21waWxhdGlvblVuaXQoIk5ld0NsYXNzLmphdmEiLCAicHVibGljIGNsYXNzIE5ld0NsYXNzIHt9IiwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7CQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdERlbGV0ZUNsYXNzTm9Xb3JraW5nQ29weSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQl0ZXN0Q1UuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl0ZXN0ZXIuaXNFeGNlcHRpb24oKTsKLQkJdGVzdGVyLmlzQ29tcGxldGUoKTsJLy8gSXQgc2hvdWxkIG9mIGJlZW4gY29tcGxldGUuCQotCQl0ZXN0Q1UgPSBudWxsOwkJCi0JfQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duRGVsZXRlQ2xhc3NOb1dvcmtpbmdDb3B5KCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmICh0ZXN0Q1UgIT0gbnVsbCAmJiB0ZXN0Q1UuZXhpc3RzKCkpIHsKLQkJCXRlc3RDVS5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0JCQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwQWRkUGFja2FnZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IChJUGFja2FnZUZyYWdtZW50KSBqcC5maW5kRWxlbWVudChuZXcgUGF0aCgidGVzdCIpKTsKLQkJaWYgKHBrZyAhPSBudWxsKQotCQkJcGtnLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEFkZFBhY2thZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IGpwLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChyb290c1tpXS5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKLQkJCQlyb290c1tpXS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoInRlc3QiLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQl0ZXN0ZXIuaXNFeGNlcHRpb24oKTsKLQkJdGVzdGVyLmlzQ29tcGxldGUoKTsJLy8gSXQgc2hvdWxkIG9mIGJlZW4gY29tcGxldGUuCQkJCi0JfQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duQWRkUGFja2FnZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGFja2FnZUZyYWdtZW50IHBrZyA9IChJUGFja2FnZUZyYWdtZW50KSBqcC5maW5kRWxlbWVudChuZXcgUGF0aCgidGVzdCIpKTsKLQkJaWYgKHBrZyAhPSBudWxsKQotCQkJcGtnLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCB0ZXN0UGtnOwotCXByb3RlY3RlZCB2b2lkIHNldFVwRGVsZXRlUGFja2FnZSgpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHJvb3RzID0ganAuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHJvb3RzW2ldLmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSkgewotCQkJCXRlc3RQa2cgPSByb290c1tpXS5jcmVhdGVQYWNrYWdlRnJhZ21lbnQoInRlc3QiLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQkJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVQYWNrYWdlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXRlc3RQa2cuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl0ZXN0ZXIuaXNFeGNlcHRpb24oKTsKLQkJdGVzdGVyLmlzQ29tcGxldGUoKTsJLy8gSXQgc2hvdWxkIG9mIGJlZW4gY29tcGxldGUuCQkJCi0JCXRlc3RQa2cgPSBudWxsOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bkRlbGV0ZVBhY2thZ2UoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHRlc3RQa2cgIT0gbnVsbCAmJiB0ZXN0UGtnLmV4aXN0cygpKQotCQkJdGVzdFBrZy5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvQWJzdHJhY3RUZXN0UHJveHkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L0Fic3RyYWN0VGVzdFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NDRiMjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvQWJzdHJhY3RUZXN0UHJveHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eTsKLS8qCi0gKiAgJFJDU2ZpbGU6IEFic3RyYWN0VGVzdFByb3h5LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSVN0YW5kYXJkQmVhblR5cGVQcm94eUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICogU3RhbmRhcmQgdHlwZSBvZiBQcm94eSBUZXN0cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGVzdFByb3h5IGV4dGVuZHMgVGVzdENhc2UgewotCQotCS8qKgotCSAqIEBhdXRob3IgcmljaGt1bHAKLQkgKgotCSAqIEludGVyZmFjZSBmb3IgcmVnaXN0cnkgaGFuZGxlci4gQWN0dWFsIGltcGxlbWVudGF0aW9ucyB3aWxsIHBsYWNlIHRoZWlyCi0JICogaGFuZGxlciBpbiB0aGUgZmllbGQgUkVHSVNUUllfSEFORExFUiB0byB0aGF0IHRoZSBwcm94eSB0ZXN0cyBjYW4gYWNjZXNzIGl0LiAKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIFJlZ2lzdHJ5SGFuZGxlciB7Ci0JCQotCQkvKioKLQkJICogQHJldHVybiBpcyB0aGUgaGFuZGxlciB2YWxpZCBhbmQgc2V0dXAgY29ycmVjdGx5LgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgY3VycmVudCByZWdpc3RyeSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgotCQkgKiBAcmV0dXJuIFRoZSByZWdpc3RyeS4gCi0JCSAqLwotCQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkJCi0JCS8qKgotCQkgKiBEZXN0cm95IHRoZSBjdXJyZW50IHJlZ2lzdHJ5LgotCQkgKi8KLQkJcHVibGljIHZvaWQgZGVzdHJveVJlZ2lzdHJ5KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgcmVnaXN0cnkgaGFuZGxlciBmb3IgYWxsIEFic3RyYWN0VGVzdFByb3h5IHRlc3RzIGluIHRoZSAKLQkgKiBnaXZlbiBzdWl0ZS4KLQkgKiBAcGFyYW0gc3VpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFJlZ2lzdHJ5SGFuZGxlcihUZXN0U3VpdGUgc3VpdGUsIFJlZ2lzdHJ5SGFuZGxlciByZWdpc3RyeUhhbmRsZXIpIHsKLQkJRW51bWVyYXRpb24gdGVzdHMgPSBzdWl0ZS50ZXN0cygpOwotCQl3aGlsZSAodGVzdHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVRlc3QgdGVzdCA9IChUZXN0KSB0ZXN0cy5uZXh0RWxlbWVudCgpOwotCQkJaWYgKHRlc3QgaW5zdGFuY2VvZiBBYnN0cmFjdFRlc3RQcm94eSkKLQkJCQkoKEFic3RyYWN0VGVzdFByb3h5KSB0ZXN0KS5zZXRSZWdpc3RyeUhhbmRsZXIocmVnaXN0cnlIYW5kbGVyKTsKLQkJCWVsc2UgaWYgKHRlc3QgaW5zdGFuY2VvZiBUZXN0U3VpdGUpCi0JCQkJaW5pdFJlZ2lzdHJ5SGFuZGxlcigoVGVzdFN1aXRlKSB0ZXN0LCByZWdpc3RyeUhhbmRsZXIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBBYnN0cmFjdFRlc3RQcm94eSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RUZXN0UHJveHkoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgUmVnaXN0cnlIYW5kbGVyIHJlZ2lzdHJ5SGFuZGxlcjsKLQkKLQlwcm90ZWN0ZWQgUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnk7Ci0JcHJvdGVjdGVkIElTdGFuZGFyZEJlYW5UeXBlUHJveHlGYWN0b3J5IHByb3h5VHlwZUZhY3Rvcnk7Ci0JcHJvdGVjdGVkIElTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkgcHJveHlGYWN0b3J5OwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhc3NlcnROb3ROdWxsKGdldFJlZ2lzdHJ5SGFuZGxlcigpKTsKLQkJYXNzZXJ0VHJ1ZSgiU3VpdGUgbm90IHNldHVwIGNvcnJlY3RseS4iLCBnZXRSZWdpc3RyeUhhbmRsZXIoKS5pc1ZhbGlkKCkpOwotCQljcmVhdGVSZWdpc3RyeSgpOwotCX0KLQotCS8qCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlZ2lzdHJ5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZWdpc3RyeSA9IGdldFJlZ2lzdHJ5SGFuZGxlcigpLmdldFJlZ2lzdHJ5KCk7Ci0JCWFzc2VydE5vdE51bGwocmVnaXN0cnkpOwotCQlwcm94eUZhY3RvcnkgPSByZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCk7Ci0JCXByb3h5VHlwZUZhY3RvcnkgPSByZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZ2lzdHJ5SGFuZGxlcihSZWdpc3RyeUhhbmRsZXIgcmVnaXN0cnlIYW5kbGVyKSB7Ci0JCXRoaXMucmVnaXN0cnlIYW5kbGVyID0gcmVnaXN0cnlIYW5kbGVyOwotCX0KLQotCXB1YmxpYyBSZWdpc3RyeUhhbmRsZXIgZ2V0UmVnaXN0cnlIYW5kbGVyKCkgewotCQlyZXR1cm4gcmVnaXN0cnlIYW5kbGVyOwotCX0KLQkKLQkvKioKLQkgKiBSZWNyZWF0ZSB0aGUgcmVnaXN0cnkuIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSBjbGVhbiBvbmUuIFNob3VsZCBiZSB1c2VkIHdpdGggY2F1dGlvbiBiZWNhdXNlIGV4cGVuc2l2ZS4KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiAKLQkgKiBAc2luY2UgMS4xLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNyZWF0ZVJlZ2lzdHJ5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlnZXRSZWdpc3RyeUhhbmRsZXIoKS5kZXN0cm95UmVnaXN0cnkoKTsKLQkJY3JlYXRlUmVnaXN0cnkoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L0V4cHJlc3Npb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9FeHByZXNzaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2VhZjFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L0V4cHJlc3Npb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEV4cHJlc3Npb25UZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEzICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLkFtYmlndW91c01ldGhvZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pZGUuSURFU3RhbmRhcmRCZWFuUHJveHlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuKjsKLSAKLS8qKgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEV4cHJlc3Npb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0UHJveHkgewotCi0JLyoqCi0JICogCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25UZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIEV4cHJlc3Npb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SVByb3h5QmVhblR5cGVQcm94eSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgdGhhdCBwcm94eSBiZWFuIHR5cGUgaXMgZmlyc3QgYW4gZXhwcmVzc2lvbiBwcm94eSBhbmQgYWZ0ZXIgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGRvZXMgaXQgYmVjb21lIGEgcmVhbCBwcm94eS4gCi0JCS8vIENhbid0IHRlc3QgdGhhdCBpdCBkb2Vzbid0IGJlY29tZSBhIHJlYWwgcHJveHkgYmVmb3JlIGV2YWx1YXRpb24gYmVjYXVzZSBpdCBtYXkgYmVjb21lIHJlc29sdmVkIHVuZGVyIHRoZSBjb3ZlcnMuIEZvcgotCQkvLyBleGFtcGxlIElERSBleHByZXNzaW9uIGltbWVkaWF0ZWx5IHJlc29sdmVzIGl0LgotCQkvLwotCQkvLyBGaXJzdCB3ZSBtdXN0IG1ha2Ugc3VyZSB3ZSBoYXZlIGEgY2xlYW4gcmVnaXN0cnkgYmVjYXVzZSBpdCBjb3VsZCBvZiBiZWVuIHJlc29sdmVkIGZyb20gYSBwcmV2aW91cyB0ZXN0LgotCQlyZWNyZWF0ZVJlZ2lzdHJ5KCk7Ci0JCQotCQkvLyBOb3cgZG8gYW4gZXhwcmVzc2lvbiBhbmQgZ2V0IGEgcHJveHkuCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCUlQcm94eUJlYW5UeXBlIGJlYW5UeXBlUHJveHkgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoZXhwLCAidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOwotCQlhc3NlcnROb3ROdWxsKGJlYW5UeXBlUHJveHkpOwotCQlhc3NlcnRUcnVlKGJlYW5UeXBlUHJveHkuaXNFeHByZXNzaW9uUHJveHkoKSk7Ci0JCWZpbmFsIElCZWFuVHlwZVByb3h5W10gcmVzb2x1dGlvbiA9IG5ldyBJQmVhblR5cGVQcm94eVsxXTsKLQkJKChFeHByZXNzaW9uUHJveHkpIGJlYW5UeXBlUHJveHkpLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVzb2x1dGlvblswXSA9IChJQmVhblR5cGVQcm94eSkgZXZlbnQuZ2V0UHJveHkoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHByb3h5Vm9pZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJZmFpbCgiUHJveHkgc2hvdWxkIG5vdCBiZSB2b2lkLiIpOwotCQkJfQotCQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJZmFpbCgiUHJveHkgc2hvdWxkIG9mIHJlc29sdmVkLiIpOwotCQkJfQotCQl9KTsKLQkJCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb2x1dGlvblswXSk7Ci0JCUlCZWFuVHlwZVByb3h5IGJlYW5UeXBlUHJveHkyID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoYmVhblR5cGVQcm94eTIpOwotCQlhc3NlcnRUcnVlKGJlYW5UeXBlUHJveHkyLmlzQmVhblByb3h5KCkpOwotCQlhc3NlcnRUcnVlKGJlYW5UeXBlUHJveHkyLmlzVmFsaWQoKSk7Ci0JCWFzc2VydFNhbWUoYmVhblR5cGVQcm94eTIsIHJlc29sdXRpb25bMF0pOwkvLyBJbiBjYXNlIG9mIGJlYW50eXBlcyB3ZSB3aWxsIGdldCBpZGVudGljYWwgb25lcyBiYWNrIChpZGVudGl0eSBub3QganVzdCBlcXVhbHMpLgotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJUHJveHlNZXRob2RQcm94eSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8vIFRlc3QgdGhhdCBwcm94eSBtZXRob2RlIGlzIGZpcnN0IGFuIGV4cHJlc3Npb24gcHJveHkgYW5kIGFmdGVyIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBkb2VzIGl0IGJlY29tZSBhIHJlYWwgcHJveHkuIAotCQkvLyBDYW4ndCB0ZXN0IHRoYXQgaXQgZG9lc24ndCBiZWNvbWUgYSByZWFsIHByb3h5IGJlZm9yZSBldmFsdWF0aW9uIGJlY2F1c2UgaXQgbWF5IGJlY29tZSByZXNvbHZlZCB1bmRlciB0aGUgY292ZXJzLiBGb3IKLQkJLy8gZXhhbXBsZSBJREUgZXhwcmVzc2lvbiBpbW1lZGlhdGVseSByZXNvbHZlcyBpdC4KLQkJLy8KLQkJLy8gRmlyc3Qgd2UgbXVzdCBtYWtlIHN1cmUgd2UgaGF2ZSBhIGNsZWFuIHJlZ2lzdHJ5IGJlY2F1c2UgaXQgY291bGQgb2YgYmVlbiByZXNvbHZlZCBmcm9tIGEgcHJldmlvdXMgdGVzdC4KLQkJcmVjcmVhdGVSZWdpc3RyeSgpOwotCQkKLQkJLy8gTm93IGRvIGFuIGV4cHJlc3Npb24gYW5kIGdldCBhIHByb3h5LgotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlJUHJveHlCZWFuVHlwZSBiZWFuVHlwZVByb3h5ID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KGV4cCwgInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsKLQkJSVByb3h5TWV0aG9kIG1ldGhvZFByb3h5ID0gYmVhblR5cGVQcm94eS5nZXRNZXRob2RQcm94eShleHAsICJ4eXoiKTsKLQkJYXNzZXJ0Tm90TnVsbChtZXRob2RQcm94eSk7Ci0JCWFzc2VydFRydWUobWV0aG9kUHJveHkuaXNFeHByZXNzaW9uUHJveHkoKSk7Ci0JCWZpbmFsIElNZXRob2RQcm94eVtdIHJlc29sdXRpb24gPSBuZXcgSU1ldGhvZFByb3h5WzFdOwotCQlmaW5hbCBib29sZWFuW10gd2FzVm9pZCA9IG5ldyBib29sZWFuWzFdOwotCQkoKEV4cHJlc3Npb25Qcm94eSkgbWV0aG9kUHJveHkpLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVzb2x1dGlvblswXSA9IChJTWV0aG9kUHJveHkpIGV2ZW50LmdldFByb3h5KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBwcm94eVZvaWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCXdhc1ZvaWRbMF0gPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQl9Ci0JCX0pOwotCQlJUHJveHlNZXRob2QgbWV0aG9kUHJveHkyID0gYmVhblR5cGVQcm94eS5nZXRNZXRob2RQcm94eShleHAsICJ4eXoiKTsKLQkJYXNzZXJ0U2FtZShtZXRob2RQcm94eSwgbWV0aG9kUHJveHkyKTsJLy8gSXQgc2hvdWxkIHJldHVybiBzYW1lIGV4cHJlc3Npb24gcHJveHkgZWFjaCB0aW1lLgotCQkKLQkJZXhwLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgbWV0aG9kUHJveHksIHRydWUsIDApOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX1JFQ0VJVkVSLCBiZWFuVHlwZVByb3h5LCAwKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydEZhbHNlKHdhc1ZvaWRbMF0pOwotCQlhc3NlcnROb3ROdWxsKHJlc29sdXRpb25bMF0pOwotCQlJTWV0aG9kUHJveHkgbWV0aG9kUHJveHkzID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIikuZ2V0TWV0aG9kUHJveHkoInh5eiIpOwotCQlhc3NlcnROb3ROdWxsKG1ldGhvZFByb3h5Myk7Ci0JCWFzc2VydFRydWUobWV0aG9kUHJveHkzLmlzQmVhblByb3h5KCkpOwotCQlhc3NlcnRUcnVlKG1ldGhvZFByb3h5My5pc1ZhbGlkKCkpOwotCQkvLyBDYW4ndCB0ZXN0IGlkZW50aXR5IG9mIG1ldGhvZHByb3hpZXMgYmVjYXVzZSBzb21lIHJlZ2lzdHJpZXMgKElERSBmb3IgZXhhbXBsZSkgY3JlYXRlIGEgbmV3IG1ldGhvZCBwcm94eSBlYWNoIHRpbWUuCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdElQcm94eUZpZWxkUHJveHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvLyBUZXN0IHRoYXQgcHJveHkgZmllbGQgaXMgZmlyc3QgYW4gZXhwcmVzc2lvbiBwcm94eSBhbmQgYWZ0ZXIgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGRvZXMgaXQgYmVjb21lIGEgcmVhbCBwcm94eS4gCi0JCS8vIENhbid0IHRlc3QgdGhhdCBpdCBkb2Vzbid0IGJlY29tZSBhIHJlYWwgcHJveHkgYmVmb3JlIGV2YWx1YXRpb24gYmVjYXVzZSBpdCBtYXkgYmVjb21lIHJlc29sdmVkIHVuZGVyIHRoZSBjb3ZlcnMuIEZvcgotCQkvLyBleGFtcGxlIElERSBleHByZXNzaW9uIGltbWVkaWF0ZWx5IHJlc29sdmVzIGl0LgotCQkvLwotCQkvLyBGaXJzdCB3ZSBtdXN0IG1ha2Ugc3VyZSB3ZSBoYXZlIGEgY2xlYW4gcmVnaXN0cnkgYmVjYXVzZSBpdCBjb3VsZCBvZiBiZWVuIHJlc29sdmVkIGZyb20gYSBwcmV2aW91cyB0ZXN0LgotCQlyZWNyZWF0ZVJlZ2lzdHJ5KCk7Ci0JCQotCQkvLyBOb3cgZG8gYW4gZXhwcmVzc2lvbiBhbmQgZ2V0IGEgcHJveHkuCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCUlQcm94eUJlYW5UeXBlIGJlYW5UeXBlUHJveHkgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoZXhwLCAidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOwotCQlJUHJveHlGaWVsZCBmaWVsZFByb3h5ID0gYmVhblR5cGVQcm94eS5nZXRGaWVsZFByb3h5KGV4cCwgIlNUQVRJQ19GSUVMRCIpOwotCQlhc3NlcnROb3ROdWxsKGZpZWxkUHJveHkpOwotCQlhc3NlcnRUcnVlKGZpZWxkUHJveHkuaXNFeHByZXNzaW9uUHJveHkoKSk7Ci0JCWZpbmFsIElGaWVsZFByb3h5W10gcmVzb2x1dGlvbiA9IG5ldyBJRmllbGRQcm94eVsxXTsKLQkJZmluYWwgYm9vbGVhbltdIHdhc1ZvaWQgPSBuZXcgYm9vbGVhblsxXTsKLQkJKChFeHByZXNzaW9uUHJveHkpIGZpZWxkUHJveHkpLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJcmVzb2x1dGlvblswXSA9IChJRmllbGRQcm94eSkgZXZlbnQuZ2V0UHJveHkoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHByb3h5Vm9pZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJd2FzVm9pZFswXSA9IHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBwcm94eU5vdFJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCX0KLQkJfSk7Ci0JCQotCQlJUHJveHlGaWVsZCBmaWVsZFByb3h5MiA9IGJlYW5UeXBlUHJveHkuZ2V0RmllbGRQcm94eShleHAsICJTVEFUSUNfRklFTEQiKTsKLQkJYXNzZXJ0U2FtZShmaWVsZFByb3h5LCBmaWVsZFByb3h5Mik7CS8vIEl0IHNob3VsZCByZXR1cm4gc2FtZSBleHByZXNzaW9uIHByb3h5IGVhY2ggdGltZS4KLQkJCi0JCWV4cC5jcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBmaWVsZFByb3h5LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLkZJRUxEX1JFQ0VJVkVSLCBiZWFuVHlwZVByb3h5LCAwKTsKLQkJSUJlYW5Qcm94eSB2ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHYpOwotCQlhc3NlcnRFcXVhbHMoMywgKChJSW50ZWdlckJlYW5Qcm94eSkgdikuaW50VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRGYWxzZSh3YXNWb2lkWzBdKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvbHV0aW9uWzBdKTsKLQkJSUZpZWxkUHJveHkgZmllbGRQcm94eTMgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKS5nZXRGaWVsZFByb3h5KCJTVEFUSUNfRklFTEQiKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWVsZFByb3h5Myk7Ci0JCWFzc2VydFRydWUoZmllbGRQcm94eTMuaXNCZWFuUHJveHkoKSk7Ci0JCWFzc2VydFRydWUoZmllbGRQcm94eTMuaXNWYWxpZCgpKTsKLQkJLy8gQ2FuJ3QgdGVzdCBpZGVudGl0eSBvZiBtZXRob2Rwcm94aWVzIGJlY2F1c2Ugc29tZSByZWdpc3RyaWVzIChJREUgZm9yIGV4YW1wbGUpIGNyZWF0ZSBhIG5ldyBtZXRob2QgcHJveHkgZWFjaCB0aW1lLgotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXN0U3RyaW5nVHlwZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDYXN0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAic2hvcnQiKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DQVNUX0VYUFJFU1NJT04sIDEwbCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygic2hvcnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoc2hvcnQpIDEwLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuc2hvcnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhc3RQcm94eVR5cGUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ2FzdEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJzaG9ydCIpKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DQVNUX0VYUFJFU1NJT04sICdhJyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygic2hvcnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoc2hvcnQpICdhJywgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLnNob3J0VmFsdWUoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzdEVycm9yKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUNhc3RFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgic2hvcnQiKSk7Ci0JCXRyeSB7Ci0JCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ0FTVF9FWFBSRVNTSU9OLCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChCb29sZWFuLlRSVUUpKTsKLQkJCWV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJCWZhaWwoIlNob3VsZCBvZiB0aHJvd24gQ2xhc3NDYXN0RXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWlmICghZS5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpLmVxdWFscygiamF2YS5sYW5nLkNsYXNzQ2FzdEV4Y2VwdGlvbiIpKQotCQkJCXRocm93IGU7CS8vIFNvbWUgb3RoZXIgZXhjZXB0aW9uLCByZXRocm93IGl0LgotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzdEZhaWxlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDYXN0RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInNob3J0IikpOwotCQl0cnkgewotCQkJZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQkJZmFpbCgiU2hvdWxkIG9mIGdvdHRvbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRnJvbSB0ZXN0Q2FzdEZhaWxlZCAoVGhpcyBpcyBzdWNjZXNzZnVsKTogIitlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YW5jZW9mU3RyaW5nVHlwZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbnN0YW5jZW9mRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiamF2YS5sYW5nLlN0cmluZyIpOwotCQlleHAuY3JlYXRlU3RyaW5nTGl0ZXJhbChGb3JFeHByZXNzaW9uLklOU1RBTkNFT0ZfVkFMVUUsICJhc2RmIik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VvZlByb3h5VHlwZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbnN0YW5jZW9mRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5TdHJpbmciKSk7Ci0JCWV4cC5jcmVhdGVTdHJpbmdMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5TVEFOQ0VPRl9WQUxVRSwgImFzZGYiKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VvZkZhaWxlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbnN0YW5jZW9mRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5TdHJpbmciKSk7Ci0JCXRyeSB7Ci0JCQlleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCQlmYWlsKCJTaG91bGQgb2YgZ290dG9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJGcm9tIHRlc3RJbnN0YW5jZW9mRmFpbGVkIChUaGlzIGlzIHN1Y2Nlc3NmdWwpOiAiK2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJfQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlTGl0ZXJhbCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUeXBlTGl0ZXJhbChGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiamF2YS5sYW5nLlN0cmluZyIpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZSgiTm90IGEgYmVhbiB0eXBlIHByb3h5LiIsIHJlc3VsdCBpbnN0YW5jZW9mIElCZWFuVHlwZVByb3h5KTsKLQkJSUJlYW5UeXBlUHJveHkgdHlwZSA9IChJQmVhblR5cGVQcm94eSkgcmVzdWx0OwotCQlhc3NlcnRUcnVlKCJOb3QgdmFsaWQuIiwgdHlwZS5pc1ZhbGlkKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB0eXBlLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlRmFpbHMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQl0cnkgewotCQkJZXhwLmNyZWF0ZVR5cGVMaXRlcmFsKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJqYXZhLmxhbmcuU3RuZyIpOwotCQkJZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQkJZmFpbCgiU2hvdWxkIG5vdCBvZiBnb3R0b24gYSByZXN1bHQuIik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkNsYXNzTm90Rm91bmRFeGNlcHRpb24iLCBlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0aW5nKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluc3RhbmNlb2ZFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJzaG9ydCIpOwotCQlleHAuY3JlYXRlQ2FzdEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTlNUQU5DRU9GX1ZBTFVFLCAic2hvcnQiKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DQVNUX0VYUFJFU1NJT04sIChzaG9ydCkgMTApOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByZWZpeFBsdXMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlUHJlZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBQcmVmaXhPcGVyYXRvci5QUkVfUExVUyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uUFJFRklYX09QRVJBTkQsIDEwKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByZWZpeE1pbnVzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVByZWZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgUHJlZml4T3BlcmF0b3IuUFJFX01JTlVTKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5QUkVGSVhfT1BFUkFORCwgMTApOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xMCwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJlZml4TWludXNDaGFyKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVByZWZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgUHJlZml4T3BlcmF0b3IuUFJFX01JTlVTKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5QUkVGSVhfT1BFUkFORCwgJ2EnKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygtJ2EnLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmVmaXhDb21wbGVtZW50KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVByZWZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgUHJlZml4T3BlcmF0b3IuUFJFX0NPTVBMRU1FTlQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLlBSRUZJWF9PUEVSQU5ELCAoc2hvcnQpIDEwKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh+MTAsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZWZpeE5vdCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVQcmVmaXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIFByZWZpeE9wZXJhdG9yLlBSRV9OT1QpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLlBSRUZJWF9PUEVSQU5ELCB0cnVlKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJlZml4RmFpbCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVQcmVmaXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIFByZWZpeE9wZXJhdG9yLlBSRV9OT1QpOwotCQl0cnkgewotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5QUkVGSVhfT1BFUkFORCwgMTApOwotCQkJZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQkJZmFpbCgiU2hvdWxkIG9mIGZhaWxlZC4iKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IHdhcyBzdWNjZXNzZnVsOiAiK2UuZ2V0UHJveHlMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGltZXMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fVElNRVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCA0KTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzKjQsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUaW1lc0V4dGVuZGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1RJTUVTLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIDVkKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJkb3VibGUiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoMyo0KjVkKSwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmRvdWJsZVZhbHVlKCksIDApOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGltZXNFeHRlbmRlZE5lc3RlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9USU1FUywgMSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBJbmZpeE9wZXJhdG9yLklOX01JTlVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAxMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgNWQpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImRvdWJsZSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCgoMTAtNSkqNCo1ZCksICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5kb3VibGVWYWx1ZSgpLCAwKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpdmlkZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9ESVZJREUsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAyKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0LzIsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REaXZpZGVFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9ESVZJREUsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDEyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIDJkKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJkb3VibGUiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoMTIvMy8yZCksICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5kb3VibGVWYWx1ZSgpLCAwKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbWFpbmRlcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9SRU1BSU5ERVIsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0JTMsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1haW5kZXJFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9SRU1BSU5ERVIsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDEyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgOSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIDJkKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJkb3VibGUiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoMTIlOSUyZCksICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5kb3VibGVWYWx1ZSgpLCAwKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX01JTlVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNC0zLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWludXNFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9NSU5VUywgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMTIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCA5KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgMmQpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImRvdWJsZSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCgxMi05LTJkKSwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmRvdWJsZVZhbHVlKCksIDApOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGVmdFNoaWZ0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0xFRlRfU0hJRlQsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0PDwzLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGVmdFNoaWZ0RXh0ZW5kZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fTEVGVF9TSElGVCwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMTIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCA5KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgMik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoKDEyPDw5PDwyKSwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCksIDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSaWdodFNoaWZ0U2lnbmVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1JJR0hUX1NISUZUX1NJR05FRCwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgLTEwMDAwMDAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEwMDAwMDAwPj4zLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSaWdodFNoaWZ0U2lnbmVkRXh0ZW5kZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfU0lHTkVELCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAtMTAwMDAwMDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgMik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoKC0xMDAwMDAwMD4+ND4+MiksICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpLCAwKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFJpZ2h0U2hpZnRVblNpZ25lZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9SSUdIVF9TSElGVF9VTlNJR05FRCwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgLTEwMDAwMDAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEwMDAwMDAwPj4+MywgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmlnaHRTaGlmdFVuU2lnbmVkRXh0ZW5kZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fUklHSFRfU0hJRlRfVU5TSUdORUQsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIC0xMDAwMDAwMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVELCAyKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoLTEwMDAwMDAwPj4+ND4+PjIpLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExlc3MoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fTEVTUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgLTEwMDAwMDAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xMDAwMDAwMDwzLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGVzc0VxdWFscygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9MRVNTX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzPD0zLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R3JlYXRlcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9HUkVBVEVSLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAtMTAwMDAwMDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEwMDAwMDAwPjMsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHcmVhdGVyRXF1YWxzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0dSRUFURVJfRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI+PTMsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNQcmltaXRpdmVzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgM2QpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoM2Q9PTMsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0cygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlVHlwZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAiamF2YS5sYW5nLlN0cmluZyIpOwotCQlleHAuY3JlYXRlVHlwZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgImphdmEubGFuZy5TdHJpbmciKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzID09IFN0cmluZy5jbGFzcywgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3ROb3RFcXVhbHNQcmltaXRpdmVzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX05PVF9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDNkKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDNkIT0zLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5vdEVxdWFsc09iamVjdHMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fTk9UX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVUeXBlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsICJqYXZhLmxhbmcuU3RyaW5nIik7Ci0JCWV4cC5jcmVhdGVUeXBlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAiamF2YS5sYW5nLlN0cmluZyIpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MgIT0gU3RyaW5nLmNsYXNzLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdFhPUigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9YT1IsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg1XjMsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RYT1JFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9YT1IsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDIzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgOSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIDIpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCgyM145XjIpLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSwgMCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbmQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fQU5ELCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCA1KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNSYzLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbmRFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9BTkQsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDEzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMTUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVELCAxKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoMTMmNSYxKSwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCksIDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9PUiwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgNSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDIpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDV8MiwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3JFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9PUiwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMTMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCA2KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9FWFRFTkRFRCwgMik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoKDEzfDZ8MiksICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpLCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGx1cygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCA1KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNSsyLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBsdXNFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCA1KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIDJsKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJsb25nIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNSsyKzJsLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBsdXNTdHJpbmdMZWZ0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoImFiYyIpKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYmMiKzIsICgoSVN0cmluZ0JlYW5Qcm94eSkgcmVzdWx0KS5zdHJpbmdWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGx1c1N0cmluZ1JpZ2h0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIDIpOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKCJhYmMiKSk7CQkKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMisiYWJjIiwgKChJU3RyaW5nQmVhblByb3h5KSByZXN1bHQpLnN0cmluZ1ZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGx1c1N0cmluZ0xlZnROdWxsKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoImFiYyIpKTsKLQkJZXhwLmNyZWF0ZU51bGwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYmMiK251bGwsICgoSVN0cmluZ0JlYW5Qcm94eSkgcmVzdWx0KS5zdHJpbmdWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFBsdXNTdHJpbmdSaWdodE51bGwoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCWV4cC5jcmVhdGVOdWxsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCk7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoImFiYyIpKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCsiYWJjIiwgKChJU3RyaW5nQmVhblByb3h5KSByZXN1bHQpLnN0cmluZ1ZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQbHVzU3RyaW5nTGVmdENoYXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgiYWJjIikpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAnYScpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWJjIisnYScsICgoSVN0cmluZ0JlYW5Qcm94eSkgcmVzdWx0KS5zdHJpbmdWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGx1c1N0cmluZ1JpZ2h0Q2hhcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAnYScpOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKCJhYmMiKSk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCdhJysiYWJjIiwgKChJU3RyaW5nQmVhblByb3h5KSByZXN1bHQpLnN0cmluZ1ZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbEFuZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9DT05ESVRJT05BTF9BTkQsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIHRydWUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCB0cnVlKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSAmJiB0cnVlLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZGl0aW9uYWxBbmRFeHRlbmRlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9DT05ESVRJT05BTF9BTkQsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIHRydWUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCB0cnVlKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVELCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlICYmIHRydWUgJiYgKDMgPT0gMyksICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbEFuZEZhbHNlTGFzdCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgSW5maXhPcGVyYXRvci5JTl9DT05ESVRJT05BTF9BTkQsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIHRydWUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCBmYWxzZSk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUgJiYgZmFsc2UsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbEFuZEZhbHNlRmlyc3QoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fQ09ORElUSU9OQUxfQU5ELCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBmYWxzZSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIHRydWUpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSAmJiB0cnVlLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZGl0aW9uYWxBbmRFeHRlbmRlZEFuZEZhbHNlRmlyc3QoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fQ09ORElUSU9OQUxfQU5ELCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBmYWxzZSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIHRydWUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlICYmIHRydWUgJiYgKDMgPT0gMyksICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbE9yKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX09SLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBmYWxzZSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIHRydWUpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSB8fCB0cnVlLCAoKElCb29sZWFuQmVhblByb3h5KSByZXN1bHQpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZGl0aW9uYWxPckV4dGVuZGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX09SLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBmYWxzZSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIGZhbHNlKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0VYVEVOREVELCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSB8fCBmYWxzZSB8fCAoMyA9PSAzKSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbmFsT3JUcnVlRmlyc3QoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIEluZml4T3BlcmF0b3IuSU5fQ09ORElUSU9OQUxfT1IsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIHRydWUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCBmYWxzZSk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUgfHwgZmFsc2UsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbE9yRXh0ZW5kZWRBbmRUcnVlTWlkZGxlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX0NPTkRJVElPTkFMX09SLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCBmYWxzZSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIHRydWUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSU5GSVhfRVhURU5ERUQsIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlIHx8IHRydWUgfHwgKDMgPT0gMyksICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUFjY2VzcygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlBcnJheUJlYW5Qcm94eSBhcnJheSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgic2hvcnQiKSwgMSk7Ci0JCWFycmF5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgoc2hvcnQpIDMpLCAwKTsKLQkJCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAxKTsKLQkJZXhwLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0FSUkFZLCBhcnJheSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfSU5ERVgsIDApOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoInNob3J0IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLnNob3J0VmFsdWUoKSwgKHNob3J0KSAzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFycmF5QWNjZXNzU2V0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUFycmF5QmVhblByb3h5IGFycmF5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJzaG9ydCIpLCAxKTsKLQkJYXJyYXkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKChzaG9ydCkgMyksIDApOwotCQkKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlQXJyYXlBY2Nlc3MoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX0xFRlQsIDEpOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfQVJSQVksIGFycmF5KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19JTkRFWCwgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgKHNob3J0KSAzMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygic2hvcnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuc2hvcnRWYWx1ZSgpLCAoc2hvcnQpIDMzKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE11bHRpQXJyYXlBY2Nlc3MoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInNob3J0IiksIG5ldyBpbnRbXSB7MiwxfSk7Ci0JCWFycmF5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgoc2hvcnQpIDMpLCBuZXcgaW50W117MSwwfSk7Ci0JCQotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXJyYXlBY2Nlc3MoRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgMSk7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19BUlJBWSwgYXJyYXkpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0lOREVYLCAxKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJzaG9ydFtdIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aUFycmF5QWNjZXNzU2V0KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUFycmF5QmVhblByb3h5IGFycmF5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJzaG9ydCIpLCBuZXcgaW50W10gezIsMX0pOwotCQlhcnJheS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoKHNob3J0KSAzKSwgbmV3IGludFtdezEsMH0pOwotCQkKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlQXJyYXlBY2Nlc3MoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX0xFRlQsIDEpOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfQVJSQVksIGFycmF5KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19JTkRFWCwgMSk7Ci0JCUlBcnJheUJlYW5Qcm94eSBuZXdBcnJheSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgic2hvcnQiKSwgbmV3IGludFtdIHszfSk7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBuZXdBcnJheSk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygic2hvcnRbXSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsICgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldExlbmd0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlBcnJheUFjY2VzczEoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInNob3J0IiksIG5ldyBpbnRbXSB7MiwxfSk7Ci0JCWFycmF5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgoc2hvcnQpIDMpLCBuZXcgaW50W117MSwwfSk7Ci0JCQotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXJyYXlBY2Nlc3MoRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgMik7Ci0JCWV4cC5jcmVhdGVQcm94eUV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19BUlJBWSwgYXJyYXkpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0lOREVYLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19JTkRFWCwgMCk7CQkKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJzaG9ydCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKChzaG9ydCkgMywgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLnNob3J0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUNyZWF0aW9uKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiaW50W10iLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUNSRUFUSU9OX0RJTUVOU0lPTiwgMik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50W10iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXRMZW5ndGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aUFycmF5Q3JlYXRpb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJpbnRbXVtdIiwgMik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlDUkVBVElPTl9ESU1FTlNJT04sIDIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQ1JFQVRJT05fRElNRU5TSU9OLCA0KTsJCQotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludFtdW10iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCAoKElBcnJheUJlYW5Qcm94eSkoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXQoMCkpLmdldExlbmd0aCgpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdE11bHRpUGFydGlhbEFycmF5Q3JlYXRpb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJpbnRbXVtdW10iLCAyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUNSRUFUSU9OX0RJTUVOU0lPTiwgMik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlDUkVBVElPTl9ESU1FTlNJT04sIDQpOwkJCi0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50W11bXVtdIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgKChJQXJyYXlCZWFuUHJveHkpKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0KDApKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoKChJQXJyYXlCZWFuUHJveHkpKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0KDApKS5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJbml0aWFsaXplckVtcHR5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImludFtdIiwgMCk7Ci0JCWV4cC5jcmVhdGVBcnJheUluaXRpYWxpemVyKDApOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludFtdIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0TGVuZ3RoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJbml0aWFsaXplck9uZURpbSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJpbnRbXSIsIDApOwotCQlleHAuY3JlYXRlQXJyYXlJbml0aWFsaXplcigxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUlOSVRJQUxJWkVSX0VYUFJFU1NJT04sIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludFtdIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgKChJTnVtYmVyQmVhblByb3h5KSAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXQoMCkpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJbml0aWFsaXplclR3b0RpbUVtcHR5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImludFtdW10iLCAwKTsKLQkJZXhwLmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIoMCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50W11bXSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldExlbmd0aCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SW5pdGlhbGl6ZXJUd29EaW0oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiaW50W11bXSIsIDApOwotCQlleHAuY3JlYXRlQXJyYXlJbml0aWFsaXplcigxKTsKLQkJZXhwLmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIoMCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50W11bXSIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsICgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoSUFycmF5QmVhblByb3h5KSAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXQoMCkpLmdldExlbmd0aCgpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SW5pdGlhbGl6ZXJUd29EaW1Ob3RFbXB0eSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJpbnRbXVtdIiwgMCk7Ci0JCWV4cC5jcmVhdGVBcnJheUluaXRpYWxpemVyKDIpOwotCQlleHAuY3JlYXRlTnVsbChGb3JFeHByZXNzaW9uLkFSUkFZSU5JVElBTElaRVJfRVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVBcnJheUluaXRpYWxpemVyKDIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZSU5JVElBTElaRVJfRVhQUkVTU0lPTiwgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OLCA0KTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnRbXVtdIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKCgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKElBcnJheUJlYW5Qcm94eSkgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0KDEpKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCAoKElOdW1iZXJCZWFuUHJveHkpKChJQXJyYXlCZWFuUHJveHkpICgoSUFycmF5QmVhblByb3h5KSByZXN1bHQpLmdldCgxKSkuZ2V0KDEpKS5pbnRWYWx1ZSgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJbml0aWFsaXplclNob3J0SW50KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgInNob3J0W10iLCAwKTsKLQkJZXhwLmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIoMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlJTklUSUFMSVpFUl9FWFBSRVNTSU9OLCAzKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJzaG9ydFtdIiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgKChJQXJyYXlCZWFuUHJveHkpIHJlc3VsdCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgKChJTnVtYmVyQmVhblByb3h5KSAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXQoMCkpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRGVmYXVsdCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImphdmEubGFuZy5PYmplY3QiLCAwKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NJbnN0YW5jZUNyZWF0aW9uRGVmYXVsdFdpdGhCZWFuVHlwZVByb3h5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5PYmplY3QiKSwgMCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25PbmVBcmcoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJqYXZhLmxhbmcuSW50ZWdlciIsIDEpOwotCQlleHAuY3JlYXRlU3RyaW5nTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgIjMiKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENsYXNzSW5zdGFuY2VDcmVhdGlvbk9uZUFyZ1dpdGhQcmltV2lkZW5pbmcoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJqYXZhLmxhbmcuU2hvcnQiLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIChieXRlKTMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TaG9ydCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKChzaG9ydCkzLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuc2hvcnRWYWx1ZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25OdWxsQXJnKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAidGVzdFBhY2thZ2UuVGVzdEN0b3JXaXRoTnVsbCIsIDEpOwotCQlleHAuY3JlYXRlTnVsbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygidGVzdFBhY2thZ2UuVGVzdEN0b3JXaXRoTnVsbCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0luc3RhbmNlQ3JlYXRpb25NaXNtYXRjaEFyZygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgInRlc3RQYWNrYWdlLlRlc3RDdG9yV2l0aE51bGwiLCAxKTsKLQkJdHJ5IHsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCAxKTsKLQkJCWV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgb2YgYmVlbiB0aHJvd24uIik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiIsIGUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCX0KLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZEFjY2Vzc1N0YXRpYygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiUkVEIiwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoImphdmEuYXd0LkNvbG9yIik7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5hd3QuQ29sb3IiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCUlCZWFuVHlwZVByb3h5IGNvbG9yVHlwZSA9IHJlc3VsdC5nZXRUeXBlUHJveHkoKTsKLQkJSU1ldGhvZFByb3h5IHJlZCA9IGNvbG9yVHlwZS5nZXRNZXRob2RQcm94eSgiZ2V0UmVkIik7Ci0JCUlNZXRob2RQcm94eSBncmVlbiA9IGNvbG9yVHlwZS5nZXRNZXRob2RQcm94eSgiZ2V0R3JlZW4iKTsKLQkJSU1ldGhvZFByb3h5IGJsdWUgPSBjb2xvclR5cGUuZ2V0TWV0aG9kUHJveHkoImdldEJsdWUiKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgKChJTnVtYmVyQmVhblByb3h5KSByZWQuaW52b2tlKHJlc3VsdCkpLmludFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgKChJTnVtYmVyQmVhblByb3h5KSBncmVlbi5pbnZva2UocmVzdWx0KSkuaW50VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCAoKElOdW1iZXJCZWFuUHJveHkpIGJsdWUuaW52b2tlKHJlc3VsdCkpLmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRBY2Nlc3NTZXRTdGF0aWMoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfTEVGVCwgIlNUQVRJQ19GSUVMRCIsIHRydWUpOwotCQlleHAuY3JlYXRlVHlwZVJlY2VpdmVyKCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgMjMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIzLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZEFjY2Vzc05vblN0YXRpYygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAieCIsIHRydWUpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIsICJqYXZhLmF3dC5Qb2ludCIsIDIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCAyKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZEFjY2Vzc1NldE5vblN0YXRpYygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9MRUZULCAieCIsIHRydWUpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIsICJqYXZhLmF3dC5Qb2ludCIsIDIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCAyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCAyMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMjMsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkQWNjZXNzU2V0Tm9uU3RhdGljU2ltcGxlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLy8gRmlyc3QgY3JlYXRlIHVzaW5nIG5vcm1hbCBwcm94eSBzdHVmZiwgdGhlbiB0ZXN0IHRoZSBleHByZXNzaW9uIHByb2Nlc3Nvci4KLQkJSUJlYW5UeXBlUHJveHkgcG9pbnRUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5Qb2ludCIpOwotCQlJRmllbGRQcm94eSB4RmllbGRQcm94eSA9IHBvaW50VHlwZS5nZXRGaWVsZFByb3h5KCJ4Iik7Ci0JCUlCZWFuUHJveHkgcG9pbnRQcm94eSA9IHBvaW50VHlwZS5nZXRDb25zdHJ1Y3RvclByb3h5KG5ldyBTdHJpbmdbXSB7ImludCIsICJpbnQifSkubmV3SW5zdGFuY2UobmV3IElCZWFuUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMSksIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDIpfSk7Ci0JCQotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlFeHByZXNzaW9uUHJveHkgZXAgPSBleHAuY3JlYXRlU2ltcGxlRmllbGRTZXQoeEZpZWxkUHJveHksIHBvaW50UHJveHksIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDIzKSwgdHJ1ZSk7Ci0JCWVwLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHJlc3VsdCA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQkJCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCWFzc2VydEVxdWFscygyMywgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRBY2Nlc3NOb25TdGF0aWNTaW1wbGUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvLyBGaXJzdCBjcmVhdGUgdXNpbmcgbm9ybWFsIHByb3h5IHN0dWZmLCB0aGVuIHRlc3QgdGhlIGV4cHJlc3Npb24gcHJvY2Vzc29yLgotCQlJQmVhblR5cGVQcm94eSBwb2ludFR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LlBvaW50Iik7Ci0JCUlGaWVsZFByb3h5IHhGaWVsZFByb3h5ID0gcG9pbnRUeXBlLmdldEZpZWxkUHJveHkoIngiKTsKLQkJSUJlYW5Qcm94eSBwb2ludFByb3h5ID0gcG9pbnRUeXBlLmdldENvbnN0cnVjdG9yUHJveHkobmV3IFN0cmluZ1tdIHsiaW50IiwgImludCJ9KS5uZXdJbnN0YW5jZShuZXcgSUJlYW5Qcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgxKSwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMil9KTsKLQkJCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBlcCA9IGV4cC5jcmVhdGVTaW1wbGVGaWVsZEFjY2Vzcyh4RmllbGRQcm94eSwgcG9pbnRQcm94eSk7Ci0JCWVwLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHJlc3VsdCA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQkJCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCWFzc2VydEVxdWFscygxLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZEFjY2Vzc05vblN0YXRpY1dpdGhQcm94eSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlCZWFuVHlwZVByb3h5IHBvaW50VHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuUG9pbnQiKTsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIHBvaW50VHlwZS5nZXRGaWVsZFByb3h5KCJ4IiksIHRydWUpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIsICJqYXZhLmF3dC5Qb2ludCIsIDIpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCAyKTsKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRBY2Nlc3NGYWlsV2l0aEV4cHJlc3Npb25Qcm94eSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUJlYW5UeXBlUHJveHkgcG9pbnRUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5Qb2ludCIpOwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQl0cnkgewotCQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIHBvaW50VHlwZS5nZXRGaWVsZFByb3h5KGV4cCwgInoiKSwgdHJ1ZSk7Ci0JCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uRklFTERfUkVDRUlWRVIsICJqYXZhLmF3dC5Qb2ludCIsIDIpOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIDEpOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIDIpOwotCQkJZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQkJZmFpbCgiU2hvdWxkIG9mIGhhZCBleGNlcHRpb24iKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTm9TdWNoRmllbGRFeGNlcHRpb24iLCBlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZEludm9rZVN0YXRpYygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJ2YWx1ZU9mIiwgdHJ1ZSwgMSk7Ci0JCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoImphdmEubGFuZy5TdHJpbmciKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5NRVRIT0RfQVJHVU1FTlQsIHRydWUpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsICgoSVN0cmluZ0JlYW5Qcm94eSkgcmVzdWx0KS5zdHJpbmdWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZEludm9rZVByb3h5RmFpbCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJSUJlYW5UeXBlUHJveHkgaW50VHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiKTsKLQkJdHJ5IHsKLQkJCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIGludFR5cGUuZ2V0TWV0aG9kUHJveHkoZXhwLCAiZ29vYmxkeS1nb29rIiksIHRydWUsIDEpOwotCQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLk1FVEhPRF9SRUNFSVZFUiwgaW50VHlwZSwgMSk7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgMyk7Ci0JCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX0FSR1VNRU5ULCAiamF2YS5sYW5nLkludGVnZXIiLCAxKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQ0xBU1NJTlNUQU5DRUNSRUFUSU9OX0FSR1VNRU5ULCA0KTsKLQkJCWV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJCWZhaWwoIlNob3VsZCBvZiBnb3R0ZW4gZXhjZXB0aW9uIik7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiIsIGUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSW52b2tlTm9uU3RhdGljKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZU1ldGhvZEludm9jYXRpb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgImNvbXBhcmVUbyIsIHRydWUsIDEpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX1JFQ0VJVkVSLCAiamF2YS5sYW5nLkludGVnZXIiLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIDMpOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX0FSR1VNRU5ULCAiamF2YS5sYW5nLkludGVnZXIiLCAxKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIDQpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiQ29tcGFyZVRvIHdhc24ndCBsZXNzIHRoYW4gMC4iLCAoKElOdW1iZXJCZWFuUHJveHkpIHJlc3VsdCkuaW50VmFsdWUoKSA8IDApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSW52b2tlTm9uU3RhdGljV2l0aFByb3h5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIGludGVnZXJUeXBlLmdldE1ldGhvZFByb3h5KCJjb21wYXJlVG8iLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7aW50ZWdlclR5cGV9KSwgdHJ1ZSwgMSk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfUkVDRUlWRVIsICJqYXZhLmxhbmcuSW50ZWdlciIsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgMyk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5NRVRIT0RfQVJHVU1FTlQsICJqYXZhLmxhbmcuSW50ZWdlciIsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgNCk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKCJDb21wYXJlVG8gd2Fzbid0IGxlc3MgdGhhbiAwLiIsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpIDwgMCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbFRydWUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfQ09ORElUSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfVFJVRSwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9GQUxTRSwgSW5maXhPcGVyYXRvci5JTl9NSU5VUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbmFsRmFsc2UoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfQ09ORElUSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfVFJVRSwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9GQUxTRSwgSW5maXhPcGVyYXRvci5JTl9NSU5VUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZENvbmRpdGlvbmFsVHJ1ZVRydWUoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfQ09ORElUSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlleHAuY3JlYXRlQ29uZGl0aW9uYWxFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfVFJVRSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9UUlVFLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSA0KTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0ZBTFNFLCBJbmZpeE9wZXJhdG9yLklOX01JTlVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9GQUxTRSwgSW5maXhPcGVyYXRvci5JTl9NSU5VUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlJQmVhblByb3h5IHJlc3VsdCA9IGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDgsICgoSU51bWJlckJlYW5Qcm94eSkgcmVzdWx0KS5pbnRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZENvbmRpdGlvbmFsRmFsc2VGYWxzZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMik7Ci0JCWV4cC5jcmVhdGVDb25kaXRpb25hbEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9UUlVFKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0NPTkRJVElPTiwgSW5maXhPcGVyYXRvci5JTl9FUVVBTFMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX1RSVUUsIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDQpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQ09ORElUSU9OQUxfRkFMU0UsIEluZml4T3BlcmF0b3IuSU5fTUlOVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSA0KTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0ZBTFNFLCBJbmZpeE9wZXJhdG9yLklOX01JTlVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgNSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCUlCZWFuUHJveHkgcmVzdWx0ID0gZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgcmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgKChJTnVtYmVyQmVhblByb3h5KSByZXN1bHQpLmludFZhbHVlKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFZvaWRSZXR1cm5UeXBlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHkgewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQl0cnkgewotCQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAzKTsKLQkJCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsICJnYyIsIHRydWUsIDApOwotCQkJZXhwLmNyZWF0ZVR5cGVSZWNlaXZlcigiamF2YS5sYW5nLlN5c3RlbSIpOwotCQkJZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpOwotCQkJZmFpbCgiU2hvdWxkIG9mIHJlY2VpdmVkIG5vIGV4cHJlc3Npb24gdmFsdWUgZXhjZXB0aW9uLiIpOwotCQl9IGNhdGNoIChOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgIT0gbnVsbCkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRlc3Qgd2FzIHN1Y2Nlc3NmdWw6ICIrZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RXcm9uZ1JldHVyblR5cGUoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQl0cnkgewotCQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBJbmZpeE9wZXJhdG9yLklOX1BMVVMsIDApOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAzKTsKLQkJCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsICJnZXRTZWN1cml0eU1hbmFnZXIiLCB0cnVlLCAwKTsKLQkJCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoImphdmEubGFuZy5TeXN0ZW0iKTsKLQkJCWV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKTsKLQkJCWZhaWwoIlNob3VsZCBvZiByZWNlaXZlZCBjbGFzcyBjYXN0IHByb3h5IGV4Y2VwdGlvbi4iKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJaWYgKCFlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkuZXF1YWxzKCJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIikpCi0JCQkJdGhyb3cgZTsJLy8gU29tZSBvdGhlciBleGNlcHRpb24sIHJldGhyb3cgaXQuCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEludm9rZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJnZXRTZWN1cml0eU1hbmFnZXIiLCB0cnVlLCAwKTsKLQkJZXhwLmNyZWF0ZVR5cGVSZWNlaXZlcigiamF2YS5sYW5nLlN5c3RlbSIpOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW52b2tlRmFpbCgpIHRocm93cyBUaHJvd2FibGVQcm94eSwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCXRyeSB7Ci0JCQlleHAuY3JlYXRlTWV0aG9kSW52b2NhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiZ2V0ZW52IiwgdHJ1ZSwgMSk7Ci0JCQlleHAuY3JlYXRlVHlwZVJlY2VpdmVyKCJqYXZhLmxhbmcuU3lzdGVtIik7Ci0JCQlleHAuY3JlYXRlU3RyaW5nTGl0ZXJhbChGb3JFeHByZXNzaW9uLk1FVEhPRF9BUkdVTUVOVCwgInh5eiIpOwotCQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJaWYgKCFlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkuZXF1YWxzKCJqYXZhLmxhbmcuRXJyb3IiKSkKLQkJCQl0aHJvdyBlOwkvLyBTb21lIG90aGVyIGV4Y2VwdGlvbiwgcmV0aHJvdyBpdC4KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzaWdubWVudCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBlcCA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlmaW5hbCBsb25nW10gdGltZSA9IG5ldyBsb25nWzFdOwotCQllcC5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5QWRhcHRlciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQl0aW1lWzBdID0gKChJTnVtYmVyQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5sb25nVmFsdWUoKTsKLQkJCX0KLQkJfSk7Ci0JCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgImN1cnJlbnRUaW1lTWlsbGlzIiwgdHJ1ZSwgMCk7Ci0JCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoImphdmEubGFuZy5TeXN0ZW0iKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZSgwTCAhPSB0aW1lWzBdKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlYXNzaWdubWVudCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBlcCA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlmaW5hbCBsb25nW10gdGltZSA9IG5ldyBsb25nWzFdOwotCQllcC5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5QWRhcHRlciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQl0aW1lWzBdID0gKChJTnVtYmVyQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5sb25nVmFsdWUoKTsKLQkJCX0KLQkJfSk7Ci0JCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgImN1cnJlbnRUaW1lTWlsbGlzIiwgdHJ1ZSwgMCk7Ci0JCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoImphdmEubGFuZy5TeXN0ZW0iKTsKLQkJZXhwLmNyZWF0ZVByb3h5UmVhc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCBlcCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgLTIzTCk7Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCWFzc2VydEVxdWFscygtMjNMLCB0aW1lWzBdKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc2lnbm1lbnRWb2lkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJRXhwcmVzc2lvblByb3h5IGVwID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCUV4cHJlc3Npb25Wb2lkIGVwbCA9IG5ldyBFeHByZXNzaW9uVm9pZCgpOwotCQllcC5hZGRQcm94eUxpc3RlbmVyKGVwbCk7Ci0JCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgInRlc3RWb2lkIiwgdHJ1ZSwgMCk7Ci0JCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZShlcGwudm9pZENhbGxlZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NpZ25tZW50Tm90KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUNvbmRpdGlvbmFsRXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5DT05ESVRJT05BTF9DT05ESVRJT04sIHRydWUpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX1RSVUUsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgZXAgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNPTkRJVElPTkFMX0ZBTFNFKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBmYWxzZSk7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBlcGwgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCWVwLmFkZFByb3h5TGlzdGVuZXIoZXBsKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJYXNzZXJ0VHJ1ZShlcGwubm90UmVzb2x2ZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NpZ25tZW50TGF0ZXJVc2FnZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8vIGVwYXJnID0gMzsKLQkJLy8gZXBJbnRlZ2VyID0gbmV3IEludGVnZXIoZXBhcmcrMSk7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBlcEFyZyA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOyAKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCAzKTsKLQkJRXhwcmVzc2lvblByb3h5IGVwSW50ZWdlciA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlQ2xhc3NJbnN0YW5jZUNyZWF0aW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpLCAxKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkNMQVNTSU5TVEFOQ0VDUkVBVElPTl9BUkdVTUVOVCwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIGVwQXJnKTsJLy8gVXNlIGxpdGVyYWwgMysxIGFzIHRoZSBhcmd1bWVudCB0byB0aGlzLgotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAxKTsgCi0JCWVwSW50ZWdlci5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQkKLQkJCQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlBZGFwdGVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCWFzc2VydEVxdWFscygoKElOdW1iZXJCZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmludFZhbHVlKCksIDQpOwotCQkJfQkJCQotCQl9KTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9Ci0JCi0JLy8gVE9ETyAtIGZvciBzb21lIHVua25vd24gcmVhc29uIHRoaXMgdGVzdCBjb250aW51ZXMgdG8gZmFpbCBpbiB0aGUgYnVpbGQgb24gdGhlIGp2ZWxpbnV4IG1hY2hpbmUuIEl0IHNlZW1zIHRvIGhhdmUKLQkvLyB2ZXJ5IHZlcnkgcG9vciBwZXJmb3JtYW5jZSBvbiBqdmVsaW51eC4KLQkvLyBJZiB3ZSBjYW4gZ2V0IGl0IHdvcmtpbmcsIHB1dCAidGVzdCIgb24gdGhlIGZyb250IG9mIHRoZSBtZXRob2QgbmFtZSBhZ2FpbiB0byBnZXQgaXQgcnVubmluZyBhcyBhIHRlc3QuCi0JcHVibGljIHZvaWQgRXhwcmVzc2lvblBlcmZvcm1hbmNlU21hbGwoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIEFtYmlndW91c01ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJLy8gU21hbGwgcGVyZm9ybWFuY2UgdGVzdC4gV2UgYXJlIHRlc3RpbmcgYSBzbWFsbCBiYXRjaCBvZiBleHByZXNzaW9ucyBvbiBlYWNoIHJ1bi4gV2UgdGhlbiBhdmcuIHRoZSBydW5zLiBUaGlzIHRlc3RzIG1hbnkgc21hbGwKLQkJLy8gZXhwcmVzc2lvbiBwcm9jZXNzaW5nIHBlcmZvcm1hbmNlLgotCQkgCi0JCS8vIFByaW1lIHRoZSBwcm94aWVzIHNvIHRoZXkgZG9uJ3QgYmVjb21lIHBhcnQgb2YgdGhlIHRpbWluZ3MuCi0JCUlCZWFuVHlwZVByb3h5IHBvaW50VHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuUG9pbnQiKTsKLQkJSU1ldGhvZFByb3h5IHNldExvY2F0aW9uID0gcG9pbnRUeXBlLmdldE1ldGhvZFByb3h5KCJzZXRMb2NhdGlvbiIsIG5ldyBTdHJpbmdbXSB7ImludCIsICJpbnQifSk7Ci0JCUlNZXRob2RQcm94eSBnZXRMb2NhdGlvbiA9IHBvaW50VHlwZS5nZXRNZXRob2RQcm94eSgiZ2V0TG9jYXRpb24iKTsKLQkJLy8KLQkJLy8gTm93IGZvciBqdXN0IGEgc2ltcGxlIG9uZSBtZXRob2QgaW52b2NhdGlvbiB1c2luZyBtZXRob2QgcHJveGllcyAoYW5kIG5vdCBtZXRob2QgbG9va3VwIGVhY2ggdGltZSkgdGhlIHN0YW5kYXJkIHByb3h5IGNhbGxzCi0JCS8vIHdpbGwgYmVhdCBvdXQgZXhwcmVzc2lvbiBwcm9jZXNzaW5nIGZvciBSZW1vdGUuIE5vdGUgdGhhdCBpcyBub3QgdHJ1ZSBvZiBJREUgdm0uIEluIHRoYXQgY2FzZSB0aGUgc3RhbmRhcmQgcHJveHkgY2FsbHMKLQkJLy8gd2lsbCBBTFdBWVMgb3V0IHBlcmZvcm0gZ3JlYXRseSB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzZXIgYmVjYXVzZSB0aGVyZSBpcyBubyBsYXRlbmN5IGluIHRoZSBjb21tdW5pY2F0aW9ucy4gSXQgaXMgYmFzaWNhbGx5Ci0JCS8vIHN0cmFpZ2h0IGRpcmVjdCBjYWxscy4gV2hpbGUgZXhwcmVzc2lvbiBwcm9jZXNzaW5nIGlzIGFsc28gZGlyZWN0IGNhbGxzLCB0aGUgY2FsbCBwYXRoIGlzIG11Y2ggbGFyZ2VyIGJlY2F1c2UgaXQgbmVlZHMgdG8gCi0JCS8vIGJ1aWxkL21haW50YWluL2V4ZWN1dGUgdGhlIHByb2Nlc3Npbmcgc3RhY2ssIHJhdGhlciB0aGFuIGp1c3QgZXhlY3V0ZSB0aGUgY29tbWFuZC4gCi0JCS8vCi0JCQotCQkvLyBUcnkgdG8gcHJpbWUgdGhlIGNvbW11bmljYXRpb24gcHVtcC4gVGhpcyBzZW5kcyBhYm91dCAzNiwwMDAgYnl0ZXMgb2YgZGF0YS4KLQkJLy8gRG9pbmcgaXQgaGVyZSBtZWFucyBsYXRlciB3aGVuIG5lZWRlZCB0aGUgY29tbXVuaWNhdGlvbnMgY29zdHMgYXJlIGRyYXN0aWNhbGx5IHJlZHVjZWQuCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWludCBpID0xMDAwOwotCQl3aGlsZSAoaS0tPjApIHsKLQkJCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIHJlZ2lzdHJ5LmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkKLQkJCQkJLmdldEJlYW5UeXBlUHJveHkoZXhwLCAiamF2YS5sYW5nLk9iamVjdCIsIDEpLCAwKTsKLQkJCWV4cC5jcmVhdGVBcnJheUluaXRpYWxpemVyKDApOwotCQl9Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCQlpbnQgdGltZXMgPSAxMDA7CS8vIE51bWJlciBvZiB0aW1lcyB0byBydW4gdGhlIHRlc3QuCi0JCWludCBiYXRjaFNpemUgPSAxMDsJLy8gU2l6ZSBvZiBiYXRjaCBmb3IgZWFjaCB0ZXN0LgkJCi0JCS8vIE5vdyBkbyB0aGUgYWN0dWFsIHRlc3QuCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJaSA9IHRpbWVzOwotCQl3aGlsZShpLS0+MCkgewotCQkJZXhwcmVzc2lvblNldHRpbmcocG9pbnRUeXBlLCBzZXRMb2NhdGlvbiwgZ2V0TG9jYXRpb24sIGJhdGNoU2l6ZSk7Ci0JCX0KLQkJCi0JCWxvbmcgZXhwcmVzc2lvblRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKS1zdGFydDsKLQkJbG9uZyBzdGFydE5vcm1hbCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpID0gdGltZXM7Ci0JCXdoaWxlKGktLT4wKSB7Ci0JCQlub3JtYWxTZXR0aW5nKHBvaW50VHlwZSwgc2V0TG9jYXRpb24sIGdldExvY2F0aW9uLCBiYXRjaFNpemUpOwotCQl9Ci0JCWxvbmcgbm9ybWFsVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0Tm9ybWFsOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNtYWxsIEJhdGNoIHJlc3VsdHM6IEJhdGNoIHNpemU9IitiYXRjaFNpemUrIiBOdW1iZXIgb2YgcnVucz0iK3RpbWVzKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJFeHByZXNzaW9uIFRpbWU6ICIgKyBleHByZXNzaW9uVGltZSArICIgQXZnOiAiICsgKGV4cHJlc3Npb25UaW1lLygoZG91YmxlKSB0aW1lcykpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3JtYWwgVGltZTogIiArIG5vcm1hbFRpbWUrICIgQXZnOiAiICsgKG5vcm1hbFRpbWUvKChkb3VibGUpIHRpbWVzKSkpOwotCQlpZiAobm9ybWFsVGltZSA9PSAwKQotCQkJbm9ybWFsVGltZSA9IDE7CS8vIFNvIG5vIGRpdmlkZSBieSB6ZXJvLgotCQlpbnQgaW1wcm92ZW1lbnQgPSAoaW50KSAoKDEtKChkb3VibGUpIGV4cHJlc3Npb25UaW1lKS9ub3JtYWxUaW1lKSoxMDApOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkltcHJvdmVtZW50IG9mIGV4cHJlc3Npb24gb3ZlciBub3JtYWwgdGltZTogIitpbXByb3ZlbWVudCsnJScpOwotCQkvLyBOb3RlIHRoYXQgdGhpcyB0ZXN0IGlzIG5vdCB2YWxpZCBmb3IgSURFIGJlY2F1c2UgdGhlIElERSB3aWxsIGFsd2F5cyBiZSBvdGhlciB3YXkgYXJvdW5kIGJlY2F1c2UKLQkJLy8gdGhlcmUgaXMgbm8gbGF0ZW5jeSBkZWxheSB0aGVyZS4KLQotCQlpZiAoIShwcm94eUZhY3RvcnkgaW5zdGFuY2VvZiBJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpKQotCQkJYXNzZXJ0VHJ1ZSgiTGVzcyB0aGFuIDMwJSBpbXByb3ZlbWVudDogIitpbXByb3ZlbWVudCsnJScsIGltcHJvdmVtZW50Pj0zMCk7CS8vIFdlIGxpa2UgdGhpcyAlLgotCX0KLQotCS8vIFRPRE8gLSBmb3Igc29tZSB1bmtub3duIHJlYXNvbiB0aGlzIHRlc3QgY29udGludWVzIHRvIGZhaWwgaW4gdGhlIGJ1aWxkIG9uIHRoZSBqdmVsaW51eCBtYWNoaW5lLiBJdCBzZWVtcyB0byBoYXZlCi0JLy8gdmVyeSB2ZXJ5IHBvb3IgcGVyZm9ybWFuY2Ugb24ganZlbGludXguCi0JLy8gSWYgd2UgY2FuIGdldCBpdCB3b3JraW5nLCBwdXQgInRlc3QiIG9uIHRoZSBmcm9udCBvZiB0aGUgbWV0aG9kIG5hbWUgYWdhaW4gdG8gZ2V0IGl0IHJ1bm5pbmcgYXMgYSB0ZXN0LgotCXB1YmxpYyB2b2lkIEV4cHJlc3Npb25QZXJmb3JtYW5jZUxhcmdlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCS8vIFNtYWxsIHBlcmZvcm1hbmNlIHRlc3QuIFdlIGFyZSB0ZXN0aW5nIGEgbGFyZ2UgYmF0Y2ggb2YgZXhwcmVzc2lvbnMgb24gZWFjaCBydW4uIFdlIHRoZW4gYXZnLiB0aGUgcnVucy4gVGhpcyB0ZXN0cyBtYW55IGxhcmdlCi0JCS8vIGV4cHJlc3Npb24gcHJvY2Vzc2luZyBwZXJmb3JtYW5jZS4KLQkJIAotCQkvLyBQcmltZSB0aGUgcHJveGllcyBzbyB0aGV5IGRvbid0IGJlY29tZSBwYXJ0IG9mIHRoZSB0aW1pbmdzLgotCQlJQmVhblR5cGVQcm94eSBwb2ludFR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LlBvaW50Iik7Ci0JCUlNZXRob2RQcm94eSBzZXRMb2NhdGlvbiA9IHBvaW50VHlwZS5nZXRNZXRob2RQcm94eSgic2V0TG9jYXRpb24iLCBuZXcgU3RyaW5nW10geyJpbnQiLCAiaW50In0pOwotCQlJTWV0aG9kUHJveHkgZ2V0TG9jYXRpb24gPSBwb2ludFR5cGUuZ2V0TWV0aG9kUHJveHkoImdldExvY2F0aW9uIik7Ci0JCS8vCi0JCS8vIE5vdyBmb3IganVzdCBhIHNpbXBsZSBvbmUgbWV0aG9kIGludm9jYXRpb24gdXNpbmcgbWV0aG9kIHByb3hpZXMgKGFuZCBub3QgbWV0aG9kIGxvb2t1cCBlYWNoIHRpbWUpIHRoZSBzdGFuZGFyZCBwcm94eSBjYWxscwotCQkvLyB3aWxsIGJlYXQgb3V0IGV4cHJlc3Npb24gcHJvY2Vzc2luZyBmb3IgUmVtb3RlLiBOb3RlIHRoYXQgaXMgbm90IHRydWUgb2YgSURFIHZtLiBJbiB0aGF0IGNhc2UgdGhlIHN0YW5kYXJkIHByb3h5IGNhbGxzCi0JCS8vIHdpbGwgQUxXQVlTIG91dCBwZXJmb3JtIGdyZWF0bHkgdGhlIGV4cHJlc3Npb24gcHJvY2Vzc2VyIGJlY2F1c2UgdGhlcmUgaXMgbm8gbGF0ZW5jeSBpbiB0aGUgY29tbXVuaWNhdGlvbnMuIEl0IGlzIGJhc2ljYWxseQotCQkvLyBzdHJhaWdodCBkaXJlY3QgY2FsbHMuIFdoaWxlIGV4cHJlc3Npb24gcHJvY2Vzc2luZyBpcyBhbHNvIGRpcmVjdCBjYWxscywgdGhlIGNhbGwgcGF0aCBpcyBtdWNoIGxhcmdlciBiZWNhdXNlIGl0IG5lZWRzIHRvIAotCQkvLyBidWlsZC9tYWludGFpbi9leGVjdXRlIHRoZSBwcm9jZXNzaW5nIHN0YWNrLCByYXRoZXIgdGhhbiBqdXN0IGV4ZWN1dGUgdGhlIGNvbW1hbmQuIAotCQkvLwotCQkKLQkJLy8gVHJ5IHRvIHByaW1lIHRoZSBjb21tdW5pY2F0aW9uIHB1bXAuIFRoaXMgc2VuZHMgYWJvdXQgMzYsMDAwIGJ5dGVzIG9mIGRhdGEuCi0JCS8vIERvaW5nIGl0IGhlcmUgbWVhbnMgbGF0ZXIgd2hlbiBuZWVkZWQgdGhlIGNvbW11bmljYXRpb25zIGNvc3RzIGFyZSBkcmFzdGljYWxseSByZWR1Y2VkLgotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlpbnQgaSA9MTAwMDsKLQkJd2hpbGUgKGktLT4wKSB7Ci0JCQlleHAuY3JlYXRlQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCByZWdpc3RyeS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpCi0JCQkJCS5nZXRCZWFuVHlwZVByb3h5KGV4cCwgImphdmEubGFuZy5PYmplY3QiLCAxKSwgMCk7Ci0JCQlleHAuY3JlYXRlQXJyYXlJbml0aWFsaXplcigwKTsKLQkJfQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJaW50IHRpbWVzID0gMjU7CS8vIE51bWJlciBvZiB0aW1lcyB0byBydW4gdGhlIHRlc3QuCi0JCWludCBiYXRjaFNpemUgPSAxMDA7CS8vIFNpemUgb2YgYmF0Y2ggZm9yIGVhY2ggdGVzdC4KLQkJCi0JCS8vIE5vdyBkbyB0aGUgYWN0dWFsIHRlc3QuCi0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJaSA9IHRpbWVzOwotCQl3aGlsZShpLS0+MCkgewotCQkJZXhwcmVzc2lvblNldHRpbmcocG9pbnRUeXBlLCBzZXRMb2NhdGlvbiwgZ2V0TG9jYXRpb24sIGJhdGNoU2l6ZSk7Ci0JCX0KLQkJbG9uZyBleHByZXNzaW9uVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpLXN0YXJ0OwotCQlsb25nIHN0YXJ0Tm9ybWFsID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWkgPSB0aW1lczsKLQkJd2hpbGUoaS0tPjApIHsKLQkJCW5vcm1hbFNldHRpbmcocG9pbnRUeXBlLCBzZXRMb2NhdGlvbiwgZ2V0TG9jYXRpb24sIGJhdGNoU2l6ZSk7Ci0JCX0KLQkJbG9uZyBub3JtYWxUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCktc3RhcnROb3JtYWw7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTGFyZ2UgQmF0Y2ggcmVzdWx0czogQmF0Y2ggc2l6ZT0iK2JhdGNoU2l6ZSsiIE51bWJlciBvZiBydW5zPSIrdGltZXMpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4cHJlc3Npb24gVGltZTogIiArIGV4cHJlc3Npb25UaW1lICsgIiBBdmc6ICIgKyAoZXhwcmVzc2lvblRpbWUvKChkb3VibGUpIHRpbWVzKSkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vcm1hbCBUaW1lOiAiICsgbm9ybWFsVGltZSsgIiBBdmc6ICIgKyAobm9ybWFsVGltZS8oKGRvdWJsZSkgdGltZXMpKSk7Ci0JCWlmIChub3JtYWxUaW1lID09IDApCi0JCQlub3JtYWxUaW1lID0gMTsJLy8gU28gbm8gZGl2aWRlIGJ5IHplcm8uCi0JCWludCBpbXByb3ZlbWVudCA9IChpbnQpICgoMS0oKGRvdWJsZSkgZXhwcmVzc2lvblRpbWUpL25vcm1hbFRpbWUpKjEwMCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiSW1wcm92ZW1lbnQgb2YgZXhwcmVzc2lvbiBvdmVyIG5vcm1hbCB0aW1lOiAiK2ltcHJvdmVtZW50KyclJyk7Ci0JCS8vIE5vdGUgdGhhdCB0aGlzIHRlc3QgaXMgbm90IHZhbGlkIGZvciBJREUgYmVjYXVzZSB0aGUgSURFIHdpbGwgYWx3YXlzIGJlIG90aGVyIHdheSBhcm91bmQgYmVjYXVzZQotCQkvLyB0aGVyZSBpcyBubyBsYXRlbmN5IGRlbGF5IHRoZXJlLgotCQlpZiAoIShwcm94eUZhY3RvcnkgaW5zdGFuY2VvZiBJREVTdGFuZGFyZEJlYW5Qcm94eUZhY3RvcnkpKQotCQkJYXNzZXJ0VHJ1ZSgiTGVzcyB0aGFuIDc1JSBpbXByb3ZlbWVudDogIitpbXByb3ZlbWVudCsnJScsIGltcHJvdmVtZW50Pj03NSk7CS8vIFdlIGxpa2UgdGhpcyAlLgotCX0KLQkKLQlwcml2YXRlIHZvaWQgZXhwcmVzc2lvblNldHRpbmcoSUJlYW5UeXBlUHJveHkgcG9pbnRUeXBlLCBJTWV0aG9kUHJveHkgc2V0TG9jYXRpb24sIElNZXRob2RQcm94eSBnZXRMb2NhdGlvbiwgaW50IHRpbWVzKSB0aHJvd3MgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLy8gVGhpcyBpcyB0aGUgc2FtZSBhcyBleHByZXNzaW9uU2V0dGluZyBleGNlcHQgaXQgdXNlcyByZWd1bGFyIHByb3h5IGFjY2VzcyBpbnN0ZWFkIG9mIGV4cHJlc3Npb25zLiBJdCBzaG91bGQgYmUKLQkJLy8gc2xvd2VyIGJlY2F1c2UgaXQgcmVxdWlyZXMgYSByb3VuZCB0cmlwIGZvciBlYWNoIGFjY2Vzcy4gRm9yIHJlbW90ZSBvbmx5LgotCQkvLyBUbyBmYWN0b3Igb3V0IHRoZSBvdmVyaGVhZCBvZiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGV4cHJlc3Npb24gcHJvY2Vzc2luZywgd2Ugd2lsbCBkbyB0aGUgY3JlYXRlL3NldC9nZXQgMTAgdGltZXMuCi0JCS8vIFBvaW50IHAgPSBuZXcgUG9pbnQoKTsKLQkJLy8gcC5zZXRMb2NhdGlvbigzLDQpOwotCQkvLyBwLmdldExvY2F0aW9uKCk7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGltZXM7IGkrKykgewotCQkJRXhwcmVzc2lvblByb3h5IGVwUG9pbnQgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCBwb2ludFR5cGUsIDApOwotCQkJZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShzZXRMb2NhdGlvbiwgZXBQb2ludCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgzKSwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoNCl9LCBmYWxzZSk7Ci0JCQlFeHByZXNzaW9uUHJveHkgZXBMb2MgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKGdldExvY2F0aW9uLCBlcFBvaW50LCBudWxsLCB0cnVlKTsKLQkJCWVwTG9jLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Qcm94eS5Qcm94eUFkYXB0ZXIoKSk7IC8vIEp1c3QgaGF2ZSBhIGxpc3RlbmVyLCB3ZSB3YW50IHRoZSBjYWxsYmFjayBvdmVyaGVhZCBhZGRlZCBpbi4KLQkJfQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBub3JtYWxTZXR0aW5nKElCZWFuVHlwZVByb3h5IHBvaW50VHlwZSwgSU1ldGhvZFByb3h5IHNldExvY2F0aW9uLCBJTWV0aG9kUHJveHkgZ2V0TG9jYXRpb24sIGludCB0aW1lcykgdGhyb3dzIFRocm93YWJsZVByb3h5LCBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCS8vIFRoaXMgaXMgdGhlIHNhbWUgYXMgZXhwcmVzc2lvblNldHRpbmcgZXhjZXB0IGl0IHVzZXMgcmVndWxhciBwcm94eSBhY2Nlc3MgaW5zdGVhZCBvZiBleHByZXNzaW9ucy4gSXQgc2hvdWxkIGJlCi0JCS8vIHNsb3dlciBiZWNhdXNlIGl0IHJlcXVpcmVzIGEgcm91bmQgdHJpcCBmb3IgZWFjaCBhY2Nlc3MuCi0JCS8vIFRvIGZhY3RvciBvdXQgdGhlIG92ZXJoZWFkIG9mIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBwcm9jZXNzaW5nLCB3ZSB3aWxsIGRvIHRoZSBjcmVhdGUvc2V0L2dldCAxMCB0aW1lcy4gVGhpcyBoZXJlIG1hdGNoZXMgdGhhdC4KLQkJLy8gUG9pbnQgcCA9IG5ldyBQb2ludCgpOwotCQkvLyBwLnNldExvY2F0aW9uKDMsNCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGltZXM7IGkrKykgewotCQkJSUJlYW5Qcm94eSBlcFBvaW50ID0gcG9pbnRUeXBlLm5ld0luc3RhbmNlKCk7Ci0JCQlzZXRMb2NhdGlvbi5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoZXBQb2ludCwJbmV3IElCZWFuUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMyksIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDQpfSk7Ci0JCQlnZXRMb2NhdGlvbi5pbnZva2VDYXRjaFRocm93YWJsZUV4Y2VwdGlvbnMoZXBQb2ludCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJsb2NrKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJaW50IGJsb2NrbnVtID0gZXhwLmNyZWF0ZUJsb2NrQmVnaW4oKTsKLQkJRXhwcmVzc2lvblByb3h5IGVwQXJnID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7IAotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIHRydWUpOwotCQlleHAuY3JlYXRlQmxvY2tCcmVhayhibG9ja251bSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBlcEJvb2xlYW4gPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgMSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5DTEFTU0lOU1RBTkNFQ1JFQVRJT05fQVJHVU1FTlQsIEluZml4T3BlcmF0b3IuSU5fQ09ORElUSU9OQUxfQU5ELCAwKTsKLQkJZXhwLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIGVwQXJnKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVCbG9ja0VuZCgpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgZXBCb29sZWFubCA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJZXBCb29sZWFuLmFkZFByb3h5TGlzdGVuZXIoZXBCb29sZWFubCk7Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoZXBCb29sZWFubC5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JfQotCi0JLyoKLQkgKiBBIHByb3h5IGxpc3RlbmVyIGNsYXNzIGZvciB0ZXN0IHB1cnBvc2VzIHRoYXQgcmVxdWlyZXMgcmVzb2x2ZWQgYnV0Ci0JICogd29uJ3QgYWxsb3cgbm90IHJlc29sdmVkIG9yIHZvaWQgcmVzb2x1dGlvbi4gSW1wbGltZW50IHRoZSByZXNvbHZlZAotCSAqIG1ldGhvZCB0byB0ZXN0IGZvciB2YWxpZCB2YWx1ZXMuCi0JICogCi0JICogQHNpbmNlIDEuMS4wCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEV4cHJlc3Npb25SZXNvbHZlZCBpbXBsZW1lbnRzIEV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyIHsKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eU5vdFJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJQcm94eSBtdXN0IG5vdCBiZSB1bnJlc29sdmVkLiIpOwotCQl9Ci0JCQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5Vm9pZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3h5Vm9pZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJQcm94eSBtdXN0IG5vdCBiZSB2b2lkIGFzc2lnbm1lbnQuIik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGNsYXNzIEV4cHJlc3Npb25Ob3RSZXNvbHZlZCBpbXBsZW1lbnRzIEV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyIHsKLQkJcHVibGljIGJvb2xlYW4gbm90UmVzb2x2ZWRDYWxsZWQgPSBmYWxzZTsKLQkJCi0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlOb3RSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3h5Tm90UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJbm90UmVzb2x2ZWRDYWxsZWQgPSB0cnVlOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJZmFpbCgiUHJveHkgc2hvdWxkIG5vdCBvZiBiZWVuIHJlc29sdmVkLiBJdCBzaG91bGQgYmUgdW5yZXNvbHZlZC4iKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5Vm9pZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3h5Vm9pZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJQcm94eSBtdXN0IG5vdCBiZSB2b2lkIGFzc2lnbm1lbnQuIEl0IHNob3VsZCBiZSB1bnJlc29sdmVkLiIpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBjbGFzcyBFeHByZXNzaW9uVm9pZCBpbXBsZW1lbnRzIEV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyIHsKLQkJcHVibGljIGJvb2xlYW4gdm9pZENhbGxlZCA9IGZhbHNlOwotCQkKLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eU5vdFJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJveHlOb3RSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJQcm94eSBzaG91bGQgb2YgYmVlbiB2b2lkIGFuZCBub3QgdW5yZXNvbHZlZC4iKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoIlByb3h5IHNob3VsZCBub3Qgb2YgYmVlbiByZXNvbHZlZCwgaXQgc2hvdWxkIG9mIGJlZW4gdm9pZC4uIik7Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVZvaWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm94eVZvaWQoUHJveHlFdmVudCBldmVudCkgewotCQkJdm9pZENhbGxlZCA9IHRydWU7Ci0JCX0KLQl9OwotCi0JcHVibGljIHZvaWQgdGVzdFRyeUNhdGNoTm9UaHJvdygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0KLQkJICovCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJRXhwcmVzc2lvblByb3h5IHhQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydFRydWUoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeVByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKHlQcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcik7Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHlQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZShydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyeTJDYXRjaE5vVGhyb3coKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvKgotCQkgKiB0cnkgewotCQkgKiAgIHRyeSB7Ci0JCSAqICAgICB4ID0gQm9vbGVhbi52YWx1ZU9mKHRydWUpOwotCQkgKiAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkgKiAgICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqICAgfQotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodHJ1ZSl9LCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvblByb3h5IHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5MiA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0KLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRUcnVlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHlQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcih5UHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgelByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXpQcm94eS5hZGRQcm94eUxpc3RlbmVyKHpQcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eTIuYWRkUHJveHlMaXN0ZW5lcihydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyMik7Ci0JCQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh5UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoelByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyeTJDYXRjaFRocm93VHJ5MSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgdyA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogICB0cnkgewotCQkgKiAgICAgeCA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiAgIH0KLQkJICogfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeiA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0KLQkJICovCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJRXhwcmVzc2lvblByb3h5IHdQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJib29sZWFuVmFsdWUiKSwgbnVsbCwgbnVsbCwgdHJ1ZSk7CQkKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHRydWUpfSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eTIgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHpQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB3UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJd1Byb3h5LmFkZFByb3h5TGlzdGVuZXIod1Byb3h5UmVzb2x2ZXIpOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB4UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIoeFByb3h5UmVzb2x2ZXIpOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB5UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIoeVByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyKTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eTIuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGV2ZW50LmdldFByb3h5KCkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydFRydWUod1Byb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHhQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh5UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcnkyQ2F0Y2hUaHJvd1RyeTJDYXRjaCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgdHJ5IHsKLQkJICogICAgIHggPSAobnVsbCkuYm9vbGVhblZhbHVlKCk7Ci0JCSAqICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogICB9Ci0JCSAqICAgdyA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeiA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0KLQkJICovCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoImJvb2xlYW5WYWx1ZSIpLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvblByb3h5IHdQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKX0sIHRydWUpOwkJCi0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eTIgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHpQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB4UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIoeFByb3h5UmVzb2x2ZXIpOwotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiwgZXZlbnQuZ2V0UHJveHkoKS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwkJCi0JCXdQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0VHJ1ZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eTIuYWRkUHJveHlMaXN0ZW5lcihydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyMik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB6UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIoelByb3h5UmVzb2x2ZXIpOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydFRydWUoeFByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh6UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcnkyQ2F0Y2hUaHJvd1RyeTJDYXRjaDEoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvKgotCQkgKiB0cnkgewotCQkgKiAgIHRyeSB7Ci0JCSAqICAgICB4ID0gKG51bGwpLmJvb2xlYW5WYWx1ZSgpOwotCQkgKiAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogICB9Ci0JCSAqICAgdyA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeiA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0KLQkJICovCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoImJvb2xlYW5WYWx1ZSIpLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IGlsbGVnYWxBcmd1bWVudENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB3UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodHJ1ZSl9LCB0cnVlKTsJCQotCQlFeHByZXNzaW9uUHJveHkgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkyID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB6UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeFByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKHhQcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGlsbGVnYWxBcmd1bWVudENhdGNoUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJaWxsZWdhbEFyZ3VtZW50Q2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKGlsbGVnYWxBcmd1bWVudENhdGNoUHJveHlSZXNvbHZlcik7Ci0KLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHlQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcih5UHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB3UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJd1Byb3h5LmFkZFByb3h5TGlzdGVuZXIod1Byb3h5UmVzb2x2ZXIpOwotCQkKLQkJcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkyLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iLCBldmVudC5nZXRQcm94eSgpLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQkJfQotCQl9KTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydFRydWUoeFByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKGlsbGVnYWxBcmd1bWVudENhdGNoUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHdQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyeTJDYXRjaFRocm93VHJ5MkZpbmFsbHkyQ2F0Y2gxKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB0cnkgewotCQkgKiAgICAgeCA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkgKiAgICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqICAgfSBmaW5hbGx5IHsKLQkJICogICAgIHYgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiAgIH0KLQkJICogICB3ID0gQm9vbGVhbi52YWx1ZU9mKHRydWUpOwotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgiYm9vbGVhblZhbHVlIiksIG51bGwsIG51bGwsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgaWxsZWdhbEFyZ3VtZW50Q2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlGaW5hbGx5Q2xhdXNlKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB2UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvblByb3h5IHdQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKX0sIHRydWUpOwkJCi0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eTIgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHpQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB4UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIoeFByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgaWxsZWdhbEFyZ3VtZW50Q2F0Y2hQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlpbGxlZ2FsQXJndW1lbnRDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIoaWxsZWdhbEFyZ3VtZW50Q2F0Y2hQcm94eVJlc29sdmVyKTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeVByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKHlQcm94eVJlc29sdmVyKTsKLQkJdlByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB3UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJd1Byb3h5LmFkZFByb3h5TGlzdGVuZXIod1Byb3h5UmVzb2x2ZXIpOwotCQkKLQkJcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkyLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iLCBldmVudC5nZXRQcm94eSgpLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQkJfQotCQl9KTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydFRydWUoeFByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKGlsbGVnYWxBcmd1bWVudENhdGNoUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHdQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyeTJDYXRjaFRocm93VHJ5MkZpbmFsbHkyTm9DYXRjaCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgdHJ5IHsKLQkJICogICAgIHggPSAobnVsbCkuYm9vbGVhblZhbHVlKCk7Ci0JCSAqICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJICogICAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiAgIH0gZmluYWxseSB7Ci0JCSAqICAgICB2ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogICB9Ci0JCSAqICAgdyA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgiYm9vbGVhblZhbHVlIiksIG51bGwsIG51bGwsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgaWxsZWdhbEFyZ3VtZW50Q2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlGaW5hbGx5Q2xhdXNlKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB2UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvblByb3h5IHdQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKX0sIHRydWUpOwkJCi0JCUV4cHJlc3Npb25Qcm94eSBpbGxlZ2FsQXJndW1lbnRDYXRjaEV4Y2VwdGlvblByb3h5MiA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB6UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeFByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKHhQcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGlsbGVnYWxBcmd1bWVudENhdGNoUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJaWxsZWdhbEFyZ3VtZW50Q2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKGlsbGVnYWxBcmd1bWVudENhdGNoUHJveHlSZXNvbHZlcik7Ci0KLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHlQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcih5UHJveHlSZXNvbHZlcik7Ci0JCXZQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgd1Byb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXdQcm94eS5hZGRQcm94eUxpc3RlbmVyKHdQcm94eVJlc29sdmVyKTsKLQkJCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBpbGxlZ2FsQXJndW1lbnRDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlpbGxlZ2FsQXJndW1lbnRDYXRjaEV4Y2VwdGlvblByb3h5Mi5hZGRQcm94eUxpc3RlbmVyKGlsbGVnYWxBcmd1bWVudENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcjIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgelByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXpQcm94eS5hZGRQcm94eUxpc3RlbmVyKHpQcm94eVJlc29sdmVyKTsKLQkJCi0JCWJvb2xlYW4gZGlkaXQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCX0gY2F0Y2ggKFRocm93YWJsZVByb3h5IGUpIHsKLQkJCWFzc2VydEVxdWFscyhwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIpLCBlLmdldFR5cGVQcm94eSgpKTsKLQkJCWRpZGl0ID0gdHJ1ZTsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShkaWRpdCk7Ci0JCWFzc2VydFRydWUoeFByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKGlsbGVnYWxBcmd1bWVudENhdGNoUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHdQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZShpbGxlZ2FsQXJndW1lbnRDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh6UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2hUaHJvdygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkgKiAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9Ci0JCSAqLwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgiYm9vbGVhblZhbHVlIiksIG51bGwsIG51bGwsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgbnVsbENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeFByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKHhQcm94eVJlc29sdmVyKTsJCQotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbnVsbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGV2ZW50LmdldFByb3h5KCkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKHhQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2hSZXRocm93KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB4ID0gKG51bGwpLmJvb2xlYW5WYWx1ZSgpOwotCQkgKiB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqICAgdGhyb3cgZTsgLy8gQXMgYSByZXRocm93LgotCQkgKiB9Ci0JCSAqLwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgiYm9vbGVhblZhbHVlIiksIG51bGwsIG51bGwsIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgbnVsbENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVJldGhyb3coKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeFByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKHhQcm94eVJlc29sdmVyKTsJCQotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbnVsbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGV2ZW50LmdldFByb3h5KCkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQl0cnkgewotCQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCWZhaWwoIlNob3VsZCBvZiB0aHJvd24gTlBFLiIpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGUuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSh4UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFRyeUNhdGNoRXhwbGljaXRUaHJvdygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJICogICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkgKiAgIHogPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9Ci0JCSAqLwotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCUV4cHJlc3Npb25Qcm94eSB4UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodHJ1ZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRocm93KCk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5USFJPV19PUEVSQU5ELCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIpLCAwKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IG51bGxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0VHJ1ZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeVByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKHlQcm94eVJlc29sdmVyKTsKLQotCQl6UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJbnVsbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGV2ZW50LmdldFByb3h5KCkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQlhc3NlcnRUcnVlKHlQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2gyTm9UaHJvdygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJICogICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeiA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0KLQkJICovCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJRXhwcmVzc2lvblByb3h5IHhQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHpQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsJCQotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0VHJ1ZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB5UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIoeVByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihpbGxlZ2FsQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB6UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIoelByb3h5UmVzb2x2ZXIpOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHpQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZShydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyeUNhdGNoMlRocm93MSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkgKiAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoImJvb2xlYW5WYWx1ZSIpLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IG51bGxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHpQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsJCQotCQlleHAuY3JlYXRlVHJ5RW5kKCk7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB4UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeFByb3h5LmFkZFByb3h5TGlzdGVuZXIoeFByb3h5UmVzb2x2ZXIpOwkJCi0KLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCQludWxsQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiwgZXZlbnQuZ2V0UHJveHkoKS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgelByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXpQcm94eS5hZGRQcm94eUxpc3RlbmVyKHpQcm94eVJlc29sdmVyKTsKLQkJCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHhQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh6UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcnlDYXRjaDJUaHJvdzIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvKgotCQkgKiB0cnkgewotCQkgKiAgIHggPSAobnVsbCkuYm9vbGVhblZhbHVlKCk7Ci0JCSAqIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoImJvb2xlYW5WYWx1ZSIpLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IG51bGxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwkJCi0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHhQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcih4UHJveHlSZXNvbHZlcik7CQkKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCWlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIoaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB5UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIoeVByb3h5UmVzb2x2ZXIpOwotCi0JCXpQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7IAotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCW51bGxDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iLCBldmVudC5nZXRQcm94eSgpLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQkJfQotCQl9KTsJCQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2hUaHJvd0ZpbmFsbHkoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvKgotCQkgKiB0cnkgewotCQkgKiAgIHggPSAobnVsbCkuYm9vbGVhblZhbHVlKCk7Ci0JCSAqIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJICogICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfSBmaW5hbGx5IHsKLQkJICogICBmID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoImJvb2xlYW5WYWx1ZSIpLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IG51bGxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUcnlGaW5hbGx5Q2xhdXNlKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBmUHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7CQkKLQkJCi0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHhQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcih4UHJveHlSZXNvbHZlcik7CQkKLQkJeVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCW51bGxDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iLCBldmVudC5nZXRQcm94eSgpLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWZQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCWFzc2VydFRydWUoeFByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2gyVGhyb3cxRmluYWxseSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkgKiAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfSBmaW5hbGx5IHsKLQkJICogICBmID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoImJvb2xlYW5WYWx1ZSIpLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IG51bGxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgeVByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHpQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsJCQotCQlleHAuY3JlYXRlVHJ5RmluYWxseUNsYXVzZSgpOwotCQlFeHByZXNzaW9uUHJveHkgZlByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwkJCi0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHhQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcih4UHJveHlSZXNvbHZlcik7CQkKLQotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCW51bGxDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24iLCBldmVudC5nZXRQcm94eSgpLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOwotCQkJfQotCQl9KTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCB6UHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIoelByb3h5UmVzb2x2ZXIpOwotCQlmUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydEZhbHNlKCgoSUJvb2xlYW5CZWFuUHJveHkpIGV2ZW50LmdldFByb3h5KCkpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCQotCQlhc3NlcnRUcnVlKHhQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh6UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2gyVGhyb3cyRmluYWxseSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IChudWxsKS5ib29sZWFuVmFsdWUoKTsKLQkJICogfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJICogICB5ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkgKiAgIHogPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9ICBmaW5hbGx5IHsKLQkJICogICBmID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoImJvb2xlYW5WYWx1ZSIpLCBudWxsLCBudWxsLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IG51bGxDYXRjaEV4Y2VwdGlvblByb3h5ID0gZXhwLmNyZWF0ZVRyeUNhdGNoQ2xhdXNlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwkJCi0JCWV4cC5jcmVhdGVUcnlGaW5hbGx5Q2xhdXNlKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBmUHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7CQkKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeFByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXhQcm94eS5hZGRQcm94eUxpc3RlbmVyKHhQcm94eVJlc29sdmVyKTsJCQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlciA9IG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKTsKLQkJaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihpbGxlZ2FsQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHlQcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQl5UHJveHkuYWRkUHJveHlMaXN0ZW5lcih5UHJveHlSZXNvbHZlcik7Ci0KLQkJelByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsgCi0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQkJbnVsbENhdGNoRXhjZXB0aW9uUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiIsIGV2ZW50LmdldFByb3h5KCkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7Ci0JCQl9Ci0JCX0pOwkKLQkJCi0JCWZQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsJCQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUoeVByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIubm90UmVzb2x2ZWRDYWxsZWQpOwotCQkKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ5Q2F0Y2hOb1Rocm93RmluYWxseSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIHRyeSB7Ci0JCSAqICAgeCA9IEJvb2xlYW4udmFsdWVPZih0cnVlKTsKLQkJICogfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCSAqICAgeSA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0gZmluYWxseSB7Ci0JCSAqICAgZiA9IEJvb2xlYW4udmFsdWVPZihmYWxzZSk7Ci0JCSAqIH0KLQkJICovCi0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVUcnkoKTsKLQkJRXhwcmVzc2lvblByb3h5IHhQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKX0sIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgcnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHkgPSBleHAuY3JlYXRlVHJ5Q2F0Y2hDbGF1c2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbiIpLCB0cnVlKTsKLQkJRXhwcmVzc2lvblByb3h5IHlQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUZpbmFsbHlDbGF1c2UoKTsKLQkJRXhwcmVzc2lvblByb3h5IGZQcm94eSA9IGV4cC5jcmVhdGVTaW1wbGVNZXRob2RJbnZva2UocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLmdldE1ldGhvZFByb3h5KCJ2YWx1ZU9mIiwgbmV3IFN0cmluZ1tdIHsiYm9vbGVhbiJ9KSwgbnVsbCwgbmV3IElQcm94eVtdIHtwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChmYWxzZSl9LCB0cnVlKTsKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydFRydWUoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeVByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKHlQcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcik7Ci0JCWZQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5TGlzdGVuZXIjcHJveHlSZXNvbHZlZChvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSBwcm94eSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJOb3QgYSBCb29sZWFuIHByb3h5OiIrcHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQm9vbGVhbiIpLCBwcm94eS5nZXRUeXBlUHJveHkoKSk7Ci0JCQkJYXNzZXJ0RmFsc2UoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQkJCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHlQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZShydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyeUNhdGNoMk5vVGhyb3dGaW5hbGx5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLyoKLQkJICogdHJ5IHsKLQkJICogICB4ID0gQm9vbGVhbi52YWx1ZU9mKHRydWUpOwotCQkgKiB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkgKiAgIHkgPSBCb29sZWFuLnZhbHVlT2YoZmFsc2UpOwotCQkgKiB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJICogICB6ID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfSBmaW5hbGx5IHsKLQkJICogICBmID0gQm9vbGVhbi52YWx1ZU9mKGZhbHNlKTsKLQkJICogfQotCQkgKi8KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZVRyeSgpOwotCQlFeHByZXNzaW9uUHJveHkgeFByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHRydWUpfSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBpbGxlZ2FsQ2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24iKSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSB5UHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7Ci0JCUV4cHJlc3Npb25Qcm94eSBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eSA9IGV4cC5jcmVhdGVUcnlDYXRjaENsYXVzZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIiksIHRydWUpOwotCQlFeHByZXNzaW9uUHJveHkgelByb3h5ID0gZXhwLmNyZWF0ZVNpbXBsZU1ldGhvZEludm9rZShwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIikuZ2V0TWV0aG9kUHJveHkoInZhbHVlT2YiLCBuZXcgU3RyaW5nW10geyJib29sZWFuIn0pLCBudWxsLCBuZXcgSVByb3h5W10ge3Byb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGZhbHNlKX0sIHRydWUpOwkJCi0JCWV4cC5jcmVhdGVUcnlGaW5hbGx5Q2xhdXNlKCk7Ci0JCUV4cHJlc3Npb25Qcm94eSBmUHJveHkgPSBleHAuY3JlYXRlU2ltcGxlTWV0aG9kSW52b2tlKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsIG5ldyBTdHJpbmdbXSB7ImJvb2xlYW4ifSksIG51bGwsIG5ldyBJUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpfSwgdHJ1ZSk7CQkKLQkJZXhwLmNyZWF0ZVRyeUVuZCgpOwotCQl4UHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUxpc3RlbmVyI3Byb3h5UmVzb2x2ZWQob3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgcHJveHkgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydEVxdWFscygiTm90IGEgQm9vbGVhbiBwcm94eToiK3Byb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCksIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkJvb2xlYW4iKSwgcHJveHkuZ2V0VHlwZVByb3h5KCkpOwotCQkJCWFzc2VydFRydWUoKChJQm9vbGVhbkJlYW5Qcm94eSkgZXZlbnQuZ2V0UHJveHkoKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgeVByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXlQcm94eS5hZGRQcm94eUxpc3RlbmVyKHlQcm94eVJlc29sdmVyKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCWlsbGVnYWxDYXRjaEV4Y2VwdGlvblByb3h5LmFkZFByb3h5TGlzdGVuZXIoaWxsZWdhbENhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlcik7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpOwotCQlydW50aW1lQ2F0Y2hFeGNlcHRpb25Qcm94eS5hZGRQcm94eUxpc3RlbmVyKHJ1bnRpbWVDYXRjaEV4Y2VwdGlvblByb3h5UmVzb2x2ZXIpOwotCQlFeHByZXNzaW9uTm90UmVzb2x2ZWQgelByb3h5UmVzb2x2ZXIgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCk7Ci0JCXpQcm94eS5hZGRQcm94eUxpc3RlbmVyKHpQcm94eVJlc29sdmVyKTsKLQkJZlByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5FeHByZXNzaW9uUHJveHkuUHJveHlMaXN0ZW5lciNwcm94eVJlc29sdmVkKG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLkV4cHJlc3Npb25Qcm94eS5Qcm94eUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHByb3h5ID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnRFcXVhbHMoIk5vdCBhIEJvb2xlYW4gcHJveHk6Iitwcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5Cb29sZWFuIiksIHByb3h5LmdldFR5cGVQcm94eSgpKTsKLQkJCQlhc3NlcnRGYWxzZSgoKElCb29sZWFuQmVhblByb3h5KSBldmVudC5nZXRQcm94eSgpKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHlQcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZShpbGxlZ2FsQ2F0Y2hFeGNlcHRpb25Qcm94eVJlc29sdmVyLm5vdFJlc29sdmVkQ2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh6UHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCWFzc2VydFRydWUocnVudGltZUNhdGNoRXhjZXB0aW9uUHJveHlSZXNvbHZlci5ub3RSZXNvbHZlZENhbGxlZCk7Ci0JCQotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RJZkVsc2VUcnVlV2l0aEVsc2UoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSWZFbHNlKHRydWUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfQ09ORElUSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlFeHByZXNzaW9uUHJveHkgdHJ1ZVByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9UUlVFKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlFeHByZXNzaW9uUHJveHkgZmFsc2VQcm94eSA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfRUxTRSk7CQkKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIEluZml4T3BlcmF0b3IuSU5fTUlOVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJCi0JCXRydWVQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHZhbHVlID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnROb3ROdWxsKHZhbHVlKTsKLQkJCQlhc3NlcnRFcXVhbHMoImludCIsIHZhbHVlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCWFzc2VydEVxdWFscyg2LCAoKElOdW1iZXJCZWFuUHJveHkpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZmFsc2VQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKSk7Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElmRWxzZUZhbHNlV2l0aEVsc2UoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQlJRXhwcmVzc2lvbiBleHAgPSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlSWZFbHNlKHRydWUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfQ09ORElUSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDQpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlFeHByZXNzaW9uUHJveHkgdHJ1ZVByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9UUlVFKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlFeHByZXNzaW9uUHJveHkgZmFsc2VQcm94eSA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfRUxTRSk7CQkKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIEluZml4T3BlcmF0b3IuSU5fTUlOVVMsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQotCQl0cnVlUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCkpOwotCQkKLQkJZmFsc2VQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHZhbHVlID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQlhc3NlcnROb3ROdWxsKHZhbHVlKTsKLQkJCQlhc3NlcnRFcXVhbHMoImludCIsIHZhbHVlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCWFzc2VydEVxdWFscygwLCAoKElOdW1iZXJCZWFuUHJveHkpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWZFbHNlVHJ1ZVdpdGhvdXRFbHNlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUlmRWxzZShmYWxzZSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCUV4cHJlc3Npb25Qcm94eSB0cnVlUHJveHkgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX1RSVUUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCQotCQl0cnVlUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCkgewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSB2YWx1ZSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCB2YWx1ZS5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoNiwgKChJTnVtYmVyQmVhblByb3h5KSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJZkVsc2VGYWxzZVdpdGhvdXRFbHNlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUlmRWxzZShmYWxzZSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCUV4cHJlc3Npb25Qcm94eSB0cnVlUHJveHkgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLklGX1RSVUUpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCQotCQl0cnVlUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCkpOwotCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElmRWxzZUJsb2Nrc1RydWVXaXRoRWxzZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJZkVsc2UodHJ1ZSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgMyk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVCbG9ja0JlZ2luKCk7Ci0JCQlFeHByZXNzaW9uUHJveHkgdHJ1ZVByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUJsb2NrRW5kKCk7Ci0JCWV4cC5jcmVhdGVCbG9ja0JlZ2luKCk7Ci0JCQlFeHByZXNzaW9uUHJveHkgZmFsc2VQcm94eSA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwkJCi0JCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9NSU5VUywgMCk7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVCbG9ja0VuZCgpOwotCQkKLQkJdHJ1ZVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgdmFsdWUgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydE5vdE51bGwodmFsdWUpOwotCQkJCWFzc2VydEVxdWFscygiaW50IiwgdmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDYsICgoSU51bWJlckJlYW5Qcm94eSkgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlmYWxzZVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWZFbHNlQmxvY2tzRmFsc2VXaXRoRWxzZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJZkVsc2UodHJ1ZSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVCbG9ja0JlZ2luKCk7Ci0JCQlFeHByZXNzaW9uUHJveHkgdHJ1ZVByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUJsb2NrRW5kKCk7Ci0JCWV4cC5jcmVhdGVCbG9ja0JlZ2luKCk7Ci0JCQlFeHByZXNzaW9uUHJveHkgZmFsc2VQcm94eSA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwkJCi0JCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9NSU5VUywgMCk7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVCbG9ja0VuZCgpOwotCi0JCXRydWVQcm94eS5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uTm90UmVzb2x2ZWQoKSk7Ci0JCQotCQlmYWxzZVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgdmFsdWUgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydE5vdE51bGwodmFsdWUpOwotCQkJCWFzc2VydEVxdWFscygiaW50IiwgdmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDAsICgoSU51bWJlckJlYW5Qcm94eSkgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZkVsc2VCbG9ja1RydWVXaXRob3V0RWxzZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVJZkVsc2UoZmFsc2UpOwotCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uSUZfQ09ORElUSU9OLCBJbmZpeE9wZXJhdG9yLklOX0VRVUFMUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX1JJR0hULCAoc2hvcnQpIDMpOwotCQlleHAuY3JlYXRlQmxvY2tCZWdpbigpOwotCQkJRXhwcmVzc2lvblByb3h5IHRydWVQcm94eSA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIEluZml4T3BlcmF0b3IuSU5fUExVUywgMCk7Ci0JCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsIChieXRlKSAzKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVCbG9ja0VuZCgpOwotCQkKLQkJdHJ1ZVByb3h5LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgdmFsdWUgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydE5vdE51bGwodmFsdWUpOwotCQkJCWFzc2VydEVxdWFscygiaW50IiwgdmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDYsICgoSU51bWJlckJlYW5Qcm94eSkgdmFsdWUpLmludFZhbHVlKCkpOwotCQkJfQotCQl9KTsKLQotCQlleHAuaW52b2tlRXhwcmVzc2lvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SWZFbHNlQmxvY2tGYWxzZVdpdGhvdXRFbHNlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUlmRWxzZShmYWxzZSk7Ci0JCWV4cC5jcmVhdGVJbmZpeEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5JRl9DT05ESVRJT04sIEluZml4T3BlcmF0b3IuSU5fRVFVQUxTLCAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9MRUZULCAoYnl0ZSkgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsIChzaG9ydCkgMyk7Ci0JCWV4cC5jcmVhdGVCbG9ja0JlZ2luKCk7Ci0JCQlFeHByZXNzaW9uUHJveHkgdHJ1ZVByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlleHAuY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9QTFVTLCAwKTsKLQkJCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgKGJ5dGUpIDMpOwotCQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgKHNob3J0KSAzKTsKLQkJZXhwLmNyZWF0ZUJsb2NrRW5kKCk7Ci0JCQotCQl0cnVlUHJveHkuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCkpOwotCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdJbml0U3RyaW5nUHJpbWl0aXZlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgVGhyb3dhYmxlUHJveHksIE5vRXhwcmVzc2lvblZhbHVlRXhjZXB0aW9uIHsKLQkJLy8gVXNlIGludGVybmFsIGV4cHJlc3Npb24gY2xhc3Mgc28gd2UgY2FuIHRlc3QgdGhlIHNwZWNpYWwgbWV0aG9kLgotCQlFeHByZXNzaW9uIGV4cCA9IChFeHByZXNzaW9uKSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlFeHByZXNzaW9uUHJveHkgcmVzdWx0ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVOZXdJbnN0YW5jZShGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsICJmYWxzZSIsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiYm9vbGVhbiIpKTsKLQkJcmVzdWx0LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpewotCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJSUJlYW5Qcm94eSB2YWx1ZSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgdmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCAoKElCb29sZWFuQmVhblByb3h5KSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQkJCi0JCX0pOwotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcmsoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvLyBKdXN0IHRlc3QgaGF2aW5nIGEgbWFyayBhbmQgbm8gZXJyb3JzLgotCQlFeHByZXNzaW9uIGV4cCA9IChFeHByZXNzaW9uKSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlpbnQgbWFyayA9IGV4cC5tYXJrKCk7Ci0JCXRyeSB7Ci0JCQlFeHByZXNzaW9uUHJveHkgcmVzdWx0ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlleHAuY3JlYXRlTmV3SW5zdGFuY2UoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCAiZmFsc2UiLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImJvb2xlYW4iKSk7Ci0JCQlyZXN1bHQuYWRkUHJveHlMaXN0ZW5lcihuZXcgRXhwcmVzc2lvblJlc29sdmVkKCl7Ci0JCQkJcHVibGljIHZvaWQgcHJveHlSZXNvbHZlZChQcm94eUV2ZW50IGV2ZW50KSB7Ci0JCQkJCUlCZWFuUHJveHkgdmFsdWUgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCQlhc3NlcnROb3ROdWxsKHZhbHVlKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgdmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJCWFzc2VydEVxdWFscyhmYWxzZSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQl9Ci0JCQkJCi0JCQl9KTsJCQkKLQkJfSBmaW5hbGx5IHsKLQkJCWV4cC5lbmRNYXJrKG1hcmspOwotCQl9Ci0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFyazIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb24gewotCQkvLyBKdXN0IHRlc3QgaGF2aW5nIGEgbWFyayBlcnJvcnMsIGJ1dCBleHByZXNzaW9ucyBiZWZvcmUgdGhlIG1hcmsgYW5kIGFmdGVyIHRoZSBtYXJrIGFyZSBzdWNjZXNzZnVsLgotCQlFeHByZXNzaW9uIGV4cCA9IChFeHByZXNzaW9uKSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlpbnQgbWFyazAgPSBleHAubWFyaygpOwotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0UmVzb2x2ZWQgPSBuZXcgYm9vbGVhblsxXTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGVwMSA9IG51bGw7Ci0JCWZpbmFsIGJvb2xlYW5bXSByZXN1bHRSZXNvbHZlZDIgPSBuZXcgYm9vbGVhblsxXTsKLQkJdHJ5IHsKLQkJCUV4cHJlc3Npb25Qcm94eSByZXN1bHQgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCXJlc3VsdC5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBwcm94eVJlc29sdmVkKFByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQkJSUJlYW5Qcm94eSB2YWx1ZSA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJCWFzc2VydE5vdE51bGwodmFsdWUpOwotCQkJCQlhc3NlcnRFcXVhbHMoImJvb2xlYW4iLCB2YWx1ZS5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJCQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCAoKElCb29sZWFuQmVhblByb3h5KSB2YWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCQlyZXN1bHRSZXNvbHZlZFswXSA9IHRydWU7Ci0JCQkJfQotCi0JCQl9KTsKLQkJCWV4cC5jcmVhdGVOZXdJbnN0YW5jZShGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsICJmYWxzZSIsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiYm9vbGVhbiIpKTsKLQkJCWV4cC5jcmVhdGVUcnkoKTsKLQkJCWludCBtYXJrID0gZXhwLm1hcmsoKTsKLQkJCXRyeSB7Ci0JCQkJRXhwcmVzc2lvblByb3h5IHJlc3VsdDEgPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCQlyZXN1bHQxLmFkZFByb3h5TGlzdGVuZXIoZXAxID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpKTsKLQkJCQlleHAuY3JlYXRlTmV3SW5zdGFuY2UoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX0xFRlQsICJmYWxzZSIsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiYm9vbGVhbiIpKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVGhpcyBpcyBvaywgc2hvdWxkIG9mIGdvdCB0aGlzLgotCQkJfSBmaW5hbGx5IHsKLQkJCQlleHAuZW5kTWFyayhtYXJrKTsKLQkJCX0KLQkJCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJCUV4cHJlc3Npb25Qcm94eSByZXN1bHQyID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlyZXN1bHQyLmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQotCQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCQlJQmVhblByb3h5IHZhbHVlID0gZXZlbnQuZ2V0UHJveHkoKTsKLQkJCQkJYXNzZXJ0Tm90TnVsbCh2YWx1ZSk7Ci0JCQkJCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHZhbHVlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCQlhc3NlcnRFcXVhbHMoZmFsc2UsICgoSUJvb2xlYW5CZWFuUHJveHkpIHZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJCXJlc3VsdFJlc29sdmVkMlswXSA9IHRydWU7Ci0JCQkJfQotCi0JCQl9KTsKLQkJCWV4cC5jcmVhdGVOZXdJbnN0YW5jZShGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsICJmYWxzZSIsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiYm9vbGVhbiIpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWV4cC5lbmRNYXJrKG1hcmswKTsKLQkJfQotCQkKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZXAxKTsKLQkJYXNzZXJ0VHJ1ZShlcDEubm90UmVzb2x2ZWRDYWxsZWQpOwotCQlhc3NlcnRUcnVlKHJlc3VsdFJlc29sdmVkWzBdKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHRSZXNvbHZlZDJbMF0pOwotCQkKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1hcmtFcnJvcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCS8vIFRlc3Qgd2l0aCBvbmUgZXJyb3IgYW5kIHNlZSBpZiBpdCByZXN0b3JlcyBjb3JyZWN0bHkuCi0JCUV4cHJlc3Npb24gZXhwID0gKEV4cHJlc3Npb24pIHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWludCBtYXJrID0gZXhwLm1hcmsoKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGVwbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlFeHByZXNzaW9uUHJveHkgcmVzdWx0ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlyZXN1bHQuYWRkUHJveHlMaXN0ZW5lcihlcGwgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCkpOwotCQkJZXhwLmNyZWF0ZU5ld0luc3RhbmNlKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9MRUZULCAiZmFsc2UiLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImJvb2xlYW4iKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGlzIGlzIGdvb2QuIFdlIHNob3VsZCBnZXQgaGVyZS4KLQkJfSBmaW5hbGx5IHsKLQkJCWV4cC5lbmRNYXJrKG1hcmspOwotCQl9Ci0JCQotCQkvLyBOb3cgd2Ugc2hvdWxkIGJlIGFibGUgdG8gY29udGludWUgYW5kIGdldCBnb29kIGFuc3dlci4KLQkJRXhwcmVzc2lvblByb3h5IHJlc3VsdCA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQlleHAuY3JlYXRlTmV3SW5zdGFuY2UoRm9yRXhwcmVzc2lvbi5BU1NJR05NRU5UX1JJR0hULCAiZmFsc2UiLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImJvb2xlYW4iKSk7Ci0JCXJlc3VsdC5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKXsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoUHJveHlFdmVudCBldmVudCkgewotCQkJCUlCZWFuUHJveHkgdmFsdWUgPSBldmVudC5nZXRQcm94eSgpOwotCQkJCWFzc2VydE5vdE51bGwodmFsdWUpOwotCQkJCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHZhbHVlLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCWFzc2VydEVxdWFscyhmYWxzZSwgKChJQm9vbGVhbkJlYW5Qcm94eSkgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJCQotCQl9KTsKLQkJCi0JCWV4cC5pbnZva2VFeHByZXNzaW9uKCk7Ci0JCWFzc2VydE5vdE51bGwoZXBsKTsKLQkJYXNzZXJ0VHJ1ZShlcGwubm90UmVzb2x2ZWRDYWxsZWQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFya05lc3RFcnJvcigpIHsKLQkJLy8gVGVzdCBtYXJrIG5lc3QgZXJyb3IuCi0JCS8vIG1hcmsKLQkJLy8gdHJ5IHsKLQkJLy8gICBlbmRtYXJrCi0JCS8vIH0gZmluYWxseSA8LS0gdGhpcyBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uLgotCQlFeHByZXNzaW9uIGV4cCA9IChFeHByZXNzaW9uKSBwcm94eUZhY3RvcnkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlpbnQgbWFyayA9IGV4cC5tYXJrKCk7Ci0JCUV4cHJlc3Npb25Ob3RSZXNvbHZlZCBlcGwgPSBudWxsOwotCQl0cnkgewotCQkJZXhwLmNyZWF0ZVRyeSgpOwotCQkJRXhwcmVzc2lvblByb3h5IHJlc3VsdCA9IGV4cC5jcmVhdGVQcm94eUFzc2lnbm1lbnRFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04pOwotCQkJcmVzdWx0LmFkZFByb3h5TGlzdGVuZXIoZXBsID0gbmV3IEV4cHJlc3Npb25Ob3RSZXNvbHZlZCgpKTsKLQkJCWV4cC5jcmVhdGVOZXdJbnN0YW5jZShGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsICJmYWxzZSIsIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiYm9vbGVhbiIpKTsKLQkJCWV4cC5lbmRNYXJrKG1hcmspOwotCQkJZXhwLmNyZWF0ZVRyeUZpbmFsbHlDbGF1c2UoKTsKLQkJCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRoaXMgaXMgZ29vZC4gV2Ugc2hvdWxkIGdldCBoZXJlLgotCQkJZXhwLmNsb3NlKCk7Ci0JCQlhc3NlcnROb3ROdWxsKGVwbCk7Ci0JCQlhc3NlcnRUcnVlKGVwbC5ub3RSZXNvbHZlZENhbGxlZCk7CQkJCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWV4cC5jbG9zZSgpOwotCQlmYWlsKCJTaG91bGQgbm90IG9mIGdvdHRlbiBoZXJlLiIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFya05lc3RFcnJvcjIoKSB7Ci0JCS8vIFRlc3QgbWFyayBuZXN0IGVycm9yLgotCQkvLyB0cnkgewotCQkvLyAgIG1hcmsKLQkJLy8gfSBmaW5hbGx5IDwtLSB0aGlzIHNob3VsZCBjYXVzZSBhbiBleGNlcHRpb24uCi0JCS8vIGVuZG1hcmsKLQkJRXhwcmVzc2lvbiBleHAgPSAoRXhwcmVzc2lvbikgcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJRXhwcmVzc2lvbk5vdFJlc29sdmVkIGVwbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCQlpbnQgbWFyayA9IGV4cC5tYXJrKCk7Ci0JCQlFeHByZXNzaW9uUHJveHkgcmVzdWx0ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCQlyZXN1bHQuYWRkUHJveHlMaXN0ZW5lcihlcGwgPSBuZXcgRXhwcmVzc2lvbk5vdFJlc29sdmVkKCkpOwotCQkJZXhwLmNyZWF0ZU5ld0luc3RhbmNlKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgImZhbHNlIiwgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJib29sZWFuIikpOwotCQkJZXhwLmNyZWF0ZVRyeUZpbmFsbHlDbGF1c2UoKTsKLQkJCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJCWV4cC5lbmRNYXJrKG1hcmspOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBpcyBnb29kLiBXZSBzaG91bGQgZ2V0IGhlcmUuCi0JCQlleHAuY2xvc2UoKTsKLQkJCWFzc2VydE5vdE51bGwoZXBsKTsKLQkJCWFzc2VydFRydWUoZXBsLm5vdFJlc29sdmVkQ2FsbGVkKTsJCQkKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZXhwLmNsb3NlKCk7Ci0JCWZhaWwoIlNob3VsZCBub3Qgb2YgZ290dGVuIGhlcmUuIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4cHJlc3Npb25UcmFuc2ZlcigpIHRocm93cyBUaHJvd2FibGUgewotCQkvLyBUZXN0IHRoYXQgdGhyZWFkIHRyYW5zZmVyIHdvcmtzLiBXZSB3aWxsIGRvIHBhcnQgb2YgdGhlIGV4cHJlc3Npb24gaW4gb25lIHRocmVhZCwgbW9yZSBpbiB0aGUgbmV4dCwgYW5kCi0JCS8vIHRoZW4gY29tZSBiYWNrIGFuZCBjb21wbGV0ZSBpdC4KLQkJSUV4cHJlc3Npb24gZXhwID0gcHJveHlGYWN0b3J5LmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJRXhwcmVzc2lvblByb3h5IGVwSW5maXggPSBleHAuY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJZXhwLmNyZWF0ZUluZml4RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFTU0lHTk1FTlRfUklHSFQsIEluZml4T3BlcmF0b3IuSU5fTEVTUywgMCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfTEVGVCwgLTEwMDAwMDAwKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5JTkZJWF9SSUdIVCwgMyk7Ci0JCQotCQkvLyBOb3cgdHJhbnNmZXIgdG8gYW5vdGhlciB0aHJlYWQuCi0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IChFeHByZXNzaW9uKSBleHA7Ci0JCWV4cHJlc3Npb24uYmVnaW5UcmFuc2ZlclRocmVhZCgpOwkvLyBCZWdpbiB0aGUgdHJhbnNmZXIuCi0JCQotCQlJQmVhblR5cGVQcm94eSBjYWxsYmFja1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS52bS5UZXN0RXhwcmVzc2lvblRocmVhZFRyYW5zZmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChjYWxsYmFja1R5cGUpOwotCQlJQmVhblByb3h5IGNhbGxiYWNrUHJveHkgPSBjYWxsYmFja1R5cGUubmV3SW5zdGFuY2UoKTsKLQkJCi0JCUV4cHJlc3Npb25UaHJlYWRUcmFuc2ZlckNhbGxCYWNrIGNiID0gbmV3IEV4cHJlc3Npb25UaHJlYWRUcmFuc2ZlckNhbGxCYWNrKGV4cHJlc3Npb24pOwotCQlyZWdpc3RyeS5nZXRDYWxsYmFja1JlZ2lzdHJ5KCkucmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFja1Byb3h5LCBjYik7Ci0JCUlJbnZva2FibGUgc3RhcnQgPSBjYWxsYmFja1R5cGUuZ2V0SW52b2thYmxlKCJzdGFydCIpOwkvLyROT04tTkxTLTEkCi0JCXN0YXJ0Lmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhjYWxsYmFja1Byb3h5KTsJLy8gU3RhcnQgdGhlIHRocmVhZCBvbiB0aGUgcmVtb3RlIHZtIGFuZCB3YWl0IGZvciBpdCB0byBmaW5pc2guCi0JCQotCQllcEluZml4LmFkZFByb3h5TGlzdGVuZXIobmV3IEV4cHJlc3Npb25SZXNvbHZlZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHJlc3VsdCA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQkJCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoLTEwMDAwMDAwPDMsICgoSUJvb2xlYW5CZWFuUHJveHkpIHJlc3VsdCkuYm9vbGVhblZhbHVlKCkpOwkJCi0JCQl9Ci0JCX0pOwotCQkKLQkJaWYgKGNiLmVycm9yICE9IG51bGwpIHsKLQkJCXRocm93IGNiLmVycm9yOwotCQl9Ci0JCQotCQljYi5lcC5hZGRQcm94eUxpc3RlbmVyKG5ldyBFeHByZXNzaW9uUmVzb2x2ZWQoKXsKLQkJCXB1YmxpYyB2b2lkIHByb3h5UmVzb2x2ZWQoRXhwcmVzc2lvblByb3h5LlByb3h5RXZlbnQgZXZlbnQpIHsKLQkJCQlJQmVhblByb3h5IHJlc3VsdCA9IGV2ZW50LmdldFByb3h5KCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbChyZXN1bHQpOwotCQkJCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIHJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzID09IFN0cmluZy5jbGFzcywgKChJQm9vbGVhbkJlYW5Qcm94eSkgcmVzdWx0KS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCWV4cHJlc3Npb24udHJhbnNmZXJUaHJlYWQoKTsKLQkJZXhwLmludm9rZUV4cHJlc3Npb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN1YmV4cHJlc3Npb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFRocm93YWJsZVByb3h5LCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHByb3h5RmFjdG9yeS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJpbnRbXVtdW10iLCAyKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUNSRUFUSU9OX0RJTUVOU0lPTiwgMik7Ci0JCUV4cHJlc3Npb25Qcm94eSBzZWNvbmREaW1lbnNpb25Qcm94eSA9IG51bGw7Ci0JCS8vIFRoaXMgdGVzdHMgdGhhdCB3ZSBjYW4gcHV0IGFuIGV4cHJlc3Npb24gcmlnaHQgaW4gdGhlIG1pZGRsZSBvZiBhbm90aGVyIGV4cHJlc3Npb24gYW5kIAotCQkvLyBwaWNrIGl0IHdoZXJlIGl0IGxlZnQgb2ZmLgotCQlleHAuY3JlYXRlU3ViZXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlVHJ5KCk7Ci0JCXNlY29uZERpbWVuc2lvblByb3h5ID0gZXhwLmNyZWF0ZVByb3h5QXNzaWdubWVudEV4cHJlc3Npb24oRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTik7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgNCk7Ci0JCWV4cC5jcmVhdGVUcnlFbmQoKTsKLQkJZXhwLmNyZWF0ZVN1YmV4cHJlc3Npb25FbmQoKTsKLQkJZXhwLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLkFSUkFZQ1JFQVRJT05fRElNRU5TSU9OLCBzZWNvbmREaW1lbnNpb25Qcm94eSk7CQkKLQkJSUJlYW5Qcm94eSByZXN1bHQgPSBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzdWx0KTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnRbXVtdW10iLCByZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCAoKElBcnJheUJlYW5Qcm94eSkoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXQoMCkpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbCgoKElBcnJheUJlYW5Qcm94eSkoKElBcnJheUJlYW5Qcm94eSkgcmVzdWx0KS5nZXQoMCkpLmdldCgwKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvRXhwcmVzc2lvblRocmVhZFRyYW5zZmVyQ2FsbEJhY2suamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L0V4cHJlc3Npb25UaHJlYWRUcmFuc2ZlckNhbGxCYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTA0OGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvRXhwcmVzc2lvblRocmVhZFRyYW5zZmVyQ2FsbEJhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5OwotLyoKLSAqICAkUkNTZmlsZTogRXhwcmVzc2lvblRocmVhZFRyYW5zZmVyQ2FsbEJhY2suamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkZvckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5JbmZpeE9wZXJhdG9yOwotLyoqCi0gKiBUaGlzIGlzIHRoZSBjYWxsYmFjayBmb3IgdGhlIGV4cHJlc3Npb24gdGVzdCB0aHJlYWQgdHJhbnNmZXIuIFRoaXMgcnVucyBvbiB0aGUgSURFIHNpZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHByZXNzaW9uVGhyZWFkVHJhbnNmZXJDYWxsQmFjayBpbXBsZW1lbnRzIElDYWxsYmFjayB7Ci0JCi0JRXhwcmVzc2lvbiBleHByZXNzaW9uOwotCXB1YmxpYyBUaHJvd2FibGUgZXJyb3I7Ci0JcHVibGljIEV4cHJlc3Npb25Qcm94eSBlcDsKLQkJCi0JcHVibGljIEV4cHJlc3Npb25UaHJlYWRUcmFuc2ZlckNhbGxCYWNrKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQl0aGlzLmV4cHJlc3Npb24gPSBleHByZXNzaW9uOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBJQmVhblByb3h5IHBhcm0pewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBjYWxsZWRCYWNrKGludCBtc2dJRCwgT2JqZWN0IHBhcm0pIHsKLQkJdHJ5IHsKLQkJCWV4cHJlc3Npb24udHJhbnNmZXJUaHJlYWQoKTsKLQkJCS8vIFRoZSB0ZXN0IGhlcmUgaXMgZm9yIGVxdWFsaXR5LgotCQkJCi0JCQllcCA9IGV4cHJlc3Npb24uY3JlYXRlUHJveHlBc3NpZ25tZW50RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OKTsKLQkJCWV4cHJlc3Npb24uY3JlYXRlSW5maXhFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uQVNTSUdOTUVOVF9SSUdIVCwgSW5maXhPcGVyYXRvci5JTl9FUVVBTFMsIDApOwotCQkJZXhwcmVzc2lvbi5jcmVhdGVUeXBlTGl0ZXJhbChGb3JFeHByZXNzaW9uLklORklYX0xFRlQsICJqYXZhLmxhbmcuU3RyaW5nIik7Ci0JCQlleHByZXNzaW9uLmNyZWF0ZVR5cGVMaXRlcmFsKEZvckV4cHJlc3Npb24uSU5GSVhfUklHSFQsICJqYXZhLmxhbmcuU3RyaW5nIik7Ci0JCQkKLQkJCQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWVycm9yID0gZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChleHByZXNzaW9uLmlzVmFsaWQoKSkKLQkJCQl0cnkgewotCQkJCQlleHByZXNzaW9uLmJlZ2luVHJhbnNmZXJUaHJlYWQoKTsJLy8gU2V0IHRvIHJldHVybiBleHByZXNzaW9uIHRvIG90aGVyIHRocmVhZC4KLQkJCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJCQllcnJvciA9IGU7Ci0JCQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJCQllcnJvciA9IGU7Ci0JCQkJfQkKLQkJfQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBPYmplY3RbXSBwYXJtcyl7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjYWxsZWRCYWNrU3RyZWFtKGludCBtc2dJRCwgSW5wdXRTdHJlYW0gaW4pewotCX0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9Qcm94eVN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9Qcm94eVN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMTNkZDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvUHJveHlTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHk7Ci0vKgotICogICRSQ1NmaWxlOiBQcm94eVN1aXRlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjkgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLkphdmFUZXN0c1BsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKiAKLSAqIFRoaXMgc3VpdGUgaXMgZm9yIHRlc3Rpbmcgc3RyYWlnaHQgUHJveHkgaW5kZXBlbmRlbnQgb2YgdGhlIHR5cGUgb2YgcHJveHkgKGUuZy4gUmVtb3RlIG9yIElERSkuCi0gKiBJdCBjYW4ndCBydW4gYnkgaXRzZWxmLiBJdCBuZWVkcyB0byBoYXZlIHRoZSByZWdpc3RyeSBjcmVhdGVyIG9iamVjdCBzdG9yZWQgaW4gaXQgc28gdGhhdAotICogdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdHJ5IGNhbiBiZSBjcmVhdGVkIGFuZCByZWNyZWF0ZWQgYXMgbmVjZXNzYXJ5IGJ5IHRoZSB0ZXN0LgotICogCi0gKiBJZiB0aGUgdGVzdHMgaW5oZXJpdCBmcm9tIEFic3RyYWN0VGVzdFByb3h5IHRoZSBzZXRSZWdpc3RyeUhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgb24gaXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm94eVN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotCi0JLy8gVGVzdCBjYXNlcyB0byBiZSBpbmNsdWRlIGluIHRoZSBzdWl0ZQotCXByaXZhdGUgc3RhdGljIENsYXNzIHRlc3RzTGlzdFtdID0gewotCQlUZXN0U3RhbmRhcmQuY2xhc3MsCi0JCVRlc3RBV1RQcm94eS5jbGFzcywKLQkJRXhwcmVzc2lvblRlc3QuY2xhc3MsCi0JCQkJCQkJCQkgICB9IDsKLQkJCQkJCQkJCSAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBrZ05hbWUgPSAib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5IiA7Ci0JICAgIAotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWNrYWdlU3VpdGUuCi0JICovCi0JcHVibGljIFByb3h5U3VpdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCXBvcHVsYXRlU3VpdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFja2FnZVN1aXRlLgotCSAqIEBwYXJhbSB0aGVDbGFzcwotCSAqLwotCXB1YmxpYyBQcm94eVN1aXRlKENsYXNzIHRoZUNsYXNzKSB7Ci0JCXN1cGVyKHRoZUNsYXNzKTsJCQotCQlwb3B1bGF0ZVN1aXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhY2thZ2VTdWl0ZS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBQcm94eVN1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwkJCi0JCXBvcHVsYXRlU3VpdGUoKSA7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlU3VpdGUgKCkgewotCQlmb3IgKGludCBpPTA7IGk8dGVzdHNMaXN0Lmxlbmd0aDsgaSsrKQotCQkgIGFkZFRlc3RTdWl0ZSh0ZXN0c0xpc3RbaV0pIDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgY29udHJpYnV0b3IgdG8gYmUgdXNlZCB3aGVuIHN0YXJ0aW5nIHRlc3RzIHNvIHRoYXQgUHJveHlTdWl0ZSBjYW4gY29udHJpYnV0ZSB0byBpdC4KLQkgKiBAcmV0dXJuIEEgY29udHJpYnV0b3IgZm9yIFByb3h5IFN1aXRlIHRlc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yIGdldFByb3h5U3VpdGVDb250cmlidXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uQ29udHJpYnV0b3JBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJpYnV0ZUNsYXNzcGF0aHMoSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyIGNvbnRyb2xsZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQljb250cm9sbGVyLmNvbnRyaWJ1dGVDbGFzc3BhdGgoSmF2YVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLCAidm0vdGVzdHMuamFyIiwgSUNvbmZpZ3VyYXRpb25Db250cmlidXRpb25Db250cm9sbGVyLkFQUEVORF9VU0VSX0NMQVNTUEFUSCwgZmFsc2UpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L1Rlc3RBV1RQcm94eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdEFXVFByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwYzE4YjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdEFXVFByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHk7Ci0vKgotICogICRSQ1NmaWxlOiBUZXN0QVdUUHJveHkuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmF3dC5JU3RhbmRhcmRBd3RCZWFuUHJveHlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5hd3QuSmF2YVN0YW5kYXJkQXd0QmVhbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgVGVzdEFXVFByb3h5IGV4dGVuZHMgQWJzdHJhY3RUZXN0UHJveHkgewotCi0JcHVibGljIFRlc3RBV1RQcm94eSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdEFXVFByb3h5KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIEphdmFTdGFuZGFyZEF3dEJlYW5Db25zdGFudHMgY29uc3RhbnRzOwkvLyBJZiB0aGlzIGlzIG51bGwgdGhlbiBkb24ndCBkbyB0ZXN0cy4KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCQotCQljb25zdGFudHMgPSBKYXZhU3RhbmRhcmRBd3RCZWFuQ29uc3RhbnRzLmdldENvbnN0YW50cyhyZWdpc3RyeSk7Ci0JCWFzc2VydE5vdE51bGwoY29uc3RhbnRzKTsKLQkJaWYgKCFjb25zdGFudHMuaXNBV1RBdmFpbGFibGUoKSkgewotCQkJLy8gdGhpcyBpcyBub3QgYW4gZXJyb3IuIEl0IGp1c3QgbWVhbnMgd2UgZG9uJ3QgYW55dGhpbmcuIFRoaXMgaXMgc2lnbmlmaWVkIGJ5IGNvbnN0YW50cyBiZWluZyBudWxsLgotCQkJY29uc3RhbnRzID0gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QVdUQ29sb3IoKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChjb25zdGFudHMgPT0gbnVsbCkKLQkJCXJldHVybjsJLy8gTm8gQVdULCBzbyB0ZXN0IGlzbid0IGRvbmUsIGJ1dCBzdGlsbCBjb25zaWRlcmVkIGdvb2QuCi0JCQkKLQkJLy8gQVdUIENvbG9yIHRlc3RzCi0JCUlCZWFuVHlwZVByb3h5IGNvbG9yVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuQ29sb3IiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGNvbG9yVHlwZSk7Ci0JCUlCZWFuUHJveHkgY29sb3JQcm94eSA9IGNvbG9yVHlwZS5uZXdJbnN0YW5jZSgiamF2YS5hd3QuQ29sb3IuY3lhbiIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoY29sb3JQcm94eSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5hd3QuQ29sb3Jbcj0wLGc9MjU1LGI9MjU1XSIsIGNvbG9yUHJveHkudG9CZWFuU3RyaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QVdUUHJveHlGYWN0b3J5KCkgewotCQlpZiAoY29uc3RhbnRzID09IG51bGwpCi0JCQlyZXR1cm47CS8vIE5vIEFXVCwgc28gdGVzdCBpc24ndCBkb25lLCBidXQgc3RpbGwgY29uc2lkZXJlZCBnb29kLgotCQkJCi0JCUlTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3RvcnkgYXd0UHJveHlGYWN0b3J5ID0gKElTdGFuZGFyZEF3dEJlYW5Qcm94eUZhY3RvcnkpIHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnlFeHRlbnNpb24oSVN0YW5kYXJkQXd0QmVhblByb3h5RmFjdG9yeS5SRUdJU1RSWV9LRVkpOwotCQlhc3NlcnROb3ROdWxsKGF3dFByb3h5RmFjdG9yeSk7Ci0JCQotCQkvLyBUZXN0IHRoZSBjcmVhdGlvbiB0aHJvdWdoIHRoZSBoZWxwZXJzLCBwbHVzIHRlc3Qgc3BlY2lhbCBtZXRob2RzIAotCQlJRGltZW5zaW9uQmVhblByb3h5IGRpbUJlYW4gPSBhd3RQcm94eUZhY3RvcnkuY3JlYXRlRGltZW5zaW9uQmVhblByb3h5V2l0aCg1LDYpOwotCQlhc3NlcnROb3ROdWxsKGRpbUJlYW4pOwotCQlhc3NlcnRFcXVhbHMoImphdmEuYXd0LkRpbWVuc2lvblt3aWR0aD01LGhlaWdodD02XSIsIGRpbUJlYW4udG9CZWFuU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscyg1LCBkaW1CZWFuLmdldFdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGltQmVhbi5nZXRIZWlnaHQoKSk7CQkKLQkJCi0JCUlQb2ludEJlYW5Qcm94eSBwb2ludEJlYW4gPSBhd3RQcm94eUZhY3RvcnkuY3JlYXRlUG9pbnRCZWFuUHJveHlXaXRoKDUsNik7Ci0JCWFzc2VydE5vdE51bGwocG9pbnRCZWFuKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmF3dC5Qb2ludFt4PTUseT02XSIsIHBvaW50QmVhbi50b0JlYW5TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDUsIHBvaW50QmVhbi5nZXRYKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgcG9pbnRCZWFuLmdldFkoKSk7CQkKLQkJCi0JCUlSZWN0YW5nbGVCZWFuUHJveHkgcmVjdEJlYW4gPSBhd3RQcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCg1LDYsNyw4KTsKLQkJYXNzZXJ0Tm90TnVsbChyZWN0QmVhbik7Ci0JCWFzc2VydEVxdWFscygiamF2YS5hd3QuUmVjdGFuZ2xlW3g9NSx5PTYsd2lkdGg9NyxoZWlnaHQ9OF0iLCByZWN0QmVhbi50b0JlYW5TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDUsIHJlY3RCZWFuLmdldFgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCByZWN0QmVhbi5nZXRZKCkpOwkJCi0JCWFzc2VydEVxdWFscyg3LCByZWN0QmVhbi5nZXRXaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDgsIHJlY3RCZWFuLmdldEhlaWdodCgpKTsJCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBV1RTcGVjaWFsc0luaXRTdHJpbmcoKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uLCBUaHJvd2FibGVQcm94eSwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmIChjb25zdGFudHMgPT0gbnVsbCkKLQkJCXJldHVybjsJLy8gTm8gQVdULCBzbyB0ZXN0IGlzbid0IGRvbmUsIGJ1dCBzdGlsbCBjb25zaWRlcmVkIGdvb2QuCi0JCQkKLQkJCi0JCS8vIFRlc3QgdGhlIGNyZWF0aW9uIHRocm91Z2ggaW5pdCBzdHJpbmdzCi0JCUlCZWFuVHlwZVByb3h5IGRpbVR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LkRpbWVuc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoZGltVHlwZSk7CQkKLQkJSURpbWVuc2lvbkJlYW5Qcm94eSBkaW1CZWFuID0gKElEaW1lbnNpb25CZWFuUHJveHkpIGRpbVR5cGUubmV3SW5zdGFuY2UoIm5ldyBqYXZhLmF3dC5EaW1lbnNpb24oNyw4KSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoZGltQmVhbik7Ci0JCWFzc2VydEVxdWFscygiamF2YS5hd3QuRGltZW5zaW9uW3dpZHRoPTcsaGVpZ2h0PThdIiwgZGltQmVhbi50b0JlYW5TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlCZWFuVHlwZVByb3h5IHBvaW50VHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuUG9pbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlJUG9pbnRCZWFuUHJveHkgcG9pbnRCZWFuID0gKElQb2ludEJlYW5Qcm94eSkgcG9pbnRUeXBlLm5ld0luc3RhbmNlKCJuZXcgamF2YS5hd3QuUG9pbnQoNSw2KSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwocG9pbnRCZWFuKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmF3dC5Qb2ludFt4PTUseT02XSIsIHBvaW50QmVhbi50b0JlYW5TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUlCZWFuVHlwZVByb3h5IHJlY3RUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5SZWN0YW5nbGUiKTsgLy8kTk9OLU5MUy0xJAotCQlJUmVjdGFuZ2xlQmVhblByb3h5IHJlY3RCZWFuID0gKElSZWN0YW5nbGVCZWFuUHJveHkpIHJlY3RUeXBlLm5ld0luc3RhbmNlKCJuZXcgamF2YS5hd3QuUmVjdGFuZ2xlKDUsNiw3LDgpIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChyZWN0QmVhbik7Ci0JCWFzc2VydEVxdWFscygiamF2YS5hd3QuUmVjdGFuZ2xlW3g9NSx5PTYsd2lkdGg9NyxoZWlnaHQ9OF0iLCByZWN0QmVhbi50b0JlYW5TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L1Rlc3RDYWxsYmFjay5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdENhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3OTMzNGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdENhbGxiYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHk7Ci0vKgotICogICRSQ1NmaWxlOiBUZXN0Q2FsbGJhY2suamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS4qOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0vKioKLSAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZvciB0aGUgdGVzdCBjYXNlLiBUaGlzIHJ1bnMgb24gdGhlIElERSBzaWRlLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdENhbGxiYWNrIGltcGxlbWVudHMgSUNhbGxiYWNrIHsKLQkKLQlPYmplY3QgdGVzdGVyOwotCVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCQotCWludCBjb3VudGVyID0gMDsKLQkKLQkvKioKLQkgKiBUaGlzIHdpbGwgZG8gYXNzZXJ0IHRlc3RzIHRvIG1ha2Ugc3VyZSB0ZXN0IGNvbXBsZXRlZCBjb3JyZWN0bHkuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENvbXBsZXRlZCgpIHsKLQkJaWYgKGJhZFBhcm1UeXBlICE9IG51bGwpCi0JCQlUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoSUludGVnZXJCZWFuUHJveHkuY2xhc3MsIGJhZFBhcm1UeXBlKTsKLQkJaWYgKGJhZFBhcm1WYWx1ZSAhPSAwKQotCQkJVGVzdENhc2UuYXNzZXJ0RXF1YWxzKGdvb2RQYXJtVmFsdWUsIGJhZFBhcm1WYWx1ZSk7Ci0JCWlmIChiYWRNc2cgIT0gbnVsbCkKLQkJCVRlc3RDYXNlLmZhaWwoYmFkTXNnKTsKLQkJVGVzdENhc2UuYXNzZXJ0RXF1YWxzKDIsIGNvdW50ZXIpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gc3RvcHBlZFRlc3Q7Ci0JcHJpdmF0ZSBDbGFzcyBiYWRQYXJtVHlwZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgYmFkUGFybVZhbHVlLCBnb29kUGFybVZhbHVlOwotCXByaXZhdGUgU3RyaW5nIGJhZE1zZzsKLQkKLQkvLyBOb3JtYWxseSB0aGUgY2FsbGJhY2sgZG9lc24ndCBkZXRlcm1pbmUgd2hlbiB0byBzdG9wIAotCS8vIHRoZSBjYWxsYmFjayBwcm94eS4gQnV0IGZvciB0aGlzIHRlc3QgaXQgZG9lcy4KLQlwdWJsaWMgVGVzdENhbGxiYWNrKE9iamVjdCB0LCBQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQl0ZXN0ZXIgPSB0OwotCQl0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgY2FsbGVkQmFjayhpbnQgbXNnSUQsIElCZWFuUHJveHkgcGFybSl7Ci0JCXN5bmNocm9uaXplZCh0ZXN0ZXIpIHsKLQkJCWlmIChzdG9wcGVkVGVzdCkKLQkJCQlyZXR1cm4gbnVsbDsJLy8gV2UndmUgYWxyZWFkeSBzdG9wcGVkLCBkb24ndCBkbyBhbnltb3JlLgotCQl9Ci0JCQotCQlpZiAobXNnSUQgIT0gMCkgewotCQkJYmFkTXNnID0gIk1zZ2lkICIgKyBtc2dJRCArICIgaXMgaW5jb3JyZWN0LiBJdCBzaG91bGQgYmUgemVyby4iOwotCQkJc3RvcFRlc3QoKTsKLQkJfSBlbHNlIGlmIChwYXJtIGluc3RhbmNlb2YgSUludGVnZXJCZWFuUHJveHkpIHsKLQkJCWludCBwdiA9ICgoSUludGVnZXJCZWFuUHJveHkpIHBhcm0pLmludFZhbHVlKCk7Ci0JCQlpZiAoKytjb3VudGVyICE9IHB2KSB7Ci0JCQkJYmFkUGFybVZhbHVlID0gcHY7Ci0JCQkJZ29vZFBhcm1WYWx1ZSA9IGNvdW50ZXI7Ci0JCQkJc3RvcFRlc3QoKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlmIChjb3VudGVyID09IDIpIHsKLQkJCQlzdG9wVGVzdCgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gQmFkIHBhcm0gdHlwZS4KLQkJCWJhZFBhcm1UeXBlID0gcGFybS5nZXRDbGFzcygpOwotCQkJc3RvcFRlc3QoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBjYWxsZWRCYWNrKGludCBtc2dJRCwgT2JqZWN0IHBhcm0pIHsKLQkJaWYgKG1zZ0lEICE9IDEpIHsKLQkJCWJhZE1zZyA9ICJNc2dpZCAiICsgbXNnSUQgKyAiIGlzIGluY29ycmVjdC4gSXQgc2hvdWxkIGJlIG9uZS4iOwotCQkJc3RvcFRlc3QoKTsKLQkJfSBlbHNlIGlmIChwYXJtIGluc3RhbmNlb2YgSW50ZWdlcil7Ci0JCQkvLyBXZSBhcmUgZ29pbmcgdG8gdXNlIHRoZSByZWdpc3RyeSB0byBzZWUgd2hhdCB0aHJlYWQgaWQgaXMgcnVubmluZyB3aGVuIHdlIGNhbGwgaW50byBpdC4KLQkJCUlNZXRob2RQcm94eSBjdXJyZW50VGhyZWFkTWV0aG9kID0gcmVnaXN0cnkuZ2V0TWV0aG9kUHJveHlGYWN0b3J5KCkuZ2V0TWV0aG9kUHJveHkoImphdmEubGFuZy5UaHJlYWQiLCAiY3VycmVudFRocmVhZCIsIG51bGwpOwotCQkJSUJlYW5Qcm94eSB0aHJlYWQgPSBjdXJyZW50VGhyZWFkTWV0aG9kLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhudWxsKTsKLQkJCUlNZXRob2RQcm94eSBoYXNoY29kZU1ldGhvZCA9IHJlZ2lzdHJ5LmdldE1ldGhvZFByb3h5RmFjdG9yeSgpLmdldE1ldGhvZFByb3h5KCJqYXZhLmxhbmcuT2JqZWN0IiwgImhhc2hDb2RlIiwgbnVsbCk7Ci0JCQlJQmVhblByb3h5IHRocmVhZElEID0gaGFzaGNvZGVNZXRob2QuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKHRocmVhZCk7Ci0JCQlpZiAodGhyZWFkSUQgaW5zdGFuY2VvZiBJTnVtYmVyQmVhblByb3h5KSB7Ci0JCQkJaWYgKCFwYXJtLmVxdWFscygoKElOdW1iZXJCZWFuUHJveHkpIHRocmVhZElEKS5udW1iZXJWYWx1ZSgpKSkgewotCQkJCQliYWRNc2cgPSAiVGhyZWFkSUQgcmV0dXJuZWQgZnJvbSBjYWxsIG5vdCBtYXRjaCBwYXJtIHNlbnQgaXQuIE1lYW5zIGNhbGxiYWNrIG5vdCBvbiBzYW1lIHRocmVhZC4iOwotCQkJCQlzdG9wVGVzdCgpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYmFkTXNnID0gIlRocmVhZElEIHJldHVybmVkIGZyb20gY2FsbCBpcyBub3QgdmFsaWQuIjsKLQkJCQlzdG9wVGVzdCgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJYmFkTXNnID0gIlBhcm0gaXMgaW52YWxpZCBmb3IgY2FsbGVkQmFjayB3aXRoIE9iamVjdCI7Ci0JCQlzdG9wVGVzdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBPYmplY3RbXSBwYXJtcyl7Ci0JCWJhZE1zZyA9ICJGYWlsZWQgQ2FsbGJhY2sgVGVzdC4gU2hvdWxkbid0IGhhdmUgZ290dG9uIHRvIG11bHRpLXBhcm1zIjsgLy8kTk9OLU5MUy0xJAotCQlzdG9wVGVzdCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2FsbGVkQmFja1N0cmVhbShpbnQgbXNnSUQsIElucHV0U3RyZWFtIGluKXsKLQkJYmFkTXNnID0gIkZhaWxlZCBDYWxsYmFjayBUZXN0LiBTaG91bGRuJ3QgaGF2ZSBnb3R0b24gdG8gaW5wdXQgc3RyZWFtIjsgLy8kTk9OLU5MUy0xJAotCQlzdG9wVGVzdCgpOwotCX0JCi0JCi0Jdm9pZCBzdG9wVGVzdCgpIHsKLQkJc3luY2hyb25pemVkKHRlc3RlcikgewotCQkJc3RvcHBlZFRlc3QgPSB0cnVlOwotCQkJdGVzdGVyLm5vdGlmeSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9UZXN0Q2FsbGJhY2tTdHJlYW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L1Rlc3RDYWxsYmFja1N0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2RjMjc0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L1Rlc3RDYWxsYmFja1N0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5OwotLyoKLSAqICAkUkNTZmlsZTogVGVzdENhbGxiYWNrU3RyZWFtLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0vKioKLSAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZvciB0aGUgdGVzdCBjYXNlIG9mIHRoZSBzdHJlYW0uIFRoaXMgcnVucyBvbiB0aGUgSURFIHNpZGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q2FsbGJhY2tTdHJlYW0gaW1wbGVtZW50cyBJQ2FsbGJhY2sgewotCi0JT2JqZWN0IHRlc3RlcjsJLy8gTm90aWZpZWQgd2hlbiB0aGUgdGVzdCBpcyBmaW5pc2hlZC4KLQkKLQlwcml2YXRlIGJvb2xlYW4gdGVzdFN0b3BwZWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgYmFkTXNnOwotCXByaXZhdGUgSU9FeGNlcHRpb24gZXhwOwotCXByaXZhdGUgYm9vbGVhbiB0ZXN0U3VjY2VzZnVsOwotCQotCXB1YmxpYyBUZXN0Q2FsbGJhY2tTdHJlYW0oT2JqZWN0IG8pIHsKLQkJdGVzdGVyID0gbzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbXBsZXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGJhZE1zZyAhPSBudWxsKQotCQkJVGVzdENhc2UuZmFpbChiYWRNc2cpOwotCQlpZiAoZXhwICE9IG51bGwpCi0JCQl0aHJvdyBleHA7Ci0JCVRlc3RDYXNlLmFzc2VydFRydWUodGVzdFN1Y2Nlc2Z1bCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBjYWxsZWRCYWNrKGludCBtc2dJRCwgT2JqZWN0ICBwYXJtKXsKLQkJYmFkTXNnID0gIkZhaWxlZCBDYWxsYmFjayBUZXN0LiBTaG91bGRuJ3QgaGF2ZSBnb3R0b24gdG8gb2JqZWN0IHBhcm0iOyAvLyROT04tTkxTLTEkCi0JCXN0b3BUZXN0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgT2JqZWN0IGNhbGxlZEJhY2soaW50IG1zZ0lELCBJQmVhblByb3h5IHBhcm0pewotCQliYWRNc2cgPSAiRmFpbGVkIENhbGxiYWNrIFRlc3QuIFNob3VsZG4ndCBoYXZlIGdvdHRvbiB0byBwYXJtIjsgLy8kTk9OLU5MUy0xJAotCQlzdG9wVGVzdCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIE9iamVjdCBjYWxsZWRCYWNrKGludCBtc2dJRCwgT2JqZWN0W10gcGFybXMpewotCQliYWRNc2cgPSAiRmFpbGVkIENhbGxiYWNrIFRlc3QuIFNob3VsZG4ndCBoYXZlIGdvdHRvbiB0byBtdWx0aS1wYXJtcyI7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcFRlc3QoKTsJCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIHZvaWQgY2FsbGVkQmFja1N0cmVhbShpbnQgbXNnSUQsIElucHV0U3RyZWFtIGluKXsKLQkJLy8gUmVhZCBmcm9tIHRoZSBzdHJlYW0gZm9yIDMwMDAwIGJ5dGVzLiBWZXJpZnkgdGhhdAotCQkvLyB3ZSBnZXQgYW4gaW5jcmVtZW50aW5nIHN0cmVhbSwgaS5lLiAwLCAxLCAuLi4sIDEyNywgLTEyNywgLi4uCi0JCQotCQlzeW5jaHJvbml6ZWQgKHRlc3RlcikgewotCQkJaWYgKHRlc3RTdG9wcGVkKQotCQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpPTA7IGk8MzAwMDA7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlpbnQgbmV4dCA9IGluLnJlYWQoKTsKLQkJCQlpZiAobmV4dCA9PSAtMSkgewotCQkJCQliYWRNc2cgPSAiRmFpbGVkIENhbGxiYWNrIFN0cmVhbSB0ZXN0LiBTdHJlYW0gZW5kZWQgdG9vIHNvb24uIE9uIGNvdW50ZXI9IitTdHJpbmcudmFsdWVPZihpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdG9wVGVzdCgpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJCWlmICgoKGJ5dGUpIG5leHQpICE9ICgoYnl0ZSkgaSkpIHsKLQkJCQkJYmFkTXNnID0gIkZhaWxlZCBDYWxsYmFjayBTdHJlYW0gdGVzdC4gRGlkIG5vdCBnZXQgY29ycmVjdCBuZXh0IGJ5dGUgYXQ6IiArIGk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc3RvcFRlc3QoKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlleHAgPSBlOwotCQkJCXN0b3BUZXN0KCk7CQkJCQotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJdHJ5IHsKLQkJCWlmIChpbi5yZWFkKCkgIT0gLTEpIHsKLQkJCQliYWRNc2cgPSAiRmFpbGVkIENhbGxiYWNrIFN0cmVhbSB0ZXN0LiBUb28gbXVjaCBkYXRhIHNlbnQuIjsgLy8kTk9OLU5MUy0xJAotCQkJCXN0b3BUZXN0KCk7CQkJCQotCQkJCXJldHVybjsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZXhwID0gZTsKLQkJfQotCQkKLQkJdGVzdFN1Y2Nlc2Z1bCA9IHRydWU7Ci0JCXN0b3BUZXN0KCk7Ci0JfQotCQotCXZvaWQgc3RvcFRlc3QoKSB7Ci0JCXN5bmNocm9uaXplZCh0ZXN0ZXIpIHsKLQkJCXRlc3RTdG9wcGVkID0gdHJ1ZTsKLQkJCXRlc3Rlci5ub3RpZnkoKTsKLQkJfQotCX0KLQkJCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L1Rlc3RTdGFuZGFyZC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdFN0YW5kYXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiODFiMzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvVGVzdFN0YW5kYXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvbW1vbi5BbWJpZ3VvdXNNZXRob2RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLQotLyoqCi0gKiBAYXV0aG9yIHJpY2hrdWxwCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFRlc3RTdGFuZGFyZCBleHRlbmRzIEFic3RyYWN0VGVzdFByb3h5IHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBUZXN0U3RhbmRhcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgVGVzdFN0YW5kYXJkKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPYmplY3QoKSB7Ci0JCUlCZWFuVHlwZVByb3h5IG9iamVjdFR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKG9iamVjdFR5cGUpOwotCQlhc3NlcnRGYWxzZShvYmplY3RUeXBlLmlzQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIG9iamVjdFR5cGUuZ2V0VHlwZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlT2YoKSB7Ci0JCUlCZWFuVHlwZVByb3h5IG9iamVjdFR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5PYmplY3QiKTsgLy8kTk9OLU5MUy0xJAkJCi0JCUlCZWFuVHlwZVByb3h5IGludGVnZXJUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoaW50ZWdlclR5cGUpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgaW50ZWdlclR5cGUuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoaW50ZWdlclR5cGUuaXNLaW5kT2Yob2JqZWN0VHlwZSkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJbnZva2UoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewkJCi0JCUlCZWFuVHlwZVByb3h5IGludGVnZXJUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkCQkKLQkJSU1ldGhvZFByb3h5IG10aGQgPSBpbnRlZ2VyVHlwZS5nZXRNZXRob2RQcm94eSgidmFsdWVPZiIsICJqYXZhLmxhbmcuU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhc3NlcnROb3ROdWxsKG10aGQpOwotCQkvLyBTZWUgaWYgd2UgY2FuIGludm9rZSBtZXRob2RzLgotCQlJSW50ZWdlckJlYW5Qcm94eSBhbkludCA9IChJSW50ZWdlckJlYW5Qcm94eSkgbXRoZC5pbnZva2UobnVsbCwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoIjUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChhbkludCk7Ci0JCWFzc2VydEVxdWFscyg1LCBhbkludC5pbnRWYWx1ZSgpKTsKLQkJLy8gU2VlIGlmIGludm9rZSB3aXRoIGJhZCB0eXBlIHRocm93cyB0aGUgRXhjZXB0aW9uUHJveHkuCi0JCXRyeSB7Ci0JCQltdGhkLmludm9rZShudWxsLCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCg1KSk7Ci0JCQlmYWlsKCJFeGNlcHRpb24gbm90IHRocm93biBsaWtlIGl0IHNob3VsZCBvZiBiZWVuLiIpOwotCQl9IGNhdGNoIChUaHJvd2FibGVQcm94eSBlKSB7Ci0JCQkvLyBXZSBzaG91bGQgb2YgZ290dG9uIHRoZSBleGNlcHRpb24uIFNlZSBpZiBpdCBpcyBvZiB0aGUgY29ycmVjdCB0eXBlLgotCQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiwgZS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9CQkJCQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludm9rZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIFRlY2huaWNhbGx5IGludm9rYWJsZXMgc2hvdWxkIGJlIHVzZWQgZm9yIG9uZS1zaG90IHVzYWdlLCBidXQgaGVyZSB0byB0ZXN0IHRoZSBpbnZva2UgY29ycmVjdGx5Ci0JCS8vIGl0IHdpbGwgYmUgdXNlZCB0d2ljZS4gVGhpcyBpcyBub3QgYW4gZXJyb3IsIGp1c3Qgb3ZlcmhlYWQuCi0JCUlCZWFuVHlwZVByb3h5IGludGVnZXJUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkCQkKLQkJSUludm9rYWJsZSBpbnZva2FibGUgPSBpbnRlZ2VyVHlwZS5nZXRJbnZva2FibGUoInZhbHVlT2YiLCAiamF2YS5sYW5nLlN0cmluZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0Tm90TnVsbChpbnZva2FibGUpOwotCQkvLyBTZWUgaWYgd2UgY2FuIGludm9rZSBtZXRob2RzLgotCQlJSW50ZWdlckJlYW5Qcm94eSBhbkludCA9IChJSW50ZWdlckJlYW5Qcm94eSkgaW52b2thYmxlLmludm9rZShudWxsLCBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgiNSIpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGFuSW50KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGFuSW50LmludFZhbHVlKCkpOwotCQkvLyBTZWUgaWYgaW52b2tlIHdpdGggYmFkIHR5cGUgdGhyb3dzIHRoZSBFeGNlcHRpb25Qcm94eS4KLQkJdHJ5IHsKLQkJCWludm9rYWJsZS5pbnZva2UobnVsbCwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoNSkpOwotCQkJZmFpbCgiRXhjZXB0aW9uIG5vdCB0aHJvd24gbGlrZSBpdCBzaG91bGQgb2YgYmVlbi4iKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJLy8gV2Ugc2hvdWxkIG9mIGdvdHRvbiB0aGUgZXhjZXB0aW9uLiBTZWUgaWYgaXQgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZS4KLQkJCWFzc2VydEVxdWFscygiamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIsIGUuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQkJCQkJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVJbml0U3RyaW5nKCkgdGhyb3dzIFRocm93YWJsZVByb3h5LCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCS8vIFNlZSBpZiB3ZSBjYW4gY3JlYXRlIGl0IGZyb20gYW4gaW5pdGlhbGl6YXRpb24gc3RyaW5nLgotCQlJSW50ZWdlckJlYW5Qcm94eSBhbkludCA9IChJSW50ZWdlckJlYW5Qcm94eSkgaW50ZWdlclR5cGUubmV3SW5zdGFuY2UoIm5ldyBqYXZhLmxhbmcuSW50ZWdlcig2KSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoYW5JbnQpOwotCQlhc3NlcnRFcXVhbHMoNiwgYW5JbnQuaW50VmFsdWUoKSk7Ci0KLQkJLy8gU2VlIGlmIHN0cmluZyBpbml0aWFsaXphdGlvbiB3b3Jrcy4KLQkJSVN0cmluZ0JlYW5Qcm94eSBhU3RyaW5nID0gKElTdHJpbmdCZWFuUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlN0cmluZyIpLm5ld0luc3RhbmNlKCJcImFiY2RcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYXNzZXJ0Tm90TnVsbChhU3RyaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYmNkIiwgYVN0cmluZy5zdHJpbmdWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29uc3RydWN0b3JzKCkgewotCQlJQmVhblR5cGVQcm94eSBzdHJpbmdUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQotCQkvLyBHZXQgYWxsIGNvbnN0cnVjdG9ycy4KLQkJSUNvbnN0cnVjdG9yUHJveHlbXSBjdG9ycyA9IHN0cmluZ1R5cGUuZ2V0Q29uc3RydWN0b3JzKCk7Ci0JCWFzc2VydE5vdE51bGwoY3RvcnMpOwotCQlpbnQgZXhwZWN0ZWRDdG9ycyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIiwiIikuc3RhcnRzV2l0aCgiMS41IikgPyAxMyA6IDExOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRDdG9ycywgY3RvcnMubGVuZ3RoKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWNsYXJlZENvbnN0cnVjdG9ycygpIHsKLQkJSUJlYW5UeXBlUHJveHkgdGVzdEFjY2Vzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCi0JCS8vIEdldCBhbGwgY29uc3RydWN0b3JzLgotCQlJQ29uc3RydWN0b3JQcm94eVtdIGN0b3JzID0gdGVzdEFjY2Vzc1R5cGUuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcnMoKTsKLQkJYXNzZXJ0Tm90TnVsbChjdG9ycyk7Ci0JCWFzc2VydEVxdWFscyg0LCBjdG9ycy5sZW5ndGgpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZUNvbnN0cnVjdG9yKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQotCQkvLyBTZWUgaWYgd2UgY2FuIGNyZWF0ZSBpdCBmcm9tIGEgY29uc3RydWN0b3IuCi0JCUlDb25zdHJ1Y3RvclByb3h5IGN0b3IgPSBpbnRlZ2VyVHlwZS5nZXRDb25zdHJ1Y3RvclByb3h5KG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5TdHJpbmcifSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChjdG9yKTsKLQkJSUludGVnZXJCZWFuUHJveHkgYW5JbnQgPSAoSUludGVnZXJCZWFuUHJveHkpIGN0b3IubmV3SW5zdGFuY2UobmV3IElCZWFuUHJveHlbXSB7cHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoIjAiKX0pOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygwLCBhbkludC5pbnRWYWx1ZSgpKTsKLQkJCQkJCQotCQkvLyBaZXJvIGlzIGNhY2hlZCwgbGV0J3Mgc2VlIGlmIHRoYXQgaXMgd2hhdCB3ZSBnb3QgYWJvdmUuCi0JCUlJbnRlZ2VyQmVhblByb3h5IGFaZXJvID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IEludGVnZXIoMCkpOwotCQlhc3NlcnRTYW1lKGFuSW50LCBhWmVybyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZURlY2xhcmVkQ29uc3RydWN0b3IoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSB0ZXN0QWNjZXNzVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkKLQkJLy8gU2VlIGlmIHdlIGNhbiBnZXQgYSBwcml2YXRlIGNvbnN0cnVjdG9yLgotCQlJQ29uc3RydWN0b3JQcm94eSBjdG9yID0gdGVzdEFjY2Vzc1R5cGUuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclByb3h5KG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIn0pOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoY3Rvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZVJldHVybigpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IGludGVnZXJUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkKLQkJLy8gU2VlIHRoYXQgd2UgZ2V0IGEgcHJpbWl0aXZlIGJhY2sgd2hlbiB0aGUgbWV0aG9kIHJldHVybiB0eXBlIGlzIGEgcHJpbWl0aXZlLgotCQlJTWV0aG9kUHJveHkgbXRoZFByaW0gPSBpbnRlZ2VyVHlwZS5nZXRNZXRob2RQcm94eSgiaW50VmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQlJSW50ZWdlckJlYW5Qcm94eSBhbkludCA9IChJSW50ZWdlckJlYW5Qcm94eSkgbXRoZFByaW0uaW52b2tlKHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBhbkludC5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoNSwgYW5JbnQuaW50VmFsdWUoKSk7Ci0JCQotCQkvLyBTZWUgdGhhdCB3ZSBnZXQgYSBwcmltaXRpdmUgYmFjayB3aGVuIHRoZSBmaWVsZCBpcyBhIHByaW1pdGl2ZS4KLQkJSUZpZWxkUHJveHkgZmllbGRQcmltID0gaW50ZWdlclR5cGUuZ2V0RmllbGRQcm94eSgiTUlOX1ZBTFVFIik7IC8vJE5PTi1OTFMtMSQKLQkJYW5JbnQgPSAoSUludGVnZXJCZWFuUHJveHkpIGZpZWxkUHJpbS5nZXQobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgYW5JbnQuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIuTUlOX1ZBTFVFLCBhbkludC5pbnRWYWx1ZSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVBcnJheVR5cGUoKSB7Ci0JCS8vIFRlc3QgUHJpbWl0aXZlIGFycmF5cy4KLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJbSSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoYXJyYXlUeXBlKTsKLQkJYXNzZXJ0VHJ1ZShhcnJheVR5cGUuaXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbSSIsIGFycmF5VHlwZS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJpbnQiKSwgYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9iamVjdEFycmF5VHlwZSgpIHsKLQkJLy8gVGVzdCBzaW1wbGUgb2JqZWN0IHR5cGUgYXJyYXkKLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJbTGphdmEubGFuZy5JbnRlZ2VyOyIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoYXJyYXlUeXBlKTsKLQkJYXNzZXJ0VHJ1ZShhcnJheVR5cGUuaXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbTGphdmEubGFuZy5JbnRlZ2VyOyIsIGFycmF5VHlwZS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpLCBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmUyREFycmF5VHlwZSgpIHsKLQkJLy8gVGVzdCB0d28gZGltZW5zaW9uIHByaW1pdGl2ZSBhcnJheQotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoIltbSSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoYXJyYXlUeXBlKTsKLQkJYXNzZXJ0VHJ1ZShhcnJheVR5cGUuaXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0kiLCBhcnJheVR5cGUuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiW0kiKSwgYXJyYXlUeXBlLmdldENvbXBvbmVudFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIFRlc3QgY29uc3RydWN0aW9uIHVzaW5nIGFjY2Vzc29yLgotCQlhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJpbnQiLCAyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGFycmF5VHlwZSk7Ci0JCWFzc2VydFRydWUoYXJyYXlUeXBlLmlzQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscygiW1tJIiwgYXJyYXlUeXBlLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPYmplY3QyREFycmF5VHlwZSgpIHsKLQkJLy8gVGVzdCB0d28gZGltZW5zaW9uIG9iamVjdCB0eXBlIGFycmF5Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiW1tMamF2YS5sYW5nLkludGVnZXI7Iik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChhcnJheVR5cGUpOwotCQlhc3NlcnRUcnVlKGFycmF5VHlwZS5pc0FycmF5KCkpOwotCQlhc3NlcnRFcXVhbHMoIltbTGphdmEubGFuZy5JbnRlZ2VyOyIsIGFycmF5VHlwZS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMocHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJbTGphdmEubGFuZy5JbnRlZ2VyOyIpLCBhcnJheVR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gVGVzdCBnZXQgdHlwZSB1c2luZyBhY2Nlc3Nvci4KLQkJYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiLCAyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGFycmF5VHlwZSk7Ci0JCWFzc2VydFRydWUoYXJyYXlUeXBlLmlzQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscygiW1tMamF2YS5sYW5nLkludGVnZXI7IiwgYXJyYXlUeXBlLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFycmF5VHlwZUZyb21BcnJheVR5cGUoKSB7Ci0JCS8vIFRlc3QgY3JlYXRpbmcgYW4gYXJyYXkgdHlwZSBmcm9tIGFuIGFycmF5IHR5cGUsIGkuZS4gYWRkaW5nIGRpbWVuc2lvbnMuCi0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiW0xqYXZhLmxhbmcuSW50ZWdlcjsiLCAyKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGFycmF5VHlwZSk7Ci0JCWFzc2VydFRydWUoYXJyYXlUeXBlLmlzQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscygiW1tbTGphdmEubGFuZy5JbnRlZ2VyOyIsIGFycmF5VHlwZS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlGcm9tQWNjZXNzb3JTaW1wbGVUeXBlKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQotCQkvLyBUZXN0IGNyZWF0aW5nIGFuIGFycmF5IHdpdGggYWNjZXNzb3Igb2YgbW9yZSB0aGFuIG9uZSBkaW1lbnNpb24gd2l0aCBjb21wb25lbnQgdHlwZSBub3QgYW4gYXJyYXkuCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheVByb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoaW50ZWdlclR5cGUsIG5ldyBpbnRbXSB7MywgNH0pOwotCQlhc3NlcnROb3ROdWxsKGFycmF5UHJveHkpOwotCQlhc3NlcnRFcXVhbHMoIltbTGphdmEubGFuZy5JbnRlZ2VyOyIsIGFycmF5UHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDMsIGFycmF5UHJveHkuZ2V0TGVuZ3RoKCkpOwotCQkKLQkJLy8gZ2V0KDApIHNob3VsZCBiZSBhbiBJbnRlZ2VyWzRdLgotCQlhcnJheVByb3h5ID0gKElBcnJheUJlYW5Qcm94eSkgYXJyYXlQcm94eS5nZXQoMCk7Ci0JCWFzc2VydE5vdE51bGwoYXJyYXlQcm94eSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhcnJheVByb3h5LmdldExlbmd0aCgpKTsJCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUZyb21BY2Nlc3NvckFycmF5VHlwZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJLy8gVGVzdCBjcmVhdGluZyBhbiBhcnJheSB3aXRoIGFjY2Vzc29yIGJ1dCBjb21wb25lbnQgdHlwZSBpcyBhbiBhcnJheS4JCQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgbmV3IGludFtdIHsxfSk7Ci0JCWFzc2VydE5vdE51bGwoYXJyYXlQcm94eSk7Ci0JCWFzc2VydEVxdWFscygiW0xqYXZhLmxhbmcuSW50ZWdlcjsiLCBhcnJheVByb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygxLCBhcnJheVByb3h5LmdldExlbmd0aCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFycmF5RnJvbUFjY2Vzc29yQXJyYXlUeXBlTXVsdGlEaW0oKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBUZXN0IGNyZWF0aW5nIGFuIGFycmF5IHdpdGggYWNjZXNzb3IgYnV0IGNvbXBvbmVudCB0eXBlIGlzIGFuIGFycmF5LCBidXQgZXh0ZW5kIGFuZCBhZGQgYSBkaW1lbnNpb24uCQkKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIG5ldyBpbnRbXSB7MiAsM30pOwotCQlhc3NlcnROb3ROdWxsKGFycmF5UHJveHkpOwotCQlhc3NlcnRFcXVhbHMoIltbTGphdmEubGFuZy5JbnRlZ2VyOyIsIGFycmF5UHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDIsIGFycmF5UHJveHkuZ2V0TGVuZ3RoKCkpOwotCi0JCS8vIFRlc3QgZmlyc3QgZW50cnkgaXMgYW4gSW50ZWdlclszXQkJCi0JCUlBcnJheUJlYW5Qcm94eSBpZHgxID0gKElBcnJheUJlYW5Qcm94eSkgYXJyYXlQcm94eS5nZXQoMCk7Ci0JCWFzc2VydE5vdE51bGwoaWR4MSk7Ci0JCWFzc2VydEVxdWFscygzLCBpZHgxLmdldExlbmd0aCgpKTsKLQkJCi0JCS8vIFRlc3QgWzFdWzJdIGlzIG51bGwuCi0JCUlCZWFuUHJveHkgaWR4MiA9IGFycmF5UHJveHkuZ2V0KG5ldyBpbnQgW10gezEsMn0pOwotCQlhc3NlcnROdWxsKGlkeDIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlTZXQoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblByb3h5IGFuSW50ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IGphdmEubGFuZy5JbnRlZ2VyKDIzKSk7Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIG5ldyBpbnRbXSB7MiAsM30pOwotCQlhc3NlcnROb3ROdWxsKGFycmF5UHJveHkpOwotCQlhc3NlcnRFcXVhbHMoIltbTGphdmEubGFuZy5JbnRlZ2VyOyIsIGFycmF5UHJveHkuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKDIsIGFycmF5UHJveHkuZ2V0TGVuZ3RoKCkpOwotCi0JCS8vIFRlc3QgZmlyc3QgZW50cnkgaXMgYW4gSW50ZWdlclszXQkJCi0JCUlBcnJheUJlYW5Qcm94eSBpZHgxID0gKElBcnJheUJlYW5Qcm94eSkgYXJyYXlQcm94eS5nZXQoMCk7Ci0JCQotCQkvLyBUZXN0IHNldCBpbnRvIGFycmF5IGlkeDEsIGJ1dCByZXRyaWV2ZSBmcm9tIGFycmF5UHJveHkuIFRlc3RzCi0JCS8vICAgMSkgU2V0IHdpdGggb25lIGluZGV4IGludG8gYXJyYXkgZnJvbSBvdXRlciBhcnJheVswXQotCQkvLyAgIDIpIEdldCB3aXRoIG11bHRpIGluZGV4IGZyb20gb3V0ZXIgYXJyYXkKLQkJLy8gICAzKSBBbmQgdGhhdCB0aGUgc2FtZSBhcnJheSBpcyBzZXQgdGhhdCBleGlzdHMgd2l0aGluIHRoZSBmaXJzdCBhcnJheS4KLQkJaWR4MS5zZXQoYW5JbnQsIDIpOwotCQlJQmVhblByb3h5IGlkeDMgPSBhcnJheVByb3h5LmdldChuZXcgaW50W10gezAsIDJ9KTsKLQkJYXNzZXJ0Tm90TnVsbChpZHgzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGlkeDMuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKGFuSW50LCBpZHgzKTsKLQkJCi0JCS8vIEludmVyc2UgdGVzdCBvZiBhYm92ZSwgbXVsdGkgc2V0LCBzaW5nbGUgZ2V0IG9mIHNhbWUgYXJyYXkuCi0JCWFycmF5UHJveHkuc2V0KGFuSW50LCBuZXcgaW50W10gezAsMX0pOwotCQlhc3NlcnRFcXVhbHMoYW5JbnQsIGlkeDEuZ2V0KDEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlTbmFwc2hvdDJEaW1BcnJheSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiLCAyKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIG5ldyBpbnRbXSB7MiwgM30pOwotCQlhc3NlcnROb3ROdWxsKGFycmF5UHJveHkpOwotCi0JCS8vIEdldCB0aGUgdHdvIGVudHJpZXMgd2hpY2ggYXJlIEludGVnZXJbM10JCQotCQlJQXJyYXlCZWFuUHJveHkgaWR4MCA9IChJQXJyYXlCZWFuUHJveHkpIGFycmF5UHJveHkuZ2V0KDApOwotCQlJQXJyYXlCZWFuUHJveHkgaWR4MSA9IChJQXJyYXlCZWFuUHJveHkpIGFycmF5UHJveHkuZ2V0KDEpOwotCQkKLQkJLy8gTm93IGdldCB0aGUgc25hcHNob3QgYW5kIHNlZSBpZiB0aGUgZW50cmllcyBhcmUgaWR4MCBhbmQgaWR4MS4KLQkJSUJlYW5Qcm94eVtdIHNuYXBzaG90ID0gYXJyYXlQcm94eS5nZXRTbmFwc2hvdCgpOwotCQlhc3NlcnRFcXVhbHMoaWR4MCwgc25hcHNob3RbMF0pOwotCQlhc3NlcnRFcXVhbHMoaWR4MSwgc25hcHNob3RbMV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheVNuYXBzaG90UHJpbWl0aXZlQXJyYXkoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImludCIsIDEpOyAvLyROT04tTkxTLTEkCi0JCQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgbmV3IGludFtdIHsyfSk7Ci0JCWFzc2VydE5vdE51bGwoYXJyYXlQcm94eSk7Ci0KLQkJLy8gU2V0IHRoZSB0d28gZW50cmllcyB0byBpbnQgdmFsdWVzLgotCQlhcnJheVByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgyKSwgMCk7Ci0JCWFycmF5UHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDMpLCAxKTsKLQkJSUludGVnZXJCZWFuUHJveHkgaWR4MCA9IChJSW50ZWdlckJlYW5Qcm94eSkgYXJyYXlQcm94eS5nZXQoMCk7Ci0JCUlJbnRlZ2VyQmVhblByb3h5IGlkeDEgPSAoSUludGVnZXJCZWFuUHJveHkpIGFycmF5UHJveHkuZ2V0KDEpOwotCQlhc3NlcnRFcXVhbHMoMiwgaWR4MC5pbnRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlkeDEuaW50VmFsdWUoKSk7Ci0JCQotCQkvLyBOb3cgZ2V0IHRoZSBzbmFwc2hvdCBhbmQgc2VlIGlmIHRoZSBlbnRyaWVzIGFyZSBpZHgwIGFuZCBpZHgxLgotCQlJQmVhblByb3h5W10gc25hcHNob3QgPSBhcnJheVByb3h5LmdldFNuYXBzaG90KCk7Ci0JCWFzc2VydEVxdWFscyhpZHgwLCBzbmFwc2hvdFswXSk7Ci0JCWFzc2VydEVxdWFscyhpZHgxLCBzbmFwc2hvdFsxXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QXJyYXkoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDcmVhdGUgYW4gZW1wdHkgb25lIGRpbWVuc2lvbmFsIGFycmF5CQkKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIG51bGwpOwotCQlhc3NlcnROb3ROdWxsKGFycmF5UHJveHkpOwotCQlhc3NlcnRFcXVhbHMoIltMamF2YS5sYW5nLkludGVnZXI7IiwgYXJyYXlQcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoMCwgYXJyYXlQcm94eS5nZXRMZW5ndGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eTJEQXJyYXkoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQkvLyBDcmVhdGUgYW4gZW10cHkgdHdvIGRpbWVuc2lvbmFsIGFycmF5CQkKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIiwgMiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoYXJyYXlQcm94eSk7Ci0JCWFzc2VydEVxdWFscygiW1tMamF2YS5sYW5nLkludGVnZXI7IiwgYXJyYXlQcm94eS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoMCwgYXJyYXlQcm94eS5nZXRMZW5ndGgoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDJEQXJyYXkoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQkvLyBDcmVhdGUgYSAyRCBhcnJheSB3aXRoIHRocmVlIGVtcHR5IGVudHJpZXMgaW4gZGltIDAuIAotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLkludGVnZXIiLCAyKSwgMyk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChhcnJheVByb3h5KTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0xqYXZhLmxhbmcuSW50ZWdlcjsiLCBhcnJheVByb3h5LmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscygzLCBhcnJheVByb3h5LmdldExlbmd0aCgpKTsKLQkJLy8gQXJyYXkgZW50cnkgc2hvdWxkIGJlIGVtcHR5LgotCQlJQXJyYXlCZWFuUHJveHkgaWR4MSA9IChJQXJyYXlCZWFuUHJveHkpIGFycmF5UHJveHkuZ2V0KDApOwotCQlhc3NlcnROdWxsKGlkeDEpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVBcnJheSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIE1ha2Ugc3VyZSB0aGF0IGlmIHRoZSBmaW5hbCBjb21wb25lbnQgdHlwZSBpcyBhbgotCQkvLyBpbnQgKHByaW1pdGl2ZSkgdGhhdCB3ZSBnZXQgYSBwcmltaXRpdmUgcHJveHkgYmFjayBhbmQgbm90IGFuIEludGVnZXIgb2JqZWN0LgkJCi0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiaW50IiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheVByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCg0NCksIDEpOwotCQlJQmVhblByb3h5IGlkeDEgPSBhcnJheVByb3h5LmdldCgxKTsKLQkJYXNzZXJ0Tm90TnVsbChpZHgxKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBpZHgxLmdldFR5cGVQcm94eSgpLmdldFR5cGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydEVxdWFscyg0NCwgKChJSW50ZWdlckJlYW5Qcm94eSkgaWR4MSkuaW50VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUVxdWFscygpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCS8vIFRlc3QgdGhhdCBhcnJheSBlcXVhbHMgd29ya3MgKGRvZXMgc2VtYW50aWMgZXF1YWxzIGFuZCBub3QgaWRlbnRpdHkgZXF1YWxzKS4KLQkJcHJpbUludEVxdWFscygpOwotCQlwcmltQm9vbEVxdWFscygpOwotCQlwcmltQnl0ZUVxdWFscygpOwotCQlwcmltU2hvcnRFcXVhbHMoKTsKLQkJcHJpbUNoYXJFcXVhbHMoKTsKLQkJcHJpbURvdWJsZUVxdWFscygpOwotCQlwcmltRmxvYXRFcXVhbHMoKTsKLQkJcHJpbUxvbmdFcXVhbHMoKTsKLQkJb2JqZWN0RXF1YWxzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcmltSW50RXF1YWxzKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJpbnQiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgMyk7Ci0JCWFycmF5UHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDQ0KSwgMSk7Ci0KLQkJSUFycmF5QmVhblByb3h5IGFycmF5MlByb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoYXJyYXlUeXBlLCAzKTsKLQkJYXJyYXkyUHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDQ0KSwgMSk7Ci0KLQkJYXNzZXJ0VHJ1ZShhcnJheVByb3h5LmVxdWFscyhhcnJheTJQcm94eSkpOwotCQkKLQkJLy8gY2hhbmdlIHRoZSB2YWx1ZSBvZiBvbmUgc28gbm93IGRpZmZlcmVudC4KLQkJYXJyYXkyUHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDU1KSwgMSk7Ci0JCWFzc2VydEZhbHNlKGFycmF5UHJveHkuZXF1YWxzKGFycmF5MlByb3h5KSk7Ci0JCQotCQkvLyBPbmUgc2lkZSB0ZXN0IHRoYXQgaWYgbm90IGNvbXBhdGlibGUgaXQgc2hvdWxkIGJlIGZhbHNlLgotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5M1R5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJsb25nIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJSUFycmF5QmVhblByb3h5IGFycmF5M1Byb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoYXJyYXkzVHlwZSwgMyk7Ci0JCWFycmF5M1Byb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCg0NGwpLCAxKTsKLQkJYXNzZXJ0RmFsc2UoYXJyYXlQcm94eS5lcXVhbHMoYXJyYXkzUHJveHkpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByaW1Cb29sRXF1YWxzKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJib29sZWFuIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheVByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCh0cnVlKSwgMSk7Ci0KLQkJSUFycmF5QmVhblByb3h5IGFycmF5MlByb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoYXJyYXlUeXBlLCAzKTsKLQkJYXJyYXkyUHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHRydWUpLCAxKTsKLQotCQlhc3NlcnRUcnVlKGFycmF5UHJveHkuZXF1YWxzKGFycmF5MlByb3h5KSk7Ci0JCQotCQkvLyBjaGFuZ2UgdGhlIHZhbHVlIG9mIG9uZSBzbyBub3cgZGlmZmVyZW50LgotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoZmFsc2UpLCAxKTsKLQkJYXNzZXJ0RmFsc2UoYXJyYXlQcm94eS5lcXVhbHMoYXJyYXkyUHJveHkpKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmltQnl0ZUVxdWFscygpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlBcnJheUJlYW5UeXBlUHJveHkgYXJyYXlUeXBlID0gKElBcnJheUJlYW5UeXBlUHJveHkpIHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiYnl0ZSIsIDEpOyAvLyROT04tTkxTLTEkCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheVByb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoYXJyYXlUeXBlLCAzKTsKLQkJYXJyYXlQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoKGJ5dGUpIDMpLCAxKTsKLQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkyUHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoKGJ5dGUpIDMpLCAxKTsKLQotCQlhc3NlcnRUcnVlKGFycmF5UHJveHkuZXF1YWxzKGFycmF5MlByb3h5KSk7Ci0JCQotCQkvLyBjaGFuZ2UgdGhlIHZhbHVlIG9mIG9uZSBzbyBub3cgZGlmZmVyZW50LgotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoKGJ5dGUpIDQpLCAxKTsKLQkJYXNzZXJ0RmFsc2UoYXJyYXlQcm94eS5lcXVhbHMoYXJyYXkyUHJveHkpKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmltU2hvcnRFcXVhbHMoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInNob3J0IiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheVByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgoc2hvcnQpIDMpLCAxKTsKLQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkyUHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoKHNob3J0KSAzKSwgMSk7Ci0KLQkJYXNzZXJ0VHJ1ZShhcnJheVByb3h5LmVxdWFscyhhcnJheTJQcm94eSkpOwotCQkKLQkJLy8gY2hhbmdlIHRoZSB2YWx1ZSBvZiBvbmUgc28gbm93IGRpZmZlcmVudC4KLQkJYXJyYXkyUHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKChzaG9ydCkgNCksIDEpOwotCQlhc3NlcnRGYWxzZShhcnJheVByb3h5LmVxdWFscyhhcnJheTJQcm94eSkpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW1DaGFyRXF1YWxzKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJjaGFyIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheVByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgnYScpLCAxKTsKLQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkyUHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoJ2EnKSwgMSk7Ci0KLQkJYXNzZXJ0VHJ1ZShhcnJheVByb3h5LmVxdWFscyhhcnJheTJQcm94eSkpOwotCQkKLQkJLy8gY2hhbmdlIHRoZSB2YWx1ZSBvZiBvbmUgc28gbm93IGRpZmZlcmVudC4KLQkJYXJyYXkyUHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKCdiJyksIDEpOwotCQlhc3NlcnRGYWxzZShhcnJheVByb3h5LmVxdWFscyhhcnJheTJQcm94eSkpOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBwcmltRG91YmxlRXF1YWxzKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJkb3VibGUiLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgMyk7Ci0JCWFycmF5UHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDQuM2QpLCAxKTsKLQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkyUHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoNC4zZCksIDEpOwotCi0JCWFzc2VydFRydWUoYXJyYXlQcm94eS5lcXVhbHMoYXJyYXkyUHJveHkpKTsKLQkJCi0JCS8vIGNoYW5nZSB0aGUgdmFsdWUgb2Ygb25lIHNvIG5vdyBkaWZmZXJlbnQuCi0JCWFycmF5MlByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgxMGQpLCAxKTsKLQkJYXNzZXJ0RmFsc2UoYXJyYXlQcm94eS5lcXVhbHMoYXJyYXkyUHJveHkpKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBwcmltRmxvYXRFcXVhbHMoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImZsb2F0IiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJSUFycmF5QmVhblByb3h5IGFycmF5UHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheVByb3h5LnNldChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCg0LjNmKSwgMSk7Ci0KLQkJSUFycmF5QmVhblByb3h5IGFycmF5MlByb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoYXJyYXlUeXBlLCAzKTsKLQkJYXJyYXkyUHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDQuM2YpLCAxKTsKLQotCQlhc3NlcnRUcnVlKGFycmF5UHJveHkuZXF1YWxzKGFycmF5MlByb3h5KSk7Ci0JCQotCQkvLyBjaGFuZ2UgdGhlIHZhbHVlIG9mIG9uZSBzbyBub3cgZGlmZmVyZW50LgotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMTBmKSwgMSk7Ci0JCWFzc2VydEZhbHNlKGFycmF5UHJveHkuZXF1YWxzKGFycmF5MlByb3h5KSk7CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbUxvbmdFcXVhbHMoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQXJyYXlCZWFuVHlwZVByb3h5IGFycmF5VHlwZSA9IChJQXJyYXlCZWFuVHlwZVByb3h5KSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImxvbmciLCAxKTsgLy8kTk9OLU5MUy0xJAotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlQcm94eSA9IHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKGFycmF5VHlwZSwgMyk7Ci0JCWFycmF5UHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDFsKSwgMSk7Ci0KLQkJSUFycmF5QmVhblByb3h5IGFycmF5MlByb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoYXJyYXlUeXBlLCAzKTsKLQkJYXJyYXkyUHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDFsKSwgMSk7Ci0KLQkJYXNzZXJ0VHJ1ZShhcnJheVByb3h5LmVxdWFscyhhcnJheTJQcm94eSkpOwotCQkKLQkJLy8gY2hhbmdlIHRoZSB2YWx1ZSBvZiBvbmUgc28gbm93IGRpZmZlcmVudC4KLQkJYXJyYXkyUHJveHkuc2V0KHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKDJsKSwgMSk7Ci0JCWFzc2VydEZhbHNlKGFycmF5UHJveHkuZXF1YWxzKGFycmF5MlByb3h5KSk7CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb2JqZWN0RXF1YWxzKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUFycmF5QmVhblR5cGVQcm94eSBhcnJheVR5cGUgPSAoSUFycmF5QmVhblR5cGVQcm94eSkgcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIsIDEpOyAvLyROT04tTkxTLTEkCi0JCUlBcnJheUJlYW5Qcm94eSBhcnJheVByb3h5ID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoYXJyYXlUeXBlLCAzKTsKLQkJYXJyYXlQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IEludGVnZXIoMSkpLCAxKTsKLQotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXkyUHJveHkgPSBwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aChhcnJheVR5cGUsIDMpOwotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IEludGVnZXIoMSkpLCAxKTsKLQotCQlhc3NlcnRUcnVlKGFycmF5UHJveHkuZXF1YWxzKGFycmF5MlByb3h5KSk7Ci0JCQotCQkvLyBjaGFuZ2UgdGhlIHZhbHVlIG9mIG9uZSBzbyBub3cgZGlmZmVyZW50LgotCQlhcnJheTJQcm94eS5zZXQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IEludGVnZXIoMikpLCAxKTsKLQkJYXNzZXJ0RmFsc2UoYXJyYXlQcm94eS5lcXVhbHMoYXJyYXkyUHJveHkpKTsJCQotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25zKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgdmVjdG9yVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS51dGlsLlZlY3RvciIpOyAvLyROT04tTkxTLTEkCi0JCUlCZWFuUHJveHkgdmVjdG9yUHJveHkgPSB2ZWN0b3JUeXBlLm5ld0luc3RhbmNlKCk7Ci0JCUNvbGxlY3Rpb25CZWFuUHJveHlXcmFwcGVyIGNvbCA9IG5ldyBDb2xsZWN0aW9uQmVhblByb3h5V3JhcHBlcih2ZWN0b3JQcm94eSk7Ci0JCQotCQkvLyBUZXN0IGFkZGluZwotCQlhc3NlcnRUcnVlKGNvbC5hZGQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMzMpKSk7Ci0JCWFzc2VydEVxdWFscygxLCBjb2wuc2l6ZSgpKTsKLQkJCQotCQkvLyBUZXN0IHRvQXJyYXksIGZpcnN0IGVudHJ5IHNob3VsZCBiZSAzMyBhbmQgbGVuZ3RoIHNob3VsZCBiZSAxLgotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlPdXQgPSBjb2wudG9BcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXJyYXlPdXQuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMzMsICgoSUludGVnZXJCZWFuUHJveHkpIGFycmF5T3V0LmdldCgwKSkuaW50VmFsdWUoKSk7Ci0JCQotCQkvLyBUZXN0IHRvQXJyYXkoYXJyYXkpLgotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlJbnRvID0gcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoYXJyYXlPdXQuZ2V0VHlwZVByb3h5KCksIGFycmF5T3V0LmdldExlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQlJQXJyYXlCZWFuUHJveHkgYXJyYXlPdXQyID0gY29sLnRvQXJyYXkoYXJyYXlJbnRvKTsKLQkJLy8gSXQgc2hvdWxkIG9mIGJlZW4gdGhlIGV4YWN0IHNhbWUgYXJyYXkgKGFycmF5SW50byA9PSBhcnJheU91dDIgdW5kZXIgdGhlIHByb3hpZXMpLgotCQlhc3NlcnRUcnVlKGFycmF5SW50by5zYW1lQXMoYXJyYXlPdXQyKSk7Ci0JCWFzc2VydEVxdWFscygzMywgKChJSW50ZWdlckJlYW5Qcm94eSkgYXJyYXlPdXQuZ2V0KDApKS5pbnRWYWx1ZSgpKTsKLQkJCi0JCS8vIFRlc3Qgc2V0dGluZyB3aXRoIHdyb25nIHR5cGUgdGhyb3dzIGV4Y2VwdGlvbi4KLQkJdHJ5IHsKLQkJCS8vIFRlc3QgdGhlIHNldHRpbmcgd2l0aCB3cm9uZyB0eXBlIHRocm93cyBhbiBleGNlcHRpb24KLQkJCWNvbCA9IG5ldyBDb2xsZWN0aW9uQmVhblByb3h5V3JhcHBlcihhcnJheU91dCk7Ci0JCQlmYWlsKCJDbGFzc0Nhc3RFeGNlcHRpb24gc2hvdWxkIG9mIGJlZW4gdGhyb3duLiIpOwotCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJLy8gSWYgaGVyZSwgdGhlbiB0aGUgdGVzdCB3YXMgcGFzc2VkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgdmVjdG9yVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS51dGlsLlZlY3RvciIpOyAvLyROT04tTkxTLTEkCi0JCUlCZWFuUHJveHkgdmVjdG9yUHJveHkgPSB2ZWN0b3JUeXBlLm5ld0luc3RhbmNlKCk7Ci0JCUNvbGxlY3Rpb25CZWFuUHJveHlXcmFwcGVyIGNvbCA9IG5ldyBDb2xsZWN0aW9uQmVhblByb3h5V3JhcHBlcih2ZWN0b3JQcm94eSk7Ci0JCWNvbC5hZGQocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgoMzMpKTsJCQotCQkKLQkJLy8gU2VlIGlmIHRoZSBpdGVyYXRvciBpbnRlcmZhY2Ugd29ya3MuCi0JCUl0ZXJhdG9yQmVhblByb3h5V3JhcHBlciBpdHJQcm94eSA9IGNvbC5pdGVyYXRvcigpOwotCQlhc3NlcnROb3ROdWxsKGl0clByb3h5KTsKLQkJaW50IGl0ZXJhdGlvbnMgPSAwOwotCQl3aGlsZSAoaXRyUHJveHkuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRpb25zKys7Ci0JCQlhc3NlcnRUcnVlKGl0ZXJhdGlvbnMgPCAyKTsKLQkJCUlCZWFuUHJveHkgaXRyVmFsdWUgPSBpdHJQcm94eS5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoMzMsICgoSUludGVnZXJCZWFuUHJveHkpIGl0clZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEludGVyZmFjZSgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IHZlY3RvclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEudXRpbC5WZWN0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlJQmVhblByb3h5IHZlY3RvclByb3h5ID0gdmVjdG9yVHlwZS5uZXdJbnN0YW5jZSgpOwotCQkKLQkJLy8gU2VlIGlmIHRoZSBsaXN0IGludGVmYWNlIHdvcmtzLgotCQlMaXN0QmVhblByb3h5V3JhcHBlciBsaXN0ID0gbmV3IExpc3RCZWFuUHJveHlXcmFwcGVyKHZlY3RvclByb3h5KTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmFkZChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgzMykpKTsJLy8gRmlyc3QgZW50cnkuCi0JCWxpc3QuYWRkKDAsIHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKHRydWUpKTsJLy8gTm93IGJlY29tZXMgZmlyc3QgZW50cnkuCi0JCWFzc2VydEVxdWFscygyLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCAoKElCb29sZWFuQmVhblByb3h5KSBsaXN0LmdldCgwKSkuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMzMsICgoSUludGVnZXJCZWFuUHJveHkpIGxpc3QuZ2V0KDEpKS5pbnRWYWx1ZSgpKTsJLy8gU3dhcHBlZCB0byBzZWNvbmQgZW50cnkgZHVlIHRvIGFkZCgwLC4uLikJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgdmVjdG9yVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS51dGlsLlZlY3RvciIpOyAvLyROT04tTkxTLTEkCi0JCUlCZWFuUHJveHkgdmVjdG9yUHJveHkgPSB2ZWN0b3JUeXBlLm5ld0luc3RhbmNlKCk7Ci0JCUxpc3RCZWFuUHJveHlXcmFwcGVyIGxpc3QgPSBuZXcgTGlzdEJlYW5Qcm94eVdyYXBwZXIodmVjdG9yUHJveHkpOwotCQlsaXN0LmFkZChwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgzMykpOwkvLyBGaXJzdCBlbnRyeS4KLQkJbGlzdC5hZGQoMCwgcHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgodHJ1ZSkpOwkvLyBOb3cgYmVjb21lcyBmaXJzdCBlbnRyeS4KLQotCQkvLyBTZWUgaWYgdGhlIExpc3RJdGVyYXRvciBpbnRlcmZhY2Ugd29ya3MKLQkJTGlzdEl0ZXJhdG9yQmVhblByb3h5V3JhcHBlciBsSXRyUHJveHkgPSBsaXN0Lmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnROb3ROdWxsKGxJdHJQcm94eSk7Ci0JCWFzc2VydFRydWUobEl0clByb3h5Lmhhc05leHQoKSk7Ci0JCUlCb29sZWFuQmVhblByb3h5IGJvb2wxID0gKElCb29sZWFuQmVhblByb3h5KSBsSXRyUHJveHkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYm9vbDEuYm9vbGVhblZhbHVlKCkpOwotCQlJSW50ZWdlckJlYW5Qcm94eSBpbnQxID0gKElJbnRlZ2VyQmVhblByb3h5KSBsSXRyUHJveHkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoMzMsIGludDEuaW50VmFsdWUoKSk7CS8vIE9sZCBmaXJzdCBlbnRyeSBtb3ZlZCB0byBzZWNvbmQgZW50cnkgYnkgYWRkKDAsLi4uKSBhYm92ZS4KLQkJYXNzZXJ0RmFsc2UobEl0clByb3h5Lmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBsSXRyUHJveHkucHJldmlvdXNJbmRleCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZEFjY2Vzc29ycygpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IGludGVnZXJUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkKLQkJLy8gVGVzdCBhYmxlIHRvIGFjY2VzcyBiZWFudHlwZSBwcm94eSBhbmQgaW52b2tlIG1ldGhvZHMgb24gaXQuIFRoaXMgaXNuJ3QKLQkJLy8gdGhlIGFwcHJvdmVkIHdheSBvZiBnZXR0aW5nIG1ldGhvZHMsIGJ1dCBpdCB0ZXN0cyB0aGF0IG1ldGhvZCBwcm94aWVzCi0JCS8vIGFyZSBjcmVhdGVkIGNvcnJlY3RseSBpZiByZXR1cm5lZCBmcm9tIGFuIGludm9rZSBtZXRob2QuCi0JCUlCZWFuVHlwZVByb3h5IGNsYXNzVHlwZVByb3h5ID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlJTWV0aG9kUHJveHkgZ2V0TWV0aG9kTWV0aG9kID0gY2xhc3NUeXBlUHJveHkuZ2V0TWV0aG9kUHJveHkoImdldE1ldGhvZCIsIG5ldyBTdHJpbmdbXSB7ImphdmEubGFuZy5TdHJpbmciLCAiW0xqYXZhLmxhbmcuQ2xhc3M7In0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkvLyBHZXQgdGhlIEludGVnZXIuYnl0ZVZhbHVlKCkgbWV0aG9kIHRocm91Z2ggYW4gaW52b2tlIGluc3RlYWQgb2YgYSBtZXRob2QgZmFjdG9yeSBvciBiZWFuIHR5cGUuCi0JCUlCZWFuUHJveHkgbWV0aG9kID0gZ2V0TWV0aG9kTWV0aG9kLmludm9rZShpbnRlZ2VyVHlwZSwgbmV3IElCZWFuUHJveHlbXSB7Ci0JCQlwcm94eUZhY3RvcnkuY3JlYXRlQmVhblByb3h5V2l0aCgiYnl0ZVZhbHVlIiksIG51bGx9KTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0JCWFzc2VydFRydWUobWV0aG9kIGluc3RhbmNlb2YgSU1ldGhvZFByb3h5KTsKLQkJCi0JCS8vIE5vdyBpbnZva2UgaXQgdG8gc2VlIGlmIGNvcnJlY3QgYW5zd2VyIGNvbWVzIGJhY2suCi0JCUlCZWFuUHJveHkgYnl0ZVZhbHVlID0gKChJTWV0aG9kUHJveHkpIG1ldGhvZCkuaW52b2tlKHByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKG5ldyBJbnRlZ2VyKDI1NCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChieXRlVmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoImJ5dGUiLCBieXRlVmFsdWUuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0RXF1YWxzKChieXRlKTI1NCwgKChJTnVtYmVyQmVhblByb3h5KSBieXRlVmFsdWUpLmJ5dGVWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEludm9rYWJsZUFjY2Vzc29ycygpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IGludGVnZXJUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkKLQkJLy8gVGVzdCBhYmxlIHRvIGFjY2VzcyBiZWFudHlwZSBwcm94eSBhbmQgaW52b2tlIG1ldGhvZHMgb24gaXQuIFRoaXMgaXNuJ3QKLQkJLy8gdGhlIGFwcHJvdmVkIHdheSBvZiBnZXR0aW5nIG1ldGhvZHMsIGJ1dCBpdCB0ZXN0cyB0aGF0IG1ldGhvZCBwcm94aWVzCi0JCS8vIGFyZSBjcmVhdGVkIGNvcnJlY3RseSBpZiByZXR1cm5lZCBmcm9tIGFuIGludm9rZSBtZXRob2QuCi0JCUlCZWFuVHlwZVByb3h5IGNsYXNzVHlwZVByb3h5ID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQ2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlJSW52b2thYmxlIGdldE1ldGhvZEludm9rYWJsZSA9IGNsYXNzVHlwZVByb3h5LmdldEludm9rYWJsZSgiZ2V0TWV0aG9kIiwgbmV3IFN0cmluZ1tdIHsiamF2YS5sYW5nLlN0cmluZyIsICJbTGphdmEubGFuZy5DbGFzczsifSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCS8vIEdldCB0aGUgSW50ZWdlci5ieXRlVmFsdWUoKSBtZXRob2QgdGhyb3VnaCBhbiBpbnZva2UgaW5zdGVhZCBvZiBhIG1ldGhvZCBmYWN0b3J5IG9yIGJlYW4gdHlwZS4KLQkJSUJlYW5Qcm94eSBtZXRob2QgPSBnZXRNZXRob2RJbnZva2FibGUuaW52b2tlKGludGVnZXJUeXBlLCBuZXcgSUJlYW5Qcm94eVtdIHsKLQkJCXByb3h5RmFjdG9yeS5jcmVhdGVCZWFuUHJveHlXaXRoKCJieXRlVmFsdWUiKSwgbnVsbH0pOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2QgaW5zdGFuY2VvZiBJTWV0aG9kUHJveHkpOwotCQkKLQkJLy8gTm93IGludm9rZSBpdCB0byBzZWUgaWYgY29ycmVjdCBhbnN3ZXIgY29tZXMgYmFjay4KLQkJSUJlYW5Qcm94eSBieXRlVmFsdWUgPSAoKElNZXRob2RQcm94eSkgbWV0aG9kKS5pbnZva2UocHJveHlGYWN0b3J5LmNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IEludGVnZXIoMjU0KSkpOwotCQlhc3NlcnROb3ROdWxsKGJ5dGVWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscygiYnl0ZSIsIGJ5dGVWYWx1ZS5nZXRUeXBlUHJveHkoKS5nZXRUeXBlTmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnRFcXVhbHMoKGJ5dGUpMjU0LCAoKElOdW1iZXJCZWFuUHJveHkpIGJ5dGVWYWx1ZSkuYnl0ZVZhbHVlKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdENhbGxiYWNrKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0gU3RhcnRpbmcgdGhlIGNhbGxiYWNrIHRlc3QgLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJSUJlYW5UeXBlUHJveHkgY2FsbGJhY2tUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkudm0uVGVzdENhbGxiYWNrIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChjYWxsYmFja1R5cGUpOwotCQlPYmplY3QgdGVzdE9iamVjdCA9IG5ldyBPYmplY3QoKTsKLQkJSUJlYW5Qcm94eSBjYWxsYmFja1Byb3h5ID0gY2FsbGJhY2tUeXBlLm5ld0luc3RhbmNlKCk7Ci0JCVRlc3RDYWxsYmFjayBjYiA9IG5ldyBUZXN0Q2FsbGJhY2sodGVzdE9iamVjdCwgcmVnaXN0cnkpOwotCQlyZWdpc3RyeS5nZXRDYWxsYmFja1JlZ2lzdHJ5KCkucmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFja1Byb3h5LCBjYik7Ci0JCUlJbnZva2FibGUgc3RhcnQgPSBjYWxsYmFja1R5cGUuZ2V0SW52b2thYmxlKCJzdGFydCIpOwkvLyROT04tTkxTLTEkCi0JCUlJbnZva2FibGUgc3RvcCA9IGNhbGxiYWNrVHlwZS5nZXRJbnZva2FibGUoInN0b3AiKTsJLy8kTk9OLU5MUy0xJAotCQlzeW5jaHJvbml6ZWQodGVzdE9iamVjdCkgewotCQkJc3RhcnQuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKGNhbGxiYWNrUHJveHkpOwotCQkJdHJ5IHsKLQkJCQl0ZXN0T2JqZWN0LndhaXQoMzAwMDApOwkvLyBTaG91bGQgYmUgZG9uZSBieSAzMCBzZWNvbmRzLgotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQl9CQkJCQotCQlzdG9wLmludm9rZUNhdGNoVGhyb3dhYmxlRXhjZXB0aW9ucyhjYWxsYmFja1Byb3h5KTsKLQkJcmVnaXN0cnkuZ2V0Q2FsbGJhY2tSZWdpc3RyeSgpLmRlcmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFja1Byb3h5KTsJCQkJCi0JCWNiLnRlc3RDb21wbGV0ZWQoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJJZiB0aGVyZSBpcyBhbnl0aGluZyBpbiB0aGUgLmxvZyBmaWxlLCB0aGVuIHRoZSB0ZXN0IGZhaWxlZC4iKTsJCQkgLy8kTk9OLU5MUy0xJAkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYWxsYmFja1N0cmVhbSgpIHRocm93cyBUaHJvd2FibGVQcm94eSwgSU9FeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLSBTdGFydGluZyB0aGUgY2FsbGJhY2sgc3RyZWFtIHRlc3QgLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJSUJlYW5UeXBlUHJveHkgY2FsbGJhY2tUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkudm0uVGVzdENhbGxiYWNrU3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbChjYWxsYmFja1R5cGUpOwotCQlPYmplY3QgdGVzdE9iamVjdCA9IG5ldyBPYmplY3QoKTsKLQkJSUJlYW5Qcm94eSBjYWxsYmFja1Byb3h5ID0gY2FsbGJhY2tUeXBlLm5ld0luc3RhbmNlKCk7Ci0JCVRlc3RDYWxsYmFja1N0cmVhbSBjYiA9IG5ldyBUZXN0Q2FsbGJhY2tTdHJlYW0odGVzdE9iamVjdCk7Ci0JCXJlZ2lzdHJ5LmdldENhbGxiYWNrUmVnaXN0cnkoKS5yZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrUHJveHksIGNiKTsKLQkJSU1ldGhvZFByb3h5IHN0YXJ0ID0gY2FsbGJhY2tUeXBlLmdldE1ldGhvZFByb3h5KCJzdGFydCIpOwkJCQkJCQkgLy8kTk9OLU5MUy0xJAotCQlzeW5jaHJvbml6ZWQodGVzdE9iamVjdCkgewkJCQotCQkJc3RhcnQuaW52b2tlQ2F0Y2hUaHJvd2FibGVFeGNlcHRpb25zKGNhbGxiYWNrUHJveHkpOwotCQl0cnkgewotCQkJCXRlc3RPYmplY3Qud2FpdCgzMDAwMCk7CS8vIFNob3VsZCBiZSBkb25lIGJ5IDMwIHNlY29uZHMuCi0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl9CQotCQl9CQkKLQkJcmVnaXN0cnkuZ2V0Q2FsbGJhY2tSZWdpc3RyeSgpLmRlcmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFja1Byb3h5KTsJCQkJCi0JCWNiLnRlc3RDb21wbGV0ZSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIklmIHRoZXJlIGlzIGFueXRoaW5nIGluIHRoZSAubG9nIGZpbGUsIHRoZW4gdGhlIHRlc3QgZmFpbGVkLiIpOwkJCSAvLyROT04tTkxTLTEkCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZUdldEZpZWxkKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgaW50ZWdlclR5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQotCQkvLyBHZXQgdGhlIHB1YmxpYyBmaWVsZC4KLQkJSUZpZWxkUHJveHkgZmllbGQgPSBpbnRlZ2VyVHlwZS5nZXRGaWVsZFByb3h5KCJNQVhfVkFMVUUiKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKGZpZWxkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlR2V0RGVjbGFyZWRGaWVsZCgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IGludGVnZXJUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpOyAvLyROT04tTkxTLTEkCQkJCQotCQkKLQkJLy8gR2V0IHRoZSBwdWJsaWMgZmllbGQuCi0JCUlGaWVsZFByb3h5IGZpZWxkID0gaW50ZWdlclR5cGUuZ2V0RGVjbGFyZWRGaWVsZFByb3h5KCJ2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwoZmllbGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGaWVsZHMoKSB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RBY2Nlc3NUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQotCQkvLyBHZXQgYWxsIGZpZWxkcy4KLQkJSUZpZWxkUHJveHlbXSBmaWVsZHMgPSB0ZXN0QWNjZXNzVHlwZS5nZXRGaWVsZHMoKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWVsZHMpOwotCQlhc3NlcnRFcXVhbHMoMiwgZmllbGRzLmxlbmd0aCk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVjbGFyZWRGaWVsZHMoKSB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RBY2Nlc3NUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQotCQkvLyBHZXQgYWxsIGZpZWxkcy4KLQkJSUZpZWxkUHJveHlbXSBmaWVsZHMgPSB0ZXN0QWNjZXNzVHlwZS5nZXREZWNsYXJlZEZpZWxkcygpOwotCQlhc3NlcnROb3ROdWxsKGZpZWxkcyk7Ci0JCWFzc2VydEVxdWFscygzLCBmaWVsZHMubGVuZ3RoKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlR2V0TWV0aG9kKCkgdGhyb3dzIFRocm93YWJsZVByb3h5IHsKLQkJSUJlYW5UeXBlUHJveHkgdGVzdEFjY2Vzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkKLQkJCi0JCS8vIEdldCB0aGUgcHVibGljIGZpZWxkLgotCQlJTWV0aG9kUHJveHkgbWV0aG9kID0gdGVzdEFjY2Vzc1R5cGUuZ2V0TWV0aG9kUHJveHkoInh5eiIpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlR2V0RGVjbGFyZWRNZXRob2QoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSB0ZXN0QWNjZXNzVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOyAvLyROT04tTkxTLTEkCQotCQkKLQkJLy8gR2V0IHRoZSBwdWJsaWMgZmllbGQuCi0JCUlNZXRob2RQcm94eSBtZXRob2QgPSB0ZXN0QWNjZXNzVHlwZS5nZXREZWNsYXJlZE1ldGhvZFByb3h5KCJxeHIiLCAoU3RyaW5nW10pIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCWFzc2VydE5vdE51bGwobWV0aG9kKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWV0aG9kcygpIHsKLQkJSUJlYW5UeXBlUHJveHkgdGVzdEFjY2Vzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlJQmVhblR5cGVQcm94eSB0ZXN0T2JqZWN0VHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk9iamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBHZXQgYWxsIG1ldGhvZHMuIE5lZWQgdG8gZ2V0IGFsbCBvZiBPYmplY3QgdG9vIHNpbmNlIGdldE1ldGhvZHMoKSBnZXRzIHRoZW0gYWxsIGluY2x1ZGluZyBpbmhlcml0ZWQuIFdlIHdpbGwKLQkJLy8gdGhlbiB0YWtlIHRoZSBkaWZmIHRvIHNob3cgd2hhdCdzIG9ubHkgYXQgdGhlIGxvY2FsIGxldmVsLgotCQlJTWV0aG9kUHJveHlbXSBtZXRob2RzID0gdGVzdEFjY2Vzc1R5cGUuZ2V0TWV0aG9kcygpOwotCQlJTWV0aG9kUHJveHlbXSBvYmplY3RNZXRob2RzID0gdGVzdE9iamVjdFR5cGUuZ2V0TWV0aG9kcygpOwotCQlhc3NlcnROb3ROdWxsKG1ldGhvZHMpOwotCQlhc3NlcnROb3ROdWxsKG9iamVjdE1ldGhvZHMpOwotCQlhc3NlcnRFcXVhbHMoNywgbWV0aG9kcy5sZW5ndGgtb2JqZWN0TWV0aG9kcy5sZW5ndGgpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlY2xhcmVkTWV0aG9kcygpIHsKLQkJSUJlYW5UeXBlUHJveHkgdGVzdEFjY2Vzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoInRlc3RQYWNrYWdlLlRlc3RBY2Nlc3MiKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCi0JCS8vIEdldCBhbGwgZmllbGRzLgotCQlJTWV0aG9kUHJveHlbXSBtZXRob2RzID0gdGVzdEFjY2Vzc1R5cGUuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCWFzc2VydE5vdE51bGwobWV0aG9kcyk7Ci0JCWFzc2VydEVxdWFscyg4LCBtZXRob2RzLmxlbmd0aCk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmluZENvbXBhdGlibGVDb25zdHJ1Y3RvcigpIHRocm93cyBBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RBY2Nlc3NUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJ0ZXN0UGFja2FnZS5UZXN0QWNjZXNzIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0KLQkJSUNvbnN0cnVjdG9yUHJveHkgY3RvciA9IHRlc3RBY2Nlc3NUeXBlLmdldENvbXBhdGlibGVDb25zdHJ1Y3RvcihuZXcgSUJlYW5UeXBlUHJveHlbXSB7cHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuQXJyYXlTdG9yZUV4Y2VwdGlvbiIpfSk7Ci0JCUlDb25zdHJ1Y3RvclByb3h5IGNvbXAgPSB0ZXN0QWNjZXNzVHlwZS5nZXREZWNsYXJlZENvbnN0cnVjdG9yUHJveHkobmV3IElCZWFuVHlwZVByb3h5W10ge3Byb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24iKX0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChjdG9yKTsKLQkJYXNzZXJ0Tm90TnVsbChjb21wKTsKLQkJYXNzZXJ0RXF1YWxzKGN0b3IsIGNvbXApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmluZENvbXBhdGlibGVNZXRob2QoKSB0aHJvd3MgQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlJQmVhblR5cGVQcm94eSB0ZXN0QWNjZXNzVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOyAvLyROT04tTkxTLTEkCQkJCQotCi0JCUlNZXRob2RQcm94eSBtZXRob2QgPSB0ZXN0QWNjZXNzVHlwZS5nZXRDb21wYXRpYmxlTWV0aG9kKCJ4eXoiLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7cHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpfSk7Ci0JCUlNZXRob2RQcm94eSBjb21wID0gdGVzdEFjY2Vzc1R5cGUuZ2V0RGVjbGFyZWRNZXRob2RQcm94eSgieHl6IiwgbmV3IElCZWFuVHlwZVByb3h5W10ge3Byb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5sYW5nLk51bWJlciIpfSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKG1ldGhvZCk7Ci0JCWFzc2VydE5vdE51bGwoY29tcCk7Ci0JCWFzc2VydEVxdWFscyhtZXRob2QsIGNvbXApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmluZEFtYmlndW91c01ldGhvZCgpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlJQmVhblR5cGVQcm94eSB0ZXN0QWNjZXNzVHlwZSA9IHByb3h5VHlwZUZhY3RvcnkuZ2V0QmVhblR5cGVQcm94eSgidGVzdFBhY2thZ2UuVGVzdEFjY2VzcyIpOyAvLyROT04tTkxTLTEkCQkJCQotCi0JCXRyeSB7Ci0JCQl0ZXN0QWNjZXNzVHlwZS5nZXRDb21wYXRpYmxlTWV0aG9kKCJkZGQiLCBuZXcgSUJlYW5UeXBlUHJveHlbXSB7cHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuSW50ZWdlciIpLCBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoImphdmEubGFuZy5JbnRlZ2VyIil9KTsKLQkJCWZhaWwoIlNob3VsZCBvZiBiZWVuIGFtYmlndW91cyIpOwotCQl9IGNhdGNoIChBbWJpZ3VvdXNNZXRob2RFeGNlcHRpb24gZSkgewotCQl9IAotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2lkZS9JREVQcm94eVN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pZGUvSURFUHJveHlTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGUzM2U0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2lkZS9JREVQcm94eVN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pZGU7Ci0vKgotICogICRSQ1NmaWxlOiBJREVQcm94eVN1aXRlLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTUgJCAKLSAqLwotaW1wb3J0IGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklDb25maWd1cmF0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuUHJveHlGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmlkZS5JREVSZWdpc3RyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LkFic3RyYWN0VGVzdFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5Qcm94eVN1aXRlOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKiBUaGlzIGlzIHRoZSB0cnVlIHRlc3Qgc3VpdGUgZm9yIFJlbW90ZSBQcm94eSBUZXN0aW5nLiBUaGUgUmVtb3RlUHJveHlUZXN0IHdpbGwgdXNlIHRoaXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBJREVQcm94eVN1aXRlIGV4dGVuZHMgVGVzdFNldHVwIHsKLQotCS8vIFRlc3QgY2FzZXMgdG8gYmUgaW5jbHVkZSBpbiB0aGUgc3VpdGUKLQlwcml2YXRlIHN0YXRpYyBDbGFzcyB0ZXN0c0xpc3RbXSA9IHsgUHJveHlTdWl0ZS5jbGFzcywgfTsKLQotCXByaXZhdGUgQWJzdHJhY3RUZXN0UHJveHkuUmVnaXN0cnlIYW5kbGVyIHJlZ2lzdHJ5SGFuZGxlciA9IG5ldyBBYnN0cmFjdFRlc3RQcm94eS5SZWdpc3RyeUhhbmRsZXIoKSB7Ci0JCXByaXZhdGUgUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnk7Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXB1YmxpYyBQcm94eUZhY3RvcnlSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCWlmIChyZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQkJcmVnaXN0cnkgPSBJREVSZWdpc3RyYXRpb24uc3RhcnRBbkltcGxlbWVudGF0aW9uKG5ldyBJQ29uZmlndXJhdGlvbkNvbnRyaWJ1dG9yW10geyBQcm94eVN1aXRlLmdldFByb3h5U3VpdGVDb250cmlidXRvcigpfSwgdHJ1ZSwgbnVsbCwgIkpVbml0IFRlc3RzIGZvciBJREUgUHJveHkiLCAib3JnLmVjbGlwc2UuamVtLnRlc3RzIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJcmV0dXJuIHJlZ2lzdHJ5OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGVzdHJveVJlZ2lzdHJ5KCkgewotCQkJaWYgKHJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCQlyZWdpc3RyeS50ZXJtaW5hdGVSZWdpc3RyeSgpOwotCQkJCXJlZ2lzdHJ5ID0gbnVsbDsKLQkJCX0KLQkJfQotCX07Ci0KLQlwdWJsaWMgSURFUHJveHlTdWl0ZSgpIHsKLQkJdGhpcygiVGVzdCBJREUgUHJveHkgU3VpdGUiKTsKLQl9Ci0KLQlwdWJsaWMgSURFUHJveHlTdWl0ZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuZXcgVGVzdFN1aXRlKG5hbWUpIHsKLQkJCXsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RzTGlzdC5sZW5ndGg7IGkrKykgewotCQkJCQkvLyBXZSBtYXkgZ2V0IHNvbWUgdGVzdHMgYW5kIHN1aXRlcy4KLQkJCQkJaWYgKFRlc3RTdWl0ZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRlc3RzTGlzdFtpXSkgfHwgVGVzdFNldHVwLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGVzdHNMaXN0W2ldKSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlUZXN0IHRzID0gKFRlc3QpIHRlc3RzTGlzdFtpXS5uZXdJbnN0YW5jZSgpOwotCQkJCQkJCWFkZFRlc3QodHMpOwotCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UKLQkJCQkJCWFkZFRlc3RTdWl0ZSh0ZXN0c0xpc3RbaV0pOwotCQkJCX0KLQotCQkJfQotCQl9KTsKLQotCQlBYnN0cmFjdFRlc3RQcm94eS5pbml0UmVnaXN0cnlIYW5kbGVyKChUZXN0U3VpdGUpIGdldFRlc3QoKSwgcmVnaXN0cnlIYW5kbGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgSURFUHJveHlTdWl0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJlZ2lzdHJ5SGFuZGxlci5kZXN0cm95UmVnaXN0cnkoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg0YWUwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0Fic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIHRlc3QgaGVscGVyIGZvciBhbGwgb2YgdGhlIHRlc3RzIHdpdGhpbiB0aGUgZ2l2ZW4gc3VpdGUuCi0JICogCi0JICogQHBhcmFtIHN1aXRlCi0JICogQHBhcmFtIHRlc3RIZWxwZXIKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdFN1aXRlKFRlc3RTdWl0ZSBzdWl0ZSwgQWJzdHJhY3RJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlciB0ZXN0SGVscGVyKSB7Ci0JCUVudW1lcmF0aW9uIHRlc3RzID0gc3VpdGUudGVzdHMoKTsKLQkJd2hpbGUgKHRlc3RzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlUZXN0IHRlc3QgPSAoVGVzdCkgdGVzdHMubmV4dEVsZW1lbnQoKTsKLQkJCWlmICh0ZXN0IGluc3RhbmNlb2YgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UpCi0JCQkJKChBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSkgdGVzdCkuc2V0VGVzdEhlbHBlcih0ZXN0SGVscGVyKTsKLQkJCWVsc2UgaWYgKHRlc3QgaW5zdGFuY2VvZiBUZXN0U3VpdGUpCi0JCQkJaW5pdFN1aXRlKChUZXN0U3VpdGUpIHRlc3QsIHRlc3RIZWxwZXIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIgdGVzdEhlbHBlcjsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHRlc3QgaGVscGVyIHRvIHVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gdGVzdEhlbHBlcgotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRlc3RIZWxwZXIoQWJzdHJhY3RJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlciB0ZXN0SGVscGVyKSB7Ci0JCXRoaXMudGVzdEhlbHBlciA9IHRlc3RIZWxwZXI7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9BYnN0cmFjdEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0Fic3RyYWN0SW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg2OWEyMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0Fic3RyYWN0SW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEFic3RyYWN0SW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgaW5pdCBzdHJpbmcgcGFyc2VyIGhlbHBlci4gQWxsb3dzICJJbml0U3RyaW5nIFBhcnNlciIgb3IgIkFTVCBQYXJzZXIiIG9yIHNvbWUgb3RoZXIga2luZCBvZiB0ZXN0aW5nLgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIgewotCS8qKgotCSAqIFRlc3QgdGhlIGdpdmVuIHN0cmluZyBhZ2FpbnN0IHRoZSBnaXZlbiByZXN1bHQuIGVxdWFsc09ubHkgZGV0ZXJtaW5lcyBob3cgZXhhY3RseSBpdCBtYXRjaGVzLgotCSAqIElmIGFsbG93ZWQgdG8gdGhyb3cgZXhjZXB0aW9ucywgdGhlbiB0aGUgZXhjZXB0aW9uIGFzIHRoZSByZXN1bHQgb2YgZXZhbHVhdGlvbiB3aWxsIGJlIHNxdWFzaGVkLgotCSAqIAotCSAqIEBwYXJhbSBhU3RyaW5nCi0JICogQHBhcmFtIGV4cGVjdGVkUmVzdWx0Ci0JICogQHBhcmFtIHRocm93c0V4Y2VwdGlvbiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGlzIGV4cGVjdGVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBhbmQgc3VjaCBleGNlcHRpb24gd2lsbCBub3QgYmUgcGFzc2VkIG9uIG91dCBhbmQgd2lsbCByZXR1cm4gbm9ybWFsLgotCSAqIEBwYXJhbSBlcXVhbHNPbmx5IDxjb2RlPnRydWU8L2NvZGU+IG1lYW5zIGlmIG11c3QgbWF0Y2ggZWl0aGVyID09LCBlcXVhbHMoKSwgb3IgdG9TdHJpbmcoKSdzIG1hdGNoLgotCSAqIEB0aHJvd3MgVGhyb3dhYmxlCi0JICogCi0JICogQHNpbmNlIDEuMC4wCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgdGVzdEluaXRTdHJpbmcoU3RyaW5nIGFTdHJpbmcsIE9iamVjdCBleHBlY3RlZFJlc3VsdCwgYm9vbGVhbiB0aHJvd3NFeGNlcHRpb24sIGJvb2xlYW4gZXF1YWxzT25seSkKLQkJdGhyb3dzIFRocm93YWJsZTsKLQotCS8qKgotCSAqIFRlc3QgdGhlIGdpdmVuIHN0cmluZyBhZ2FpbnN0IHRoZSBnaXZlbiByZXN1bHQuIEl0IG11c3QgbWF0Y2ggZWl0aGVyID09LCBlcXVhbHMoKSwgb3IgdG9TdHJpbmcoKSdzIG1hdGNoLgotCSAqIEl0IHNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9ucy4gSWYgaXQgZG9lcywgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHBhc3NlZCBvdXQuCi0JICogCi0JICogQHBhcmFtIGFTdHJpbmcKLQkgKiBAcGFyYW0gZXhwZWN0ZWRSZXN1bHQKLQkgKiBAdGhyb3dzIFRocm93YWJsZSAKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdFN0cmluZyhTdHJpbmcgYVN0cmluZywgT2JqZWN0IGV4cGVjdGVkUmVzdWx0KSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEluaXRTdHJpbmcoYVN0cmluZywgZXhwZWN0ZWRSZXN1bHQsIGZhbHNlLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IHRoZSBnaXZlbiBzdHJpbmcgYWdhaW5zdCB0aGUgZ2l2ZW4gcmVzdWx0LiBlcXVhbHNPbmx5IGRldGVybWluZXMgaG93IGV4YWN0bHkgaXQgbWF0Y2hlcwotCSAqIEl0IHNob3VsZCBub3QgdGhyb3cgZXhjZXB0aW9ucy4gSWYgaXQgZG9lcywgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHBhc3NlZCBvdXQuCi0JICogCi0JICogQHBhcmFtIGFTdHJpbmcKLQkgKiBAcGFyYW0gZXF1YWxzT25seSA8Y29kZT50cnVlPC9jb2RlPiBtZWFucyBpZiBtdXN0IG1hdGNoIGVpdGhlciA9PSwgZXF1YWxzKCksIG9yIHRvU3RyaW5nKCkncyBtYXRjaC4KLQkgKiBAcGFyYW0gZXhwZWN0ZWRSZXN1bHQKLQkgKiBAdGhyb3dzIFRocm93YWJsZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbml0U3RyaW5nKFN0cmluZyBhU3RyaW5nLCBib29sZWFuIGVxdWFsc09ubHksIE9iamVjdCBleHBlY3RlZFJlc3VsdCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RJbml0U3RyaW5nKGFTdHJpbmcsIGV4cGVjdGVkUmVzdWx0LCBmYWxzZSwgZXF1YWxzT25seSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9BcnJheUNvbnN0cnVjdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9BcnJheUNvbnN0cnVjdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGMyZTBiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQXJyYXlDb25zdHJ1Y3RvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogQXJyYXlDb25zdHJ1Y3RvclRlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQXJyYXlDb250cnVjdG9yVGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBBcnJheUNvbnN0cnVjdG9yVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0cmluZzFEKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBTdHJpbmdbMl0iLG5ldyBTdHJpbmdbMl0pOwkKLSAgICB9Ci0JcHVibGljIHZvaWQgdGVzdEVtcHR5U3RyaW5nMkQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IFN0cmluZ1syXVsyXSIsbmV3IFN0cmluZ1syXVsyXSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlDb2xvcjFEKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLmF3dC5Db2xvclszXSIsbmV3IGphdmEuYXd0LkNvbG9yWzNdKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUNvbG9yMkQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEuYXd0LkNvbG9yWzNdWzRdIixuZXcgamF2YS5hd3QuQ29sb3JbM11bNF0pOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEVtcHR5SW50KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBpbnRbM10iLCBuZXcgaW50WzNdKTsJCi0JfQotCQotCS8vIFRPRE86IGVuYWJsZSB0aGlzIHRlc3Qgd2hlbiB0aGlzIHdvcmtzCi0JLyoKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FsY3VsYXRlZFNpemUoKSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBTdHJpbmdbbmV3IEludGVnZXIoMykuaW50VmFsdWUoKV0iLG5ldyBTdHJpbmdbbmV3IEludGVnZXIoMykuaW50VmFsdWUoKV0pOyAgICAJCi0JfQotCSovCi0JCi0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVkSW50cygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgaW50W10gey0yLDN9IixuZXcgaW50W117LTIsM30pOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVkSW50c1RyYWlsaW5nQ29tbWEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGludFtdIHstMiwzLH0iLG5ldyBpbnRbXXstMiwzLH0pOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZWREb3VibGVQYXJlbnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGRvdWJsZVtdIHsoLTIpLCAzLjAgfSIsbmV3IGRvdWJsZVtdIHsoLTIpLCAzLjAgfSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZWRTdHJpbmdzVHdvKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBTdHJpbmdbXSB7XCIxXCIsXCIyXCJ9IixuZXcgU3RyaW5nW10geyIxIiwiMiJ9KTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplZFN0cmluZ3NUaHJlZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgU3RyaW5nW10ge1wiRnJvZ1wiLFwiRG9nXCIsXCJDb3dcIn0iLG5ldyBTdHJpbmdbXSB7IkZyb2ciLCJEb2ciLCJDb3cifSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZWRDb2xvcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEuYXd0LkNvbG9yW10geyBqYXZhLmF3dC5Db2xvci5yZWQgLCBuZXcgamF2YS5hd3QuQ29sb3IoMCwwLDApIH0iLG5ldyBqYXZhLmF3dC5Db2xvcltdIHsgamF2YS5hd3QuQ29sb3IucmVkICwgbmV3IGphdmEuYXd0LkNvbG9yKDAsMCwwKSB9KTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbml0YWxpemVkSW50czJEMSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgaW50W11bXSB7IHsgMiAsIC0zIH0gLCB7IDQgLCA1IH0gfSIsbmV3IGludFtdW10geyB7IDIgLCAtMyB9ICwgeyA0ICwgNSB9IH0pOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEluaXRhbGl6ZWRJbnRzMkQyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBpbnRbXVtdIHt7MSwyLDN9LHs0LDUsNn19IixuZXcgaW50W11bXXt7MSwyLDN9LHs0LDUsNn19KTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbml0YWxpemVkSW50czJEUGFyZW5zQ29tbWFzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCS8vIE11Y2ggdG8gbXkgc3VycHJpc2UsIGV4dHJhIGNvbW1hbmRzIGFyZSB2YWxpZCBzeW50YXggYXQgdGhlIGVuZCBvZiB0aGUgYXJndW1lbnRzIGV2ZW4gd2l0aG91dCBhbnkgZm9sbG93aW5nIGFyZ3VtZW50Ci0JCS8vIHRoZSByZXNvbHZlIHRoYXQgb2NjdXJzIGJ5IHRoZSBWaXN1YWwgRWRpdG9yIGFjdHVhbGx5IGluc2VydHMgdGhlc2UsIHNvIHdlIG5lZWQgdGVzdHMgdG8gbWFrZSBzdXJlIHdlIGNhbiBkZWFsIHdpdGggdGhlbSBjb3JyZWN0bHkKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGludFtdW10geyB7MiAsKC0zKSx9ICwgeyA0ICwgNSx9fSIsbmV3IGludFtdW10geyB7IDIgLCAoLTMpLH0gLCB7IDQgLCA1LH19KTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbml0YWxpemVkSW50czJEUGFyZW5zQ29tbWFzMigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgaW50W11bXSB7IHsyICwoLTMpLH0gLCB7IDQgLCA1LH0sfSIsbmV3IGludFtdW10geyB7IDIgLCAoLTMpLH0gLCB7IDQgLCA1LH0sfSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGFsaXplZERvdWJsZXMyRCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgZG91YmxlW11bXSB7IHsgMiAsIDMgfSAsIHsgNCAsIDUgfSB9IixuZXcgZG91YmxlW11bXSB7IHsgMiAsIDMgfSAsIHsgNCAsIDUgfSB9KTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbml0YWxpemVkRG91YmxlczJETWFueSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgZG91YmxlW11bXXt7IDUuMCwgLTIuMCwgNS4wLCAtMS4wLCAtMS4wLCA1LjAsIC0yLjAsIDUuMCB9LCB7IDUuMCwgLTIuMCwgNS4wLCAtMi4wLCA1LjAsIC0xLjAsIDUuMCwgLTIuMCwgNS4wIH19IixuZXcgZG91YmxlW11bXXt7IDUuMCwgLTIuMCwgNS4wLCAtMS4wLCAtMS4wLCA1LjAsIC0yLjAsIDUuMCB9LCB7IDUuMCwgLTIuMCwgNS4wLCAtMi4wLCA1LjAsIC0xLjAsIDUuMCwgLTIuMCwgNS4wIH19KTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbnQyRFBhcmFtKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgaW50W11bXSB7ezEsMiwzfSx7Myw0LDV9fSkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgaW50W11bXSB7ezEsMiwzfSx7Myw0LDV9fSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEludDJEUGFyYW1Db21tYXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBpbnRbXVtdIHt7MSwyLDMsfSx7Myw0LDUsfX0pIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGludFtdW10ge3sxLDIsMyx9LHszLDQsNSx9fSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEludDJEUGFyYW1Db21tYXMyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgaW50W11bXSB7ezEsMiwzLH0sezMsNCw1LH0sfSkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgaW50W11bXSB7ezEsMiwzLH0sezMsNCw1LH0sfSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdERvdWJsZVBhcmFtKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgZG91YmxlW117MSwyLDN9KSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBkb3VibGVbXXsxLDIsM30pKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGVQYXJhbTIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBkb3VibGVbXXsxLjAsMiwtMy41fSkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgZG91YmxlW117MS4wLDIsLTMuNX0pKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGVQYXJhbTMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBkb3VibGVbXXstMSwyLC0wLjV9KSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBkb3VibGVbXXstMSwyLC0wLjV9KSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlMkRQYXJhbSgpIHRocm93cyBUaHJvd2FibGUgewotCQkvLyBUaGlzIHRlc3QgaXMgb25lIHRoYXQgaXMgc2ltaWxhciB0byB0aGUgdHlwZSBvZiBjb25zdHJ1Y3RvciB1c2VkIGJ5IFRhYmxlTGF5b3V0IGZvciBTV0EKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBkb3VibGVbXVtde3sgNS4wLCAtMi4wLCA1LjAsIC0xLjAsIC0xLjAsIDUuMCwgLTIuMCwgNS4wIH0sIHsgNS4wLCAtMi4wLCA1LjAsIC0yLjAsIDUuMCwgLTEuMCwgNS4wLCAtMi4wLCA1LjAgfX0pIiwKLQkJCQkJCW5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhuZXcgZG91YmxlW11bXXt7IDUuMCwgLTIuMCwgNS4wLCAtMS4wLCAtMS4wLCA1LjAsIC0yLjAsIDUuMCB9LCB7IDUuMCwgLTIuMCwgNS4wLCAtMi4wLCA1LjAsIC0xLjAsIDUuMCwgLTIuMCwgNS4wIH19KSk7ICAgIAkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdERvdWJsZTJEUGFyYW1Db21tYXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBkb3VibGVbXVtde3sgNS4wLCAtMi4wLCA1LjAsIC0xLjAsIC0xLjAsIDUuMCwgLTIuMCwgNS4wICwgfSwgeyA1LjAsIC0yLjAsIDUuMCwgLTIuMCwgNS4wLCAtMS4wLCA1LjAsIC0yLjAsIDUuMCAsIH0gLCB9KSIsCi0JCQkJCQkJbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBkb3VibGVbXVtde3sgNS4wLCAtMi4wLCA1LjAsIC0xLjAsIC0xLjAsIDUuMCwgLTIuMCwgNS4wICwgfSwgeyA1LjAsIC0yLjAsIDUuMCwgLTIuMCwgNS4wLCAtMS4wLCA1LjAsIC0yLjAsIDUuMCAsIH0gLCB9KSk7CQotCX0KLQkKLQkKLQkvLyBUT0RPOiBlbmFibGUgdGhpcyB0ZXN0IHdoZW4gdGhlIGNhc2UgaXMgaGFuZGxlZCBwcm9wZXJseQotCS8qCi0JcHVibGljIHZvaWQgdGVzdEludDNEKCkgewotCQkvLyBOZWVkcyBmaXhpbmcgLSBXZSBkb24ndCBoYXZlIGRpbWVuc2lvbnMgZ3JlYXRlciB0aGFuIDIgd29ya2luZyB5ZXQKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGludFtdW11bXSB7IHsgeyAxICwgMiB9ICwgeyAzICwgNCB9IH0sIHsgeyA1ICwgNiB9ICwgeyA3ICwgOCB9IH0gfSIsbmV3IGludFtdW11bXSB7IHsgeyAxICwgMiB9ICwgeyAzICwgNCB9IH0sIHsgeyA1ICwgNiB9ICwgeyA3ICwgOCB9IH0gfSk7ICAgIAkKLQl9Ci0gICAgKi8KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQmxvY2tUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0Jsb2NrVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2U3ZDc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQmxvY2tUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IEJsb2NrVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBCbG9ja1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQmxvY2tUZXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEJsb2NrVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLS8qCi0gKiBUT0RPIFRoZXNlIHRocmVlIGRvbid0IHdvcmsgZm9yIG5vdy4gTGF0ZXIgdGhleSBtYXkgYmUgZml4ZWQgaWYgaXQgc2hvd3MgdXAgYXMgYSBnZW5lcmFsIHByb2JsZW0gZm9yIGN1c3RvbWVycy4gU28gZmFyIHRoZXkgaGF2ZW4ndC4KLSAgICAgICAgcHVibGljIHZvaWQgdGVzdFNldEVsZW1lbnRzMSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJIigoKG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygzKSkuc2V0RWxlbUF0KFwiYWNjb3VudFN0YXRlbWVudERldGFpbHNcIiwwKSkuc2V0RWxlbUF0KG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhcIk9wbkJhbGFuY2VcIixcIk9wbkJhbGFuY2VcIixudWxsLGZhbHNlLGZhbHNlLHRydWUsNTApLDEpKS5zZXRFbGVtQXQobmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKFwiT3BuRGF0ZVwiLFwiT3BuRGF0ZVwiLG51bGwsZmFsc2UsZmFsc2UsdHJ1ZSw1MCksMik7IiwKLQkJCSgoKG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygzKSkuc2V0RWxlbUF0KCJhY2NvdW50U3RhdGVtZW50RGV0YWlscyIsMCkpLnNldEVsZW1BdChuZXcgTmF2aWdhdGlvblBhcmFtZXRlcnMoIk9wbkJhbGFuY2UiLCJPcG5CYWxhbmNlIixudWxsLGZhbHNlLGZhbHNlLHRydWUsNTApLDEpKS5zZXRFbGVtQXQobmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCJPcG5EYXRlIiwiT3BuRGF0ZSIsbnVsbCxmYWxzZSxmYWxzZSx0cnVlLDUwKSwyKSk7ICAgIAkKLSAgICB9Ci0JcHVibGljIHZvaWQgdGVzdFNldEVsZW1lbnRzMigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJCSIoKChuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoMykpLnNldEVsZW1BdChcImFjY291bnRTdGF0ZW1lbnREZXRhaWxzXCIsMCkpLnNldEVsZW1BdChuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoXCJPcG5CYWxhbmNlXCIsXCJPcG5CYWxhbmNlXCIsbnVsbCxmYWxzZSxmYWxzZSx0cnVlLDUwKSwxKSkiLAotCQkJCSgoKG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygzKSkuc2V0RWxlbUF0KCJhY2NvdW50U3RhdGVtZW50RGV0YWlscyIsMCkpLnNldEVsZW1BdChuZXcgTmF2aWdhdGlvblBhcmFtZXRlcnMoIk9wbkJhbGFuY2UiLCJPcG5CYWxhbmNlIixudWxsLGZhbHNlLGZhbHNlLHRydWUsNTApLDEpKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RWxlbWVudHMzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkiKChuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoMykpLnNldEVsZW1BdChuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoXCJPcG5CYWxhbmNlXCIsXCJPcG5CYWxhbmNlXCIsbnVsbCxmYWxzZSxmYWxzZSx0cnVlLDUwKSwxKSkiLAotCQkJKChuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoMykpLnNldEVsZW1BdChuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoIk9wbkJhbGFuY2UiLCJPcG5CYWxhbmNlIixudWxsLGZhbHNlLGZhbHNlLHRydWUsNTApLDEpKSk7ICAgIAkKLQl9Ci0qLwotCXB1YmxpYyB2b2lkIHRlc3RTZXRFbGVtZW50NCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJCSIoKG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygzKSkuc2V0RWxlbUF0KFwiYWNjb3VudFN0YXRlbWVudERldGFpbHNcIiwwKSkiLAotCQkJCSgobmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKDMpKS5zZXRFbGVtQXQoImFjY291bnRTdGF0ZW1lbnREZXRhaWxzIiwwKSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1JlcGxhY2VtZW50MSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJCSIoKChuZXcgU3RyaW5nKFwiRnJvZ1wiKSkucmVwbGFjZSgnbycsJ2knKSkucmVwbGFjZSgnaScsJ2EnKSkucmVwbGFjZSgnYScsJ28nKSIsCi0JCQkJKCgobmV3IFN0cmluZygiRnJvZyIpKS5yZXBsYWNlKCdvJywnaScpKS5yZXBsYWNlKCdpJywnYScpKS5yZXBsYWNlKCdhJywnbycpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdSZXBsYWNlbWVudDIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCQkiKCgoKG5ldyBTdHJpbmcoXCJGcm9nXCIpKS5yZXBsYWNlKCdvJywnaScpKS5yZXBsYWNlKCdpJywnYScpKS5yZXBsYWNlKCdhJywnbycpKS5yZXBsYWNlKCdvJywnZScpIiwKLQkJCQkoKCgobmV3IFN0cmluZygiRnJvZyIpKS5yZXBsYWNlKCdvJywnaScpKS5yZXBsYWNlKCdpJywnYScpKS5yZXBsYWNlKCdhJywnbycpKS5yZXBsYWNlKCdvJywnZScpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDYXNlczEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCQkiKG5ldyBTdHJpbmcoXCJGcm9nXCIpLnRvTG93ZXJDYXNlKCkpLnRvVXBwZXJDYXNlKCkiLAotCQkJCShuZXcgU3RyaW5nKCJGcm9nIikudG9Mb3dlckNhc2UoKSkudG9VcHBlckNhc2UoKQotCQkJCSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ2FzZXMyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkJIigobmV3IFN0cmluZyhcIkZyb2dcIikudG9Mb3dlckNhc2UoKSkudG9VcHBlckNhc2UoKSkudG9Mb3dlckNhc2UoKSIsCi0JCQkJKChuZXcgU3RyaW5nKCJGcm9nIikudG9Mb3dlckNhc2UoKSkudG9VcHBlckNhc2UoKSkudG9Mb3dlckNhc2UoKQotCQkJCSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ2FzZXMzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkJIigoKG5ldyBTdHJpbmcoXCJGcm9nXCIpLnRvTG93ZXJDYXNlKCkpLnRvVXBwZXJDYXNlKCkpLnRvTG93ZXJDYXNlKCkpLnRvVXBwZXJDYXNlKCkiLAotCQkJCSgoKG5ldyBTdHJpbmcoIkZyb2ciKS50b0xvd2VyQ2FzZSgpKS50b1VwcGVyQ2FzZSgpKS50b0xvd2VyQ2FzZSgpKS50b1VwcGVyQ2FzZSgpCi0JCQkJKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25jYXQxKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkJIihuZXcgU3RyaW5nKFwiRnJvZ3NcIikuY29uY2F0KFwiYXJlXCIpKS5jb25jYXQoXCJjb29sXCIpIiwKLQkJCQkobmV3IFN0cmluZygiRnJvZ3MiKS5jb25jYXQoImFyZSIpKS5jb25jYXQoImNvb2wiKQotCQkJCSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uY2F0MigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJCSIoKG5ldyBTdHJpbmcoXCJGcm9nc1wiKS5jb25jYXQoXCJhcmVcIikpLmNvbmNhdChcInZlcnlcIikpLmNvbmNhdChcImNvb2xcIikiLAotCQkJCSgobmV3IFN0cmluZygiRnJvZ3MiKS5jb25jYXQoImFyZSIpKS5jb25jYXQoInZlcnkiKSkuY29uY2F0KCJjb29sIikKLQkJCQkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbmNhdDMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCQkiKCgobmV3IFN0cmluZyhcIkZyb2dzXCIpLmNvbmNhdChcImp1c3RcIikpLmNvbmNhdChcInJ1bGVcIikpLmNvbmNhdChcImNvb2xcIikpLmNvbmNhdChcImtpbmdkb21cIikiLAotCQkJCSgoKG5ldyBTdHJpbmcoIkZyb2dzIikuY29uY2F0KCJqdXN0IikpLmNvbmNhdCgicnVsZSIpKS5jb25jYXQoImNvb2wiKSkuY29uY2F0KCJraW5nZG9tIikKLQkJCQkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbmNhdDQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCQkiKChuZXcgU3RyaW5nKFwiRnJvZ3NcIikuY29uY2F0KFwianVzdFwiKSkuY29uY2F0KG5ldyBTdHJpbmcoXCJ0b3RhbGx5XCIpKS5jb25jYXQobmV3IFN0cmluZyhcIlJvY2tcIikpKSIsCi0JCQkJKChuZXcgU3RyaW5nKCJGcm9ncyIpLmNvbmNhdCgianVzdCIpKS5jb25jYXQobmV3IFN0cmluZygidG90YWxseSIpKS5jb25jYXQobmV3IFN0cmluZygiUm9jayIpKSkKLQkJCQkpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0JvcmRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQm9yZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjg4YjY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQm9yZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBCb3JkZXJUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQm9yZGVyVGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBCb3JkZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXRjaGVkUmFpc2VkKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkiamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoamF2YXguc3dpbmcuYm9yZGVyLkV0Y2hlZEJvcmRlci5SQUlTRUQpIiAsCi0JCQkgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVFdGNoZWRCb3JkZXIoamF2YXguc3dpbmcuYm9yZGVyLkV0Y2hlZEJvcmRlci5SQUlTRUQpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCZXZlbFJhaXNlZCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJImphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlQmV2ZWxCb3JkZXIoamF2YXguc3dpbmcuYm9yZGVyLkJldmVsQm9yZGVyLlJBSVNFRCkiLAotCQkJamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVCZXZlbEJvcmRlcihqYXZheC5zd2luZy5ib3JkZXIuQmV2ZWxCb3JkZXIuUkFJU0VEKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkiamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigpIiwKLQkJCWphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hdHRlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkiamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVNYXR0ZUJvcmRlcigyLCAyLCAyLCAyLCBqYXZhLmF3dC5Db2xvci5ibGFjaykiLAotCQkJZmFsc2UsCi0JCQlqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZU1hdHRlQm9yZGVyKDIsIDIsIDIsIDIsIGphdmEuYXd0LkNvbG9yLmJsYWNrKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvZnRCZXZlbCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJIm5ldyBqYXZheC5zd2luZy5ib3JkZXIuU29mdEJldmVsQm9yZGVyKDApIiwKLQkJCWZhbHNlLAotCQkJbmV3IGphdmF4LnN3aW5nLmJvcmRlci5Tb2Z0QmV2ZWxCb3JkZXIoMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVNpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSJqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDIsIDIsIDIsIDIpIiwKLQkJCWZhbHNlLAotCQkJamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigyLCAyLCAyLCAyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpbmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSJqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUxpbmVCb3JkZXIoamF2YS5hd3QuQ29sb3IuYmxhY2ssIDIpIiwKLQkJCWZhbHNlLAotCQkJamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKGphdmEuYXd0LkNvbG9yLmJsYWNrLCAyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvZnRCZXZlbFJhaXNlZCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJIm5ldyBqYXZheC5zd2luZy5ib3JkZXIuU29mdEJldmVsQm9yZGVyKGphdmF4LnN3aW5nLmJvcmRlci5CZXZlbEJvcmRlci5SQUlTRUQpIiwKLQkJCWZhbHNlLAotCQkJbmV3IGphdmF4LnN3aW5nLmJvcmRlci5Tb2Z0QmV2ZWxCb3JkZXIoamF2YXguc3dpbmcuYm9yZGVyLkJldmVsQm9yZGVyLlJBSVNFRCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUaXRsZWRCYXNpYygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJImphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKG51bGwsXCJmcm9nXCIsMiwwKSIsCi0JCQlmYWxzZSwKLQkJCWphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlVGl0bGVkQm9yZGVyKG51bGwsICJmcm9nIiwgMiwgMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wb3VuZEJhc2ljKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkibmV3IGphdmF4LnN3aW5nLmJvcmRlci5Db21wb3VuZEJvcmRlcihqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKCksamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigpKSIsCi0JCQlmYWxzZSwKLQkJCW5ldyBqYXZheC5zd2luZy5ib3JkZXIuQ29tcG91bmRCb3JkZXIoamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVFbXB0eUJvcmRlcigpLGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wb3VuZE1lZGl1bSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKAotCQkJImphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlQ29tcG91bmRCb3JkZXIoamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVCZXZlbEJvcmRlcihqYXZheC5zd2luZy5ib3JkZXIuQmV2ZWxCb3JkZXIuUkFJU0VEKSwgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVCZXZlbEJvcmRlcihqYXZheC5zd2luZy5ib3JkZXIuQmV2ZWxCb3JkZXIuTE9XRVJFRCkpIiwKLQkJCWZhbHNlLAotCQkJamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVDb21wb3VuZEJvcmRlcihqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUJldmVsQm9yZGVyKGphdmF4LnN3aW5nLmJvcmRlci5CZXZlbEJvcmRlci5SQUlTRUQpLCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUJldmVsQm9yZGVyKGphdmF4LnN3aW5nLmJvcmRlci5CZXZlbEJvcmRlci5MT1dFUkVEKSkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGl0bGVkQWR2YW5jZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSJqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUxpbmVCb3JkZXIoamF2YS5hd3QuU3lzdGVtQ29sb3IuYWN0aXZlQ2FwdGlvbiwzMCksIFwiSGVsbG9cIiwgamF2YXguc3dpbmcuYm9yZGVyLlRpdGxlZEJvcmRlci5DRU5URVIsIGphdmF4LnN3aW5nLmJvcmRlci5UaXRsZWRCb3JkZXIuREVGQVVMVF9QT1NJVElPTiwgbmV3IGphdmEuYXd0LkZvbnQoXCJEaWFsb2dcIiwgamF2YS5hd3QuRm9udC5CT0xELCAxOCksIGphdmEuYXd0LkNvbG9yLmxpZ2h0R3JheSkiLAotCQkJZmFsc2UsCi0JCQlqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZVRpdGxlZEJvcmRlcihqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUxpbmVCb3JkZXIoamF2YS5hd3QuU3lzdGVtQ29sb3IuYWN0aXZlQ2FwdGlvbiwzMCksICJIZWxsbyIsIGphdmF4LnN3aW5nLmJvcmRlci5UaXRsZWRCb3JkZXIuQ0VOVEVSLCBqYXZheC5zd2luZy5ib3JkZXIuVGl0bGVkQm9yZGVyLkRFRkFVTFRfUE9TSVRJT04sIG5ldyBqYXZhLmF3dC5Gb250KCJEaWFsb2ciLCBqYXZhLmF3dC5Gb250LkJPTEQsIDE4KSwgamF2YS5hd3QuQ29sb3IubGlnaHRHcmF5KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9DYXN0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9DYXN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE4MmRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvQ2FzdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBDYXN0VGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXN0VGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDYXN0VGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBDYXN0VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50VG9GbG9hdCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgRmxvYXQoKGZsb2F0KTEwKSIsIG5ldyBGbG9hdCgxMCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEludFRvRmxvYXRTcGFjZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgRmxvYXQoIChmbG9hdCkgMTAgKSIsIG5ldyBGbG9hdCgxMCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEZsb2F0VG9GbG9hdCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgRmxvYXQoKGZsb2F0KTEwLjMpIiwgbmV3IEZsb2F0KChmbG9hdCkgMTAuMykpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEZsb2F0VG9GbG9hdDIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IEZsb2F0KChmbG9hdCk1LjMpIiwgbmV3IEZsb2F0KChmbG9hdCkgNS4zKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RmxvYXRUb0Zsb2F0U3BhY2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IEZsb2F0KCAoZmxvYXQpIDEwLjMgKSIsIG5ldyBGbG9hdCgoZmxvYXQpIDEwLjMpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsVG9TdHJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiKFN0cmluZyludWxsIiwgKFN0cmluZykgbnVsbCk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTGl0ZXJhbFRvU3RyaW5nKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIihTdHJpbmcpXCJoaVwiIiwgImhpIik7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFRvU3RyaW5nUGFyYW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmF4LnN3aW5nLkpMYWJlbCggKFN0cmluZykgbnVsbCkiLCBuZXcgamF2YXguc3dpbmcuSkxhYmVsKChTdHJpbmcpIG51bGwpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbnRUb1Nob3J0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIihzaG9ydCkxMCIsIG5ldyBTaG9ydCgoc2hvcnQpIDEwKSk7CQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEZsb2F0VG9GbG9hdFByaW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiKGZsb2F0KTEwLjMiLCBuZXcgRmxvYXQoKGZsb2F0KTEwLjMpKTsJCi0JfQotCQotICAgIC8vCUNhc3RzIHN0YXRlbWVudHMgd2l0aCBxdWFsaWZpZWQgZXhwcmVzc2lvbiB1c2VkIHRvIGZhaWwKLQlwdWJsaWMgdm9pZCB0ZXN0UXVhbGlmaWVkU3RyaW5nUmV0dXJuKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIihqYXZhLmxhbmcuU3RyaW5nKW9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldFJldmVyc2VkKFwiRnJvZ1wiKSIsb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0UmV2ZXJzZWQoIkZyb2ciKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUmV0dXJuKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIihTdHJpbmcpb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0UmV2ZXJzZWQoXCJGcm9nXCIpIixvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXRSZXZlcnNlZCgiRnJvZyIpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RRdWFsaWZpZWRDb2xvclJldHVybigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIoamF2YS5hd3QuQ29sb3Ipb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0Q29sb3IoXCJyZWRcIikiLG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldENvbG9yKCJyZWQiKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzdFVwQ29sb3IoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgIC8vCQlUZXN0IHdoZXJlIHRoZSBtZXRob2QgaXMgdHlwZWQgdG8gcmV0dXJuIENvbG9yIGFuZCB3ZSBjYXN0IHRvIHRoZSBtb3JlIGdlbmVyYWlsaXplZCBzdWJjbGFzcyBvZiBTeXN0ZW1Db2xvcgotCQkgdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiKGphdmEuYXd0LlN5c3RlbUNvbG9yKW9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldENvbG9yKFwid2luZG93XCIpIixvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXRDb2xvcigid2luZG93IikpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0NoYXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0NoYXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOTJiZTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9DaGFyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IENoYXJUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIENoYXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENoYXJUZXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIENoYXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhcigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCInYSciLCBuZXcgQ2hhcmFjdGVyKCdhJykpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdENoYXJhY3RlcigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgQ2hhcmFjdGVyKCdhJykiLCBuZXcgQ2hhcmFjdGVyKCdhJykpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdERvdWJsZVF1b3RlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIidcIiciLCBuZXcgQ2hhcmFjdGVyKCdcIicpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVRdW90ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCInXFwnJyIsIG5ldyBDaGFyYWN0ZXIoJ1wnJykpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEJhY2tzbGFzaCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCInXFxcXCciLCBuZXcgQ2hhcmFjdGVyKCdcXCcpKTsJCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhckV4Y2VwdGlvbigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCInYXNkZiciLCBudWxsLCB0cnVlLCB0cnVlKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9FeGNlcHRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0V4Y2VwdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxMjMzZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0V4Y2VwdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBFeGNlcHRpb25UZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRXhjZXB0aW9uVGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBFeGNlcHRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb29NYW55UGFyYW1zKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBJbnRlZ2VyKFwiMywzXCIpIiwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5yZXNvbHZlZENsYXNzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBBQkNEKDQpIiwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5yZXNvbHZlZE1ldGhvZCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJnZXRNZXRob2QoKSIsbnVsbCx0cnVlLCB0cnVlKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RVbnJlc29sdmVkTGl0ZXJhbCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJ1bnJlc29sdmVkTGl0ZXJhbCIsbnVsbCx0cnVlLCB0cnVlKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9Jbml0UGFyc2VyU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvSW5pdFBhcnNlclN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZjRkNjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9Jbml0UGFyc2VyU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBJbml0UGFyc2VyU3VpdGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0UGFyc2VyU3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0JLy8gVGVzdCBjYXNlcyB0byBiZSBpbmNsdWRlIGluIHRoZSBzdWl0ZQotCXByaXZhdGUgc3RhdGljIENsYXNzIHRlc3RzTGlzdFtdID0gewotCQlOZWVkc0NvZGluZ1Rlc3QuY2xhc3MsCi0JCUJsb2NrVGVzdC5jbGFzcywKLQkJQXJyYXlDb25zdHJ1Y3RvclRlc3QuY2xhc3MsCi0JCU11bHRpQXJnU3RhdGljTWV0aG9kVGVzdC5jbGFzcywKLQkJTXVsdGlBcmdDb25zdHJ1Y3RvclRlc3QuY2xhc3MsCi0JCU11bHRpQXJnSW5zdGFuY2VUZXN0LmNsYXNzLAotCQlOdW1iZXJUZXN0LmNsYXNzLAotCQlDYXN0VGVzdC5jbGFzcywKLQkJRXhjZXB0aW9uVGVzdC5jbGFzcywKLQkJTGl0ZXJhbFRlc3QuY2xhc3MsCi0JCVN0cmluZ1Rlc3QuY2xhc3MsCi0JCUNoYXJUZXN0LmNsYXNzLAotCQlKRkNUZXN0LmNsYXNzLAotCQlCb3JkZXJUZXN0LmNsYXNzLAotCQlPdmVybG9hZGluZ1Rlc3QuY2xhc3MsCi0JCVNhbWVOYW1lNDYzNzZUZXN0LmNsYXNzCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwa2dOYW1lID0gIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyIiA7Ci0JICAgIAotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWNrYWdlU3VpdGUuCi0JICovCi0JcHVibGljIEluaXRQYXJzZXJTdWl0ZSgpIHsKLQkJc3VwZXIoKTsKLQkJcG9wdWxhdGVTdWl0ZSgpIDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFja2FnZVN1aXRlLgotCSAqIEBwYXJhbSB0aGVDbGFzcwotCSAqLwotCXB1YmxpYyBJbml0UGFyc2VyU3VpdGUoQ2xhc3MgdGhlQ2xhc3MpIHsKLQkJc3VwZXIodGhlQ2xhc3MpOwotCQlwb3B1bGF0ZVN1aXRlKCkgOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWNrYWdlU3VpdGUuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgSW5pdFBhcnNlclN1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQlwb3B1bGF0ZVN1aXRlKCkgOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVN1aXRlICgpIHsKLQkJZm9yIChpbnQgaT0wOyBpPHRlc3RzTGlzdC5sZW5ndGg7IGkrKykKLQkJICBhZGRUZXN0U3VpdGUodGVzdHNMaXN0W2ldKSA7Ci0JCQotCQlBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZS5pbml0U3VpdGUodGhpcywgbmV3IEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyKHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKSk7Ci0JfQotICAgIAotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBJbml0UGFyc2VyU3VpdGUoIlRlc3QgZm9yOiAiK3BrZ05hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9Jbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9Jbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2M0NDdkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLkluaXRpYWxpemF0aW9uU3RyaW5nRXZhbHVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci5Jbml0aWFsaXphdGlvblN0cmluZ1BhcnNlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlciBleHRlbmRzIEFic3RyYWN0SW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKLQkKLQlwdWJsaWMgSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIoKSB7Ci0JCXRoaXMuY2xhc3NMb2FkZXIgPSBudWxsOwkKLQl9Ci0JCi0JcHVibGljIEluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyKENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXRoaXMuY2xhc3NMb2FkZXIgPSBjbGFzc0xvYWRlcjsJCi0JfQotCQotCS8qKgotCSAqIFRlc3RJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbml0U3RyaW5nKFN0cmluZyBhU3RyaW5nLCBPYmplY3QgZXhwZWN0ZWRSZXN1bHQsIGJvb2xlYW4gdGhyb3dzRXhjZXB0aW9uLCBib29sZWFuIGVxdWFsc09ubHkpIHRocm93cyBUaHJvd2FibGUgewotCQkvLyBFcXVhbHMgb25seSBtZWFucyBhY2NlcHQgaWYgPT0gb3IgZXF1YWxzKCksIGRvbid0IHRyeSB0byBnbyBvbiBhbmQgc2F5IG1heWJlIGVxdWFsLgotCi0JCXRyeSB7Ci0JCQlJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlciBwYXJzZXIgPSBJbml0aWFsaXphdGlvblN0cmluZ1BhcnNlci5jcmVhdGVQYXJzZXIoYVN0cmluZywgY2xhc3NMb2FkZXIpOwotCQkJT2JqZWN0IHJlc3VsdCA9IHBhcnNlci5ldmFsdWF0ZSgpOwotCQkJaWYgKHRocm93c0V4Y2VwdGlvbikgewotCQkJCUFzc2VydC5mYWlsKCJJdCBzaG91bGQgb2YgdGhyb3duIGFuIGV4Y2VwdGlvbi4gSW5zdGVhZCByZXN1bHQ9IiArIChyZXN1bHQgIT0gbnVsbCA/IHJlc3VsdC50b1N0cmluZygpIDogIm51bGwiKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChyZXN1bHQgPT0gZXhwZWN0ZWRSZXN1bHQpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0gZWxzZSBpZiAoCi0JCQkJCShyZXN1bHQgPT0gbnVsbCAmJiBleHBlY3RlZFJlc3VsdCAhPSBudWxsKSB8fCAoZXhwZWN0ZWRSZXN1bHQgPT0gbnVsbCAmJiByZXN1bHQgIT0gbnVsbCkpIHsKLQkJCQkJCUFzc2VydC5mYWlsKCJFeHBlY3RlZFJlc3VsdD0iICsgZXhwZWN0ZWRSZXN1bHQgKyAiIHJlc3VsdD0iICsgcmVzdWx0KTsKLQkJCQl9IGVsc2UgaWYgKHJlc3VsdC5lcXVhbHMoZXhwZWN0ZWRSZXN1bHQpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBJdCBtYXkgYmUgdGhhdCB0aGUgZXF1YWxzIGV4cHJlc3Npb24gaXMgYmFkLiAgSWYgc28gdXNlIHRoZSB0b1N0cmluZygpIHRvIGRvIGEgcGFydGlhbCBjb21wYXJpc29uCi0JCQkJCWlmIChyZXN1bHQuZ2V0Q2xhc3MoKSA9PSBleHBlY3RlZFJlc3VsdC5nZXRDbGFzcygpKSB7Ci0JCQkJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGV4cGVjdGVkUmVzdWx0LnRvU3RyaW5nKCkpKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkvLyBUaGUgdG9TdHJpbmdzIGRvIG5vdCBtYXRjaCBwZXJmZWN0bHkgYnV0IHRoZSBjbGFzc2VzIGRvLgotCQkJCQkJCS8vIFRyeSBhbmQgc2VlIGhvdyBjbG9zZSB0aGUgdHdvIHN0cmluZ3MgYXJlCi0JCQkJCQkJaWYgKCBleHBlY3RlZFJlc3VsdC5nZXRDbGFzcygpLmlzQXJyYXkoKSAmJiByZXN1bHQuZ2V0Q2xhc3MoKS5pc0FycmF5KCkpewotCQkJCQkJCQlDbGFzcyBleHBlY3RlZFJlc3VsdENsYXNzID0gZXhwZWN0ZWRSZXN1bHQuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJCQkJCUNsYXNzIHJlc3VsdENsYXNzID0gcmVzdWx0LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJCQkJCQlpbnQgcmVzdWx0TGVuZ3RoID0gQXJyYXkuZ2V0TGVuZ3RoKHJlc3VsdCk7Ci0JCQkJCQkJCWludCBleHBlY3RlZExlbmd0aCA9IEFycmF5LmdldExlbmd0aChleHBlY3RlZFJlc3VsdCk7Ci0JCQkJCQkJCWlmICggZXhwZWN0ZWRMZW5ndGggPT0gcmVzdWx0TGVuZ3RoICl7Ci0JCQkJCQkJCQlpZiAoIHJlc3VsdENsYXNzID09IGV4cGVjdGVkUmVzdWx0Q2xhc3MgKSB7Ci0JCQkJCQkJCQkJLy8gVE9ETyBTaG91bGQgYWN0dWFsbHkgc3RlcCBpbiBhbmQgY2hlY2sgZWFjaCBlbGVtZW50IHRvby4KLQkJCQkJCQkJCQlyZXR1cm47CQkJCQkJCQkJCQkJCQkJCQkJCi0JCQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQkJCUFzc2VydC5mYWlsKCBhU3RyaW5nCi0JCQkJCQkJCQkJCQkrICIgRXhwZWN0ZWRSZXN1bHQ9IgotCQkJCQkJCQkJCQkJKyBleHBlY3RlZFJlc3VsdAotCQkJCQkJCQkJCQkJKyAiIEFjdHVhbFJlc3VsdD0iCi0JCQkJCQkJCQkJCQkrIHJlc3VsdAotCQkJCQkJCQkJCQkJKyAiIEV4cGVjdGVkQ2xhc3M9IgotCQkJCQkJCQkJCQkJKyBleHBlY3RlZFJlc3VsdC5nZXRDbGFzcygpCi0JCQkJCQkJCQkJCQkrICIgQWN0dWFsQ2xhc3M9IgotCQkJCQkJCQkJCQkJKyByZXN1bHQuZ2V0Q2xhc3MoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCQlBc3NlcnQuZmFpbCggYVN0cmluZwotCQkJCQkJCQkJCQkrICIgRXhwZWN0ZWRSZXN1bHQ9IgotCQkJCQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0Ci0JCQkJCQkJCQkJCSsgIiBBY3R1YWxSZXN1bHQ9IgotCQkJCQkJCQkJCQkrIHJlc3VsdAotCQkJCQkJCQkJCQkrICIgRXhwZWN0ZWRDbGFzcz0iCi0JCQkJCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQuZ2V0Q2xhc3MoKQotCQkJCQkJCQkJCQkrICIgQWN0dWFsQ2xhc3M9IgotCQkJCQkJCQkJCQkrIHJlc3VsdC5nZXRDbGFzcygpKTsJCQotCQkJCQkJCQl9CQkJCQkJCQkKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQlpZiAoZXF1YWxzT25seSkKLQkJCQkJCQkJCUFzc2VydC5mYWlsKCBhU3RyaW5nCi0JCQkJCQkJCQkJKyAiIEV4cGVjdGVkUmVzdWx0PSIKLQkJCQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0Ci0JCQkJCQkJCQkJKyAiIEFjdHVhbFJlc3VsdD0iCi0JCQkJCQkJCQkJKyByZXN1bHQKLQkJCQkJCQkJCQkrICIgRXhwZWN0ZWRDbGFzcz0iCi0JCQkJCQkJCQkJKyBleHBlY3RlZFJlc3VsdC5nZXRDbGFzcygpCi0JCQkJCQkJCQkJKyAiIEFjdHVhbENsYXNzPSIKLQkJCQkJCQkJCQkrIHJlc3VsdC5nZXRDbGFzcygpKTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCUFzc2VydC5mYWlsKCBhU3RyaW5nCi0JCQkJCQkJCSsgIiBFeHBlY3RlZFJlc3VsdD0iCi0JCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQKLQkJCQkJCQkJKyAiIEFjdHVhbFJlc3VsdD0iCi0JCQkJCQkJCSsgcmVzdWx0Ci0JCQkJCQkJCSsgIiBFeHBlY3RlZENsYXNzPSIKLQkJCQkJCQkJKyBleHBlY3RlZFJlc3VsdC5nZXRDbGFzcygpCi0JCQkJCQkJCSsgIiBBY3R1YWxDbGFzcz0iCi0JCQkJCQkJCSsgcmVzdWx0LmdldENsYXNzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJbml0aWFsaXphdGlvblN0cmluZ0V2YWx1YXRpb25FeGNlcHRpb24gZSkgewotCQkJaWYgKHRocm93c0V4Y2VwdGlvbikgewotCQkJCXJldHVybjsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgZS5nZXRPcmlnaW5hbEV4Y2VwdGlvbigpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL0pGQ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvSkZDVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTgzYTQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvSkZDVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBKRkNUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEpGQ1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSkZDVGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBKRkNUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REaW1lbnNpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEuYXd0LkRpbWVuc2lvbigxLDEpIiwgbmV3IGphdmEuYXd0LkRpbWVuc2lvbigxLCAxKSk7CQotICAgIH0KLQlwdWJsaWMgdm9pZCB0ZXN0RGltZW5zaW9uTmVnKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLmF3dC5EaW1lbnNpb24oLTEsLTEpIiwgbmV3IGphdmEuYXd0LkRpbWVuc2lvbigtMSwgLTEpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RDb2xvckNvbnN0YW50KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoImphdmEuYXd0LkNvbG9yLmN5YW4iLCBqYXZhLmF3dC5Db2xvci5jeWFuKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RDb2xvclN0cmluZygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJqYXZhLmF3dC5Db2xvci5jeWFuLnRvU3RyaW5nKCkiLCBqYXZhLmF3dC5Db2xvci5jeWFuLnRvU3RyaW5nKCkpOyAgICAJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RDb2xvclJHQigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS5hd3QuQ29sb3IoMTAsMjAsMzApIiwgbmV3IGphdmEuYXd0LkNvbG9yKDEwLCAyMCwgMzApKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBJbnRlZ2VyKDUwKSIsIG5ldyBJbnRlZ2VyKDUwKSk7ICAgIAkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEludGVnZXJOZWdhdGl2ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS5sYW5nLkludGVnZXIoLTUwKSIsIG5ldyBJbnRlZ2VyKC01MCkpOyAgICAJCi0JfQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IFNob3J0KChzaG9ydCk1MCkiLCBuZXcgU2hvcnQoKHNob3J0KTUwKSk7ICAgIAkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFNob3J0TmVnYXRpdmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IFNob3J0KChzaG9ydCktNTApIiwgbmV3IFNob3J0KChzaG9ydCktNTApKTsgICAgCQotCX0JCi0JcHVibGljIHZvaWQgdGVzdExvbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IExvbmcoNTBMKSIsIG5ldyBMb25nKDUwTCkpOyAgICAJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RMb25nTmVnYXRpdmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEubGFuZy5Mb25nKC01MEwpIiwgbmV3IExvbmcoLTUwTCkpOyAgICAJCi0JfQkKLQlwdWJsaWMgdm9pZCB0ZXN0Qnl0ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgQnl0ZSgoYnl0ZSkxMCkiLCBuZXcgQnl0ZSgoYnl0ZSkxMCkpOyAgICAJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RCeXRlTmVnYXRpdmUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IEJ5dGUoKGJ5dGUpLTEwKSIsIG5ldyBCeXRlKChieXRlKS0xMCkpOyAgICAJCi0JfQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmxvYXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLS8vCQlUT0RPIE5lZWQgdG8gZml4IHRoaXMKLS8vCQkJSXQganVzdCBkb2Vzbid0IHdvcmsgdy9vIGphdmEubGFuZyBvbiBmcm9udC4gVGhlcmUgaXMgYSBwcm9ibGVtIHdpdGggQ29udHJ1Y3RvciBnb2luZyBjbG9zZWQgdG9vIGVhcmx5IGJlY2F1c2Ugb2YgdGhlJy4nIGluIDMuNSwKLS8vCQkJYnV0IGlmIHlvdSBmaXggdGhhdCwgdGhlbiAobmV3IFN0cmluZygiRnJvZyIpLmNvbmNhdCgieHl6IikpLmNvbmNhdCguLi4gZ2V0cyBhbGwgbWVzc2VkIHVwIGJlY2F1c2UgaXQKLS8vCQkJdHJpZXMgdG8gcHJvY2VzcyBTdHJpbmcoKS5jb25jYXQoKSB0b2dldGhlciwgYW5kIGhvdyB0aGF0IHNob3VsZCB3b3JrIGRvZXNuJ3Qgd29yayB0aGUgd2F5IGl0IGRvZXMuIAkJCi0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLmxhbmcuRmxvYXQoMTAuM0YpIiwgbmV3IEZsb2F0KDEwLjNGKSk7ICAgIAkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdERvdWJsZSgpIHRocm93cyBUaHJvd2FibGUgewotLy8JCVRPRE8gc2FtZSBwcm9ibGVtIGFzIHRlc3RGbG9hdC4gTmVlZCBqYXZhLmxhbmcgZm9yIG5vdy4JCQotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS5sYW5nLkRvdWJsZSgxMC4zRCkiLCBuZXcgRG91YmxlKDEwLjNEKSk7ICAgIAkKLQl9CQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyU3RyaW5nKCkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiwgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IEludGVnZXIoXCI1MFwiKSIsIG5ldyBJbnRlZ2VyKCI1MCIpKTsgICAgCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Rmxvd0xheW91dCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS5hd3QuRmxvd0xheW91dCgpIiwgbmV3IGphdmEuYXd0LkZsb3dMYXlvdXQoKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1hZ2VJY29uKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZheC5zd2luZy5JbWFnZUljb24oIFwiQzovV0lOTlQvWmFwb3RlYy5ibXBcIikiLG5ldyBqYXZheC5zd2luZy5JbWFnZUljb24oICJDOi9XSU5OVC9aYXBvdGVjLmJtcCIgKSk7ICAJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RSZWN0YW5nbGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCQkibmV3IGphdmEuYXd0LlJlY3RhbmdsZSggMTAgLCAyMCAsIDMwICwgNDAgKSIsCi0JCQkJbmV3IGphdmEuYXd0LlJlY3RhbmdsZSgxMCwgMjAsIDMwLCA0MCkpOwotICAgIAkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdExvY2FsZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS51dGlsLkxvY2FsZShcImZyXCIsXCJGUlwiKSIsIG5ldyBqYXZhLnV0aWwuTG9jYWxlKCJmciIsICJGUiIpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RMb2NhbGVWYXJpYW50KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBqYXZhLnV0aWwuTG9jYWxlKFwiZnJcIixcIkZSXCIsXCJcIikiLCBuZXcgamF2YS51dGlsLkxvY2FsZSgiZnIiLCAiRlIiLCAiIikpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdExvY2FsZUV4Y2VwdGlvbigpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAgIC8vTG9jYWxlIGNvbnN0cnVjdG9yIGNhbm5vdCB0YWtlIG51bGwgYXMgYXJndW1lbnQgbGlrZSB0aGlzOiBuZXcgSmF2YS51dGlsLkxvY2FsZSgiZnIiLCAiRlIiLCBudWxsKQotCQkgIC8vc28gdGhpcyBpcyBleHBlY3RlZCB0byBmYWlsCi0JCSAgdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEudXRpbC5Mb2NhbGUoXCJmclwiLFwiRlJcIixudWxsKSIsIG51bGwsIHRydWUsIHRydWUpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdERpYWxvZygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS5hd3QuRGlhbG9nKG5ldyBqYXZhLmF3dC5GcmFtZSgpKSIsIGZhbHNlLCBuZXcgamF2YS5hd3QuRGlhbG9nKG5ldyBqYXZhLmF3dC5GcmFtZSgpKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TGVuZ3RoKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBJbnRlZ2VyKCA1MCApLnRvU3RyaW5nKCkubGVuZ3RoKCkiLCBuZXcgSW50ZWdlcihuZXcgSW50ZWdlciggNTAgKS50b1N0cmluZygpLmxlbmd0aCgpKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS51dGlsLkFycmF5TGlzdCgpLnNpemUoKSIsIG5ldyBJbnRlZ2VyKG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KCkuc2l6ZSgpKSk7CQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEN1cnNvcigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YS5hd3QuQ3Vyc29yKGphdmEuYXd0LkN1cnNvci5IQU5EX0NVUlNPUikiLG5ldyBqYXZhLmF3dC5DdXJzb3IoamF2YS5hd3QuQ3Vyc29yLkhBTkRfQ1VSU09SKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFuZWwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IGphdmEuYXd0LlBhbmVsKG51bGwpIiwgZmFsc2UsIG5ldyBqYXZhLmF3dC5QYW5lbChudWxsKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleEZvbnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygKLQkJCSJuZXcgamF2YS5hd3QuRm9udChcIkRpYWxvZ1wiLCBqYXZhLmF3dC5Gb250LkJPTEQgfCBqYXZhLmF3dC5Gb250LklUQUxJQywgMTIpIiwKLQkJCW5ldyBqYXZhLmF3dC5Gb250KCJEaWFsb2ciLCBqYXZhLmF3dC5Gb250LkJPTEQgfCBqYXZhLmF3dC5Gb250LklUQUxJQywgMTIpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0S2V5U3Ryb2tlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoCi0JCQkiamF2YXguc3dpbmcuS2V5U3Ryb2tlLmdldEtleVN0cm9rZShqYXZhLmF3dC5ldmVudC5LZXlFdmVudC5WS19ILCBqYXZhLmF3dC5FdmVudC5BTFRfTUFTSyB8IGphdmEuYXd0LkV2ZW50LkNUUkxfTUFTSyB8IGphdmEuYXd0LkV2ZW50LlNISUZUX01BU0ssIHRydWUpIiwKLQkJCWphdmF4LnN3aW5nLktleVN0cm9rZS5nZXRLZXlTdHJva2UoamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQuVktfSCwgamF2YS5hd3QuRXZlbnQuQUxUX01BU0sgfCBqYXZhLmF3dC5FdmVudC5DVFJMX01BU0sgfCBqYXZhLmF3dC5FdmVudC5TSElGVF9NQVNLLCB0cnVlKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9MaXRlcmFsVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9MaXRlcmFsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhhNzM5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTGl0ZXJhbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBMaXRlcmFsVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXRlcmFsVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBMaXRlcmFsVGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBMaXRlcmFsVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJcIkZyb2dcIiIsICJGcm9nIik7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJudWxsIiwgbnVsbCk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RmFsc2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiZmFsc2UiLCBCb29sZWFuLkZBTFNFKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUcnVlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoInRydWUiLCBCb29sZWFuLlRSVUUpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEJvb2xlYW5UcnVlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIkJvb2xlYW4uVFJVRSIsIEJvb2xlYW4uVFJVRSk7CQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTXVsdGlBcmdDb25zdHJ1Y3RvclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTXVsdGlBcmdDb25zdHJ1Y3RvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1N2ZmYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL011bHRpQXJnQ29uc3RydWN0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogTXVsdGlBcmdDb25zdHJ1Y3RvclRlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgTXVsdGlBcmdDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTXVsdGlBcmdDb25zdHJ1Y3RvclRlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgTXVsdGlBcmdDb25zdHJ1Y3RvclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFR3b0Jvb2xlYW5zKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhmYWxzZSwgZmFsc2UpIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoZmFsc2UsZmFsc2UpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RUd29JbnRzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygxMiwgMjQpIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoMTIsMjQpKTsJCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VGhyZWVGbG9hdHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKChmbG9hdCkxMiwoZmxvYXQpMjQsKGZsb2F0KTUwKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKDEyLDI0LDUwKSk7CQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR3b0RvdWJsZXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKDEyLjVkLCAyNC41ZCkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygxMi41ZCwyNC41ZCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR3b1N0cmluZ3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKFwiYVwiLCBcImJcIikiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygiYSIsImIiKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvQ29sb3JzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhqYXZhLmF3dC5Db2xvci5yZWQsIGphdmEuYXd0LkNvbG9yLnJlZCkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycyhqYXZhLmF3dC5Db2xvci5yZWQsamF2YS5hd3QuQ29sb3IucmVkKSk7CQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR3b05ld0NvbG9ycygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGphdmEuYXd0LkNvbG9yKDI1NSwwLDApLCBuZXcgamF2YS5hd3QuQ29sb3IoMjU1LDAsMCkpIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGphdmEuYXd0LkNvbG9yKDI1NSwwLDApLG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsMCwwKSkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdExvdHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKFwicHJvY2Vzc29yXCIsIDAsIFwiY3VzdG9tZXJTZWFyY2hDbGllbnRPcFwiLCAwLCBcIjIzNDM0MzRcIiwgXCIzNDQzMjM0MjM0XCIsIFwiZGVwb3NpdFJlcEZtdFwiLCBcImRlcG9zaXRSZXBGbXRcIiwgXCJcIiwgXCJcIiwgMCwgMCwgMCwgMCwgZmFsc2UsIGZhbHNlKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCJwcm9jZXNzb3IiLCAwLCAiY3VzdG9tZXJTZWFyY2hDbGllbnRPcCIsIDAsICIyMzQzNDM0IiwgIjM0NDMyMzQyMzQiLCAiZGVwb3NpdFJlcEZtdCIsICJkZXBvc2l0UmVwRm10IiwgIiIsICIiLCAwLCAwLCAwLCAwLCBmYWxzZSwgZmFsc2UpKTsJCi0JfQotCi0vLyBUZXN0Y2FzZSBmb3IgQnVnemlsbGEgYnVnICM1ODg1NCAtIG5vdCB5ZXQgZml4ZWQuCi0vLwlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkTmVzdGVkKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0vLwkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKG5ldyBqYXZhLmxhbmcuU3RyaW5nKG5ldyBTdHJpbmcoXCJzXCIpKSwgXCJhXCIpIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMobmV3IGphdmEubGFuZy5TdHJpbmcobmV3IFN0cmluZygicyIpKSwgImEiKSk7CQotLy8JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9NdWx0aUFyZ0luc3RhbmNlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9NdWx0aUFyZ0luc3RhbmNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjAzODRjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTXVsdGlBcmdJbnN0YW5jZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXI7Ci0vKgotICogICRSQ1NmaWxlOiBNdWx0aUFyZ0luc3RhbmNlVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBNdWx0aUFyZ0luc3RhbmNlVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNdWx0aUFyZ0luc3RhbmNlVGVzdC4KLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBNdWx0aUFyZ0luc3RhbmNlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFR3b0Jvb2xlYW5zKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldChmYWxzZSwgZmFsc2UpIixuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQoZmFsc2UsZmFsc2UpKTsJCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvSW50cygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMoKS5zZXQoMTIsIDI0KSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KDEyLDI0KSk7CQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFRocmVlRmxvYXRzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldCgoZmxvYXQpMTIsKGZsb2F0KTI0LChmbG9hdCk1MCkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldCgxMiwyNCw1MCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR3b0RvdWJsZXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KDEyLjVkLCAyNC41ZCkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldCgxMi41ZCwyNC41ZCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR3b1N0cmluZ3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KFwiYVwiLCBcImJcIikiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldCgiYSIsImIiKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvQ29sb3JzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldChqYXZhLmF3dC5Db2xvci5yZWQsIGphdmEuYXd0LkNvbG9yLnJlZCkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldChqYXZhLmF3dC5Db2xvci5yZWQsamF2YS5hd3QuQ29sb3IucmVkKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvTmV3Q29sb3JzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldChuZXcgamF2YS5hd3QuQ29sb3IoMjU1LDAsMCksIG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsMCwwKSkiLG5ldyBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycygpLnNldChuZXcgamF2YS5hd3QuQ29sb3IoMjU1LDAsMCksbmV3IGphdmEuYXd0LkNvbG9yKDI1NSwwLDApKSk7CQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTXVsdGlBcmdTdGF0aWNNZXRob2RUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL011bHRpQXJnU3RhdGljTWV0aG9kVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmQyZjkwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTXVsdGlBcmdTdGF0aWNNZXRob2RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogTXVsdGlBcmdTdGF0aWNNZXRob2RUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjUgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi0vKioKLSAqIEBhdXRob3Igam15ZXJzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIE11bHRpQXJnU3RhdGljTWV0aG9kVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNdWx0aUFyZ1N0YXRpY01ldGhvZFRlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgTXVsdGlBcmdTdGF0aWNNZXRob2RUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUd29Cb29sZWFucygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQoZmFsc2UsIGZhbHNlKSIsb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KGZhbHNlLGZhbHNlKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvSW50cygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQoMTIsIDI0KSIsb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KDEyLDI0KSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VGhyZWVGbG9hdHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KChmbG9hdCkxMiwoZmxvYXQpMjQsKGZsb2F0KTUwKSIsb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KDEyLDI0LDUwKSk7CQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR3b0RvdWJsZXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KDEyLjVkLCAyNC41ZCkiLG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldCgxMi41ZCwyNC41ZCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR3b1N0cmluZ3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuTmF2aWdhdGlvblBhcmFtZXRlcnMuZ2V0KFwiYVwiLCBcImJcIikiLG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldCgiYSIsImIiKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvQ29sb3JzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldChqYXZhLmF3dC5Db2xvci5yZWQsIGphdmEuYXd0LkNvbG9yLnJlZCkiLG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzLmdldChqYXZhLmF3dC5Db2xvci5yZWQsamF2YS5hd3QuQ29sb3IucmVkKSk7CQkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFR3b05ld0NvbG9ycygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQobmV3IGphdmEuYXd0LkNvbG9yKDI1NSwwLDApLCBuZXcgamF2YS5hd3QuQ29sb3IoMjU1LDAsMCkpIixvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQobmV3IGphdmEuYXd0LkNvbG9yKDI1NSwwLDApLG5ldyBqYXZhLmF3dC5Db2xvcigyNTUsMCwwKSkpOwkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9OYXZpZ2F0aW9uUGFyYW1ldGVycy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9OYXZpZ2F0aW9uUGFyYW1ldGVycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTFlNmZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTmF2aWdhdGlvblBhcmFtZXRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogTmF2aWdhdGlvblBhcmFtZXRlcnMuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLmF3dC4qOwotCi0vKioKLSAqIFRlc3QgY2xhc3MgZm9yIHRoZSBpbml0U3RyaW1nIHBhcnNlciAtIFRoaXMgaXMgdGhlcmUgYWZ0ZXIgdGhlIFNwYW5pc2ggZm9sa3MgZm91bmQgc29tZSBlcnJvcnMgd2l0aCBpbml0U3RyaW5ncwotICogdGhhdCBzaG93ZWQgdXAgZGVmaWNpZW5jaWVzIHdoZXJlIHdlIGhhZCBtZXRob2RzIHdpdGggbXVsdGlwbGUgYXJndW1lbnRzIGFuZCBzb21lIG9mIHRoZSBleHByZXNzaW9ucyBpbnNpZGUgdGhlCi0gKiBhcmd1bWVudHMgd2VyZSBub3QgYmVpbmcgY2xvc2VkIGNvcnJlY3RseS4gIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gaGF2ZSBsb3RzIG9mIG1ldGhvZHMgKCBjb25zdHJ1Y3RvcnMgYW5kIHN0YXRpY3MKLSAqIGFuZCBpbnN0YW5jZSBtZXRob2RzICkgd2l0aCBtdWx0aXBsZSBhcmd1bWVudCB0eXBlcyB0byB0ZXN0IHRoZXNlIHNjZW5hcmlvcywgYW5kIG5pY2UgdG9TdHJpbmcoKSBtZXRob2RzIHNvIHRoYXQgd2UgY2FuCi0gKiBnZXQgZ29vZCBoaXQgcmVzdWx0cyBvbiB0aGUgdGVzdCBzdWNjZWVkaW5nIGJ5IGEgcGVyZmVjdCB0b1N0cmluZygpIG1hdGNoCi0gKi8KLXB1YmxpYyBjbGFzcyBOYXZpZ2F0aW9uUGFyYW1ldGVycyBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqIAotCSAqIEBzaW5jZSAxLjEuMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDUyODk1MzA0OTI4MzM0ODQ2NDBMOwotCXByb3RlY3RlZCBpbnQgeCA9IEludGVnZXIuTUlOX1ZBTFVFOwotCXByb3RlY3RlZCBpbnQgeSA9IEludGVnZXIuTUlOX1ZBTFVFOwotCXByb3RlY3RlZCBib29sZWFuIGJvb2xBLCBib29sQiwgYm9vbEM7Ci0JcHJvdGVjdGVkIENvbG9yIGNvbG9yQSwgY29sb3JCOwotCXByb3RlY3RlZCBTdHJpbmcgc3RyaW5nQSwgc3RyaW5nQiwgc3RyaW5nQzsKLQlwcm90ZWN0ZWQgZG91YmxlIGQxID0gRG91YmxlLk1JTl9WQUxVRTsKLQlwcm90ZWN0ZWQgZG91YmxlIGQyID0gRG91YmxlLk1JTl9WQUxVRTsKLQlwcm90ZWN0ZWQgZmxvYXQgZjEgPSBGbG9hdC5NSU5fVkFMVUU7Ci0JcHJvdGVjdGVkIGZsb2F0IGYyID0gRmxvYXQuTUlOX1ZBTFVFOwkKLQlwcm90ZWN0ZWQgZmxvYXQgZjMgPSBGbG9hdC5NSU5fVkFMVUU7CQotCXByb3RlY3RlZCBpbnRbXVtdIGZJbnRBcnJheTsJCi0JcHJvdGVjdGVkIGRvdWJsZVtdW10gZkRvdWJsZURvdWJsZUFycmF5OwotCXByb3RlY3RlZCBkb3VibGVbXSBmRG91YmxlQXJyYXk7CQotCXByb3RlY3RlZCBNYXAgZkVsZW1lbnRzOwkKLQotLy8gVGhlIG9yaWdpbmFsIGNvbnN0cnVjdG9yIHdlIGJyb2tlIG9uIC0gbGVmdCB0aGVyZSBmb3IgcG9zdGVyaXR5Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMoU3RyaW5nIG5ld0NvbnRleHRVc2VkLCBpbnQgbmV3TmF2aWdhdGlvbiwgU3RyaW5nIG5ld09wZXJhdGlvbk5hbWUsIGludCBuZXdDaGFpbkNvbnRleHQsIFN0cmluZyBuZXdWaWV3TmFtZSwgU3RyaW5nIG5ld1ZpZXdTb3VyY2UsIFN0cmluZyBuZXdPdXRwdXRNYXBGb3JtYXQsIFN0cmluZyBuZXdJbnB1dE1hcEZvcm1hdCwgU3RyaW5nIGEsIFN0cmluZyBiLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgYm9vbGVhbiB1c2VQLCBib29sZWFuIHVzZVMpIHsKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycygpewotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzKGludCB4KXsKLQl0aGlzLnggPSB4OwotCXkgPSAxMDA7Ci19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMgc2V0RWxlbUF0KE9iamVjdCBhS2V5LCBpbnQgYVZhbHVlKXsKLQlpZiAoIGZFbGVtZW50cyA9PSBudWxsICkgewotCQlmRWxlbWVudHMgPSBuZXcgSGFzaE1hcCgxKTsKLQl9OwotCWZFbGVtZW50cy5wdXQoYUtleSxuZXcgSW50ZWdlcihhVmFsdWUpKTsKLQlyZXR1cm4gdGhpczsKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhTdHJpbmcgc3RyaW5nMSwgU3RyaW5nIHN0cmluZzIsIFN0cmluZyBzdHJpbmczLCBib29sZWFuIGJvb2wxLCBib29sZWFuIGJvb2wyLCBib29sZWFuIGJvb2wzLCBpbnQgeCl7Ci0Jc3RyaW5nQSA9IHN0cmluZzE7Ci0Jc3RyaW5nQiA9IHN0cmluZzI7Ci0Jc3RyaW5nQyA9IHN0cmluZzM7Ci0JYm9vbEEgPSBib29sMTsKLQlib29sQiA9IGJvb2wyOwotCWJvb2xDID0gYm9vbDM7CQotCXRoaXMueCA9IHg7Ci19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMoaW50W11bXSBpbnRBcnJheSl7Ci0JZkludEFycmF5ID0gaW50QXJyYXk7Ci19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMoZG91YmxlW10gZG91YmxlQXJyYXkpewotCWZEb3VibGVBcnJheSA9IGRvdWJsZUFycmF5OwotfQotLy8gQ29uc3RydWN0b3JzIHdpdGggZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBhcmd1bWVudHMKLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhib29sZWFuIGEsIGJvb2xlYW4gYil7Ci0JYm9vbEEgPSBhOwotCWJvb2xCID0gYjsKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhpbnQgeCwgaW50IHkpewotCXRoaXMueCA9IHg7Ci0JdGhpcy55ID0geTsKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhmbG9hdCBmMSwgZmxvYXQgZjIsIGZsb2F0IGYzKXsKLQl0aGlzLmYxID0gZjE7Ci0JdGhpcy5mMiA9IGYyOwotCXRoaXMuZjMgPSBmMzsJCi19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMoZG91YmxlW11bXSBhRG91YmxlRG91YmxlQXJyYXkpewotCWZEb3VibGVEb3VibGVBcnJheSA9IGFEb3VibGVEb3VibGVBcnJheTsKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhkb3VibGUgZDEsIGRvdWJsZSBkMil7Ci0JdGhpcy5kMSA9IGQxOwotCXRoaXMuZDIgPSBkMjsKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyhDb2xvciBjb2xvckEsIENvbG9yIGNvbG9yQil7Ci0JdGhpcy5jb2xvckEgPSBjb2xvckE7Ci0JdGhpcy5jb2xvckIgPSBjb2xvckI7Ci19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMoU3RyaW5nIHN0cmluZ0EsIFN0cmluZyBzdHJpbmdCKXsKLQl0aGlzLnN0cmluZ0EgPSBzdHJpbmdBOwotCXRoaXMuc3RyaW5nQiA9IHN0cmluZ0I7Ci19Ci0vLyBTdGF0aWMgbWV0aG9kIGNhbGxzIHdpdGggZGlmZmVyZW50IGNvbWJpbmF0aW9ucyBvZiBhcmd1bWVudHMKLXB1YmxpYyBzdGF0aWMgTmF2aWdhdGlvblBhcmFtZXRlcnMgZ2V0KGJvb2xlYW4gYSwgYm9vbGVhbiBiKXsKLQlyZXR1cm4gbmV3IE5hdmlnYXRpb25QYXJhbWV0ZXJzKGEsYik7Ci19Ci1wdWJsaWMgc3RhdGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzIGdldChpbnQgeCwgaW50IHkpewotCXJldHVybiBuZXcgTmF2aWdhdGlvblBhcmFtZXRlcnMoeCx5KTsKLX0KLXB1YmxpYyBzdGF0aWMgTmF2aWdhdGlvblBhcmFtZXRlcnMgZ2V0KGZsb2F0IGYxLCBmbG9hdCBmMiwgZmxvYXQgZjMpewotCXJldHVybiBuZXcgTmF2aWdhdGlvblBhcmFtZXRlcnMoZjEsZjIsZjMpOwotfQotcHVibGljIHN0YXRpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyBnZXQoZG91YmxlIGQxLCBkb3VibGUgZDIpewotCXJldHVybiBuZXcgTmF2aWdhdGlvblBhcmFtZXRlcnMoZDEsZDIpOwotfQotcHVibGljIHN0YXRpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyBnZXQoQ29sb3IgY29sb3JBLCBDb2xvciBjb2xvckIpewotCXJldHVybiBuZXcgTmF2aWdhdGlvblBhcmFtZXRlcnMoY29sb3JBLGNvbG9yQik7Ci19Ci1wdWJsaWMgc3RhdGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzIGdldChTdHJpbmcgc3RyaW5nQSwgU3RyaW5nIHN0cmluZ0IpewotCXJldHVybiBuZXcgTmF2aWdhdGlvblBhcmFtZXRlcnMoc3RyaW5nQSxzdHJpbmdCKTsKLX0KLXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFJldmVyc2VkKFN0cmluZyBhcmcpewotCS8vIFJldHVybiB0aGUgYXJndW1lbnQgcmV2ZXJzZWQKLQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihhcmcubGVuZ3RoKCkpOwotCWZvciAoaW50IGkgPSBhcmcubGVuZ3RoKCktMTsgaSA+PSAwOyBpLS0pIHsKLQkJYnVmZmVyLmFwcGVuZChhcmcuY2hhckF0KGkpKTsKLQl9Ci0JcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotfQotcHVibGljIHN0YXRpYyBDb2xvciBnZXRDb2xvcihTdHJpbmcgY29sb3JOYW1lKXsKLQkvLyBSZXR1cm4gdGhlIGNvbG9yTmFtZSB0byB0ZXN0IGNhc3Qgc3RhdGVtZW50cwotCXRyeSB7Ci0JCUZpZWxkIGZpZWxkID0gQ29sb3IuY2xhc3MuZ2V0RmllbGQoY29sb3JOYW1lKTsKLQkJcmV0dXJuIChDb2xvcikgZmllbGQuZ2V0KENvbG9yLmNsYXNzKTsKLQl9IGNhdGNoICggTm9TdWNoRmllbGRFeGNlcHRpb24gZXhjICkgewotCQl0cnkgewotCQkJLy8gSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgZmllbGQgaXMgb24gU3lzdGVtQ29sb3IgYW5kIG5vdCBjb2xvcgotCQkJRmllbGQgZmllbGQgPSBTeXN0ZW1Db2xvci5jbGFzcy5nZXRGaWVsZChjb2xvck5hbWUpOwotCQkJcmV0dXJuIChDb2xvcikgZmllbGQuZ2V0KENvbG9yLmNsYXNzKTsJCQotCQl9IGNhdGNoICggRXhjZXB0aW9uIGUgKSB7Ci0JCX0KLQl9IGNhdGNoICggRXhjZXB0aW9uIGV4YyApIHsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0vLyBJbnN0YW5jZSBtZXRob2QgY2FsbHMgd2l0aCBkaWZmZXJlbnQgY29tYmluYXRpb25zIG9mIGFyZ3VtZW50cwotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzIHNldChib29sZWFuIGEsIGJvb2xlYW4gYil7Ci0JYm9vbEEgPSBhOwotCWJvb2xCID0gYjsKLQlyZXR1cm4gdGhpczsJCi19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMgc2V0KGludCB4LCBpbnQgeSl7Ci0JdGhpcy54ID0geDsKLQl0aGlzLnkgPSB5OwotCXJldHVybiB0aGlzOwkKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyBzZXQoZmxvYXQgZjEsIGZsb2F0IGYyLCBmbG9hdCBmMyl7Ci0JdGhpcy5mMSA9IGYxOwotCXRoaXMuZjIgPSBmMjsKLQl0aGlzLmYzID0gZjM7Ci0JcmV0dXJuIHRoaXM7CQotfQotcHVibGljIE5hdmlnYXRpb25QYXJhbWV0ZXJzIHNldChkb3VibGUgZDEsIGRvdWJsZSBkMil7Ci0JdGhpcy5kMSA9IGQxOwotCXRoaXMuZDIgPSBkMjsKLQlyZXR1cm4gdGhpczsJCi19Ci1wdWJsaWMgTmF2aWdhdGlvblBhcmFtZXRlcnMgc2V0KENvbG9yIGNvbG9yQSwgQ29sb3IgY29sb3JCKXsKLQl0aGlzLmNvbG9yQSA9IGNvbG9yQTsKLQl0aGlzLmNvbG9yQiA9IGNvbG9yQjsKLQlyZXR1cm4gdGhpczsKLX0KLXB1YmxpYyBOYXZpZ2F0aW9uUGFyYW1ldGVycyBzZXQoU3RyaW5nIHN0cmluZ0EsIFN0cmluZyBzdHJpbmdCKXsKLQl0aGlzLnN0cmluZ0EgPSBzdHJpbmdBOwotCXRoaXMuc3RyaW5nQiA9IHN0cmluZ0I7Ci0JcmV0dXJuIHRoaXM7CQotfQotLy8gVG8gc3RyaW5nIG1ldGhvZCB0byBoZWxwIHRoZSB0ZXN0cyBiZSBPSz8gd2l0aCBtYXRjaGluZyB0b1N0cmluZygpIHJlc3VsdHMKLXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQlTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCXdyaXRlci53cml0ZSgiTmF2aWdhdGlvblBhcmFtZXRlcnMoIik7Ci0JaWYgKCB4ICE9IEludGVnZXIuTUlOX1ZBTFVFICkgd3JpdGVyLndyaXRlKG5ldyBJbnRlZ2VyKHgpLnRvU3RyaW5nKCkpOwotCWlmICggeSAhPSBJbnRlZ2VyLk1JTl9WQUxVRSApIHdyaXRlci53cml0ZShuZXcgSW50ZWdlcih5KS50b1N0cmluZygpKTsJCi0Jd3JpdGVyLndyaXRlKCJib29sQT0iICsgYm9vbEEpOwotCXdyaXRlci53cml0ZSgiYm9vbEE9IiArIGJvb2xCKTsJCi0Jd3JpdGVyLndyaXRlKCJib29sQT0iICsgYm9vbEEpOwotCXdyaXRlci53cml0ZSgiYm9vbEM9IiArIGJvb2xDKTsJCQotCWlmICggY29sb3JBICE9IG51bGwgKSB3cml0ZXIud3JpdGUoImNvbG9yQT0iICsgY29sb3JBKTsKLQlpZiAoIGNvbG9yQiAhPSBudWxsICkgd3JpdGVyLndyaXRlKCJjb2xvckI9IiArIGNvbG9yQik7CQotCWlmICggc3RyaW5nQSAhPSBudWxsICkgd3JpdGVyLndyaXRlKCJzdHJpbmdBPSIgKyBzdHJpbmdBKTsKLQlpZiAoIHN0cmluZ0IgIT0gbnVsbCApIHdyaXRlci53cml0ZSgic3RyaW5nQj0iICsgc3RyaW5nQik7CQkKLQlpZiAoIHN0cmluZ0MgIT0gbnVsbCApIHdyaXRlci53cml0ZSgic3RyaW5nQj0iICsgc3RyaW5nQyk7Ci0JaWYgKCBkMSAhPSBEb3VibGUuTUlOX1ZBTFVFICkgd3JpdGVyLndyaXRlKCJkMT0iICsgZDEpOwotCWlmICggZDIgIT0gRG91YmxlLk1JTl9WQUxVRSApIHdyaXRlci53cml0ZSgiZDE9IiArIGQyKTsKLQlpZiAoIGYxICE9IEZsb2F0Lk1JTl9WQUxVRSApIHdyaXRlci53cml0ZSgiZjE9IiArIGYxKTsKLQlpZiAoIGYyICE9IEZsb2F0Lk1JTl9WQUxVRSApIHdyaXRlci53cml0ZSgiZjI9IiArIGYyKTsKLQlpZiAoIGYyICE9IEZsb2F0Lk1JTl9WQUxVRSApIHdyaXRlci53cml0ZSgiZjM9IiArIGYzKTsJCi0JaWYgKCBmSW50QXJyYXkgIT0gbnVsbCApIHsKLQkJd3JpdGVyLndyaXRlKCJpbnQgYXJyYXk9Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkludEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQl3cml0ZXIud3JpdGUoIlsiKTsKLQkJCS8vIFRoZSBlbGVtZW50cyBpbiB0aGUgYXJyYXkgYXJlIHRoZW1zZWx2ZXMgYXJyYXlzIC0gaXQgaXMgdHdvIGRpbWVuc2lvbmFsCi0JCQlpbnRbXSBlbGVtZW50cyA9IGZJbnRBcnJheVtpXTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQl3cml0ZXIud3JpdGUobmV3IEludGVnZXIoZWxlbWVudHNbal0pLnRvU3RyaW5nKCkpOwkKLQkJCX0KLQkJCXdyaXRlci53cml0ZSgiXSIpOwotCQl9Ci0JfQotCWlmICggZkRvdWJsZURvdWJsZUFycmF5ICE9IG51bGwgKSB7Ci0JCXdyaXRlci53cml0ZSgiZG91YmxlZG91YmxlIGFycmF5PSIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZEb3VibGVEb3VibGVBcnJheS5sZW5ndGg7IGkrKykgewotCQkJd3JpdGVyLndyaXRlKCJbIik7Ci0JCQkvLyBUaGUgZWxlbWVudHMgaW4gdGhlIGFycmF5IGFyZSB0aGVtc2VsdmVzIGFycmF5cyAtIGl0IGlzIHR3byBkaW1lbnNpb25hbAotCQkJZG91YmxlW10gZWxlbWVudHMgPSBmRG91YmxlRG91YmxlQXJyYXlbaV07Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJd3JpdGVyLndyaXRlKG5ldyBEb3VibGUoZWxlbWVudHNbal0pLnRvU3RyaW5nKCkpOwkKLQkJCX0KLQkJCXdyaXRlci53cml0ZSgiXSIpOwotCQl9Ci0JfQotCQotCWlmICggZkRvdWJsZUFycmF5ICE9IG51bGwgKSB7CQotCQl3cml0ZXIud3JpdGUoImRvdWJsZSBhcnJheT0iKTsJCQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZEb3VibGVBcnJheS5sZW5ndGg7IGkrKykgewotCQkJd3JpdGVyLndyaXRlKCIoIik7CQkJCi0JCQl3cml0ZXIud3JpdGUobmV3IERvdWJsZShmRG91YmxlQXJyYXlbaV0pLnRvU3RyaW5nKCkpOwotCQkJd3JpdGVyLndyaXRlKCIpIik7CQkJCi0JCX0KLQl9Ci0Jd3JpdGVyLndyaXRlKCIpIik7Ci0JcmV0dXJuIHdyaXRlci50b1N0cmluZygpOwotfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL05lZWRzQ29kaW5nVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9OZWVkc0NvZGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlYzQ1My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL05lZWRzQ29kaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IE5lZWRzQ29kaW5nVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS42ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBOZWVkc0NvZGluZ1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTmVlZHNDb2RpbmdUZXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIE5lZWRzQ29kaW5nVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CQotCQotCS8vIFRPRE86IGVuYWJsZSB0aGlzIHRlc3Qgd2hlbiBtYXRoIHdvcmtzCi0JLyoKLQlwdWJsaWMgdm9pZCB0ZXN0TWF0aCgpIHsKLQkJLy8gRG9pbmcgbWF0aCBpcyBub3QgY29kZWQgeWV0LiAgV2UgZG9uJ3QgZXhwZWN0IHRvIGVuY291bnRlciBhbnkgc3RyaW5ncyBsaWtlIHRoaXMgYXMgcGFydCBvZiBHQQotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIxMCArIDIwIiwgbmV3IEludGVnZXIoMTAgKyAyMCkpOwkKLQl9Ci0JKi8KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJDbGFzc2VzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgICAvLwlJbm5lciBjbGFzc2VzIG5lZWQgY29kaW5nIGJ1dCB3ZSBoYXZlIGEgdGVzdCB0byBtYWtlIHN1cmUgd2UgdGhyb3cgYW4gZXhwbGljaXQgZXhjZXB0aW9uCi0JCSB0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgamF2YXguc3dpbmcudGFibGUuRGVmYXVsdFRhYmxlTW9kZWwoKXt9IixuZXcgamF2YXguc3dpbmcudGFibGUuRGVmYXVsdFRhYmxlTW9kZWwoKXsKLQotCQkJLyoqCi0JCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkJICogCi0JCQkgKiBAc2luY2UgMS4xLjAKLQkJCSAqLwotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7fSx0cnVlLCB0cnVlKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RQYXJhbXNUaHJlZUZsb2F0cygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQoKGZsb2F0KTEyLChmbG9hdCkyNCwoZmxvYXQpNTApIixvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5OYXZpZ2F0aW9uUGFyYW1ldGVycy5nZXQoMTIsMjQsNTApKTsJCQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0VGhyZWVGbG9hdHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKChmbG9hdCkxMiwoZmxvYXQpMjQsKGZsb2F0KTUwKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKDEyLDI0LDUwKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3UGFyYW1zVGhyZWVGbG9hdHMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KChmbG9hdCkxMiwoZmxvYXQpMjQsKGZsb2F0KTUwKSIsbmV3IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLk5hdmlnYXRpb25QYXJhbWV0ZXJzKCkuc2V0KDEyLDI0LDUwKSk7CQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvTnVtYmVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9OdW1iZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NjNiNjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9OdW1iZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyOwotLyoKLSAqICAkUkNTZmlsZTogTnVtYmVyVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS40ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBOdW1iZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE51bWJlclRlc3QuCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgTnVtYmVyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50UHJpbSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIxMCIsIG5ldyBJbnRlZ2VyKDEwKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnRQcmltKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIihzaG9ydCkxMCIsIG5ldyBTaG9ydCgoc2hvcnQpMTApKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3ROZWdhdGl2ZVNob3J0UHJpbSgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIoc2hvcnQpLTEwIiwgbmV3IFNob3J0KChzaG9ydCktMTApKTsJCi0JfQkKLQlwdWJsaWMgdm9pZCB0ZXN0Qnl0ZVByaW0oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiKGJ5dGUpMTAiLCBuZXcgQnl0ZSgoYnl0ZSkxMCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdERvdWJsZVByaW1FeHBsaWNpdCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIxMGQiLCBuZXcgRG91YmxlKDEwZCkpOwkKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE5lZ2F0aXZlRG91YmxlUHJpbUV4cGxpY2l0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIi0xMGQiLCBuZXcgRG91YmxlKC0xMGQpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RGbG9hdFByaW1FeHBsaWNpdCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIxMGYiLCBuZXcgRmxvYXQoMTBmKSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TG9uZ1ByaW1FeHBsaWNpdCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIxMGwiLCBuZXcgTG9uZygxMGwpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGVQcmltSW1wbGljaXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiMTAuNzUiLCBuZXcgRG91YmxlKDEwLjc1KSk7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVnYXRpdmVEb3VibGVQcmltSW1wbGljaXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiLTEwLjc1IiwgbmV3IERvdWJsZSgtMTAuNzUpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTcGFjZWREb3VibGVQcmltSW1wbGljaXQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiIDEwLjc1ICIsIG5ldyBEb3VibGUoMTAuNzUpKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3ROZWdhdGl2ZURvdWJsZVByaW1FeHBsaWNpdDIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiLTEwLjc1ZCIsIG5ldyBEb3VibGUoLTEwLjc1ZCkpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL092ZXJsb2FkaW5nVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9PdmVybG9hZGluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgzYWU0NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL092ZXJsb2FkaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IE92ZXJsb2FkaW5nVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS43ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotLyoqCi0gKiBUZXN0IHRoYXQgY29ycmVjdCBvdmVybG9hZGVkIG1ldGhvZCBpcyBjYWxsZWQuCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBPdmVybG9hZGluZ1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgT3ZlcmxvYWRpbmdUZXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIE92ZXJsb2FkaW5nVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcmxvYWRTdHJpbmcoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygibmV3IEludGVnZXIoXCIzXCIpIiwgbmV3IEludGVnZXIoMykpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcmxvYWRTaG9ydCgpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgSW50ZWdlcig1KSIsIG5ldyBJbnRlZ2VyKDUpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL1NhbWVOYW1lNDYzNzZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL1NhbWVOYW1lNDYzNzZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZTVhNzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci9TYW1lTmFtZTQ2Mzc2VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IFNhbWVOYW1lNDYzNzZUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotIAotLyoqCi0gKiBUaGlzIGlzIHRvIHRlc3QgZm9yIGRlZmVjdCBbNDYzNzZdLgotICogCi0gKiBTYW1lTmFtZSB0ZXN0LiBUaGlzIGlzIHRlc3Qgd2hlcmUgeW91IGhhdmUgdGhpczoKLSAqIAlJbml0UGFyc2VyVGVzdDQ2Mzc2LlNhbWVOYW1lVGVzdENsYXNzLmphdmEKLSAqIAlJbml0UGFyc2VyVGVzdDQ2Mzc2LmphdmEKLSAqIAotICogYW5kCi0gKiAKLSAqIAluZXcgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuU2FtZU5hbWVUZXN0Q2xhc3MuUmVhbENsYXNzKCkKLSAqIAotICogQmVmb3JlIFs0NjM3Nl0gdGhlIFN0YXRpYyBwYXJzZXIgd291bGQgZmluZCBTYW1lTmFtZVRlc3RDbGFzcy5qYXZhIGluc3RlYWQgb2YgdGhlIFJlYWxDbGFzcyBhbmQgd291bGQgb2YgZmFpbGVkLgotICogVG8gY29tcGlsZSBpbiBFY2xpcHNlIHdlIG5lZWQgdG8gaGF2ZSBvbmUgb2YgdGhlIGNsYXNzZXMgYmUgaW4gdGhlIGRlZmF1bHQgcGFja2FnZS4gRWNsaXBzZSBjb21wbGFpbnMgaWYgd2UgZGlkbid0LgotICogQnV0IHRoZXJlIGlzIG5vdGhpbmcgdG8gc3RvcCB0aGlzIGZyb20gaGFwcGVuaW5nIHdpdGggcGFja2FnZXMgdG9vIGlmIHRoZXkgYXJlIHNwcmVhZCBhY3Jvc3MgY29tcGlsZSBncm91cHMuICAKLSAqLwotcHVibGljIGNsYXNzIFNhbWVOYW1lNDYzNzZUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCQotCXB1YmxpYyBTYW1lTmFtZTQ2Mzc2VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdDQ2Mzc2KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIm5ldyBpbml0UGFyc2VyVGVzdDQ2Mzc2LlNhbWVOYW1lVGVzdENsYXNzKCkiLCBuZXcgaW5pdFBhcnNlclRlc3Q0NjM3Ni5TYW1lTmFtZVRlc3RDbGFzcygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL1N0cmluZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvU3RyaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2I0NDY1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvU3RyaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlcjsKLS8qCi0gKiAgJFJDU2ZpbGU6IFN0cmluZ1Rlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLS8qKgotICogQGF1dGhvciBqbXllcnMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBTdHJpbmdUZXN0LgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZ1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIlwiRnJvZy8xMjNcIiIsICJGcm9nLzEyMyIpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50VmFsdWUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiU3RyaW5nLnZhbHVlT2YoMTApIiwgIjEwIik7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyZW5zKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIlwiRnJvZygxMjMpcHJpbmNlXCIiLCAiRnJvZygxMjMpcHJpbmNlIik7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUXVvdGVzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIlwiRnJvZ1xcXCJwcmluY2VcXFwiMTIzXCIiLCAiRnJvZ1wicHJpbmNlXCIxMjMiKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RCYWNrU2xhc2hlcygpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJcIkZyb2dcXFxccHJpbmNlXFxcXDEyM1wiIiwgIkZyb2dcXHByaW5jZVxcMTIzIik7CQotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFja1NsYXNoKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIlwiXFxcXEZyb2dcIiIsICJcXEZyb2ciKTsJCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdGdW5jdGlvbigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJcIkZyb2dcIi5sZW5ndGgoKSIsIG5ldyBJbnRlZ2VyKDQpKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVEFycmF5c1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RBcnJheXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNWQ0OTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVEFycmF5c1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEFTVEFycmF5c1Rlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkZvckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuQXJyYXlDb25zdHJ1Y3RvclRlc3Q7Ci0gCi0vKioKLSAqIFRlc3QgQXJyYXlzIGZvciBBU1QuCi0gKiAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgQVNUQXJyYXlzVGVzdCBleHRlbmRzIEFycmF5Q29uc3RydWN0b3JUZXN0IHsKLQotCXB1YmxpYyBBU1RBcnJheXNUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyIGdldFRyZWVQYXJzZXIoKSB7Ci0JCXJldHVybiAoQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyKSB0ZXN0SGVscGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5kZWZpbmVkU2Vjb25kRGltKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUNyZWF0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJpbnRbXVtdIiwgMSk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlDUkVBVElPTl9ESU1FTlNJT04sIDMpOwotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJuZXcgaW50WzNdW10iLCBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlBY2Nlc3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUFycmF5QWNjZXNzKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sIDEpOwotCQlleHAuY3JlYXRlQXJyYXlDcmVhdGlvbihGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0FSUkFZLCAiamF2YS5sYW5nLkludGVnZXJbXSIsIDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQ1JFQVRJT05fRElNRU5TSU9OLCAzKTsKLQkJZXhwLmNyZWF0ZVByaW1pdGl2ZUxpdGVyYWwoRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19JTkRFWCwgMCk7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIihuZXcgSW50ZWdlclszXSlbMF0iLCBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCkpOyAKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE11dGx0aUFycmF5QWNjZXNzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVBcnJheUFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAyKTsKLQkJZXhwLmNyZWF0ZUFycmF5Q3JlYXRpb24oRm9yRXhwcmVzc2lvbi5BUlJBWUFDQ0VTU19BUlJBWSwgImludFtdW10iLCAwKTsKLQkJZXhwLmNyZWF0ZUFycmF5SW5pdGlhbGl6ZXIoMik7Ci0JCWV4cC5jcmVhdGVBcnJheUluaXRpYWxpemVyKDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZSU5JVElBTElaRVJfRVhQUkVTU0lPTiwgMik7Ci0JCWV4cC5jcmVhdGVBcnJheUluaXRpYWxpemVyKDEpOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZSU5JVElBTElaRVJfRVhQUkVTU0lPTiwgNCk7Ci0JCWV4cC5jcmVhdGVQcmltaXRpdmVMaXRlcmFsKEZvckV4cHJlc3Npb24uQVJSQVlBQ0NFU1NfSU5ERVgsIDApOwotCQlleHAuY3JlYXRlUHJpbWl0aXZlTGl0ZXJhbChGb3JFeHByZXNzaW9uLkFSUkFZQUNDRVNTX0lOREVYLCAwKTsJCQotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCIobmV3IGludFtdW10ge3syfSwgezR9fSlbMF1bMF0iLCBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCkpOyAKLQl9CQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVEZpZWxkQWNjZXNzVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVEZpZWxkQWNjZXNzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODRlYWRiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RGaWVsZEFjY2Vzc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEFTVEZpZWxkQWNjZXNzVGVzdC5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS41ICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLklFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuRm9yRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5BYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZTsKLSAKLS8qKgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEFTVEZpZWxkQWNjZXNzVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENyZWF0ZSB3aXRoIG5hbWUuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgQVNURmllbGRBY2Nlc3NUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyIGdldFRyZWVQYXJzZXIoKSB7Ci0JCXJldHVybiAoQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyKSB0ZXN0SGVscGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uUXVhbGlmaWVkRmllbGRBY2Nlc3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJZ2V0VHJlZVBhcnNlcigpLnRlc3RJbml0U3RyaW5nKCJDb2xvci5yZWQiLCBuZXcgU3RyaW5nW10geyJqYXZhLmF3dC4qIn0sIGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5UeXBlUHJveHlGYWN0b3J5KCkuZ2V0QmVhblR5cGVQcm94eSgiamF2YS5hd3QuQ29sb3IiKS5uZXdJbnN0YW5jZSgiamF2YS5hd3QuQ29sb3IucmVkIikgKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEV4cHJlc3Npb25GaWVsZEFjY2VzcygpIHRocm93cyBUaHJvd2FibGUgewotCQlnZXRUcmVlUGFyc2VyKCkudGVzdEluaXRTdHJpbmcoIihDb2xvci5yZWQpLnJlZCIsIG5ldyBTdHJpbmdbXSB7ImphdmEuYXd0LioifSwgZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5Db2xvciIpLm5ld0luc3RhbmNlKCJqYXZhLmF3dC5Db2xvci5yZWQiKSApOwkvLyBTaG91bGQgbm90IHVzZSB0aGlzIGZvcm0sIGJ1dCBpdCBpcyB2YWxpZCwgdXNlIHZhbGlkIGZvcm0gZm9yIGV4cGVjdGVkIHJlc3VsdHMgc28gbm8gd2FybmluZ3MuCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRGaWVsZEFjY2VzcygpIHRocm93cyBUaHJvd2FibGUgewotCQlnZXRUcmVlUGFyc2VyKCkudGVzdEluaXRTdHJpbmcoIkFTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhLmFjb2xvci5yZWQiLCBuZXcgU3RyaW5nW10geyJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLkFTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhIn0sICBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuVHlwZVByb3h5RmFjdG9yeSgpLmdldEJlYW5UeXBlUHJveHkoImphdmEuYXd0LkNvbG9yIikubmV3SW5zdGFuY2UoImphdmEuYXd0LkNvbG9yLnJlZCIpKTsJLy8gU2hvdWxkIG5vdCB1c2UgdGhpcyBmb3JtLCBidXQgaXQgaXMgdmFsaWQsIHVzZSB2YWxpZCBmb3JtIGZvciBleHBlY3RlZCByZXN1bHRzIHNvIG5vIHdhcm5pbmdzLgotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRGaWVsZEV4cHJlc3Npb25BY2Nlc3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJZ2V0VHJlZVBhcnNlcigpLnRlc3RJbml0U3RyaW5nKCJuZXcgQVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEoKS5hY29sb3IucmVkIiwgbmV3IFN0cmluZ1tdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS5BU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YSJ9LCAgZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmF3dC5Db2xvciIpLm5ld0luc3RhbmNlKCJqYXZhLmF3dC5Db2xvci5yZWQiKSk7CS8vIFNob3VsZCBub3QgdXNlIHRoaXMgZm9ybSwgYnV0IGl0IGlzIHZhbGlkLCB1c2UgdmFsaWQgZm9ybSBmb3IgZXhwZWN0ZWQgcmVzdWx0cyBzbyBubyB3YXJuaW5ncy4KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5vbnN0YXRpY0ZpZWxkQWNjZXNzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiYXJlY3QiLCB0cnVlKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLkZJRUxEX1JFQ0VJVkVSLCAib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS5BU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YSIsIDApOwotCQlnZXRUcmVlUGFyc2VyKCkudGVzdEluaXRTdHJpbmcoIm5ldyBBU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YSgpLmFyZWN0IiwgbmV3IFN0cmluZ1tdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS5BU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YSJ9LCAgZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5vbnN0YXRpY05lc3RlZEZpZWxkQWNjZXNzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAieCIsIHRydWUpOwotCQlleHAuY3JlYXRlRmllbGRBY2Nlc3MoRm9yRXhwcmVzc2lvbi5GSUVMRF9SRUNFSVZFUiwgImFyZWN0IiwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVDbGFzc0luc3RhbmNlQ3JlYXRpb24oRm9yRXhwcmVzc2lvbi5GSUVMRF9SRUNFSVZFUiwgIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuQVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEiLCAwKTsKLQkJZ2V0VHJlZVBhcnNlcigpLnRlc3RJbml0U3RyaW5nKCJuZXcgQVNUTmVzdEZpZWxkQWNjZXNzVGVzdERhdGEoKS5hcmVjdC54IiwgbmV3IFN0cmluZ1tdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS5BU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YSJ9LCAgZXhwLmdldEV4cHJlc3Npb25WYWx1ZSgpKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUSW5uZXJDbGFzc0FjY2Vzc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RJbm5lckNsYXNzQWNjZXNzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDU5M2QyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RJbm5lckNsYXNzQWNjZXNzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQVNUSW5uZXJDbGFzc0FjY2Vzc1Rlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuaW5pdFBhcnNlci50cmVlLkZvckV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2U7Ci0gCi0vKioKLSAqIFRoaXMgaXMgZm9yIHRlc3RpbmcgaW5uZXIgY2xhc3MgYWNjZXNzLgotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBU1RJbm5lckNsYXNzQWNjZXNzVGVzdCBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIG5hbWUuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgQVNUSW5uZXJDbGFzc0FjY2Vzc1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlciBnZXRUcmVlUGFyc2VyKCkgewotCQlyZXR1cm4gKEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlcikgdGVzdEhlbHBlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElubmVyRmllbGRBY2Nlc3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUZpZWxkQWNjZXNzKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJHUkVFTiIsIHRydWUpOwotCQlleHAuY3JlYXRlVHlwZVJlY2VpdmVyKCJvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlLklubmVyQ2xhc3NUZXN0RGF0YSRJbm5lcklubmVyQ2xhc3MiKTsKLQkJZ2V0VHJlZVBhcnNlcigpLnRlc3RJbml0U3RyaW5nKCJJbm5lckNsYXNzVGVzdERhdGEuSW5uZXJJbm5lckNsYXNzLkdSRUVOIiwgbmV3IFN0cmluZ1tdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS4qIn0sIGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lckZpZWxkQWNjZXNzMigpIHRocm93cyBUaHJvd2FibGUgewotCQlJRXhwcmVzc2lvbiBleHAgPSBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlRXhwcmVzc2lvbigpOwotCQlleHAuY3JlYXRlRmllbGRBY2Nlc3MoRm9yRXhwcmVzc2lvbi5ST09URVhQUkVTU0lPTiwgIkdSRUVOIiwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW5uZXJDbGFzc1Rlc3REYXRhJElubmVySW5uZXJDbGFzcyIpOwotCQkKLQkJLy8gVGVzdCB3aGVyZSB0aGUgaW5uZXIgY2xhc3MgaXMgdGhlIHRvcCBsZXZlbCBsaXN0ZWQuCi0JCWdldFRyZWVQYXJzZXIoKS50ZXN0SW5pdFN0cmluZygiSW5uZXJJbm5lckNsYXNzLkdSRUVOIiwgbmV3IFN0cmluZ1tdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS5Jbm5lckNsYXNzVGVzdERhdGEuSW5uZXJJbm5lckNsYXNzIn0sIGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJJbm5lckZpZWxkQWNjZXNzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVGaWVsZEFjY2VzcyhGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAiUkVEIiwgdHJ1ZSk7Ci0JCWV4cC5jcmVhdGVUeXBlUmVjZWl2ZXIoIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuSW5uZXJDbGFzc1Rlc3REYXRhJElubmVySW5uZXJDbGFzcyRJbm5lcklubmVySW5uZXJDbGFzcyIpOwotCQkKLQkJZ2V0VHJlZVBhcnNlcigpLnRlc3RJbml0U3RyaW5nKCJJbm5lckNsYXNzVGVzdERhdGEuSW5uZXJJbm5lckNsYXNzLklubmVySW5uZXJJbm5lckNsYXNzLlJFRCIsIG5ldyBTdHJpbmdbXSB7Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuKiJ9LCBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lckNsYXNzQ3JlYXRpb24oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJSUV4cHJlc3Npb24gZXhwID0gZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUV4cHJlc3Npb24oKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLlJPT1RFWFBSRVNTSU9OLCAib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS5Jbm5lckNsYXNzVGVzdERhdGEkSW5uZXJJbm5lckNsYXNzIiwgMCk7Ci0JCS8vIENyZWF0ZSBzdGF0aWMgaW5uZXIgY2xhc3MKLQkJZ2V0VHJlZVBhcnNlcigpLnRlc3RJbml0U3RyaW5nKCJuZXcgSW5uZXJDbGFzc1Rlc3REYXRhLklubmVySW5uZXJDbGFzcygpIiwgbmV3IFN0cmluZ1tdIHsib3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZS4qIn0sIGV4cC5nZXRFeHByZXNzaW9uVmFsdWUoKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVE1pc2NUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUTWlzY1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQyYWJmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUTWlzY1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IEFTVE1pc2NUZXN0LmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5JbnN0YW50aWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVENoYXJhY3RlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2U7Ci0gCi0vKioKLSAqIFNvbWUgbWlzYy4gdGVzdHMuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEFTVE1pc2NUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0IHdpdGggbmFtZS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBBU1RNaXNjVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENoYXJMaXRlcmFsKCkgewotCQlQVENoYXJhY3RlckxpdGVyYWwgY2wgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRDaGFyYWN0ZXJMaXRlcmFsKCk7Ci0JCWNsLnNldEVzY2FwZWRWYWx1ZSgiXCdhXCciKTsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgY2wuZ2V0Q2hhclZhbHVlKCkpOwotCQljbC5zZXRDaGFyVmFsdWUoJ2InKTsKLQkJYXNzZXJ0RXF1YWxzKCJcJ2JcJyIsIGNsLmdldEVzY2FwZWRWYWx1ZSgpKTsKLQkJY2wuc2V0RXNjYXBlZFZhbHVlKCJcJ1xcblwnIik7Ci0JCWFzc2VydEVxdWFscygnXG4nLCBjbC5nZXRDaGFyVmFsdWUoKSk7Ci0JCWNsLnNldENoYXJWYWx1ZSgnXGInKTsKLQkJYXNzZXJ0RXF1YWxzKCJcJ1xcYlwnIiwgY2wuZ2V0RXNjYXBlZFZhbHVlKCkpOwotCQljbC5zZXRFc2NhcGVkVmFsdWUoIlwnXFx1MDMwMFwnIik7Ci0JCWFzc2VydEVxdWFscygnXHUwMzAwJywgY2wuZ2V0Q2hhclZhbHVlKCkpOwotCQljbC5zZXRDaGFyVmFsdWUoJ1x1MDQwMCcpOwotCQlhc3NlcnRFcXVhbHMoIlwnXFx1MDQwMFwnIiwgY2wuZ2V0RXNjYXBlZFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdMaXRlcmFsKCkgewotCQlQVFN0cmluZ0xpdGVyYWwgc2wgPSBJbnN0YW50aWF0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUFRTdHJpbmdMaXRlcmFsKCk7Ci0JCXNsLnNldEVzY2FwZWRWYWx1ZSgiXCJhXCIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhIiwgc2wuZ2V0TGl0ZXJhbFZhbHVlKCkpOwotCQlzbC5zZXRMaXRlcmFsVmFsdWUoIlxiIik7Ci0JCWFzc2VydEVxdWFscygiXCJcXGJcIiIsIHNsLmdldEVzY2FwZWRWYWx1ZSgpKTsKLQkJc2wuc2V0RXNjYXBlZFZhbHVlKCJcIlxcblwiIik7Ci0JCWFzc2VydEVxdWFscygiXG4iLCBzbC5nZXRMaXRlcmFsVmFsdWUoKSk7Ci0JCXNsLnNldExpdGVyYWxWYWx1ZSgiXGIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJcIlxcYlwiIiwgc2wuZ2V0RXNjYXBlZFZhbHVlKCkpOwotCQlzbC5zZXRFc2NhcGVkVmFsdWUoIlwiXFx1MDMwMFwiIik7Ci0JCWFzc2VydEVxdWFscygiXHUwMzAwIiwgc2wuZ2V0TGl0ZXJhbFZhbHVlKCkpOwotCQlzbC5zZXRMaXRlcmFsVmFsdWUoIlx1MDQwMCIpOwotCQlhc3NlcnRFcXVhbHMoIlwiXFx1MDQwMFwiIiwgc2wuZ2V0RXNjYXBlZFZhbHVlKCkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDhlNzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL0FTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0vKgotICogICRSQ1NmaWxlOiBBU1ROZXN0RmllbGRBY2Nlc3NUZXN0RGF0YS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLQotaW1wb3J0IGphdmEuYXd0LkNvbG9yOwotaW1wb3J0IGphdmEuYXd0LlJlY3RhbmdsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgaW4gdGhlIHRlc3Rpbmcgb2YgbmVzdGVkIGZpZWxkIGFjY2VzcyBmb3IgUGFyc2UgdGVzdGluZy4KLSAqIFRoaXMgaXMgd2hlbiB5b3UgYWNjZXNzIGEgZmllbGQsIGFuZCB0aGVuIGFjY2VzcyBhIGZpZWxkIG9mIHRoYXQuCi0gKiBJbiB0aGlzIGNhc2UgIDxjb2RlPkFTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhLmFjb2xvci5yZWQ8L2NvZGU+Ci0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEFTVE5lc3RGaWVsZEFjY2Vzc1Rlc3REYXRhIHsKLQlwdWJsaWMgc3RhdGljIENvbG9yIGFjb2xvciA9IENvbG9yLmdyZWVuOwotCXB1YmxpYyBSZWN0YW5nbGUgYXJlY3QgPSBuZXcgUmVjdGFuZ2xlKDEwLDIwLDMwLDQwKTsgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUT3BlcmF0aW9uc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RPcGVyYXRpb25zVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDAxZDRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RPcGVyYXRpb25zVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQVNUT3BlcmF0aW9uc1Rlc3QuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNSAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci5BYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZTsKLSAKLS8qKgotICogCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIEFTVE9wZXJhdGlvbnNUZXN0IGV4dGVuZHMgQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ3JlYXRlIHdpdGggbmFtZS4KLQkgKiBAcGFyYW0gbmFtZQotCSAqIAotCSAqIEBzaW5jZSAxLjAuMAotCSAqLwotCXB1YmxpYyBBU1RPcGVyYXRpb25zVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlciBnZXRUcmVlUGFyc2VyKCkgewotCQlyZXR1cm4gKEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlcikgdGVzdEhlbHBlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFR3b09wZXJzKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIjMrNCIsIGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKDMrNCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Rm91ck9wZXJzRXh0ZW5kZWQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiMys0KzUrNiIsIGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKDMrNCs1KzYpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdE1peGVkT3BlcnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiMys0LTUiLCBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCgzKzQtNSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRPcGVyc1ByZWNlZGVuY2UoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiNiB8IDMrNCB8IDgiLCBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCg2IHwgMys0IHwgOCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29uZGl0aW9uYWwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiamF2YS5hd3QuQ29sb3IucmVkICE9IG51bGwgPyAzIDogNSIsIGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKGphdmEuYXd0LkNvbG9yLnJlZCAhPSBudWxsID8gMyA6IDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VvZigpIHRocm93cyBUaHJvd2FibGUgewotCQl0ZXN0SGVscGVyLnRlc3RJbml0U3RyaW5nKCJqYXZhLmF3dC5Db2xvci5yZWQgaW5zdGFuY2VvZiBqYXZhLmF3dC5Db2xvciIsIGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKHRydWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUxpdGVyYWwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiT2JqZWN0LmNsYXNzIiwgZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCkuZ2V0QmVhblR5cGVQcm94eUZhY3RvcnkoKS5nZXRCZWFuVHlwZVByb3h5KCJqYXZhLmxhbmcuT2JqZWN0IikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUGx1c09wZXJhdGlvbnMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiMytcImFcIiIsIGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKDMrImEiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQbHVzT3BlcmF0aW9uczEoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEhlbHBlci50ZXN0SW5pdFN0cmluZygiXCJhXCIrMyIsIGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKCJhIiszKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQbHVzRXh0ZW5kZWRPcGVyYXRpb25zKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIjMrNCtcImFcIiIsIGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKDMrNCsiYSIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1BsdXNFeHRlbmRlZE9wZXJhdGlvbnMxKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRlc3RIZWxwZXIudGVzdEluaXRTdHJpbmcoIjMrXCJhXCIrNCIsIGdldFRyZWVQYXJzZXIoKS5nZXRSZWdpc3RyeSgpLmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlXaXRoKDMrImEiKzQpKTsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUUGFyc2VyU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RQYXJzZXJTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzM5MDRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RQYXJzZXJTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlOwotLyoKLSAqICAkUkNTZmlsZTogQVNUUGFyc2VyU3VpdGUuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMTIgJCAgJERhdGU6IDIwMDYvMDUvMTcgMjA6MTM6NTYgJCAKLSAqLwotaW1wb3J0IGp1bml0LmV4dGVuc2lvbnMuVGVzdFNldHVwOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVByb2plY3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhVGVzdHNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LlByb3h5U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuKjsKLQotLyoqCi0gKiBAYXV0aG9yIGpteWVycwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBU1RQYXJzZXJTdWl0ZSBleHRlbmRzIFRlc3RTZXR1cCB7Ci0KLQkvLyBUZXN0IGNhc2VzIHRvIGJlIGluY2x1ZGUgaW4gdGhlIHN1aXRlCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgdGVzdHNMaXN0W10gPSB7Ci0JCU5lZWRzQ29kaW5nVGVzdC5jbGFzcywKLQkJQmxvY2tUZXN0LmNsYXNzLAotCQlBU1RGaWVsZEFjY2Vzc1Rlc3QuY2xhc3MsCi0JCUFTVEFycmF5c1Rlc3QuY2xhc3MsCi0JCU11bHRpQXJnU3RhdGljTWV0aG9kVGVzdC5jbGFzcywKLQkJTXVsdGlBcmdDb25zdHJ1Y3RvclRlc3QuY2xhc3MsCi0JCU11bHRpQXJnSW5zdGFuY2VUZXN0LmNsYXNzLAotCQlOdW1iZXJUZXN0LmNsYXNzLAotCQlDYXN0VGVzdC5jbGFzcywKLS8vCQlFeGNlcHRpb25UZXN0LmNsYXNzLAkvLyBtaXhlcyBwYXJzZSBlcnJvciB3L2V4ZWN1dGlvbiBlcnJvcnMuIENhbid0IHRlc3QgcGFyc2UgZXJyb3JzLiBOZWVkIHNwZWNpZmljIHRlc3QgZm9yIGV4ZWMgZXJyb3JzIGxpa2UgbWV0aG9kIG5vdCBmb3VuZC4KLQkJTGl0ZXJhbFRlc3QuY2xhc3MsCi0JCVN0cmluZ1Rlc3QuY2xhc3MsCi0JCUNoYXJUZXN0LmNsYXNzLAotCQlKRkNUZXN0LmNsYXNzLAotCQlCb3JkZXJUZXN0LmNsYXNzLAotCQlPdmVybG9hZGluZ1Rlc3QuY2xhc3MsCi0JCVNhbWVOYW1lNDYzNzZUZXN0LmNsYXNzLAotCQlBU1RPcGVyYXRpb25zVGVzdC5jbGFzcywKLQkJQVNUSW5uZXJDbGFzc0FjY2Vzc1Rlc3QuY2xhc3MsCi0JCUFTVE1pc2NUZXN0LmNsYXNzLAotCQlUZXN0Q29tcGF0aWJsZU1ldGhvZHMuY2xhc3MsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwa2dOYW1lID0gIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUiIDsKLQkgICAgCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFBhY2thZ2VTdWl0ZS4KLQkgKi8KLQlwdWJsaWMgQVNUUGFyc2VyU3VpdGUoKSB7Ci0JCXRoaXMoIkFTVCBQYXJzZXIgU3VpdGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFja2FnZVN1aXRlLgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEFTVFBhcnNlclN1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5ldyBUZXN0U3VpdGUobmFtZSkpOwotCQlwb3B1bGF0ZVN1aXRlKCkgOwotCX0KLQotCVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5OwotCQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVN1aXRlICgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSkgZ2V0VGVzdCgpOwotCQlmb3IgKGludCBpPTA7IGk8dGVzdHNMaXN0Lmxlbmd0aDsgaSsrKQotCQkgIHN1aXRlLmFkZFRlc3RTdWl0ZSh0ZXN0c0xpc3RbaV0pIDsKLQkJCi0JCXRyeSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gSmF2YVByb2plY3RVdGlsLmNyZWF0ZUVtcHR5SmF2YVByb2plY3QoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLCBuZXcgUGF0aChBU1RfUFJPSkVDVCksIG51bGwpOwotCQkJSUphdmFQcm9qZWN0IGpwcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJLy8gQWRkIGphdmF0ZXN0cy5qYXIgKGkuZS4gdGhpcyBwbHVnaW5zIGphcikgc28gdGhhdCB0aGUgY2xhc3NlcyB3aXRoaW4gdGhlIHRlc3RzIGphciBhcmUgYXZhaWxhYmxlCi0JCQkvLyB0byB0aGUgamR0IHBhcnNlciBmb3IgcmVmZXJlbmNpbmcuCi0JCQlKYXZhUHJvamVjdFV0aWwuYWRkQnVuZGxlSmFyVG9QYXRoKEphdmFUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKSwgImphdmF0ZXN0cy5qYXIiLCBqcHJvamVjdCwgbnVsbCk7Ci0JCQkKLQkJCS8vIFdlJ3JlIGdvaW5nIHRvIHVzZSB0aGUgcmVtb3RlIHByb3h5LCBiZWNhdXNlIGl0IGlzIGVhc2llciB0byBzdGFydCB1cCwgYnV0IHdlIGFyZW4ndCByZWFsbHkgdGVzdGluZwotCQkJLy8gdGhlIHJlbW90ZSBwcm94eSBleHByZXNzaW9uIGV2YWx1YXRpb24uIFdlIGFyZSByZWFsbHkgdGVzdGluZyBBU1QtPlBhcnNlVHJlZS0+QmVhblByb3h5LiBJZiBhbnkgZXhwcmVzc2lvbgotCQkJLy8gdHlwZSBlcnJvcnMgc2hvdyB1cCAoaS5lLiB0aGUgcHJveHkgZXhwcmVzc2lvbiBpdHNlbGYgaXMgbm90IHdvcmtpbmcgY29ycmVjdGx5KS4gVGhlbiB0aGF0IHNob3VsZCBiZSBmaXhlZAotCQkJLy8gYW5kIGEganVuaXQgdGVzdCBpbiB0aGUgcHJveHkgc3VpdGUgc2hvdWxkIGJlIGNyZWF0ZWQgaW5zdGVhZC4KLQkJCXJlZ2lzdHJ5ID0gUHJveHlMYXVuY2hTdXBwb3J0LnN0YXJ0SW1wbGVtZW50YXRpb24oCi0JCQkJCXByb2plY3QsCi0JCQkJCSJKVW5pdCBQYXJzZSBUcmVlIFRlc3QiLAotCQkJCQluZXcgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIHsgUHJveHlTdWl0ZS5nZXRQcm94eVN1aXRlQ29udHJpYnV0b3IoKX0sCi0JCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCi0JCQlBYnN0cmFjdEluaXRQYXJzZXJUZXN0Q2FzZS5pbml0U3VpdGUoc3VpdGUsIG5ldyBBU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIocHJvamVjdCwgcmVnaXN0cnkpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbChlKTsKLQkJfQotCX0KLSAgICAKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgQVNUUGFyc2VyU3VpdGUoIlRlc3QgZm9yOiAiK3BrZ05hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1RfUFJPSkVDVCA9ICIvQVNUIHRlc3RzLyI7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5leHRlbnNpb25zLlRlc3RTZXR1cCN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCXJlZ2lzdHJ5LnRlcm1pbmF0ZVJlZ2lzdHJ5KCk7Ci0JCQlUaHJlYWQuc2xlZXAoNTAwMCk7CS8vIEdpdmUgaXQgZml2ZSBzZWNvbmRzIHRvIFJFQUxMWSBnbyBhd2F5LiBUaGVyZSBpcyBhIHNtYWxsIHdpbmRvdyBiZXR3ZWVuIAotCQkJLy8gdGVybWluYXRlIHJlcXVlc3QgYW5kIHRydWUgc2h1dGRvd24gb2YgdGhlIHJlbW90ZSB2bS4gV2UgcmV0dXJuIGltbWVkaWF0ZWx5IGFuZCBsZXQgYQotCQkJLy8gam9iIHdhaXQgZm9yIHRoZSBhY3R1YWwgdHJ1ZSB0ZXJtaW5hdGlvbi4KLQkJfQotCQkKLQkJSmF2YVByb2plY3RVdGlsLmRlbGV0ZVByb2plY3QoSmF2YVByb2plY3RVdGlsLmdldFByb2plY3QoQVNUX1BST0pFQ1QpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9BU1RUcmVlSW5pdFN0cmluZ1BhcnNlclRlc3RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyOWIyMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqICAkUkNTZmlsZTogQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEyICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU0ICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuaW5zdGFudGlhdGlvbi5QVEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmluc3RhbnRpYXRpb24uYmFzZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuQWJzdHJhY3RJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLnV0aWxpdHkuKjsKLSAKLS8qKgotICogSW5pdCBTdHJpbmcgcGFyc2VyIGhlbHBlciBmb3Igd29ya2luZyB3aXRoIEFTVCB0cmVlcy4KLSAqICAKLSAqIEBzaW5jZSAxLjAuMAotICovCi1wdWJsaWMgY2xhc3MgQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyIGV4dGVuZHMgQWJzdHJhY3RJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVfQ0xBU1MgPSAicHVibGljIGNsYXNzIFRFTVBMQVRFICd7J1xuICBwdWJsaWMgdm9pZCB0ZXN0KCkgJ3snXG4gICAgU3RyaW5nLnZhbHVlT2YoezB9KTtcdC8vIGEgbGluZSBjb21tZW50XG4gIH1cbn0iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9DTEFTU19JTVBPUlRTID0gInswfVxucHVibGljIGNsYXNzIFRFTVBMQVRFICd7J1xuICBwdWJsaWMgdm9pZCB0ZXN0KCkgJ3snXG4gICAgU3RyaW5nLnZhbHVlT2YoezF9KTtcbiAgfVxufSI7Ci0JCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgcHJvamVjdDsKLQlwcml2YXRlIFBhcnNlVHJlZUNyZWF0aW9uRnJvbUFTVCBwYXJzZXIgPSBuZXcgUGFyc2VUcmVlQ3JlYXRpb25Gcm9tQVNUKG5ldyBBU1RCb3VuZFJlc29sdmVyKCkpOwotCXByaXZhdGUgUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnk7Ci0JCi0JcHVibGljIEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlcigpIHsKLQl9Ci0JCi0JcHVibGljIEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlcihJUHJvamVjdCBwcm9qZWN0LCBQcm94eUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQl0aGlzLnByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLQl9Ci0JCi0JcHVibGljIEFTVFRyZWVJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMocHJvamVjdCwgbnVsbCk7Ci0JfQkKLQkKLQlwdWJsaWMgUHJveHlGYWN0b3J5UmVnaXN0cnkgZ2V0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuQWJzdHJhY3RJbml0U3RyaW5nUGFyc2VyVGVzdEhlbHBlciN0ZXN0SW5pdFN0cmluZyhqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0LCBib29sZWFuLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbml0U3RyaW5nKFN0cmluZyBhU3RyaW5nLCBPYmplY3QgZXhwZWN0ZWRSZXN1bHQsIGJvb2xlYW4gdGhyb3dzRXhjZXB0aW9uLCBib29sZWFuIGVxdWFsc09ubHkpIHRocm93cyBUaHJvd2FibGUgewotCQlTdHJpbmcgdGVzdENsYXNzID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoVEVNUExBVEVfQ0xBU1MsIG5ldyBPYmplY3RbXSB7YVN0cmluZ30pOwotCQlBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7Ci0JCXBhcnNlci5zZXRTb3VyY2UodGVzdENsYXNzLnRvQ2hhckFycmF5KCkpOwotCQlwYXJzZXIuc2V0VW5pdE5hbWUoIlRFTVBMQVRFLmphdmEiKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJcGFyc2VyLnNldFByb2plY3QocHJvamVjdCk7Ci0JCQlwYXJzZXIuc2V0UmVzb2x2ZUJpbmRpbmdzKHRydWUpOwotCQl9Ci0JCUNvbXBpbGF0aW9uVW5pdCBjdSAgPSAoQ29tcGlsYXRpb25Vbml0KSBwYXJzZXIuY3JlYXRlQVNUKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCS8vIFRoaXMgaXMgdGhlIG9ubHkgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIGZyb20gYm90aCBpbml0IHN0cmluZyBhbmQgcGFyc2UgYWxsb2NhdGlvbi4gU28gd2UgY2FuIGJlIGFzc3VtZSB0aGF0Ci0JCS8vIGl0IGlzIGEgc3RyYWlnaHQgaW5pdCBzdHJpbmcuIEluIHRoYXQgY2FzZSB3ZSBjYW4gZ28gYWhlYWQgYW5kIGRvIHJlZ3VsYXIgcHJveHkgaW5pdCBzdHJpbmcgcGFyc2luZyB0bwotCQkvLyBnZXQgYSBwcm94eSB0byBwYXNzIGludG8gdGhlIHBhcnNlIHRlc3RpbmcuCi0JCUlCZWFuUHJveHkgZXhwZWN0ZWRQcm94eSA9IG51bGw7Ci0JCWlmIChleHBlY3RlZFJlc3VsdCBpbnN0YW5jZW9mIElCZWFuUHJveHkpCi0JCQlleHBlY3RlZFByb3h5ID0gKElCZWFuUHJveHkpIGV4cGVjdGVkUmVzdWx0OwotCQllbHNlIGlmIChleHBlY3RlZFJlc3VsdCAhPSBudWxsICYmICF0aHJvd3NFeGNlcHRpb24gJiYgcmVnaXN0cnkgIT0gbnVsbCkgewotCQkJZXhwZWN0ZWRQcm94eSA9IHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlGcm9tKGFTdHJpbmcpOwotCQl9Ci0JCXRlc3RJbml0U3RyaW5nKGFTdHJpbmcsIGN1LCBleHBlY3RlZFByb3h5LCB0aHJvd3NFeGNlcHRpb24sIGVxdWFsc09ubHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbml0U3RyaW5nKFN0cmluZyBhU3RyaW5nLCBTdHJpbmdbXSBpbXBvcnRzLCBJQmVhblByb3h5IGV4cGVjdGVkUmVzdWx0KSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdGVzdEluaXRTdHJpbmcoYVN0cmluZywgaW1wb3J0cyxleHBlY3RlZFJlc3VsdCwgZmFsc2UsIHRydWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdFN0cmluZyhTdHJpbmcgYVN0cmluZywgU3RyaW5nW10gaW1wb3J0cywgSUJlYW5Qcm94eSBleHBlY3RlZFJlc3VsdCwgYm9vbGVhbiB0aHJvd3NFeGNlcHRpb24sIGJvb2xlYW4gZXF1YWxzT25seSkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCVN0cmluZ0J1ZmZlciBpbXBvcnRMaW5lcyA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbXBvcnRMaW5lcy5hcHBlbmQoImltcG9ydCAiKTsKLQkJCWltcG9ydExpbmVzLmFwcGVuZChpbXBvcnRzW2ldKTsKLQkJCWltcG9ydExpbmVzLmFwcGVuZCgiO1xuIik7Ci0JCX0KLQkJU3RyaW5nIHRlc3RDbGFzcyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KFRFTVBMQVRFX0NMQVNTX0lNUE9SVFMsIG5ldyBPYmplY3RbXSB7aW1wb3J0TGluZXMsIGFTdHJpbmd9KTsKLQkJQVNUUGFyc2VyIHBhcnNlciA9IEFTVFBhcnNlci5uZXdQYXJzZXIoQVNULkpMUzMpOwotCQlwYXJzZXIuc2V0U291cmNlKHRlc3RDbGFzcy50b0NoYXJBcnJheSgpKTsKLQkJcGFyc2VyLnNldFVuaXROYW1lKCJURU1QTEFURS5qYXZhIik7Ci0JCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCXBhcnNlci5zZXRQcm9qZWN0KHByb2plY3QpOwotCQkJcGFyc2VyLnNldFJlc29sdmVCaW5kaW5ncyh0cnVlKTsKLQkJfQotCQlDb21waWxhdGlvblVuaXQgY3UgID0gKENvbXBpbGF0aW9uVW5pdCkgcGFyc2VyLmNyZWF0ZUFTVChudWxsKTsKLQkJdGVzdEluaXRTdHJpbmcoYVN0cmluZywgY3UsIGV4cGVjdGVkUmVzdWx0LCB0aHJvd3NFeGNlcHRpb24sIGVxdWFsc09ubHkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0ZXN0SW5pdFN0cmluZygKLQkJU3RyaW5nIGFTdHJpbmcsCi0JCUNvbXBpbGF0aW9uVW5pdCBjdSwKLQkJSUJlYW5Qcm94eSBleHBlY3RlZFJlc3VsdCwKLQkJYm9vbGVhbiB0aHJvd3NFeGNlcHRpb24sCi0JCWJvb2xlYW4gZXF1YWxzT25seSkKLQkJdGhyb3dzIFRocm93YWJsZSB7Ci0JCUlQcm9ibGVtW10gcHJvYmxlbXMgPSBjdS5nZXRQcm9ibGVtcygpOwotCQlpZiAocHJvYmxlbXMubGVuZ3RoID4gMCkgewotCQkJYm9vbGVhbiBlcnJvcnMgPSBmYWxzZTsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKDEwMCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2JsZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZXJyb3JzID0gZXJyb3JzIHwgcHJvYmxlbXNbaV0uaXNFcnJvcigpOwotCQkJCWJ1Zi5hcHBlbmQoIiAiICsgcHJvYmxlbXNbaV0uZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJCS8vIElmIG9ubHkgd2FybmluZ3MsIHRyeSBnb2luZyBvbi4gT25seSBlcnJvcnMgc2hvdWxkIGNhdXNlIGEgZmFpbHVyZS4KLQkJCWlmIChlcnJvcnMpCi0JCQkJaWYgKCF0aHJvd3NFeGNlcHRpb24pCi0JCQkJCUFzc2VydC5mYWlsKCJQcm9ibGVtcyB3aXRoIFwiIiArIGFTdHJpbmcgKyAiXCI6ICIgKyBidWYpOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuOyAvLyBUcmVhdCB0aGlzIGFzIGFuIGV4Y2VwdGlvbi4KLQkJCWVsc2UgewotCQkJCS8vIEVsc2UganVzdCBsb2cgdGhlIHdhcm5pbmdzLgotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiV2FybmluZ3Mgb2N1cnJlZCBmb3IgXCIiICsgYVN0cmluZyArICJcIjoiICsgYnVmKTsKLQkJCX0KLQkJfQotCi0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IChUeXBlRGVjbGFyYXRpb24pIGN1LnR5cGVzKCkuZ2V0KDApOwotCQlFeHByZXNzaW9uU3RhdGVtZW50IGVzID0gKEV4cHJlc3Npb25TdGF0ZW1lbnQpIHRkLmdldE1ldGhvZHMoKVswXS5nZXRCb2R5KCkuc3RhdGVtZW50cygpLmdldCgwKTsKLQkJTWV0aG9kSW52b2NhdGlvbiBtaSA9IChNZXRob2RJbnZvY2F0aW9uKSBlcy5nZXRFeHByZXNzaW9uKCk7Ci0JCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uIGV4cCA9IChvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbikgbWkuYXJndW1lbnRzKCkuZ2V0KDApOwotCQlQVEV4cHJlc3Npb24gcGFyc2VFeHAgPSBwYXJzZXIuY3JlYXRlRXhwcmVzc2lvbihleHApOwotCi0JCWlmIChyZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQlQYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3IgdiA9IG5ldyBQYXJzZVRyZWVBbGxvY2F0aW9uSW5zdGFudGlhdGlvblZpc2l0b3IoKTsKLQkJCXRyeSB7Ci0JCQkJSUJlYW5Qcm94eSBiZWFuID0gdi5nZXRCZWFuUHJveHkocGFyc2VFeHAsIHJlZ2lzdHJ5KTsKLQkJCQlpZiAodGhyb3dzRXhjZXB0aW9uKQotCQkJCQlBc3NlcnQuZmFpbCgiU2hvdWxkIG9mIHRocm93biBleGNlcHRpb24uIEluc3RlYWQgcmVzdWx0IHdhcyBcIiIgKyAoYmVhbiAhPSBudWxsID8gYmVhbi50b0JlYW5TdHJpbmcoKSA6IG51bGwpICsgIlwiIik7Ci0JCQkJaWYgKGJlYW4gPT0gZXhwZWN0ZWRSZXN1bHQpCi0JCQkJCXJldHVybjsKLQkJCQlpZiAoKGJlYW4gPT0gbnVsbCAmJiBleHBlY3RlZFJlc3VsdCAhPSBudWxsKSB8fCAoZXhwZWN0ZWRSZXN1bHQgPT0gbnVsbCAmJiBiZWFuICE9IG51bGwpKQotCQkJCQlBc3NlcnQuZmFpbCgKLQkJCQkJCSJFeHBlY3RlZFJlc3VsdD0iCi0JCQkJCQkJKyAoZXhwZWN0ZWRSZXN1bHQgIT0gbnVsbCA/IGV4cGVjdGVkUmVzdWx0LnRvQmVhblN0cmluZygpIDogbnVsbCkKLQkJCQkJCQkrICIgcmVzdWx0PSIKLQkJCQkJCQkrIChiZWFuICE9IG51bGwgPyBiZWFuLnRvQmVhblN0cmluZygpIDogbnVsbCkpOwotCQkJCWlmIChiZWFuLmVxdWFscyhleHBlY3RlZFJlc3VsdCkpCi0JCQkJCXJldHVybjsKLQkJCQkvLyBJdCBtYXkgYmUgdGhhdCB0aGUgZXF1YWxzIGV4cHJlc3Npb24gaXMgYmFkLiBJZiBzbyB1c2UgdGhlIHRvU3RyaW5nKCkgdG8gZG8KLQkJCQkvLyBhIHBhcnRpYWwgY29tcGFyaXNvbgotCQkJCWlmIChiZWFuLmdldFR5cGVQcm94eSgpID09IGV4cGVjdGVkUmVzdWx0LmdldFR5cGVQcm94eSgpKSB7Ci0JCQkJCWlmIChiZWFuLnRvQmVhblN0cmluZygpLmVxdWFscyhleHBlY3RlZFJlc3VsdC50b0JlYW5TdHJpbmcoKSkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIFRoZSB0b1N0cmluZ3MgZG8gbm90IG1hdGNoIHBlcmZlY3RseSBidXQgdGhlIGNsYXNzZXMgZG8uCi0JCQkJCQkvLyBUcnkgYW5kIHNlZSBob3cgY2xvc2UgdGhlIHR3byBzdHJpbmdzIGFyZQotCQkJCQkJaWYgKGV4cGVjdGVkUmVzdWx0LmdldFR5cGVQcm94eSgpLmlzQXJyYXkoKSAmJiBiZWFuLmdldFR5cGVQcm94eSgpLmlzQXJyYXkoKSkgewotCQkJCQkJCUlCZWFuVHlwZVByb3h5IGV4cGVjdGVkUmVzdWx0Q2xhc3MgPSAoKElBcnJheUJlYW5UeXBlUHJveHkpIGV4cGVjdGVkUmVzdWx0LmdldFR5cGVQcm94eSgpKS5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCQkJCQkJSUJlYW5UeXBlUHJveHkgcmVzdWx0Q2xhc3MgPSAoKElBcnJheUJlYW5UeXBlUHJveHkpIGJlYW4uZ2V0VHlwZVByb3h5KCkpLmdldENvbXBvbmVudFR5cGUoKTsKLQkJCQkJCQlpbnQgcmVzdWx0TGVuZ3RoID0gKChJQXJyYXlCZWFuUHJveHkpIGJlYW4pLmdldExlbmd0aCgpOwotCQkJCQkJCWludCBleHBlY3RlZExlbmd0aCA9ICgoSUFycmF5QmVhblByb3h5KSBleHBlY3RlZFJlc3VsdCkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQkJaWYgKGV4cGVjdGVkTGVuZ3RoID09IHJlc3VsdExlbmd0aCkgewotCQkJCQkJCQlpZiAocmVzdWx0Q2xhc3MgPT0gZXhwZWN0ZWRSZXN1bHRDbGFzcykgewotCQkJCQkJCQkJLy8gVE9ETyBTaG91bGQgYWN0dWFsbHkgc3RlcCBpbiBhbmQgY2hlY2sgZWFjaCBlbGVtZW50IHRvby4KLQkJCQkJCQkJCXJldHVybjsKLQkJCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJCUFzc2VydC5mYWlsKAotCQkJCQkJCQkJCWFTdHJpbmcKLQkJCQkJCQkJCQkJKyAiIEV4cGVjdGVkUmVzdWx0PSIKLQkJCQkJCQkJCQkJKyBleHBlY3RlZFJlc3VsdC50b0JlYW5TdHJpbmcoKQotCQkJCQkJCQkJCQkrICIgQWN0dWFsUmVzdWx0PSIKLQkJCQkJCQkJCQkJKyBiZWFuLnRvQmVhblN0cmluZygpCi0JCQkJCQkJCQkJCSsgIiBFeHBlY3RlZENsYXNzPSIKLQkJCQkJCQkJCQkJKyBleHBlY3RlZFJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpCi0JCQkJCQkJCQkJCSsgIiBBY3R1YWxDbGFzcz0iCi0JCQkJCQkJCQkJCSsgYmVhbi5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCUFzc2VydC5mYWlsKAotCQkJCQkJCQkJYVN0cmluZwotCQkJCQkJCQkJCSsgIiBFeHBlY3RlZFJlc3VsdD0iCi0JCQkJCQkJCQkJKyBleHBlY3RlZFJlc3VsdC50b0JlYW5TdHJpbmcoKQotCQkJCQkJCQkJCSsgIiBBY3R1YWxSZXN1bHQ9IgotCQkJCQkJCQkJCSsgYmVhbi50b0JlYW5TdHJpbmcoKQotCQkJCQkJCQkJCSsgIiBFeHBlY3RlZENsYXNzPSIKLQkJCQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0LmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkKLQkJCQkJCQkJCQkrICIgQWN0dWFsQ2xhc3M9IgotCQkJCQkJCQkJCSsgYmVhbi5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWlmIChlcXVhbHNPbmx5KQotCQkJCQkJCQlBc3NlcnQuZmFpbCgKLQkJCQkJCQkJCWFTdHJpbmcKLQkJCQkJCQkJCQkrICIgRXhwZWN0ZWRSZXN1bHQ9IgotCQkJCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQudG9CZWFuU3RyaW5nKCkKLQkJCQkJCQkJCQkrICIgQWN0dWFsUmVzdWx0PSIKLQkJCQkJCQkJCQkrIGJlYW4udG9CZWFuU3RyaW5nKCkKLQkJCQkJCQkJCQkrICIgRXhwZWN0ZWRDbGFzcz0iCi0JCQkJCQkJCQkJKyBleHBlY3RlZFJlc3VsdC5nZXRUeXBlUHJveHkoKS5nZXRGb3JtYWxUeXBlTmFtZSgpCi0JCQkJCQkJCQkJKyAiIEFjdHVhbENsYXNzPSIKLQkJCQkJCQkJCQkrIGJlYW4uZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKSk7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJQXNzZXJ0LmZhaWwoCi0JCQkJCQlhU3RyaW5nCi0JCQkJCQkJKyAiIEV4cGVjdGVkUmVzdWx0PSIKLQkJCQkJCQkrIGV4cGVjdGVkUmVzdWx0LnRvQmVhblN0cmluZygpCi0JCQkJCQkJKyAiIEFjdHVhbFJlc3VsdD0iCi0JCQkJCQkJKyBiZWFuLnRvQmVhblN0cmluZygpCi0JCQkJCQkJKyAiIEV4cGVjdGVkQ2xhc3M9IgotCQkJCQkJCSsgZXhwZWN0ZWRSZXN1bHQuZ2V0VHlwZVByb3h5KCkuZ2V0Rm9ybWFsVHlwZU5hbWUoKQotCQkJCQkJCSsgIiBBY3R1YWxDbGFzcz0iCi0JCQkJCQkJKyBiZWFuLmdldFR5cGVQcm94eSgpLmdldEZvcm1hbFR5cGVOYW1lKCkpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKHRocm93c0V4Y2VwdGlvbikKLQkJCQkJcmV0dXJuOyAvLyBUaGlzIGlzIG9rLCBpdCBzaG91bGQgb2YgdGhyb3duIGV4Y2VwdGlvbi4KLQkJCQllbHNlCi0JCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9Jbm5lckNsYXNzVGVzdERhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9Jbm5lckNsYXNzVGVzdERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxM2YyYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvSW5uZXJDbGFzc1Rlc3REYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBJbm5lckNsYXNzVGVzdERhdGEuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNCAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWU7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLSAKLS8qKgotICogVGhpcyBpcyBmb3IgdGVzdGluZyBpbm5lciBjbGFzcyBhY2Nlc3MuCi0gKiBAc2luY2UgMS4wLjAKLSAqLwotcHVibGljIGNsYXNzIElubmVyQ2xhc3NUZXN0RGF0YSB7Ci0KLQkvKioKLQkgKiAKLQkgKiBAc2luY2UgMS4wLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIElubmVySW5uZXJDbGFzcyBleHRlbmRzIE9iamVjdCB7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgQ29sb3IgR1JFRU4gPSBDb2xvci5ncmVlbjsKLQotCQkvKioKLQkJICogCi0JCSAqIEBzaW5jZSAxLjAuMAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBjbGFzcyBJbm5lcklubmVySW5uZXJDbGFzcyBleHRlbmRzIE9iamVjdCB7Ci0JCQlwdWJsaWMgZmluYWwgc3RhdGljIENvbG9yIFJFRCA9IENvbG9yLnJlZDsgCi0KLQkJCS8qKgotCQkJICogCi0JCQkgKiBAc2luY2UgMS4wLjAKLQkJCSAqLwotCQkJcHVibGljIGNsYXNzIElubmVySW5uZXJJbm5lcklubmVyQ2xhc3MgewotCi0JCQkJLyogKG5vbi1KYXZhZG9jKQotCQkJCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgSW5uZXJJbm5lcklubmVySW5uZXJDbGFzczsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkJCSAqLwotCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCQlyZXR1cm4gc3VwZXIuZXF1YWxzKG9iaikgfHwgb2JqIGluc3RhbmNlb2YgSW5uZXJJbm5lcklubmVyQ2xhc3M7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCXJldHVybiBzdXBlci5lcXVhbHMob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBJbm5lcklubmVyQ2xhc3M7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBzdXBlci5lcXVhbHMob2JqKSB8fCBvYmogaW5zdGFuY2VvZiBJbm5lckNsYXNzVGVzdERhdGE7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL1Rlc3RDb21wYXRpYmxlTWV0aG9kcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL1Rlc3RDb21wYXRpYmxlTWV0aG9kcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDJlNWM4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9UZXN0Q29tcGF0aWJsZU1ldGhvZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RDb21wYXRpYmxlTWV0aG9kcy5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA2LzAzLzE5IDE4OjI3OjEyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmluaXRQYXJzZXIudHJlZS5Gb3JFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5pbml0UGFyc2VyLnRyZWUuTm9FeHByZXNzaW9uVmFsdWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIuQWJzdHJhY3RJbml0UGFyc2VyVGVzdENhc2U7Ci0gCi0KLS8qKgotICogCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDb21wYXRpYmxlTWV0aG9kcyBleHRlbmRzIEFic3RyYWN0SW5pdFBhcnNlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICogCi0JICogQHNpbmNlIDEuMi4wCi0JICovCi0JcHVibGljIFRlc3RDb21wYXRpYmxlTWV0aG9kcyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyIGdldFRyZWVQYXJzZXIoKSB7Ci0JCXJldHVybiAoQVNUVHJlZUluaXRTdHJpbmdQYXJzZXJUZXN0SGVscGVyKSB0ZXN0SGVscGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUJlYW5Qcm94eSBleGVjdXRlUVFRKElCZWFuUHJveHkgYTEsIElCZWFuUHJveHkgYTIpIHRocm93cyBUaHJvd2FibGVQcm94eSwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBOb0V4cHJlc3Npb25WYWx1ZUV4Y2VwdGlvbiB7Ci0JCVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCk7Ci0JCUlFeHByZXNzaW9uIGV4cCA9IHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVFeHByZXNzaW9uKCk7Ci0JCWV4cC5jcmVhdGVNZXRob2RJbnZvY2F0aW9uKEZvckV4cHJlc3Npb24uUk9PVEVYUFJFU1NJT04sICJxcXEiLCB0cnVlLCAyKTsKLQkJZXhwLmNyZWF0ZUNsYXNzSW5zdGFuY2VDcmVhdGlvbihGb3JFeHByZXNzaW9uLk1FVEhPRF9SRUNFSVZFUiwgIm9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5pbml0UGFyc2VyLnRyZWUuVGVzdENvbXBhdGlibGVNZXRob2RzRGF0YTEiLCAwKTsKLQkJZXhwLmNyZWF0ZVByb3h5RXhwcmVzc2lvbihGb3JFeHByZXNzaW9uLk1FVEhPRF9BUkdVTUVOVCwgYTEpOwotCQlleHAuY3JlYXRlUHJveHlFeHByZXNzaW9uKEZvckV4cHJlc3Npb24uTUVUSE9EX0FSR1VNRU5ULCBhMik7Ci0JCXJldHVybiBleHAuZ2V0RXhwcmVzc2lvblZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbWJpZ3VvdXMoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRUcmVlUGFyc2VyKCkuZ2V0UmVnaXN0cnkoKTsKLQkJdHJ5IHsKLQkJCWV4ZWN1dGVRUVEocmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eVdpdGgobmV3IEludGVnZXIoMSkpLCByZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aCgKLQkJCQkJbmV3IEludGVnZXIoMSkpKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlUHJveHkgZSkgewotCQkJaWYgKGUuZ2V0VHlwZVByb3h5KCkuZ2V0VHlwZU5hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uQW1iaWd1b3VzTWV0aG9kRXhjZXB0aW9uIikpCi0JCQkJcmV0dXJuOwkvLyBUaGlzIGlzIGdvb2QuCi0JCQl0aHJvdyBlOwotCQl9CQkKLQkJZmFpbCgiU2hvdWxkIG9mIHRocm93biBhbWJpcXVvdXMuIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFeGFjdE1hdGNoKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCk7Ci0JCUlJbnRlZ2VyQmVhblByb3h5IHJlc3VsdCA9IChJSW50ZWdlckJlYW5Qcm94eSkgZXhlY3V0ZVFRUShyZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChuZXcgSW50ZWdlcigxKSksIHJlZ2lzdHJ5LmdldEJlYW5Qcm94eUZhY3RvcnkoKS5jcmVhdGVCZWFuUHJveHlGcm9tKCJuZXcgT2JqZWN0KCkiKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXN1bHQuaW50VmFsdWUoKSk7Ci0JCQotCQlyZXN1bHQgPSAoSUludGVnZXJCZWFuUHJveHkpIGV4ZWN1dGVRUVEocmVnaXN0cnkuZ2V0QmVhblByb3h5RmFjdG9yeSgpLmNyZWF0ZUJlYW5Qcm94eUZyb20oIm5ldyBPYmplY3QoKSIpLCByZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5RnJvbSgibmV3IE9iamVjdCgpIikpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzdWx0LmludFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGF0aWJsZU1hdGNoKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCVByb3h5RmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0VHJlZVBhcnNlcigpLmdldFJlZ2lzdHJ5KCk7Ci0JCUlJbnRlZ2VyQmVhblByb3h5IHJlc3VsdCA9IChJSW50ZWdlckJlYW5Qcm94eSkgZXhlY3V0ZVFRUShyZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChuZXcgRmxvYXQoMSkpLCByZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChuZXcgSW50ZWdlcigxKSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmludFZhbHVlKCkpOwotCi0JCXJlc3VsdCA9IChJSW50ZWdlckJlYW5Qcm94eSkgZXhlY3V0ZVFRUShyZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5V2l0aChuZXcgRmxvYXQoMSkpLCByZWdpc3RyeS5nZXRCZWFuUHJveHlGYWN0b3J5KCkuY3JlYXRlQmVhblByb3h5RnJvbSgibmV3IE9iamVjdCgpIikpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzdWx0LmludFZhbHVlKCkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9UZXN0Q29tcGF0aWJsZU1ldGhvZHNEYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9pbml0UGFyc2VyL3RyZWUvVGVzdENvbXBhdGlibGVNZXRob2RzRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2E1MmZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9UZXN0Q29tcGF0aWJsZU1ldGhvZHNEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBUZXN0Q29tcGF0aWJsZU1ldGhvZHNEYXRhLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjEgJCAgJERhdGU6IDIwMDYvMDMvMTkgMTg6Mjc6MTIgJCAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuaW5pdFBhcnNlci50cmVlOwotIAotCi0vKioKLSAqIFVzZWQgdG8gdGVzdCBjb21wYXRpYmxlIG1ldGhvZHMgc2VhcmNoaW5nLgotICogQHNpbmNlIDEuMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q29tcGF0aWJsZU1ldGhvZHNEYXRhIHsKLQotCXByb3RlY3RlZCB2b2lkIHQoKSB7Ci0JCXFxcShuZXcgSW50ZWdlcigxKSwgbmV3IE9iamVjdCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBxcXEoT2JqZWN0IG8sIE9iamVjdCBvMSkgewotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgcXFxKEludGVnZXIgaSwgT2JqZWN0IG8pIHsKLQkJcmV0dXJuIC0xOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9qYXZhdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L2luaXRQYXJzZXIvdHJlZS9UZXN0Q29tcGF0aWJsZU1ldGhvZHNEYXRhMS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL1Rlc3RDb21wYXRpYmxlTWV0aG9kc0RhdGExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOGU0ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvaW5pdFBhcnNlci90cmVlL1Rlc3RDb21wYXRpYmxlTWV0aG9kc0RhdGExLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBUZXN0Q29tcGF0aWJsZU1ldGhvZHNEYXRhMS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xICQgICREYXRlOiAyMDA2LzAzLzE5IDE4OjI3OjEyICQgCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LmluaXRQYXJzZXIudHJlZTsKLQotIAotCi0vKioKLSAqIFVzZWQgZm9yIHRlc3RpbmcgbW9zdCBjb21wYXRpYmxlIHByb3RlY3RlZCBtZXRob2RzCi0gKiBAc2luY2UgMS4yLjAKLSAqLwotcHVibGljIGNsYXNzIFRlc3RDb21wYXRpYmxlTWV0aG9kc0RhdGExIGV4dGVuZHMgVGVzdENvbXBhdGlibGVNZXRob2RzRGF0YSB7Ci0KLQlwcm90ZWN0ZWQgaW50IHFxcShOdW1iZXIgbiwgSW50ZWdlciBpMSkgewotCQlyZXR1cm4gMTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBxcXEoSW50ZWdlciBpLCBPYmplY3QgbzEpIHsKLQkJcmV0dXJuIDI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9yZW1vdGUvUmVtb3RlUHJveHlTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvcmVtb3RlL1JlbW90ZVByb3h5U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxZWRmYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9yZW1vdGUvUmVtb3RlUHJveHlTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkucmVtb3RlOwotLyoKLSAqICAkUkNTZmlsZTogUmVtb3RlUHJveHlTdWl0ZS5qYXZhLHYgJAotICogICRSZXZpc2lvbjogMS4xMSAkICAkRGF0ZTogMjAwNi8wOS8xNCAxODozMTowNiAkIAotICovCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZXh0ZW5zaW9ucy5UZXN0U2V0dXA7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMuSmF2YVByb2plY3RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5KYXZhVGVzdHNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LkFic3RyYWN0VGVzdFByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS5Qcm94eVN1aXRlOwotCi0vKioKLSAqIEBhdXRob3IgcmljaGt1bHAKLSAqCi0gKiBUaGlzIGlzIHRoZSB0cnVlIHRlc3Qgc3VpdGUgZm9yIFJlbW90ZSBQcm94eSBUZXN0aW5nLiBUaGUgUmVtb3RlUHJveHlUZXN0IHdpbGwgdXNlIHRoaXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZW1vdGVQcm94eVN1aXRlIGV4dGVuZHMgVGVzdFNldHVwIHsKLQotCS8vIFRlc3QgY2FzZXMgdG8gYmUgaW5jbHVkZSBpbiB0aGUgc3VpdGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzcyB0ZXN0c0xpc3RbXSA9IHsgUHJveHlTdWl0ZS5jbGFzcywgVGVzdFByb2plY3RBY2Nlc3MuY2xhc3MsIH07Ci0KLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7IC8vIFRoZSBwcm9qZWN0IHRvIHN0YXJ0IHRoZSBwcm94eSBmYWN0b3J5IG9uLgkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCXByaXZhdGUgQWJzdHJhY3RUZXN0UHJveHkuUmVnaXN0cnlIYW5kbGVyIHJlZ2lzdHJ5SGFuZGxlciA9IG5ldyBBYnN0cmFjdFRlc3RQcm94eS5SZWdpc3RyeUhhbmRsZXIoKSB7Ci0JCXByaXZhdGUgUHJveHlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnk7Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJCXJldHVybiBwcm9qZWN0ICE9IG51bGw7Ci0JCX0KLQkJcHVibGljIFByb3h5RmFjdG9yeVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJaWYgKHJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCQlyZWdpc3RyeSA9Ci0JCQkJCVByb3h5TGF1bmNoU3VwcG9ydC5zdGFydEltcGxlbWVudGF0aW9uKAotCQkJCQkJcHJvamVjdCwKLQkJCQkJCSJKVW5pdCBSZW1vdGUgUHJveHkgVGVzdCIsCi0JCQkJCQluZXcgSUNvbmZpZ3VyYXRpb25Db250cmlidXRvcltdIHsgUHJveHlTdWl0ZS5nZXRQcm94eVN1aXRlQ29udHJpYnV0b3IoKX0sCi0JCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJCXJldHVybiByZWdpc3RyeTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRlc3Ryb3lSZWdpc3RyeSgpIHsKLQkJCWlmIChyZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQkJcmVnaXN0cnkudGVybWluYXRlUmVnaXN0cnkoKTsKLQkJCQlyZWdpc3RyeSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHVibGljIFJlbW90ZVByb3h5U3VpdGUoKSB7Ci0JCXRoaXMoIlRlc3QgUmVtb3RlIFByb3h5IFN1aXRlIik7Ci0JfQotCi0JcHVibGljIFJlbW90ZVByb3h5U3VpdGUoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmV3IFRlc3RTdWl0ZShuYW1lKSB7Ci0JCQl7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0c0xpc3QubGVuZ3RoOyBpKyspIHsKLQkJCQkJLy8gV2UgbWF5IGdldCBzb21lIHRlc3RzIGFuZCBzdWl0ZXMuCi0JCQkJCWlmIChUZXN0U3VpdGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0ZXN0c0xpc3RbaV0pIHx8IFRlc3RTZXR1cC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHRlc3RzTGlzdFtpXSkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJVGVzdCB0cyA9IChUZXN0KSB0ZXN0c0xpc3RbaV0ubmV3SW5zdGFuY2UoKTsKLQkJCQkJCQlhZGRUZXN0KHRzKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlCi0JCQkJCQlhZGRUZXN0U3VpdGUodGVzdHNMaXN0W2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCUFic3RyYWN0VGVzdFByb3h5LmluaXRSZWdpc3RyeUhhbmRsZXIoKFRlc3RTdWl0ZSkgdGhpcy5nZXRUZXN0KCksIHJlZ2lzdHJ5SGFuZGxlcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFJlbW90ZVByb3h5U3VpdGUoKTsKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEVTVF9QUk9KRUNUX05BTUUgPSAiVGVzdCBSZW1vdGUgUHJveHkiOwotCXByaXZhdGUgYm9vbGVhbiBvbGRBdXRvQnVpbGRpbmdTdGF0ZTsgLy8gYXV0b0J1aWxkaW5nIHN0YXRlIGJlZm9yZSB3ZSBzdGFydGVkLgotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiLS0gSW5pdGlhbGl6aW5nIHRoZSBQcm94eSBSZW1vdGUgdGVzdCBkYXRhIC0tIik7IC8vJE5PTi1OTFMtMSQKLQkJb2xkQXV0b0J1aWxkaW5nU3RhdGUgPSBKYXZhUHJvamVjdFV0aWwuc2V0QXV0b0J1aWxkKHRydWUpOwotCQlTdHJpbmcgemlwUGF0aCA9Ci0JCQlGaWxlTG9jYXRvci50b0ZpbGVVUkwobmV3IFVSTChKYXZhVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKSwgInRlc3RkYXRhL3Rlc3RyZW1vdGVwcm9qZWN0LnppcCIpKQotCQkJCS5nZXRGaWxlKCk7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBKYXZhUHJvamVjdFV0aWwuaW1wb3J0UHJvamVjdHMobmV3IFN0cmluZ1tdIHsgVEVTVF9QUk9KRUNUX05BTUUgfSwgbmV3IFN0cmluZ1tdIHsgemlwUGF0aCB9KTsKLQkJYXNzZXJ0Tm90TnVsbChwcm9qZWN0c1swXSk7Ci0JCUphdmFQcm9qZWN0VXRpbC53YWl0Rm9yQXV0b0J1aWxkKCk7CQkKLQkJcHJvamVjdCA9IHByb2plY3RzWzBdOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tIERhdGEgaW5pdGlhbGl6ZWQgLS0iKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmVnaXN0cnlIYW5kbGVyLmRlc3Ryb3lSZWdpc3RyeSgpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCg1MDApOwkvLyBXYWl0IGJlY2F1c2Ugc29tZSB0aW1lcyB0aGUgb3RoZXIgdm0gaXNuJ3QgcXVpdGUgZG93biBzbyBhIGZpbGUgc3RheXMgbG9ja2VkLgotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJfQotCQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgZmFsc2UsIG51bGwpOyAvLyBHZXQgcmlkIG9mIHRoZSBwcm9qZWN0IGFuZCB0aGUgZmlsZXMgdGhlbXNlbHZlcy4KLQkJCXByb2plY3QgPSBudWxsOwotCQl9Ci0JCUphdmFQcm9qZWN0VXRpbC5zZXRBdXRvQnVpbGQob2xkQXV0b0J1aWxkaW5nU3RhdGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL2phdmF0ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvcmVtb3RlL1Rlc3RQcm9qZWN0QWNjZXNzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9yZW1vdGUvVGVzdFByb2plY3RBY2Nlc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzYzFmYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvamF2YXRlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS9yZW1vdGUvVGVzdFByb2plY3RBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LnJlbW90ZTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RQcm9qZWN0QWNjZXNzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTUgJCAKLSAqLwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmludGVybmFsLnByb3h5LmNvcmUuSUJlYW5Qcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29yZS5JQmVhblR5cGVQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkuQWJzdHJhY3RUZXN0UHJveHk7Ci0KLS8qKgotICogQGF1dGhvciByaWNoa3VscAotICoKLSAqIFRlc3QgUHJvamVjdCBBY2Nlc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0UHJvamVjdEFjY2VzcyBleHRlbmRzIEFic3RyYWN0VGVzdFByb3h5IHsKLQotCXB1YmxpYyBUZXN0UHJvamVjdEFjY2VzcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdFByb2plY3RBY2Nlc3MoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0Zyb21Qcm9qZWN0KCkgewotCQlJQmVhblR5cGVQcm94eSB0ZXN0Q2xhc3NUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJvcmcuZWNsaXBzZS5qZW0udGVzdGluZy5wcm94eS5yZW1vdGUuVGVzdENsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0Q2xhc3NUeXBlKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdENsYXNzSW5zdGFudGlhdGlvbigpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RDbGFzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS50ZXN0aW5nLnByb3h5LnJlbW90ZS5UZXN0Q2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlJQmVhblByb3h5IHRlc3RDbGFzcyA9IHRlc3RDbGFzc1R5cGUubmV3SW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0Q2xhc3MpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb2plY3RDbGFzc01ldGhvZCgpIHRocm93cyBUaHJvd2FibGVQcm94eSB7Ci0JCUlCZWFuVHlwZVByb3h5IHRlc3RDbGFzc1R5cGUgPSBwcm94eVR5cGVGYWN0b3J5LmdldEJlYW5UeXBlUHJveHkoIm9yZy5lY2xpcHNlLmplbS50ZXN0aW5nLnByb3h5LnJlbW90ZS5UZXN0Q2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQlJTWV0aG9kUHJveHkgdGVzdE1ldGhvZCA9IHRlc3RDbGFzc1R5cGUuZ2V0TWV0aG9kUHJveHkoImdldFRlc3RTdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotCQlhc3NlcnROb3ROdWxsKHRlc3RNZXRob2QpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0Q2xhc3NNZXRob2RJbnZva2UoKSB0aHJvd3MgVGhyb3dhYmxlUHJveHkgewotCQlJQmVhblR5cGVQcm94eSB0ZXN0Q2xhc3NUeXBlID0gcHJveHlUeXBlRmFjdG9yeS5nZXRCZWFuVHlwZVByb3h5KCJvcmcuZWNsaXBzZS5qZW0udGVzdGluZy5wcm94eS5yZW1vdGUuVGVzdENsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJSU1ldGhvZFByb3h5IHRlc3RNZXRob2QgPSB0ZXN0Q2xhc3NUeXBlLmdldE1ldGhvZFByb3h5KCJnZXRUZXN0U3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJSUJlYW5Qcm94eSB0ZXN0Q2xhc3MgPSB0ZXN0Q2xhc3NUeXBlLm5ld0luc3RhbmNlKCk7Ci0JCUlTdHJpbmdCZWFuUHJveHkgYVN0cmluZyA9IChJU3RyaW5nQmVhblByb3h5KSB0ZXN0TWV0aG9kLmludm9rZSh0ZXN0Q2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKGFTdHJpbmcpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RTVFJJTkciLCBhU3RyaW5nLnN0cmluZ1ZhbHVlKCkpOwkJCi0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGVlOGI5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jICRTb3VyY2U6IC9jdnNyb290L3dlYnRvb2xzL2plZXRvb2xzLm1vdmUvd2VidG9vbHMuamF2YWVlLnRlc3RzLmdpdC90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMsdiAkCi0jICRSZXZpc2lvbjogMS4zICQgICREYXRlOiAyMDA1LzA4LzI0IDIwOjU4OjU1ICQKLSMKLQotCi1wbHVnaW5OYW1lPUphdmEgRU1GIE1vZGVsIEpVbml0IFRlc3QgQ2FzZXMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWVlNDI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby5yZWdpc3RyYXRpb25zIj4KLSAgICAgIDxyZWdpc3RyYXRpb24KLSAgICAgICAgICAgIGNvbnRhaW5lcj0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIj4KLSAgICAgICAgIDxvdmVycmlkZQotICAgICAgICAgICAgICAgcGFja2FnZT0ib3JnLmVjbGlwc2UuamVtLnRlc3RzLmJlYW5pbmZvIgotICAgICAgICAgICAgICAgcGF0aD0idGVzdGRhdGEvb3ZlcnJpZGVzL2JlYW5pbmZvIj4KLSAgICAgICAgIDwvb3ZlcnJpZGU+Ci0gICAgICA8L3JlZ2lzdHJhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLTwhLS0KLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuamVtLnV0aWwudWlUZXN0ZXIiPgotICAgICAgICA8dWlUZXN0ZXIgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS5qZW0udGVzdHMuVUlUZXN0ZXIiLz4KLSAgICAgPC9leHRlbnNpb24+Ci0tLT4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Byb3h5LmphcnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvcHJveHkuamFycwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E3MDI5YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvcHJveHkuamFycworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotdm0vdGVzdHMuamFyPS9vcmcuZWNsaXBzZS5qZW0udGVzdHMvYmluLwotamF2YXRlc3RzLmphcj0vb3JnLmVjbGlwc2UuamVtLnRlc3RzL2Jpbi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNWIxYTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4KLQotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgcGx1Z2luLW5hbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS50ZXN0cyIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdC9saWJyYXJ5LnhtbCIvPgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImplbS1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vamVtX2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke2plbS1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAJPCEtLSBOb3RlOiBEb2Vzbid0IHJlYWxseSBuZWVkIHRvIGJlIFVJIHRlc3QgYnV0IGxhdW5jaGluZyByZW1vdGUgVk0ncyB3aXRoCi0gIAkgICAgIERlYnVnVUkgcGx1Z2luIHByZXNlbnQgYnV0IG5vdCBsYXVuY2hpbmcgVUkgY2F1c2VzIHNldmVyZSBlcnJyb3JzCi0gIAkgICAgIGJlY2F1c2UgaXQgdHJpZXMgdG8gc3RhcnQgRGVidWdVSSBpbiBoZWFkbGVzcyBlbnYuIEJpZyBQYWluISAtLT4KLSAgICA8YW50IHRhcmdldD0idWktdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2plbS1mb2xkZXJ9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmplbS50ZXN0cy5BbGxTdWl0ZXMiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9KREs1QmluVGVzdHMuamFyIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL0pESzVCaW5UZXN0cy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ODYyZTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL0pESzVCaW5UZXN0cy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvSkRLNVRlc3RzLnppcCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9KREs1VGVzdHMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDg4YmQwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9KREs1VGVzdHMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL2V4dGphcm9wcy50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvZXh0amFyb3BzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjZmI3ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvZXh0amFyb3BzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotZ2V0QWN0aW9uQ29tbWFuZAotZ2V0TGFiZWwKLXNldEFjdGlvbkNvbW1hbmQKLXNldExhYmVsCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvZXh0amFycHJvcHMudHh0IGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL2V4dGphcnByb3BzLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM3ZWQ2Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvZXh0amFycHJvcHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotYWxpZ25tZW50WAotYWxpZ25tZW50WQotYmFja2dyb3VuZAotYm91bmRzCi1jb2xvck1vZGVsCi1jdXJzb3IKLWVuYWJsZWQKLWZvY3VzVHJhdmVyc2FibGUKLWNvbXBvbmVudE9yaWVudGF0aW9uCi1mb250Ci1mb3JlZ3JvdW5kCi1ncmFwaGljcwotbG9jYWxlCi1sb2NhdGlvbgotbG9jYXRpb25PblNjcmVlbgotbWF4aW11bVNpemUKLW1pbmltdW1TaXplCi1uYW1lCi1wYXJlbnQKLXByZWZlcnJlZFNpemUKLXNob3dpbmcKLXNpemUKLXRvb2xraXQKLXRyZWVMb2NrCi12YWxpZAotdmlzaWJsZQotYWN0aW9uQ29tbWFuZAotbGFiZWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9qbGFiZWxvcHMudHh0IGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL2psYWJlbG9wcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYWQ4ZDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL2psYWJlbG9wcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotaGFzaENvZGUKLW5vdGlmeQotbm90aWZ5QWxsCi13YWl0Ci13YWl0Ci13YWl0Ci1nZXRDbGFzcwotZXF1YWxzCi10b1N0cmluZwotYWRkCi1hZGROb3RpZnkKLWNoZWNrSW1hZ2UKLWNvbnRhaW5zCi1jcmVhdGVJbWFnZQotY3JlYXRlSW1hZ2UKLWRpc3BhdGNoRXZlbnQKLWRvTGF5b3V0Ci1nZXRCYWNrZ3JvdW5kCi1nZXRCb3VuZHMKLWdldENvbG9yTW9kZWwKLWdldEN1cnNvcgotZ2V0Rm9udAotZ2V0Rm9udE1ldHJpY3MKLWdldEZvcmVncm91bmQKLWdldEdyYXBoaWNzCi1nZXRMb2NhbGUKLWdldExvY2F0aW9uCi1nZXRMb2NhdGlvbk9uU2NyZWVuCi1nZXRNYXhpbXVtU2l6ZQotZ2V0TWluaW11bVNpemUKLWdldE5hbWUKLWdldFBhcmVudAotZ2V0UHJlZmVycmVkU2l6ZQotZ2V0U2l6ZQotZ2V0VG9vbGtpdAotZ2V0VHJlZUxvY2sKLWludmFsaWRhdGUKLWlzRW5hYmxlZAotaXNTaG93aW5nCi1pc1ZhbGlkCi1pc1Zpc2libGUKLWxpc3QKLWxpc3QKLXBhaW50QWxsCi1wcmVwYXJlSW1hZ2UKLXByaW50QWxsCi1yZW1vdmUKLXJlbW92ZU5vdGlmeQotcmVwYWludAotcmVxdWVzdEZvY3VzCi1zZXRCYWNrZ3JvdW5kCi1zZXRCb3VuZHMKLXNldEN1cnNvcgotc2V0RW5hYmxlZAotc2V0Rm9yZWdyb3VuZAotc2V0TG9jYWxlCi1zZXRMb2NhdGlvbgotc2V0TG9jYXRpb24KLXNldE5hbWUKLXNldFNpemUKLXNldFNpemUKLXRyYW5zZmVyRm9jdXMKLXZhbGlkYXRlCi1hZGQKLWFkZAotYWRkCi1hZGQKLWFkZAotZ2V0QWxpZ25tZW50WAotZ2V0QWxpZ25tZW50WQotZ2V0Q29tcG9uZW50Ci1nZXRDb21wb25lbnRBdAotZ2V0Q29tcG9uZW50QXQKLWdldENvbXBvbmVudENvdW50Ci1nZXRDb21wb25lbnRzCi1nZXRJbnNldHMKLWdldExheW91dAotaXNBbmNlc3Rvck9mCi1saXN0Ci1saXN0Ci1wcmludAotcmVtb3ZlCi1yZW1vdmUKLXJlbW92ZUFsbAotc2V0TGF5b3V0Ci1jb21wdXRlVmlzaWJsZVJlY3QKLWNvbnRhaW5zCi1jcmVhdGVUb29sVGlwCi1maXJlUHJvcGVydHlDaGFuZ2UKLWZpcmVQcm9wZXJ0eUNoYW5nZQotZmlyZVByb3BlcnR5Q2hhbmdlCi1maXJlUHJvcGVydHlDaGFuZ2UKLWZpcmVQcm9wZXJ0eUNoYW5nZQotZmlyZVByb3BlcnR5Q2hhbmdlCi1maXJlUHJvcGVydHlDaGFuZ2UKLWdldEFjY2Vzc2libGVDb250ZXh0Ci1nZXRBY3Rpb25Gb3JLZXlTdHJva2UKLWdldEF1dG9zY3JvbGxzCi1nZXRCb3JkZXIKLWdldEJvdW5kcwotZ2V0Q2xpZW50UHJvcGVydHkKLWdldENvbmRpdGlvbkZvcktleVN0cm9rZQotZ2V0SGVpZ2h0Ci1nZXRMb2NhdGlvbgotZ2V0TmV4dEZvY3VzYWJsZUNvbXBvbmVudAotZ2V0UmVnaXN0ZXJlZEtleVN0cm9rZXMKLWdldFJvb3RQYW5lCi1nZXRTaXplCi1nZXRUb29sVGlwVGV4dAotZ2V0VG9wTGV2ZWxBbmNlc3RvcgotZ2V0VmlzaWJsZVJlY3QKLWdldFdpZHRoCi1nZXRYCi1nZXRZCi1ncmFiRm9jdXMKLWhhc0ZvY3VzCi1pc0RvdWJsZUJ1ZmZlcmVkCi1pc0ZvY3VzQ3ljbGVSb290Ci1pc0ZvY3VzVHJhdmVyc2FibGUKLWlzTWFuYWdpbmdGb2N1cwotaXNPcGFxdWUKLWlzT3B0aW1pemVkRHJhd2luZ0VuYWJsZWQKLWlzUmVxdWVzdEZvY3VzRW5hYmxlZAotaXNWYWxpZGF0ZVJvb3QKLXBhaW50Ci1wYWludEltbWVkaWF0ZWx5Ci1wdXRDbGllbnRQcm9wZXJ0eQotcmVwYWludAotcmVxdWVzdERlZmF1bHRGb2N1cwotcmVzZXRLZXlib2FyZEFjdGlvbnMKLXJldmFsaWRhdGUKLXNjcm9sbFJlY3RUb1Zpc2libGUKLXNldEFsaWdubWVudFgKLXNldEFsaWdubWVudFkKLXNldEF1dG9zY3JvbGxzCi1zZXRCb3JkZXIKLXNldEJvdW5kcwotc2V0RGVidWdHcmFwaGljc09wdGlvbnMKLXNldERvdWJsZUJ1ZmZlcmVkCi1zZXRNYXhpbXVtU2l6ZQotc2V0TWluaW11bVNpemUKLXNldE5leHRGb2N1c2FibGVDb21wb25lbnQKLXNldE9wYXF1ZQotc2V0UHJlZmVycmVkU2l6ZQotc2V0UmVxdWVzdEZvY3VzRW5hYmxlZAotc2V0VG9vbFRpcFRleHQKLXNldFZpc2libGUKLXVucmVnaXN0ZXJLZXlib2FyZEFjdGlvbgotdXBkYXRlCi1nZXREaXNhYmxlZEljb24KLWdldERpc3BsYXllZE1uZW1vbmljCi1nZXRIb3Jpem9udGFsQWxpZ25tZW50Ci1nZXRIb3Jpem9udGFsVGV4dFBvc2l0aW9uCi1nZXRJY29uCi1nZXRJY29uVGV4dEdhcAotZ2V0TGFiZWxGb3IKLWdldFRleHQKLWdldFVJCi1nZXRWZXJ0aWNhbEFsaWdubWVudAotZ2V0VmVydGljYWxUZXh0UG9zaXRpb24KLXNldERpc2FibGVkSWNvbgotc2V0RGlzcGxheWVkTW5lbW9uaWMKLXNldEZvbnQKLXNldEhvcml6b250YWxBbGlnbm1lbnQKLXNldEhvcml6b250YWxUZXh0UG9zaXRpb24KLXNldEljb24KLXNldEljb25UZXh0R2FwCi1zZXRMYWJlbEZvcgotc2V0VGV4dAotc2V0VUkKLXNldFZlcnRpY2FsQWxpZ25tZW50Ci1zZXRWZXJ0aWNhbFRleHRQb3NpdGlvbgotdXBkYXRlVUkKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9qbGFiZWxwcm9wcy50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvamxhYmVscHJvcHMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGJjNzA3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9qbGFiZWxwcm9wcy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi1iYWNrZ3JvdW5kCi1ib3VuZHMKLWNvbG9yTW9kZWwKLWN1cnNvcgotZW5hYmxlZAotZm9jdXNUcmF2ZXJzYWJsZQotZm9yZWdyb3VuZAotbG9jYWxlCi1sb2NhdGlvbgotbG9jYXRpb25PblNjcmVlbgotY29tcG9uZW50T3JpZW50YXRpb24KLW5hbWUKLXBhcmVudAotc2hvd2luZwotc2l6ZQotdG9vbGtpdAotdHJlZUxvY2sKLXZhbGlkCi12aXNpYmxlCi1jb21wb25lbnRDb3VudAotY29tcG9uZW50cwotbGF5b3V0Ci1hbGlnbm1lbnRYCi1hbGlnbm1lbnRZCi1hdXRvc2Nyb2xscwotYm9yZGVyCi1kZWJ1Z0dyYXBoaWNzT3B0aW9ucwotZG91YmxlQnVmZmVyZWQKLWZvY3VzQ3ljbGVSb290Ci1ncmFwaGljcwotaGVpZ2h0Ci1pbnNldHMKLW1hbmFnaW5nRm9jdXMKLW1heGltdW1TaXplCi1taW5pbXVtU2l6ZQotbmV4dEZvY3VzYWJsZUNvbXBvbmVudAotb3BhcXVlCi1vcHRpbWl6ZWREcmF3aW5nRW5hYmxlZAotcGFpbnRpbmdUaWxlCi1wcmVmZXJyZWRTaXplCi1yZWdpc3RlcmVkS2V5U3Ryb2tlcwotcmVxdWVzdEZvY3VzRW5hYmxlZAotcm9vdFBhbmUKLXRvb2xUaXBUZXh0Ci10b3BMZXZlbEFuY2VzdG9yCi12YWxpZGF0ZVJvb3QKLXZpc2libGVSZWN0Ci13aWR0aAoteAoteQotZGlzYWJsZWRJY29uCi1kaXNwbGF5ZWRNbmVtb25pYwotZm9udAotaG9yaXpvbnRhbEFsaWdubWVudAotaG9yaXpvbnRhbFRleHRQb3NpdGlvbgotaWNvbgotaWNvblRleHRHYXAKLWxhYmVsRm9yCi10ZXh0Ci12ZXJ0aWNhbEFsaWdubWVudAotdmVydGljYWxUZXh0UG9zaXRpb24KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9vdmVycmlkZXMvYmVhbmluZm8vVGVzdE92ZXJyaWRlcy5vdmVycmlkZSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS9vdmVycmlkZXMvYmVhbmluZm8vVGVzdE92ZXJyaWRlcy5vdmVycmlkZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5ZWJlNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvb3ZlcnJpZGVzL2JlYW5pbmZvL1Rlc3RPdmVycmlkZXMub3ZlcnJpZGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNoYW5nZTpDaGFuZ2VEZXNjcmlwdGlvbiB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UuamVtLmphdmE9ImphdmEueG1pIiB4bWxuczpvcmcuZWNsaXBzZS52ZS5pbnRlcm5hbC5jZGUuZGVjb3JhdG9ycz0iaHR0cDovLy9vcmcvZWNsaXBzZS92ZS9pbnRlcm5hbC9jZGUvZGVjb3JhdG9ycy5lY29yZSIgeG1sbnM6b3JnLmVjbGlwc2UudmUuaW50ZXJuYWwuY2RlLnV0aWxpdHk9Imh0dHA6Ly8vb3JnL2VjbGlwc2UvdmUvaW50ZXJuYWwvY2RlL3V0aWxpdHkuZWNvcmUiIHhtbG5zOm9yZy5lY2xpcHNlLnZlLmludGVybmFsLmpjbT0iaHR0cDovLy9vcmcvZWNsaXBzZS92ZS9pbnRlcm5hbC9qY20uZWNvcmUiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6Y2hhbmdlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL0NoYW5nZSIgeG1pOnZlcnNpb249IjIuMCI+Ci0gICA8b2JqZWN0Q2hhbmdlcyBrZXk9Ilg6Uk9PVCMvL0Byb290Ij4KLSAgICAgIDx2YWx1ZSBmZWF0dXJlTmFtZT0iZVN0cnVjdHVyYWxGZWF0dXJlcyI+Ci0gICAgICAgICA8bGlzdENoYW5nZXMgcmVmZXJlbmNlVmFsdWVzPSJfZVN0cnVjdHVyYWxGZWF0dXJlcyBfZVN0cnVjdHVyYWxGZWF0dXJlczEiLz4KLSAgICAgIDwvdmFsdWU+Ci0gICA8L29iamVjdENoYW5nZXM+Ci0gICA8b2JqZWN0c1RvQXR0YWNoIHhtaTppZD0iX2VTdHJ1Y3R1cmFsRmVhdHVyZXMiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ4eXoiPgotICAgICAgPGVBbm5vdGF0aW9ucyBzb3VyY2U9Ik92ZXJyaWRlIEFubm90YXRpb24iLz4KLSAgICA8L29iamVjdHNUb0F0dGFjaD4KLSAgIDxvYmplY3RzVG9BdHRhY2ggeG1pOmlkPSJfZVN0cnVjdHVyYWxGZWF0dXJlczEiIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0ZXN0NzkwODMiLz4gICAgCi08L2NoYW5nZTpDaGFuZ2VEZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJhc2ljLnppcCBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0YmFzaWMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2U3NjAyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0YmFzaWMuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RiZWFuaW5mby56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJlYW5pbmZvLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3MGFiZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJlYW5pbmZvLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0YmVhbmluZm9iZWFuaW5mb3MuemlwIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RiZWFuaW5mb2JlYW5pbmZvcy56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNjljMWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RiZWFuaW5mb2JlYW5pbmZvcy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJlYW5pbmZvcHJlcS56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdGJlYW5pbmZvcHJlcS56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxM2U4YWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RiZWFuaW5mb3ByZXEuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RidXR0b25iZWFuaW5mb3VpMXByb2plY3RqYXIuemlwIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3Rlc3RidXR0b25iZWFuaW5mb3VpMXByb2plY3RqYXIuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzJiNTg3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0YnV0dG9uYmVhbmluZm91aTFwcm9qZWN0amFyLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0cmVtb3RlcHJvamVjdC56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdGVzdHJlbW90ZXByb2plY3QuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTIzMDIyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy90ZXN0ZGF0YS90ZXN0cmVtb3RlcHJvamVjdC56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdW56aXAueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3Rlc3RkYXRhL3VuemlwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5N2E3NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdGVzdGRhdGEvdW56aXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJ6aXAiIGRlZmF1bHQ9InppcCIgYmFzZWRpcj0iLiI+Ci0gIDx0YXJnZXQgbmFtZT0iemlwIj4KLSAgICA8dW56aXAgc3JjPSIke3ppcGZyb219IiBkZXN0PSIke3ppcHRvfSIgLz4gIAotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdm1fdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L3ZtL1Rlc3RDYWxsYmFjay5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS92bS9UZXN0Q2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyMThkYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qZW0udGVzdHMvdm1fdGVzdHMvb3JnL2VjbGlwc2UvamVtL3Rlc3RzL3Byb3h5L3ZtL1Rlc3RDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qZW0udGVzdHMucHJveHkudm07Ci0vKgotICogICRSQ1NmaWxlOiBUZXN0Q2FsbGJhY2suamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuNiAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLio7Ci0vKioKLSAqIFRoaXMgaXMgYSB0ZXN0IGZvciB0ZXN0aW5nIGNhbGxiYWNrcy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RDYWxsYmFjayBpbXBsZW1lbnRzIElDYWxsYmFjayB7Ci0JCi0JSVZNQ2FsbGJhY2tTZXJ2ZXIgdm1TZXJ2ZXI7Ci0JaW50IGNhbGxiYWNrSUQ7Ci0JYm9vbGVhbiBzdG9wID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBXaGVuIHRvbGQgdG8gc3RhcnQsIGl0IHdpbGwgc2VuZCBhIGNhbGxiYWNrCi0JICogb25jZSBldmVyeSBoYWxmIHNlY29uZCB1bnRpbCB0b2xkIHRvIHN0b3AuCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0JCW5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIEZpcnN0IHNlbmQgYmFjayB0ZXN0IGZvciBJREUgY2FsbGluZyBiYWNrIG9uIHNhbWUgdGhyZWFkLiBXZSBkbyB0aGlzIGJ5IHNlbmRpbmcgdGhlIHRocmVhZCBpZAotCQkJCS8vIGFzIGEgY29uc3RhbnQgYW5kIHRoZSBvdGhlciBzaWRlIHdpbGwgdGhlbiBjYWxsIGJhY2sgdG8gcmVtb3RlLCBhc2sgZm9yIHRoZSB0aHJlYWQgaWQsIGFuZAotCQkJCS8vIHNlZSBpZiBpdCBtYXRjaGVzLgotCQkJCXRyeSB7Ci0JCQkJCXZtU2VydmVyLmRvQ2FsbGJhY2sobmV3IElDYWxsYmFja1J1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIE9iamVjdCBydW4oSUNhbGxiYWNrSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCQkJCQkJcmV0dXJuIGhhbmRsZXIuY2FsbGJhY2tBc0NvbnN0YW50cyhjYWxsYmFja0lELCAxLCBuZXcgSW50ZWdlcihUaHJlYWQuY3VycmVudFRocmVhZCgpLmhhc2hDb2RlKCkpKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJCQotCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQkKLQkJCQkvLyBOb3cgZG8gdGhlIHJlZ3VsYXIgdGVzdGluZy4KLQkJCQlmaW5hbCBJbnRlZ2VyW10gcCA9IG5ldyBJbnRlZ2VyW10ge25ldyBJbnRlZ2VyKDApfTsKLQkJCQl3aGlsZSghc3RvcCkgewotCQkJCQl0cnkgewotCQkJCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWlmIChzdG9wKQotCQkJCQkJYnJlYWs7Ci0JCQkJCS8vIE5vdyBzaWduYWwgdGhlIGNhbGxiYWNrLgotCQkJCQlwWzBdID0gbmV3IEludGVnZXIocFswXS5pbnRWYWx1ZSgpKzEpOwotCQkJCQl0cnkgewotCQkJCQkJdm1TZXJ2ZXIuZG9DYWxsYmFjayhuZXcgSUNhbGxiYWNrUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIE9iamVjdCBydW4oSUNhbGxiYWNrSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgQ29tbWFuZEV4Y2VwdGlvbiB7Ci0JCQkJCQkJCXJldHVybiBoYW5kbGVyLmNhbGxiYWNrV2l0aFBhcm1zKGNhbGxiYWNrSUQsIDAsIHApOwkJCQkJCQkJCi0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0gY2F0Y2ggKENvbW1hbmRFeGNlcHRpb24gZSkgewotCQkJCQl9CQkJCQkJCi0JCQkJfQotCQkJfQotCQl9KS5zdGFydCgpOwotCX0KLQkKLQkvKioKLQkgKiBUZWxsIGl0IHN0b3AuCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJc3RvcCA9IHRydWU7Ci0JfQotCQotCS8qKgotCSAqIEl0IGlzIGJlaW5nIGluaXRpYWxpemVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDYWxsYmFjayhJVk1DYWxsYmFja1NlcnZlciBzZXJ2ZXIsIGludCBpZCkgewotCQl2bVNlcnZlciA9IHNlcnZlcjsKLQkJY2FsbGJhY2tJRCA9IGlkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS92bS9UZXN0Q2FsbGJhY2tTdHJlYW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy92bV90ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvdm0vVGVzdENhbGxiYWNrU3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkODNlYjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS92bS9UZXN0Q2FsbGJhY2tTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamVtLnRlc3RzLnByb3h5LnZtOwotLyoKLSAqICAkUkNTZmlsZTogVGVzdENhbGxiYWNrU3RyZWFtLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjQgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTQgJCAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSUNhbGxiYWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5wcm94eS5jb21tb24uSVZNQ2FsbGJhY2tTZXJ2ZXI7Ci0vKioKLSAqIFRoaXMgaXMgYSB0ZXN0IGZvciB0ZXN0aW5nIGNhbGxiYWNrIHN0cmVhbXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q2FsbGJhY2tTdHJlYW0gaW1wbGVtZW50cyBJQ2FsbGJhY2sgewotCQotCUlWTUNhbGxiYWNrU2VydmVyIHZtU2VydmVyOwotCWludCBjYWxsYmFja0lEOwotCWJvb2xlYW4gc3RvcCA9IGZhbHNlOwotCi0JLyoqCi0JICogV2hlbiB0b2xkIHRvIHN0YXJ0LCBpdCB3aWxsIHNlbmQgYSBzdHJlYW0gb2YgMzAwMDAgYnl0ZXMgb2YgaW5jcmVtZW50aW5nCi0JICogdmFsdWUgKGkuZS4gMCwgMSwgMiwgLi4uLCAxMjcsIC0xMjcsIC4uLikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlvcyA9IHZtU2VydmVyLnJlcXVlc3RTdHJlYW0oY2FsbGJhY2tJRCwgMCk7Ci0JCQkJCWlmIChvcyAhPSBudWxsKQotCQkJCQkJZm9yIChpbnQgaT0wOyBpPDMwMDAwOyBpKyspCi0JCQkJCQkJb3Mud3JpdGUoaSk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKG9zICE9IG51bGwpCi0JCQkJCQlvcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCX19KS5zdGFydCgpOwotCX0KLQkKLQkvKioKLQkgKiBJdCBpcyBiZWluZyBpbml0aWFsaXplZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQ2FsbGJhY2soSVZNQ2FsbGJhY2tTZXJ2ZXIgc2VydmVyLCBpbnQgaWQpIHsKLQkJdm1TZXJ2ZXIgPSBzZXJ2ZXI7Ci0JCWNhbGxiYWNrSUQgPSBpZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy92bV90ZXN0cy9vcmcvZWNsaXBzZS9qZW0vdGVzdHMvcHJveHkvdm0vVGVzdEV4cHJlc3Npb25UaHJlYWRUcmFuc2Zlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS92bS9UZXN0RXhwcmVzc2lvblRocmVhZFRyYW5zZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NWI1YWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL29yZy9lY2xpcHNlL2plbS90ZXN0cy9wcm94eS92bS9UZXN0RXhwcmVzc2lvblRocmVhZFRyYW5zZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmplbS50ZXN0cy5wcm94eS52bTsKLS8qCi0gKiAgJFJDU2ZpbGU6IFRlc3RFeHByZXNzaW9uVGhyZWFkVHJhbnNmZXIuamF2YSx2ICQKLSAqICAkUmV2aXNpb246IDEuMyAkICAkRGF0ZTogMjAwNS8wOC8yNCAyMDo1ODo1NCAkIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucHJveHkuY29tbW9uLio7Ci0vKioKLSAqIFRoaXMgaXMgYSB0ZXN0IGZvciB0ZXN0aW5nIGNhbGxiYWNrcy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RFeHByZXNzaW9uVGhyZWFkVHJhbnNmZXIgaW1wbGVtZW50cyBJQ2FsbGJhY2sgewotCQotCUlWTUNhbGxiYWNrU2VydmVyIHZtU2VydmVyOwotCWludCBjYWxsYmFja0lEOwotCWJvb2xlYW4gc3RvcCA9IGZhbHNlOwotCi0JLyoqCi0JICogV2hlbiB0b2xkIHRvIHN0YXJ0LCBpdCB3aWxsIHNlbmQgYSBjYWxsYmFjawotCSAqIG9uY2UgZXZlcnkgaGFsZiBzZWNvbmQgdW50aWwgdG9sZCB0byBzdG9wLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQkvLyBOZWVkIHRvIHB1dCBpdCBpbnRvIGEgbmV3IHRocmVhZC4KLQkJLy8gVGhlbiB3ZSdsbCBqdXN0IHdhaXQgdW50aWwgdGhlIHRocmVhZCBpcyBkb25lLgotCQkvLyBUaGlzIHdpbGwgY2F1c2UgY2FsbGJhY2sgb250byBhIGRpZmZlcmVudCB0aHJlYWQgaW4gSURFLgotCQlUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCS8vIENhbGJhY2sgdG8gSURFIG9uIHRoaXMgdGhyZWFkLiBJdCB3b24ndCByZXR1cm4gdW50aWwgY29tcGxldGUgb24gdGhlIG90aGVyIHNpZGUuCi0JCQkJdHJ5IHsKLQkJCQkJdm1TZXJ2ZXIuZG9DYWxsYmFjayhuZXcgSUNhbGxiYWNrUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgT2JqZWN0IHJ1bihJQ2FsbGJhY2tIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBDb21tYW5kRXhjZXB0aW9uIHsKLQkJCQkJCQlyZXR1cm4gaGFuZGxlci5jYWxsYmFja0FzQ29uc3RhbnRzKGNhbGxiYWNrSUQsIDAsIG51bGwpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJCi0JCQkJfSBjYXRjaCAoQ29tbWFuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQkJdC5zdGFydCgpOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJdHJ5IHsKLQkJCQl0LmpvaW4oKTsKLQkJCQlicmVhazsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQkvLyBOb3cgd2UgcmV0dXJuIGFuZCBvcmlnaW5hbCB0aHJlYWQgb24gSURFIHJlc3VtZXMgcHJvY2Vzc2luZy4KLQl9Ci0JCQotCS8qKgotCSAqIEl0IGlzIGJlaW5nIGluaXRpYWxpemVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVDYWxsYmFjayhJVk1DYWxsYmFja1NlcnZlciBzZXJ2ZXIsIGludCBpZCkgewotCQl2bVNlcnZlciA9IHNlcnZlcjsKLQkJY2FsbGJhY2tJRCA9IGlkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL3Rlc3RQYWNrYWdlL1Rlc3RBY2Nlc3MuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy92bV90ZXN0cy90ZXN0UGFja2FnZS9UZXN0QWNjZXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMGJkNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL3Rlc3RQYWNrYWdlL1Rlc3RBY2Nlc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogICRSQ1NmaWxlOiBUZXN0QWNjZXNzLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDUvMTEgMTk6MDE6MzIgJCAKLSAqLwotcGFja2FnZSB0ZXN0UGFja2FnZTsKLSAKLQotLyoqCi0gKiBVc2VkIGZvciB0ZXN0aW5nIGZpZWxkcy4KLSAqIEBzaW5jZSAxLjEuMAotICovCi1wdWJsaWMgY2xhc3MgVGVzdEFjY2VzcyB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFZvaWQoKSB7Ci0JCQotCX0KLQkKLQlwdWJsaWMgaW50IGZpZWxkMTsKLQlwcm90ZWN0ZWQgaW50IGZpZWxkMjsKLQkKLQlwdWJsaWMgc3RhdGljIGludCBTVEFUSUNfRklFTEQgPSAzOwotCi0JVGVzdEFjY2VzcyhSdW50aW1lRXhjZXB0aW9uIGkpIHsKLQkJCi0JfQotCQotCVRlc3RBY2Nlc3MoVGhyb3dhYmxlIG4pIHsKLQkJCi0JfQotCQotCXB1YmxpYyBUZXN0QWNjZXNzKCkgewotCQkKLQl9Ci0JCi0JcHVibGljIFRlc3RBY2Nlc3MoRXhjZXB0aW9uIG8pIHsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIGRkZChJbnRlZ2VyIG8sIE51bWJlciBuKSB7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkZGQoTnVtYmVyIG8sIEludGVnZXIgbikgewotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGRkKE51bWJlciBuLCBOdW1iZXIgbjEpIHsKLQkJCi0JfQotCi0JCi0JcHVibGljIHZvaWQgeHl6KCkgewotCX0KLQkKLQlwdWJsaWMgdm9pZCB4eXooTnVtYmVyIG4pIHsKLQl9Ci0JCi0JcHVibGljIHZvaWQgeHl6KE9iamVjdCBuKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHF4cigpIHsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL3Rlc3RQYWNrYWdlL1Rlc3RDdG9yV2l0aE51bGwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmplbS50ZXN0cy92bV90ZXN0cy90ZXN0UGFja2FnZS9UZXN0Q3RvcldpdGhOdWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZGY1YzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuamVtLnRlc3RzL3ZtX3Rlc3RzL3Rlc3RQYWNrYWdlL1Rlc3RDdG9yV2l0aE51bGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgdGVzdFBhY2thZ2U7Ci0vKgotICogICRSQ1NmaWxlOiBUZXN0Q3RvcldpdGhOdWxsLmphdmEsdiAkCi0gKiAgJFJldmlzaW9uOiAxLjMgJCAgJERhdGU6IDIwMDUvMDgvMjQgMjA6NTg6NTUgJCAKLSAqLwotCi0vKioKLSAqIAotICogQHNpbmNlIDEuMC4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q3RvcldpdGhOdWxsIHsKLQotCXB1YmxpYyBUZXN0Q3RvcldpdGhOdWxsKFN0cmluZyB4KSB7Ci0JCS8vIFRoaXMgaXMganVzdCBhIHRlc3QgdG8gc2VlIHRoYXQgY3RvciB3aWxsIGJlIHNlbGVjdGVkIGlmIGl0IGhhcyBhIG51bGwgcGFzc2VkIGluIGZvciBUcmVlIEV4cHJlc3Npb24gUHJvY2Vzc2luZy4KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ODZlZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLWNvcmUtcGVyZm9ybWFuY2UuamFyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNlMTJmYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYTkwZDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1zb3VyY2UuY29yZS1wZXJmb3JtYW5jZS5qYXIgPSBzcmMvCi1vdXRwdXQuY29yZS1wZXJmb3JtYW5jZS5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGNvcmUtcGVyZm9ybWFuY2UuamFyLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIHRlc3RjYXNlLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZmQ1MTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlIgotICAgbmFtZT0iQ29yZSBQZXJmb3JtYW5jZSBQbHVnLWluIgotICAgdmVyc2lvbj0iMS4xLjAiCi0gICBwcm92aWRlci1uYW1lPSIiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS5Db3JlUGVyZm9ybWFuY2VUZXN0UGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJjb3JlLXBlcmZvcm1hbmNlLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cyIvPgotICAgPC9yZXF1aXJlcz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL3BlcmZvcm1hbmNlL0FsbENvcmVQZXJmb3JtYW5jZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL3BlcmZvcm1hbmNlL0FsbENvcmVQZXJmb3JtYW5jZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZDQyMzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9wZXJmb3JtYW5jZS9BbGxDb3JlUGVyZm9ybWFuY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTm92IDI4LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuQXBwQ2xpZW50RU1GRWRpdFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5BcHBDbGllbnRFTUZUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuRWFyRU1GRWRpdFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FYXJFTUZUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuRWpiRU1GRWRpdFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5SYXJFTUZFZGl0VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLlJhckVNRlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5XYXJFTUZFZGl0VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLldhckVNRlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5XZWJTZXJ2aWNlc0VNRlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UuQmFzZVBlcmZvcm1hbmNlVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuYXBwY2xpZW50Lm9wZXJhdGlvbnMuQXBwQ2xpZW50UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5lamIub3BlcmF0aW9ucy5FSkJJbXBvcnRPcGVyYXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmVqYi5vcGVyYXRpb25zLkVKQlByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuamNhLm9wZXJhdGlvbnMuSkNBUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy53ZWIub3BlcmF0aW9ucy5XZWJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0OwotCi0vKioKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxDb3JlUGVyZm9ybWFuY2VUZXN0cyBleHRlbmRzIEJhc2VQZXJmb3JtYW5jZVRlc3RDYXNlewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiUGVyZm9ybWFuY2UgVGVzdCBmb3IgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0Iik7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEFwcENsaWVudEVNRkVkaXRUZXN0KCJ0ZXN0QXBwbGljYXRpb25DbGllbnRFZGl0IiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIkFwcGxpY2F0aW9uIENsaWVudCBlbWYgZWRpdCB0ZXN0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBBcHBDbGllbnRFTUZUZXN0KCJ0ZXN0QXBwbGljYXRpb25DbGllbnRQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkxPQ0FMLCAiQXBwbGljYXRpb24gQ2xpZW50IGVtZiB0ZXN0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBBcHBDbGllbnRFTUZUZXN0KCJ0ZXN0MTRBcHBsaWNhdGlvbkNsaWVudFBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiQXBwbGljYXRpb24gQ2xpZW50IDE0IGVtZiB0ZXN0IiApOwotCQkKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgRWFyRU1GRWRpdFRlc3QoInRlc3RFQVJFZGl0IiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIkVBUiBlbWYgZWRpdCB0ZXN0IiApOwotCQkvL2FkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEVhckVNRlRlc3QoInRlc3RFQVJQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkxPQ0FMLCAiRUFSICBlbWYgdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgRWFyRU1GVGVzdCgidGVzdDE0RUFSUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJFQVIgMTQgZW1mIHRlc3QiICk7Ci0JCQotCQkvL2FkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEVqYkVNRkVkaXRUZXN0KCJ0ZXN0RUpCSmFyRWRpdCIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJFSkIgZW1mIGVkaXQgdGVzdCAtdGVzdEVKQkphckVkaXQiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEVqYkVNRkVkaXRUZXN0KCJ0ZXN0V0NDTUphciIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5MT0NBTCwgIkVKQiBlbWYgZWRpdCB0ZXN0IC0gdGVzdFdDQ01KYXIiICk7Ci0JCS8vYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgRWpiRU1GVGVzdCgidGVzdEVKQkphclBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuTE9DQUwsICJFSkIgIGVtZiB0ZXN0IiApOwotCQkvL2FkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEVqYkVNRlRlc3QoInRlc3QxNEVKQkphclBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiRUpCIDE0IGVtZiB0ZXN0IiApOwotCQotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBSYXJFTUZFZGl0VGVzdCgidGVzdFJBUkVkaXQiKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiUkFSIGVtZiBlZGl0IHRlc3QiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IFJhckVNRlRlc3QoInRlc3RSQVJQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkxPQ0FMLCAiUkFSICBlbWYgdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgUmFyRU1GVGVzdCgidGVzdDE0UkFSUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJSQVIgMTQgZW1mIHRlc3QiICk7Ci0JCi0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IFdhckVNRkVkaXRUZXN0KCJ0ZXN0V0FSRWRpdCIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJXQVIgZW1mIGVkaXQgdGVzdCIgKTsKLQkJLy9hZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBXYXJFTUZUZXN0KCJ0ZXN0V0FSUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5MT0NBTCwgIldBUiAgZW1mIHRlc3QiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IFdhckVNRlRlc3QoInRlc3QxNFdBUlBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiV0FSIDE0IGVtZiB0ZXN0IiApOwotCQkKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgV2ViU2VydmljZXNFTUZUZXN0KCJ0ZXN0MTNXZWJTZXJ2aWNlc0NsaWVudFBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuTk9ORSwgIldlYiBTZXJ2aWNlIENsaWVudCAxMyBlbWYgdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgV2ViU2VydmljZXNFTUZUZXN0KCJ0ZXN0MTNXZWJTZXJ2aWNlc0REUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5MT0NBTCwgIldlYiBzZXJ2aWNlcyAxMyBlbWYgdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgV2ViU2VydmljZXNFTUZUZXN0KCJ0ZXN0MTRXZWJTZXJ2aWNlc0REUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJXZWIgc2VydmljZXMgMTQgZW1mIHRlc3QiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IFdlYlNlcnZpY2VzRU1GVGVzdCgidGVzdEpheFJQQ01hcFBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiSmF4UlBDTWFwcGluZyBlbWYgdGVzdCIgKTsKLQkJCi0JCQotCQkvL0NyZWF0aW9uIHRlc3RzCi0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEVKQlByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QoInRlc3RFSkIyMV9EZWZhdWx0cyIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5OT05FLCAiRUpCIENvbXBvbmVudCBjcmVhdGlvbiB0ZXN0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBBcHBDbGllbnRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0KCJ0ZXN0QUM1MF9EZWZhdWx0cyIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5MT0NBTCwgIkFwcCBDbGllbnQgQ29tcG9uZW50IGNyZWF0aW9uIHRlc3QiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEpDQVByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QoInRlc3RDb25uZWN0b3IxNV9EZWZhdWx0cyIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJDb25uZWN0b3IgQ29tcG9uZW50IGNyZWF0aW9uIHRlc3QiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IFdlYlByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QoInRlc3RXZWIyNF9EZWZhdWx0cyIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJXZWIgQ29tcG9uZW50IGNyZWF0aW9uIHRlc3QiICk7Ci0JCQotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBFSkJJbXBvcnRPcGVyYXRpb25UZXN0KCJ0ZXN0RUpCSW1wb3J0MjFfRGVmYXVsdHMiKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuTk9ORSwgIkVKQiBDb21wb25lbnQgaW1wb3J0IHRlc3QiICk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvcGVyZm9ybWFuY2UvQ29yZVBlcmZvcm1hbmNlVGVzdFBsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9wZXJmb3JtYW5jZS9Db3JlUGVyZm9ybWFuY2VUZXN0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NzY5ZWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9wZXJmb3JtYW5jZS9Db3JlUGVyZm9ybWFuY2VUZXN0UGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIENvcmVQZXJmb3JtYW5jZVRlc3RQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQ29yZVBlcmZvcm1hbmNlVGVzdFBsdWdpbiBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENvcmVQZXJmb3JtYW5jZVRlc3RQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvcmVQZXJmb3JtYW5jZVRlc3RQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IENvcmVQZXJmb3JtYW5jZVRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VQbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiM2NmZDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJKMkVFIFBlcmZvcm1hbmNlIHRlc3QiIGRlZmF1bHQ9InBlcmZvcm1hbmNlIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn0vLi4vLi4iLz4KLQotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgZWNsaXBzZS1ob21lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiCi0gICAgICAgICAgICB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdF8zLjEuMC9saWJyYXJ5LnhtbCIvPgotICA8cHJvcGVydHkgbmFtZT0icGVyZi10ZXN0cy1maWxlIgotICAgICAgICAgICAgdmFsdWU9IiR7dGVzdERpcn0vcGVyZm9ybWFuY2UtdGVzdHMueG1sIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9Ii1YbXg1MTJNIi8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gCi0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgcGVyZm9ybWFuY2UgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci08dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlLXN1aXRlIj4KLSAgPHByb3BlcnR5IG5hbWU9InBlcmZvcm1hbmNlLWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wZXJmb3JtYW5jZV9mb2xkZXIiLz4KLSAgPGRlbGV0ZSBkaXI9IiR7cGVyZm9ybWFuY2UtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLSAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtwZXJmLXRlc3RzLWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7cGVyZm9ybWFuY2UtZm9sZGVyfSIvPgotICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS5BbGxDb3JlUGVyZm9ybWFuY2VUZXN0cyIvPgotICAgICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPgotICA8L2FudD4KLTwvdGFyZ2V0PgotICAgICAgICAgICAgICAgICAgICAKLTwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgcGVyZm9ybWFuY2UgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLTwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLTx0YXJnZXQgbmFtZT0icGVyZm9ybWFuY2UiIGRlcGVuZHM9ImluaXQscGVyZm9ybWFuY2Utc3VpdGUsY2xlYW51cCI+Ci0gIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICA8L2FudD4KLTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS90ZXN0Y2FzZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3RjYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3MTg2NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3RjYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPHRlc3RDYXNlcz4KLQk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuRWFyRU1GRWRpdFRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3RFQVJFZGl0IiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iRUFSIGVtZiBlZGl0IiAvPgotCTwvdGVzdENhc2U+Ci0JPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkVhckVNRlRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3QxNEVBUlBvcHVsYXRpb24iIHRhZ2dpbmc9IkdMT0JBTCIgc2hvcnROYW1lPSJFQVIgMTQgZW1mIHRlc3QiIC8+Ci0gCTwvdGVzdENhc2U+Ci0gCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FamJFTUZFZGl0VGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdEVKQkphckVkaXQiIHRhZ2dpbmc9IkdMT0JBTCIgc2hvcnROYW1lPSJFSkIgZW1mIGVkaXQiIC8+Ci0gCTwvdGVzdENhc2U+Ci0gCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FamJFTUZFZGl0VGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdFdDQ01KYXIiIHRhZ2dpbmc9IkdMT0JBTCIgc2hvcnROYW1lPSJFSkIgZW1mIGVkaXQiIC8+Ci0gCTwvdGVzdENhc2U+Ci0gCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FamJFTUZUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0RUpCSmFyUG9wdWxhdGlvbiIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IkVKQiBlbWYgdGVzdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkVqYkVNRlRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3QxNEVKQkphclBvcHVsYXRpb24iIHRhZ2dpbmc9IkdMT0JBTCIgc2hvcnROYW1lPSJFSkIgMTQgZW1mIHRlc3QiIC8+Ci0gCTwvdGVzdENhc2U+Ci0gCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5BcHBDbGllbnRFTUZFZGl0VGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdEFwcGxpY2F0aW9uQ2xpZW50RWRpdCIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IkFwcGxpY2F0aW9uIENsaWVudCBlbWYgZWRpdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkFwcENsaWVudEVNRlRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3QxNEFwcGxpY2F0aW9uQ2xpZW50UG9wdWxhdGlvbiIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IkFwcGxpY2F0aW9uIENsaWVudCAxNCBlbWYgdGVzdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJCi0gCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5SYXJFTUZFZGl0VGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdFJBUkVkaXQiIHRhZ2dpbmc9IkdMT0JBTCIgc2hvcnROYW1lPSJDb25uZWN0b3IgZW1mIGVkaXQiIC8+Ci0gCTwvdGVzdENhc2U+Ci0gCQotIAk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuUmFyRU1GVGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdDE0UkFSUG9wdWxhdGlvbiIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IkNvbm5lY3RvciAxNCBlbWYgdGVzdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLldhckVNRkVkaXRUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0V0FSRWRpdCIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IldlYiBlbWYgZWRpdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLldhckVNRlRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3QxNFdBUlBvcHVsYXRpb24iIHRhZ2dpbmc9IkdMT0JBTCIgc2hvcnROYW1lPSJXZWIgMTQgZW1mIHRlc3QiIC8+Ci0gCTwvdGVzdENhc2U+Ci0gCQotIAk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuV2ViU2VydmljZXNFTUZUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0MTRXZWJTZXJ2aWNlc0REUG9wdWxhdGlvbiIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IldlYiBzZXJ2aWNlcyAxNCBlbWYgdGVzdCIgLz4KLSAJPC90ZXN0Q2FzZT4gCi0gCQotPC90ZXN0Q2FzZXM+Ci0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDkwMDU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY29tbW9uQXJjaGl2ZVRlc3RzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibW9majJlZVRlc3RzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjk5NjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLXRlc3RPdXRwdXQKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXRlc3RzLmphcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDdhYWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz48L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhYTE2Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSNUaHUgQXByIDI2IDEzOjI4OjI0IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzExNmUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RodSBBcHIgMjYgMTM6Mjg6MjQgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3Mzk5NjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IHRlc3RzLmphcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24udGVzdCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LnRlc3QsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3QsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuYXBpLnRlc3QsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5hcGksCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuZW1mbG9hZCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudGVzdCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AudGVzdCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi50ZXN0LAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24udGVzdCwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQudGVzdAotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iWzMuOC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWwsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLAotIG9yZy5lY2xpcHNlLmplbSwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTlkZjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMTBiYTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gdGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIGNvbW1vbkFyY2hpdmVSZXNvdXJjZXMvLFwKLSAgICAgICAgICAgICAgIHRlc3REYXRhLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotb3V0cHV0LnRlc3RzLmphciA9IGJpbi8KLWphcnMuY29tcGlsZS5vcmRlciA9IHRlc3RzLmphcgotc291cmNlLnRlc3RzLmphciA9IGNvbW1vbkFyY2hpdmVUZXN0cy8sXAotICAgICAgICAgICAgICAgICAgIG1vZmoyZWVUZXN0cy8KLWJpbi5leGNsdWRlcyA9IGNvbW1vbkFyY2hpdmVSZXNvdXJjZXMvLmN2c2lnbm9yZQotc3JjLmluY2x1ZGVzID0gcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgb3V0LnhtaSxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBidWlsZC8sXAotICAgICAgICAgICAgICAgdGVzdERhdGEvLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgyYTk5My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1DT05UQUNUPWRhbmJlcmdAdXMuaWJtLmNvbQotQ29tcG9uZW50U2hvcnROYW1lPWNvbS5pYm0uZXRvb2xzLmoyZWUuY29yZS50ZXN0Ci1Db21wb25lbnRGdWxsTmFtZT1jb20uaWJtLmV0b29scy5qMmVlLmNvcmUudGVzdAotQ29tcG9uZW50Q29tcGV0ZW5jeT1URVNUUwotSmF2YUNvbXBpbGUuMT1zcmNqYXIKLUJ1aWxkVmVyaWZpY2F0aW9uLjE9ZGlyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkL3BhY2thZ2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9idWlsZC9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkxZjMyNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iY29tLmlibS5ldG9vbHMuajJlZS5jb3JlLnRlc3QiIGRlZmF1bHQ9InBhY2thZ2luZ1BsdWdpbiIgYmFzZWRpcj0iLi8uLiI+Ci0gICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBhY2thZ2VEaXIiIHZhbHVlPSIiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5kaXJlY3RvcnkiICB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLmlkIiB2YWx1ZT0iY29tLmlibS5ldG9vbHMuajJlZS5jb3JlLnRlc3QiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi52ZXJzaW9uIiAgdmFsdWU9IiIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0icGFja2FnaW5nUGx1Z2luIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iJHtwbHVnaW4uaWR9Ii8+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke3BhY2thZ2VEaXJ9L3BsdWdpbnMvJHtwbHVnaW4uaWR9XyR7cGx1Z2luLnZlcnNpb259Ij4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW4uZGlyZWN0b3J5fSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icGx1Z2luLnhtbCIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InRlc3QueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icnVudGltZS9jb21tb25BcmNoaXZlVGVzdHMuamFyIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icnVudGltZS9tb2RlbFRlc3RzLmphciIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InJ1bnRpbWUvamF2YVRlc3RzLmphciIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkL3dzQnVpbGQueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9idWlsZC93c0J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1Mzg4NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkL3dzQnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgcHJvamVjdCBbCi0JPCFFTlRJVFkgYmFzZUJ1aWxkIFNZU1RFTSAiZmlsZTouLi8uLi93c0J1aWxkRGVmLnhtbCI+Ci1dPgotCi08cHJvamVjdCBuYW1lPSJidWlsZFBsdWdpbiIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4vLi4iPgotCi08IS0tIGluY2x1ZGUgdGhlIGNvbW1vbiB4bWwgYnVpbGQgZmlsZSAtLT4KLSZiYXNlQnVpbGQ7Ci0KLTx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9InByZXBhcmUiIGlmPSJwbHVnaW4uaWQiPgotCi0gICAgPGFudGNhbGwgdGFyZ2V0PSJ1bnppcHNyY2phciI+IDxwYXJhbSBuYW1lPSJqYXJuYW1lIiB2YWx1ZT0iY29tbW9uQXJjaGl2ZVRlc3RzIi8+IDwvYW50Y2FsbD4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9InVuemlwc3JjamFyIj4gPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSJtb2RlbFRlc3RzIi8+IDwvYW50Y2FsbD4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9InVuemlwc3JjamFyIj4gPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSJqYXZhVGVzdHMiLz4gPC9hbnRjYWxsPgotCi0gICAgPG1rZGlyIGRpcj0gIiR7cGx1Z2luLmJ1aWxkLmRpcmVjdG9yeX0vY29tbW9uYmxkIi8+Ci0gICAgPGphdmFjIGZhaWxvbmVycm9yPSJmYWxzZSIgZGVzdGRpcj0iJHtwbHVnaW4uYnVpbGQuZGlyZWN0b3J5fS9jb21tb25ibGQiIGluY2x1ZGVBbnRSdW50aW1lPSJmYWxzZSI+Ci0gICAgICAgIDxzcmMgcGF0aD0iJHtwbHVnaW4uc3JjLmRpcmVjdG9yeX0vY29tbW9uQXJjaGl2ZVRlc3RzIi8+Ci0gICAgICAgIDxzcmMgcGF0aD0iJHtwbHVnaW4uc3JjLmRpcmVjdG9yeX0vbW9kZWxUZXN0cyIvPgotICAgICAgICA8c3JjIHBhdGg9IiR7cGx1Z2luLnNyYy5kaXJlY3Rvcnl9L2phdmFUZXN0cyIvPgotICAgICAgICA8Ym9vdGNsYXNzcGF0aCBwYXRoPSIke2Jvb3RjbGFzc3BhdGh9Ii8+Ci0gICAgICAgIDxjbGFzc3BhdGggcGF0aD0iJHtwbHVnaW4uY2xhc3NwYXRofSIvPgotICAgIDwvamF2YWM+Ci0KLQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkamFyIj4KLQkJPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSJjb21tb25BcmNoaXZlVGVzdHMiLz4KLQkJPHBhcmFtIG5hbWU9ImphcmNsYXNzcGF0aCIgdmFsdWU9IiR7cGx1Z2luLmNsYXNzcGF0aH07JHtwbHVnaW4uYnVpbGQuZGlyZWN0b3J5fS9jb21tb25ibGQiLz4KLQk8L2FudGNhbGw+Ci0JPGFudGNhbGwgdGFyZ2V0PSJidWlsZGphciI+Ci0JCTxwYXJhbSBuYW1lPSJqYXJuYW1lIiB2YWx1ZT0ibW9kZWxUZXN0cyIvPgotCQk8cGFyYW0gbmFtZT0iamFyY2xhc3NwYXRoIiB2YWx1ZT0iJHtwbHVnaW4uY2xhc3NwYXRofTske3BsdWdpbi5idWlsZC5kaXJlY3Rvcnl9L2NvbW1vbmJsZCIvPgotCTwvYW50Y2FsbD4KLQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkamFyIj4KLQkJPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSJqYXZhVGVzdHMiLz4KLQkJPHBhcmFtIG5hbWU9ImphcmNsYXNzcGF0aCIgdmFsdWU9IiR7cGx1Z2luLmNsYXNzcGF0aH07JHtwbHVnaW4uYnVpbGQuZGlyZWN0b3J5fS9jb21tb25ibGQiLz4KLQk8L2FudGNhbGw+Ci0KLTwvdGFyZ2V0PgotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTE3OGVlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLXRlc3RPdXRwdXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvYXBwbGljYXRpb24tY2xpZW50LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC9hcHBsaWNhdGlvbi1jbGllbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzk2ZTIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC9hcHBsaWNhdGlvbi1jbGllbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYXBwbGljYXRpb24tY2xpZW50IFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gQ2xpZW50IDEuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbi1jbGllbnRfMV8zLmR0ZCI+Ci0KLSAgIDxhcHBsaWNhdGlvbi1jbGllbnQgaWQ9IkFwcGxpY2F0aW9uLWNsaWVudF9JRCI+Ci0gICAgICA8aWNvbj4KLSAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICA8L2ljb24+Ci0gICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8wPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8wPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzE8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8xPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV8yPC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8ZWpiLXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8ZWpiLXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfNDwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8wPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8wPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8yPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV80PC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxjYWxsYmFjay1oYW5kbGVyPmphdmEudXRpbC5IYXNoVGFibGU8L2NhbGxiYWNrLWhhbmRsZXI+Ci0gICA8L2FwcGxpY2F0aW9uLWNsaWVudD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC9hcHBsaWNhdGlvbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvYXBwbGljYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmU3NzQ1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC9hcHBsaWNhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiPgotCi0gICA8YXBwbGljYXRpb24gaWQ9IkFwcGxpY2F0aW9uX0lEIj4KLSAgICAgIDxpY29uPgotICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgIDwvaWNvbj4KLSAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgPG1vZHVsZT4KLSAgICAgICAgIDxqYXZhPnVyaV8wPC9qYXZhPgotICAgICAgICAgPGFsdC1kZD5hbHRERF8wPC9hbHQtZGQ+Ci0gICAgICA8L21vZHVsZT4KLSAgICAgIDxtb2R1bGU+Ci0gICAgICAgICA8ZWpiPnVyaV8wPC9lamI+Ci0gICAgICAgICA8YWx0LWRkPmFsdEREXzA8L2FsdC1kZD4KLSAgICAgIDwvbW9kdWxlPgotICAgICAgPG1vZHVsZT4KLSAgICAgICAgIDx3ZWI+Ci0gICAgICAgICAgICA8d2ViLXVyaT51cmlfMDwvd2ViLXVyaT4KLSAgICAgICAgICAgIDxjb250ZXh0LXJvb3Q+Y29udGV4dFJvb3RfMDwvY29udGV4dC1yb290PgotICAgICAgICAgPC93ZWI+Ci0gICAgICAgICA8YWx0LWRkPmFsdEREXzA8L2FsdC1kZD4KLSAgICAgIDwvbW9kdWxlPgotICAgICAgPG1vZHVsZT4KLSAgICAgICAgIDxjb25uZWN0b3I+dXJpXzA8L2Nvbm5lY3Rvcj4KLSAgICAgICAgIDxhbHQtZGQ+YWx0RERfMDwvYWx0LWRkPgotICAgICAgPC9tb2R1bGU+Ci0gICAgICA8bW9kdWxlPgotICAgICAgICAgPGphdmE+dXJpXzE8L2phdmE+Ci0gICAgICAgICA8YWx0LWRkPmFsdEREXzE8L2FsdC1kZD4KLSAgICAgIDwvbW9kdWxlPgotICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICA8L2FwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL2VqYi1qYXIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL2VqYi1qYXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzlkNjhkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC9lamItamFyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4NjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBlamItamFyIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9lamItamFyXzJfMC5kdGQiPgotCi0gICA8ZWpiLWphciBpZD0iZWpiLWphcl9JRCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICA8ZW50ZXJwcmlzZS1iZWFucz4KLSAgICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5IYXNoVGFibGU8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8wPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8wPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzE8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzA8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzA8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8xPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuTGlzdDwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkxpc3Q8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5MaXN0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5MaXN0PC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkxpc3Q8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkxpc3Q8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV85PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzU8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV81PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua181PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV82PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV83PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV83PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV84PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfODwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfOTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua181PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV82PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV82PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua183PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV84PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV84PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua185PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV81PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV82PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV83PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV84PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV85PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5PjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV84PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV85PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvZW50aXR5PgotICAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLSAgICAgICAgICAgIDxhYnN0cmFjdC1zY2hlbWEtbmFtZT5hYnN0cmFjdFNjaGVtYU5hbWVfMDwvYWJzdHJhY3Qtc2NoZW1hLW5hbWU+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV8wPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV8xPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV8yPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV8zPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV80PC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8cHJpbWtleS1maWVsZD5uYW1lXzA8L3ByaW1rZXktZmllbGQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzEwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzEyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTA8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzExPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzExPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzEyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzEzPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzE0PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzEwPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xMDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzExPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xMjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTI8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTM8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTQ8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE0PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzEwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzEyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzExPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzEzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5SZW1vdGU8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzA8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5Mb2NhbDwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMTwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+UmVtb3RlPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8yPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPkxvY2FsPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8zPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5SZW1vdGU8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzQ8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgIDxzZXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8c2Vzc2lvbi10eXBlPlN0YXRlZnVsPC9zZXNzaW9uLXR5cGU+Ci0gICAgICAgICAgICA8dHJhbnNhY3Rpb24tdHlwZT5CZWFuPC90cmFuc2FjdGlvbi10eXBlPgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xNTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xNjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzE3PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzE4PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTk8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTU8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE2PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE3PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE4PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xODwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eT48L3VzZS1jYWxsZXItaWRlbnRpdHk+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9zZXNzaW9uPgotICAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMjwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzI8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMjwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzQ8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5zcWwuRGF0YTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5zcWwuRGF0YTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5zcWwuRGF0YTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnNxbC5EYXRhPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5zcWwuRGF0YTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnNxbC5EYXRhPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIxPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzIwPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjE8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjI8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yMDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjA8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjE8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzIyPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzIzPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yNDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIxPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvZW50aXR5PgotICAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzM8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMzwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzU8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLkludGVnZXI8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEubGFuZy5JbnRlZ2VyPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjU8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yNTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjY8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yODwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzI5PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI1PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI2PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yNjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjg8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjk8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHk+PC91c2UtY2FsbGVyLWlkZW50aXR5PgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvZW50aXR5PgotICAgICAgICAgPG1lc3NhZ2UtZHJpdmVuPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDx0cmFuc2FjdGlvbi10eXBlPkJlYW48L3RyYW5zYWN0aW9uLXR5cGU+Ci0gICAgICAgICAgICA8bWVzc2FnZS1zZWxlY3Rvcj5tZXNzYWdlU2VsZWN0b3JfMDwvbWVzc2FnZS1zZWxlY3Rvcj4KLSAgICAgICAgICAgIDxhY2tub3dsZWRnZS1tb2RlPkF1dG8tYWNrbm93bGVkZ2U8L2Fja25vd2xlZGdlLW1vZGU+Ci0gICAgICAgICAgICA8bWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24+Ci0gICAgICAgICAgICAgICA8ZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWU8L2Rlc3RpbmF0aW9uLXR5cGU+Ci0gICAgICAgICAgICAgICA8c3Vic2NyaXB0aW9uLWR1cmFiaWxpdHk+RHVyYWJsZTwvc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHk+Ci0gICAgICAgICAgICA8L21lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uPgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzMwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzMxPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzMyPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzM8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzQ8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzA8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzMwPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzMxPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzMyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zMjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzMzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zNDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzQ8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMxPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L21lc3NhZ2UtZHJpdmVuPgotICAgICAgICAgPHNlc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV83PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5MaXN0PC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuTGlzdDwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkxpc3Q8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkxpc3Q8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHNlc3Npb24tdHlwZT5TdGF0ZWxlc3M8L3Nlc3Npb24tdHlwZT4KLSAgICAgICAgICAgIDx0cmFuc2FjdGlvbi10eXBlPkNvbnRhaW5lcjwvdHJhbnNhY3Rpb24tdHlwZT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzM1PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzM2PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzc8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzg8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zODwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zOTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzY8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzc8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM4PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM5PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5PjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L3Nlc3Npb24+Ci0gICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV80PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl80PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLmxhbmcuU3RyaW5nPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQxPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQwPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDE8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDI8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80MDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDA8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDE8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQyPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQzPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80NDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80MDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQxPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80MjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvZW50aXR5PgotICAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzU8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80NTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80ODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ3PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80ODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ4PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80OTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDk8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80OTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDU8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ2PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ3PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80ODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ4PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80ODwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180ODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180OTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eT48L3VzZS1jYWxsZXItaWRlbnRpdHk+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80ODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICA8L2VudGVycHJpc2UtYmVhbnM+Ci0gICAgICA8cmVsYXRpb25zaGlwcz4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8wPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfODwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkNvbGxlY3Rpb248L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLQkJCSAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV85PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuQ29sbGVjdGlvbjwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMTwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzI8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzM8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMjwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzQ8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzU8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0JCQkgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzM8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV82PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV83PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzQ8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV84PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV85PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotCQkJICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgIDwvcmVsYXRpb25zaGlwcz4KLSAgICAgIDxhc3NlbWJseS1kZXNjcmlwdG9yPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dW5jaGVja2VkLz4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18wPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8zPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzQ8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzY8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV82PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzc8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc184PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzExPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzM8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzQ8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV83PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV83PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5Ob3RTdXBwb3J0ZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzM8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzQ8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5TdXBwb3J0czwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV81PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV82PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzc8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVkPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8zPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV80PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZXNOZXc8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV83PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80OTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5NYW5kYXRvcnk8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgPGV4Y2x1ZGUtbGlzdD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzM8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzQ8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81NDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgPC9leGNsdWRlLWxpc3Q+Ci0gICAgICA8L2Fzc2VtYmx5LWRlc2NyaXB0b3I+Ci0gICAgICA8ZWpiLWNsaWVudC1qYXI+ZWpiQ2xpZW50SmFyXzA8L2VqYi1jbGllbnQtamFyPgotICAgPC9lamItamFyPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL3JhLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC9yYS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMmEyNjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL3JhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGNvbm5lY3RvciBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBDb25uZWN0b3IgMS4wLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2Nvbm5lY3Rvcl8xXzAuZHRkIj4KLTxjb25uZWN0b3I+Ci0gICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgIDxpY29uPgotICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgPC9pY29uPgotICAgIDx2ZW5kb3ItbmFtZT52ZW5kb3JOYW1lXzA8L3ZlbmRvci1uYW1lPgotICAgIDxzcGVjLXZlcnNpb24+MS4wPC9zcGVjLXZlcnNpb24+Ci0gICAgPGVpcy10eXBlPmVpc1R5cGVfMDwvZWlzLXR5cGU+Ci0gICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDxsaWNlbnNlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsaWNlbnNlLXJlcXVpcmVkPnRydWU8L2xpY2Vuc2UtcmVxdWlyZWQ+Ci0gICAgPC9saWNlbnNlPgotICAgIDxyZXNvdXJjZWFkYXB0ZXI+Ci0gICAgICAgIDxtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+bWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3NfMDwvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlXzA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NfMDwvY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz4KLSAgICAgICAgPGNvbm5lY3Rpb24taW50ZXJmYWNlPmNvbm5lY3Rpb25JbnRlcmZhY2VfMDwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0gICAgICAgIDxjb25uZWN0aW9uLWltcGwtY2xhc3M+Y29ubmVjdGlvbkltcGxDbGFzc18wPC9jb25uZWN0aW9uLWltcGwtY2xhc3M+Ci0gICAgICAgIDx0cmFuc2FjdGlvbi1zdXBwb3J0Pk5vVHJhbnNhY3Rpb248L3RyYW5zYWN0aW9uLXN1cHBvcnQ+Ci0gICAgICAgIDxjb25maWctcHJvcGVydHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8wPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfMDwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzE8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8xPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8Y29uZmlnLXByb3BlcnR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfMjwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzI8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgIDxjb25maWctcHJvcGVydHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8zPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfMzwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzQ8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV80PC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQ8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWw8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5LZXJidjU8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWw8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+S2VyYnY1PC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbDwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICA8cmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PnRydWU8L3JlYXV0aGVudGljYXRpb24tc3VwcG9ydD4KLSAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fMDwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzE8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8yPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fMzwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzQ8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgIDwvcmVzb3VyY2VhZGFwdGVyPgotPC9jb25uZWN0b3I+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvd2ViLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDlmOTU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIHdlYi1hcHAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiPgotPHdlYi1hcHAgaWQ9IldlYkFwcF9JRCI+Ci0gICAgPGljb24+Ci0gICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICA8L2ljb24+Ci0gICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgIDxkaXN0cmlidXRhYmxlLz4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzA8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzA8L3BhcmFtLXZhbHVlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM8L3BhcmFtLXZhbHVlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGZpbHRlcj4KLSAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICA8L2ljb24+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzA8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2ZpbHRlci1jbGFzcz4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjU8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yNTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI2PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjY8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yNzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI3PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjg8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yODwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI5PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjk8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgIDwvZmlsdGVyPgotICAgIDxmaWx0ZXI+Ci0gICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgPC9pY29uPgotICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8xPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGZpbHRlci1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvZmlsdGVyLWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zMDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzMwPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zMTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzMyPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zMzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzMzPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zNDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgPC9maWx0ZXI+Ci0gICAgPGZpbHRlcj4KLSAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMjwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8yPC9sYXJnZS1pY29uPgotICAgICAgICA8L2ljb24+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzI8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzI8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPmphdmEuc3FsLkRhdGE8L2ZpbHRlci1jbGFzcz4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzU8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zNTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM2PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzY8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zNzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM3PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzg8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zODwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM5PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzk8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgIDwvZmlsdGVyPgotICAgIDxmaWx0ZXI+Ci0gICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzM8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMzwvbGFyZ2UtaWNvbj4KLSAgICAgICAgPC9pY29uPgotICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8zPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8zPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGZpbHRlci1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvZmlsdGVyLWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80MDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQwPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80MTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQyPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80MzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQzPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80NDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgPC9maWx0ZXI+Ci0gICAgPGZpbHRlcj4KLSAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl80PC9sYXJnZS1pY29uPgotICAgICAgICA8L2ljb24+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzQ8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L2ZpbHRlci1jbGFzcz4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDU8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80NTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ2PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDY8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80NzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ3PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDg8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80ODwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ5PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDk8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgIDwvZmlsdGVyPgotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzA8L3VybC1wYXR0ZXJuPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8xPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTwvdXJsLXBhdHRlcm4+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzI8L2ZpbHRlci1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yPC91cmwtcGF0dGVybj4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMzwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzM8L3VybC1wYXR0ZXJuPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV80PC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDwvdXJsLXBhdHRlcm4+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPmphdmEudXRpbC5MaXN0PC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPmphdmEuc3FsLkRhdGE8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICA8L2ljb24+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMDwvc2VydmxldC1uYW1lPgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8anNwLWZpbGU+anNwRmlsZV8wPC9qc3AtZmlsZT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzA8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjA8L2xvYWQtb24tc3RhcnR1cD4KLSAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18wPC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zPC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgIDwvc2VydmxldD4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8xPC9sYXJnZS1pY29uPgotICAgICAgICA8L2ljb24+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMTwvc2VydmxldC1uYW1lPgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8c2VydmxldC1jbGFzcz5jbGFzc05hbWVfMDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV82PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV83PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfODwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzg8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV85PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua181PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV82PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNjwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzc8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua184PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV85PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfOTwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgIDwvc2VydmxldD4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMjwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8yPC9sYXJnZS1pY29uPgotICAgICAgICA8L2ljb24+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMjwvc2VydmxldC1uYW1lPgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzI8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8anNwLWZpbGU+anNwRmlsZV8xPC9qc3AtZmlsZT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTA8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzExPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTE8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xMjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzEyPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE0PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTQ8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjI8L2xvYWQtb24tc3RhcnR1cD4KLSAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEwPC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMTwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTI8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEzPC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNDwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgIDwvc2VydmxldD4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMzwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8zPC9sYXJnZS1pY29uPgotICAgICAgICA8L2ljb24+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMzwvc2VydmxldC1uYW1lPgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzM8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8c2VydmxldC1jbGFzcz5jbGFzc05hbWVfMTwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTU8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xNTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE2PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTY8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xNzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE3PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTg8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xODwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE5PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTk8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjM8L2xvYWQtb24tc3RhcnR1cD4KLSAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE1PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNjwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTc8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE4PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xOTwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgIDwvc2VydmxldD4KLSAgICA8c2VydmxldD4KLSAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl80PC9sYXJnZS1pY29uPgotICAgICAgICA8L2ljb24+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfNDwvc2VydmxldC1uYW1lPgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzQ8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8anNwLWZpbGU+anNwRmlsZV8yPC9qc3AtZmlsZT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjA8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzIxPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjE8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yMjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzIyPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI0PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjQ8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjQ8L2xvYWQtb24tc3RhcnR1cD4KLSAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIwPC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMTwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjI8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIzPC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNDwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgIDwvc2VydmxldD4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzA8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMDwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8xPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMjwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV80PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotICAgIDxzZXNzaW9uLWNvbmZpZz4KLSAgICAgICAgPHNlc3Npb24tdGltZW91dD4wPC9zZXNzaW9uLXRpbWVvdXQ+Ci0gICAgPC9zZXNzaW9uLWNvbmZpZz4KLSAgICA8bWltZS1tYXBwaW5nPgotICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl8wPC9leHRlbnNpb24+Ci0gICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfMDwvbWltZS10eXBlPgotICAgIDwvbWltZS1tYXBwaW5nPgotICAgIDxtaW1lLW1hcHBpbmc+Ci0gICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzE8L2V4dGVuc2lvbj4KLSAgICAgICAgPG1pbWUtdHlwZT5taW1lVHlwZV8xPC9taW1lLXR5cGU+Ci0gICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgPG1pbWUtbWFwcGluZz4KLSAgICAgICAgPGV4dGVuc2lvbj5leHRlbnNpb25fMjwvZXh0ZW5zaW9uPgotICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzI8L21pbWUtdHlwZT4KLSAgICA8L21pbWUtbWFwcGluZz4KLSAgICA8bWltZS1tYXBwaW5nPgotICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl8zPC9leHRlbnNpb24+Ci0gICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfMzwvbWltZS10eXBlPgotICAgIDwvbWltZS1tYXBwaW5nPgotICAgIDxtaW1lLW1hcHBpbmc+Ci0gICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzQ8L2V4dGVuc2lvbj4KLSAgICAgICAgPG1pbWUtdHlwZT5taW1lVHlwZV80PC9taW1lLXR5cGU+Ci0gICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPndlbGNvbWVGaWxlXzA8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT53ZWxjb21lRmlsZV8xPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+d2VsY29tZUZpbGVfMjwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPndlbGNvbWVGaWxlXzM8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT53ZWxjb21lRmlsZV80PC93ZWxjb21lLWZpbGU+Ci0gICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLSAgICA8ZXJyb3ItcGFnZT4KLSAgICAgICAgPGV4Y2VwdGlvbi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2V4Y2VwdGlvbi10eXBlPgotICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMDwvbG9jYXRpb24+Ci0gICAgPC9lcnJvci1wYWdlPgotICAgIDxlcnJvci1wYWdlPgotICAgICAgICA8ZXJyb3ItY29kZT5lcnJvckNvZGVfMDwvZXJyb3ItY29kZT4KLSAgICAgICAgPGxvY2F0aW9uPmxvY2F0aW9uXzA8L2xvY2F0aW9uPgotICAgIDwvZXJyb3ItcGFnZT4KLSAgICA8ZXJyb3ItcGFnZT4KLSAgICAgICAgPGV4Y2VwdGlvbi10eXBlPmphdmEudXRpbC5MaXN0PC9leGNlcHRpb24tdHlwZT4KLSAgICAgICAgPGxvY2F0aW9uPmxvY2F0aW9uXzE8L2xvY2F0aW9uPgotICAgIDwvZXJyb3ItcGFnZT4KLSAgICA8ZXJyb3ItcGFnZT4KLSAgICAgICAgPGVycm9yLWNvZGU+ZXJyb3JDb2RlXzE8L2Vycm9yLWNvZGU+Ci0gICAgICAgIDxsb2NhdGlvbj5sb2NhdGlvbl8xPC9sb2NhdGlvbj4KLSAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgPGVycm9yLXBhZ2U+Ci0gICAgICAgIDxleGNlcHRpb24tdHlwZT5qYXZhLnNxbC5EYXRhPC9leGNlcHRpb24tdHlwZT4KLSAgICAgICAgPGxvY2F0aW9uPmxvY2F0aW9uXzI8L2xvY2F0aW9uPgotICAgIDwvZXJyb3ItcGFnZT4KLSAgICA8dGFnbGliPgotICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfMDwvdGFnbGliLXVyaT4KLSAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl8wPC90YWdsaWItbG9jYXRpb24+Ci0gICAgPC90YWdsaWI+Ci0gICAgPHRhZ2xpYj4KLSAgICAgICAgPHRhZ2xpYi11cmk+dGFnbGliVVJJXzE8L3RhZ2xpYi11cmk+Ci0gICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fMTwvdGFnbGliLWxvY2F0aW9uPgotICAgIDwvdGFnbGliPgotICAgIDx0YWdsaWI+Ci0gICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV8yPC90YWdsaWItdXJpPgotICAgICAgICA8dGFnbGliLWxvY2F0aW9uPnRhZ2xpYkxvY2F0aW9uXzI8L3RhZ2xpYi1sb2NhdGlvbj4KLSAgICA8L3RhZ2xpYj4KLSAgICA8dGFnbGliPgotICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfMzwvdGFnbGliLXVyaT4KLSAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl8zPC90YWdsaWItbG9jYXRpb24+Ci0gICAgPC90YWdsaWI+Ci0gICAgPHRhZ2xpYj4KLSAgICAgICAgPHRhZ2xpYi11cmk+dGFnbGliVVJJXzQ8L3RhZ2xpYi11cmk+Ci0gICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fNDwvdGFnbGliLWxvY2F0aW9uPgotICAgIDwvdGFnbGliPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8wPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8wPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzA8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzI8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8zPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzA8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkFDTDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+QkFTRUxJTkUtQ09OVFJPTDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+QklORDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMjwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+Q0hFQ0tJTjwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+Q0hFQ0tPVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkxBQkVMPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5NRVJHRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+TUtBQ1RJVklUWTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMzwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+TUtXT1JLU1BBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlJFQklORDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UkVQT1JUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5TRUFSQ0g8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlVOQklORDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfNDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VU5DSEVDS09VVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VVBEQVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5WRVJTSU9OLUNPTlRST0w8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkFDSzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+QllFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPGF1dGgtY29uc3RyYWludD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc180PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5OT05FPC90cmFuc3BvcnQtZ3VhcmFudGVlPgotICAgICAgICA8L3VzZXItZGF0YS1jb25zdHJhaW50PgotICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICA8c2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfNTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+Q0FOQ0VMPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5DT1BZPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5FUlJPUlJFU1BPTlNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5JTkZPPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5JTlZJVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzY8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkxPQ0s8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk1FU1NBR0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk1LQ09MPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5NT1ZFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5OT1RJRlk8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzc8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBSQUNLPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QUk9QRklORDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFJPUFBBVENIPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QUk9WSVNJT05BTFJFU1BPTlNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVUJMSVNIPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV84PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5SRURJUkVDVFJFU1BPTlNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5SRUdJU1RFUjwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UkVRVUVTVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UkVTUE9OU0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlNVQ0NFU1NSRVNQT05TRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfOTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VU5MT0NLPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPGF1dGgtY29uc3RyYWludD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc182PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc185PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5JTlRFR1JBTDwvdHJhbnNwb3J0LWd1YXJhbnRlZT4KLSAgICAgICAgPC91c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMjwvZGlzcGxheS1uYW1lPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzEwPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkFDTDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+QkFTRUxJTkUtQ09OVFJPTDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTE8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5CSU5EPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5DSEVDS0lOPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5DSEVDS09VVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+TEFCRUw8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk1FUkdFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xMjwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk1LQUNUSVZJVFk8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk1LV09SS1NQQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5SRUJJTkQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlJFUE9SVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+U0VBUkNIPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xMzwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlVOQklORDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VU5DSEVDS09VVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VVBEQVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5WRVJTSU9OLUNPTlRST0w8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkFDSzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTQ8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzcwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzcxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzcyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzczPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzc0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5CWUU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkNBTkNFTDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+Q09QWTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+RVJST1JSRVNQT05TRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SU5GTzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDxhdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzEwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzExPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzEyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzEzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE0PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5DT05GSURFTlRJQUw8L3RyYW5zcG9ydC1ndWFyYW50ZWU+Ci0gICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgotICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzM8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xNTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPklOVklURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+TE9DSzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+TUVTU0FHRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+TUtDT0w8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk1PVkU8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE2PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+Tk9USUZZPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QUkFDSzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFJPUEZJTkQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBST1BQQVRDSDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFJPVklTSU9OQUxSRVNQT05TRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTc8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVUJMSVNIPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5SRURJUkVDVFJFU1BPTlNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5SRUdJU1RFUjwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UkVRVUVTVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UkVTUE9OU0U8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE4PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+U1VDQ0VTU1JFU1BPTlNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5VTkxPQ0s8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xOTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkFDTDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDxhdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE5PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5OT05FPC90cmFuc3BvcnQtZ3VhcmFudGVlPgotICAgICAgICA8L3VzZXItZGF0YS1jb25zdHJhaW50PgotICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICA8c2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV80PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMjA8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTAyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkJBU0VMSU5FLUNPTlRST0w8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkJJTkQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkNIRUNLSU48L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkNIRUNLT1VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5MQUJFTDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMjE8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk1FUkdFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5NS0FDVElWSVRZPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5NS1dPUktTUEFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UkVCSU5EPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5SRVBPUlQ8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzIyPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTExPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5TRUFSQ0g8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlVOQklORDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VU5DSEVDS09VVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VVBEQVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5WRVJTSU9OLUNPTlRST0w8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzIzPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5BQ0s8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkJZRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+Q0FOQ0VMPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5DT1BZPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5FUlJPUlJFU1BPTlNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8yNDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTIwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMjI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTIzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SU5GTzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SU5WSVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5MT0NLPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5NRVNTQUdFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5NS0NPTDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDxhdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzIwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzIxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzIyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzIzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzI0PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5JTlRFR1JBTDwvdHJhbnNwb3J0LWd1YXJhbnRlZT4KLSAgICAgICAgPC91c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgPGxvZ2luLWNvbmZpZz4KLSAgICAgICAgPGF1dGgtbWV0aG9kPkJBU0lDPC9hdXRoLW1ldGhvZD4KLSAgICAgICAgPHJlYWxtLW5hbWU+cmVhbG1OYW1lXzA8L3JlYWxtLW5hbWU+Ci0gICAgICAgIDxmb3JtLWxvZ2luLWNvbmZpZz4KLSAgICAgICAgICAgIDxmb3JtLWxvZ2luLXBhZ2U+Zm9ybUxvZ2luUGFnZV8wPC9mb3JtLWxvZ2luLXBhZ2U+Ci0gICAgICAgICAgICA8Zm9ybS1lcnJvci1wYWdlPmZvcm1FcnJvclBhZ2VfMDwvZm9ybS1lcnJvci1wYWdlPgotICAgICAgICA8L2Zvcm0tbG9naW4tY29uZmlnPgotICAgIDwvbG9naW4tY29uZmlnPgotICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgPC9zZWN1cml0eS1yb2xlPgotICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8wPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8wPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMjwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8wPC9sb2NhbC1ob21lPgotICAgICAgICA8bG9jYWw+cmVtb3RlXzA8L2xvY2FsPgotICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xPC9sb2NhbC1ob21lPgotICAgICAgICA8bG9jYWw+cmVtb3RlXzE8L2xvY2FsPgotICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjwvbG9jYWwtaG9tZT4KLSAgICAgICAgPGxvY2FsPnJlbW90ZV8yPC9sb2NhbD4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgPC9lamItbG9jYWwtcmVmPgotICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgPGxvY2FsPnJlbW90ZV8zPC9sb2NhbD4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgPC9lamItbG9jYWwtcmVmPgotICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ8L2xvY2FsLWhvbWU+Ci0gICAgICAgIDxsb2NhbD5yZW1vdGVfNDwvbG9jYWw+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgIDwvZWpiLWxvY2FsLXJlZj4KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9hcHBsaWNhdGlvbi1jbGllbnQueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2FwcGxpY2F0aW9uLWNsaWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNTk2MGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2FwcGxpY2F0aW9uLWNsaWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbi1jbGllbnQgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiBDbGllbnQgMS4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkIj4KLQotICAgPGFwcGxpY2F0aW9uLWNsaWVudCBpZD0iQXBwbGljYXRpb24tY2xpZW50X0lEIj4KLSAgICAgIDxpY29uPgotICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgIDwvaWNvbj4KLSAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc2MzIzOSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8wPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5NzYzMjQwIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5NzYzMjQxIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5NzYzMjU5Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3NjMyNjAiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc2MzI3OSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8wPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc2MzI4MCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5NzYzMjgxIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMjwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5NzYzMjgyIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3NjMyODMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5NzYzMjk5Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8wPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8wPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3NjMzMDAiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3NjMzMDEiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc2MzMwMiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc2MzMwMyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc2MzMxOSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc2MzM0OSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3NjMzNTAiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3NjMzNTEiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5NzYzMzUyIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxjYWxsYmFjay1oYW5kbGVyPmphdmEudXRpbC5IYXNoVGFibGU8L2NhbGxiYWNrLWhhbmRsZXI+Ci0gICA8L2FwcGxpY2F0aW9uLWNsaWVudD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9hcHBsaWNhdGlvbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvYXBwbGljYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWY0NmJkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9hcHBsaWNhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uXzFfMy5kdGQiPgotCi0gICA8YXBwbGljYXRpb24gaWQ9IkFwcGxpY2F0aW9uX0lEIj4KLSAgICAgIDxpY29uPgotICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgIDwvaWNvbj4KLSAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgPG1vZHVsZSBpZD0iSmF2YUNsaWVudE1vZHVsZV8xMDUxNjM5Nzc4MTYwIj4KLSAgICAgICAgIDxqYXZhPnVyaV8wPC9qYXZhPgotICAgICAgICAgPGFsdC1kZD5hbHRERF8wPC9hbHQtZGQ+Ci0gICAgICA8L21vZHVsZT4KLSAgICAgIDxtb2R1bGUgaWQ9IkVqYk1vZHVsZV8xMDUxNjM5Nzc4MTYwIj4KLSAgICAgICAgIDxlamI+dXJpXzE8L2VqYj4KLSAgICAgICAgIDxhbHQtZGQ+YWx0RERfMTwvYWx0LWRkPgotICAgICAgPC9tb2R1bGU+Ci0gICAgICA8bW9kdWxlIGlkPSJXZWJNb2R1bGVfMTA1MTYzOTc3ODE2MCI+Ci0gICAgICAgICA8d2ViPgotICAgICAgICAgICAgPHdlYi11cmk+dXJpXzI8L3dlYi11cmk+Ci0gICAgICAgICAgICA8Y29udGV4dC1yb290PmNvbnRleHRSb290XzA8L2NvbnRleHQtcm9vdD4KLSAgICAgICAgIDwvd2ViPgotICAgICAgICAgPGFsdC1kZD5hbHRERF8yPC9hbHQtZGQ+Ci0gICAgICA8L21vZHVsZT4KLSAgICAgIDxtb2R1bGUgaWQ9IkNvbm5lY3Rvck1vZHVsZV8xMDUxNjM5Nzc4MTYwIj4KLSAgICAgICAgIDxjb25uZWN0b3I+dXJpXzM8L2Nvbm5lY3Rvcj4KLSAgICAgICAgIDxhbHQtZGQ+YWx0RERfMzwvYWx0LWRkPgotICAgICAgPC9tb2R1bGU+Ci0gICAgICA8bW9kdWxlIGlkPSJKYXZhQ2xpZW50TW9kdWxlXzEwNTE2Mzk3NzgxNjEiPgotICAgICAgICAgPGphdmE+dXJpXzQ8L2phdmE+Ci0gICAgICAgICA8YWx0LWRkPmFsdEREXzQ8L2FsdC1kZD4KLSAgICAgIDwvbW9kdWxlPgotICAgICAgPHNlY3VyaXR5LXJvbGUgaWQ9IlNlY3VyaXR5Um9sZV8xMDUxNjM5Nzc4MTcwIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgPHNlY3VyaXR5LXJvbGUgaWQ9IlNlY3VyaXR5Um9sZV8xMDUxNjM5Nzc4MTkwIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgPHNlY3VyaXR5LXJvbGUgaWQ9IlNlY3VyaXR5Um9sZV8xMDUxNjM5Nzc4MTkxIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgPHNlY3VyaXR5LXJvbGUgaWQ9IlNlY3VyaXR5Um9sZV8xMDUxNjM5Nzc4MTkyIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgPHNlY3VyaXR5LXJvbGUgaWQ9IlNlY3VyaXR5Um9sZV8xMDUxNjM5Nzc4MTkzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgPC9hcHBsaWNhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3NWVhZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODY0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgZWpiLWphciBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZWpiLWphcl8yXzAuZHRkIj4KLQotICAgPGVqYi1qYXIgaWQ9ImVqYi1qYXJfSUQiPgotICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgPGVudGVycHJpc2UtYmVhbnM+Ci0gICAgICAgICA8ZW50aXR5IGlkPSJFbnRpdHlfMTA1MTYzOTc4ODY0NSI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5MaXN0PC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnNxbC5EYXRhPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODY5NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8wPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4NzA1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4NzA2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4NzA3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg3MTUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODcyNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8wPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODcyNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4NzI3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4NzI4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg3MjkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODc0NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua181PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4NzQ2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV82PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua182PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4NzQ3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV83PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg3NDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV84PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV84PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg3NDkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzk8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4Nzc1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg3NzYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODc3NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4Nzc4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg3NzkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJ1bi1hcyBpZD0iUnVuQXNTcGVjaWZpZWRJZGVudGl0eV8xMDUxNjM5Nzg4Nzc1Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODc4NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4Nzg2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4Nzg3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg3ODgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg3OTUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg4MDUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4ODA2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4ODA3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4ODA4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODgwOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgIDxlbnRpdHkgaWQ9IkVudGl0eV8xMDUxNjM5Nzg4ODA1Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5zcWwuRGF0YTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLkludGVnZXI8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5MaXN0PC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5MaXN0PC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg4MDUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODE1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODE2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODgxNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV84PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODE4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV85PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODgxNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTA8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4ODE2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzExPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzExPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODgxNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTI8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4ODE4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzEzPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODgxOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTQ8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg4MTUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE1PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4ODE2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTY8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg4MTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE3PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4ODE4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTg8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg4MTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE5PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg4MjUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua181PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODgyNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4ODI3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV83PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg4MjgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua184PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODgyOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eSBpZD0iVXNlQ2FsbGVySWRlbnRpdHlfMTA1MTYzOTc4ODgyNSI+PC91c2UtY2FsbGVyLWlkZW50aXR5PgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg4MjUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg4MjYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODgyNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODgyOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4ODI5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV85PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV85PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODgyNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODgyNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODgyNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg4MjgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg4MjkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvZW50aXR5PgotICAgICAgICAgPGVudGl0eSBpZD0iQ29udGFpbmVyTWFuYWdlZEVudGl0eV8xMDUxNjM5Nzg4ODI1Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMjwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzI8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMjwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLkludGVnZXI8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEubGFuZy5TdHJpbmc8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkxpc3Q8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnNxbC5EYXRhPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5zcWwuRGF0YTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxjbXAtdmVyc2lvbj4yLjA8L2NtcC12ZXJzaW9uPgotICAgICAgICAgICAgPGFic3RyYWN0LXNjaGVtYS1uYW1lPmFic3RyYWN0U2NoZW1hTmFtZV8wPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLSAgICAgICAgICAgIDxjbXAtZmllbGQgaWQ9IkNNUEF0dHJpYnV0ZV8xMDUxNjM5Nzg4ODQ1Ij4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfMzwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZCBpZD0iQ01QQXR0cmlidXRlXzEwNTE2Mzk3ODg4NDYiPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV80PC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkIGlkPSJDTVBBdHRyaWJ1dGVfMTA1MTYzOTc4ODg0NyI+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzU8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQgaWQ9IkNNUEF0dHJpYnV0ZV8xMDUxNjM5Nzg4ODQ4Ij4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfNjwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZCBpZD0iQ01QQXR0cmlidXRlXzEwNTE2Mzk3ODg4NDkiPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV83PC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODg1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODg2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODg3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzEyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg4ODgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzEzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg4ODkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg4ODUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzIwPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODg4NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg4ODciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzIyPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODg4OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg4ODkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzI0PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4ODk1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODg5NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI2PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4ODk3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODg5OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI4PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4ODk5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4ODk1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg4OTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzExPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODg5NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4ODk4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg4OTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJ1bi1hcyBpZD0iUnVuQXNTcGVjaWZpZWRJZGVudGl0eV8xMDUxNjM5Nzg4ODk1Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODg5NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzEwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4ODk2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzExPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4ODk3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzEyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg4OTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg5MDUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5MDUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODkwNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzExPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODkwNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzEyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTA4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTA5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHF1ZXJ5IGlkPSJRdWVyeV8xMDUxNjM5Nzg4OTM2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2QgaWQ9IlF1ZXJ5TWV0aG9kXzEwNTE2Mzk3ODg5MzYiPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPlJlbW90ZTwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMDwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeSBpZD0iUXVlcnlfMTA1MTYzOTc4ODkzNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kIGlkPSJRdWVyeU1ldGhvZF8xMDUxNjM5Nzg4OTM3Ij4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5Mb2NhbDwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMTwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeSBpZD0iUXVlcnlfMTA1MTYzOTc4ODkzOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kIGlkPSJRdWVyeU1ldGhvZF8xMDUxNjM5Nzg4OTM4Ij4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182ODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5SZW1vdGU8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzI8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnkgaWQ9IlF1ZXJ5XzEwNTE2Mzk3ODg5MzkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZCBpZD0iUXVlcnlNZXRob2RfMTA1MTYzOTc4ODkzOSI+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81ODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+TG9jYWw8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzM8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnkgaWQ9IlF1ZXJ5XzEwNTE2Mzk3ODg5NDAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZCBpZD0iUXVlcnlNZXRob2RfMTA1MTYzOTc4ODk0MCI+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81OTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+UmVtb3RlPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF80PC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8c2Vzc2lvbiBpZD0iU2Vzc2lvbl8xMDUxNjM5Nzg4OTQ2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzM8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMzwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLlN0cmluZzwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkxpc3Q8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5zcWwuRGF0YTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8c2Vzc2lvbi10eXBlPlN0YXRlZnVsPC9zZXNzaW9uLXR5cGU+Ci0gICAgICAgICAgICA8dHJhbnNhY3Rpb24tdHlwZT5CZWFuPC90cmFuc2FjdGlvbi10eXBlPgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk0NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk0NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg5NDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk0OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4OTUwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg5NDYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzMwPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODk0NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg5NDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzMyPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODk0OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg5NTAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzM0PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4OTQ2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODk0NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM2PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4OTQ4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODk0OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM4PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4OTUwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4OTQ2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg5NDciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODk0OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4OTQ5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg5NTAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkgaWQ9IlVzZUNhbGxlcklkZW50aXR5XzEwNTE2Mzk3ODg5NDYiPjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4OTQ2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4OTQ3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg5NDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg5NDkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODk1NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5NTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5NTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODk1OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODk1OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTYwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9zZXNzaW9uPgotICAgICAgICAgPGVudGl0eSBpZD0iRW50aXR5XzEwNTE2Mzk3ODg5NTYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV80PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl80PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuTGlzdDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnNxbC5EYXRhPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk1NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk1NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4OTU4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4OTU5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk2MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4OTU2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg5NTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDE8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4OTU4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg5NTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDM8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4OTYwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODk1NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDU8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg5NTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ2PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80NjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODk1OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDc8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg5NTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80ODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ4PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80ODwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180ODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODk2MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDk8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODk1NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4OTU3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg5NTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODk1OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4OTYwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxydW4tYXMgaWQ9IlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfMTA1MTYzOTc4ODk1NiI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg5NTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODk1OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIxPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODk1OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4OTYwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4OTYxIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTYxIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTYyIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5NjMiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5NjQiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODk2NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvZW50aXR5PgotICAgICAgPC9lbnRlcnByaXNlLWJlYW5zPgotICAgICAgPHJlbGF0aW9uc2hpcHMgaWQ9IlJlbGF0aW9uc2hpcHNfMTA1MTYzOTc4ODk1NiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlbGF0aW9uIGlkPSJFSkJSZWxhdGlvbl8xMDUxNjM5Nzg4OTk2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzA8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBpZD0iRUpCUmVsYXRpb25zaGlwUm9sZV8xMDUxNjM5Nzg4OTk2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8wPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgaWQ9IlJvbGVTb3VyY2VfMTA1MTYzOTc4ODk5NiI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZCBpZD0iQ01SRmllbGRfMTA1MTYzOTc4ODk5NiI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8xMDwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBpZD0iRUpCUmVsYXRpb25zaGlwUm9sZV8xMDUxNjM5Nzg4OTk3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBpZD0iUm9sZVNvdXJjZV8xMDUxNjM5Nzg4OTk3Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICA8Y21yLWZpZWxkIGlkPSJDTVJGaWVsZF8xMDUxNjM5Nzg4OTk3Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzExPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgIDxlamItcmVsYXRpb24gaWQ9IkVKQlJlbGF0aW9uXzEwNTE2Mzk3ODg5OTciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMTwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGlkPSJFSkJSZWxhdGlvbnNoaXBSb2xlXzEwNTE2Mzk3ODg5OTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzU8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGlkPSJSb2xlU291cmNlXzEwNTE2Mzk3ODg5OTgiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQgaWQ9IkNNUkZpZWxkXzEwNTE2Mzk3ODg5OTgiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMTU8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUgaWQ9IkVKQlJlbGF0aW9uc2hpcFJvbGVfMTA1MTYzOTc4ODk5OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlPjwvY2FzY2FkZS1kZWxldGU+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGlkPSJSb2xlU291cmNlXzEwNTE2Mzk3ODg5OTkiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQgaWQ9IkNNUkZpZWxkXzEwNTE2Mzk3ODg5OTkiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMTY8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICAgPGVqYi1yZWxhdGlvbiBpZD0iRUpCUmVsYXRpb25fMTA1MTYzOTc4OTAwNiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8yPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUgaWQ9IkVKQlJlbGF0aW9uc2hpcFJvbGVfMTA1MTYzOTc4OTAwNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzEwPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgaWQ9IlJvbGVTb3VyY2VfMTA1MTYzOTc4OTAwNiI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQgaWQ9IkNNUkZpZWxkXzEwNTE2Mzk3ODkwMDYiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzIwPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGlkPSJFSkJSZWxhdGlvbnNoaXBSb2xlXzEwNTE2Mzk3ODkwMDciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xMTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgaWQ9IlJvbGVTb3VyY2VfMTA1MTYzOTc4OTAwNyI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQgaWQ9IkNNUkZpZWxkXzEwNTE2Mzk3ODkwMDciPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzIxPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgIDxlamItcmVsYXRpb24gaWQ9IkVKQlJlbGF0aW9uXzEwNTE2Mzk3ODkwMDciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMzwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGlkPSJFSkJSZWxhdGlvbnNoaXBSb2xlXzEwNTE2Mzk3ODkwMDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xNTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgaWQ9IlJvbGVTb3VyY2VfMTA1MTYzOTc4OTAwOCI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQgaWQ9IkNNUkZpZWxkXzEwNTE2Mzk3ODkwMDgiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzI1PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGlkPSJFSkJSZWxhdGlvbnNoaXBSb2xlXzEwNTE2Mzk3ODkwMDkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xNjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlPjwvY2FzY2FkZS1kZWxldGU+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGlkPSJSb2xlU291cmNlXzEwNTE2Mzk3ODkwMDkiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICA8Y21yLWZpZWxkIGlkPSJDTVJGaWVsZF8xMDUxNjM5Nzg5MDA5Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8yNjwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgICA8ZWpiLXJlbGF0aW9uIGlkPSJFSkJSZWxhdGlvbl8xMDUxNjM5Nzg5MDA4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzQ8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBpZD0iRUpCUmVsYXRpb25zaGlwUm9sZV8xMDUxNjM5Nzg5MDEwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMjA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZT48L2Nhc2NhZGUtZGVsZXRlPgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBpZD0iUm9sZVNvdXJjZV8xMDUxNjM5Nzg5MDEwIj4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZCBpZD0iQ01SRmllbGRfMTA1MTYzOTc4OTAxMCI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMzA8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUgaWQ9IkVKQlJlbGF0aW9uc2hpcFJvbGVfMTA1MTYzOTc4OTAxMSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzIxPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBpZD0iUm9sZVNvdXJjZV8xMDUxNjM5Nzg5MDExIj4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZCBpZD0iQ01SRmllbGRfMTA1MTYzOTc4OTAxMSI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMzE8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgPC9yZWxhdGlvbnNoaXBzPgotICAgICAgPGFzc2VtYmx5LWRlc2NyaXB0b3IgaWQ9IkFzc2VtYmx5RGVzY3JpcHRvcl8xMDUxNjM5Nzg5MDE2Ij4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTYzOTc4OTAzNiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTYzOTc4OTAzNyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTYzOTc4OTA0NiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTYzOTc4OTA0NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTYzOTc4OTA0OCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxtZXRob2QtcGVybWlzc2lvbiBpZD0iTWV0aG9kUGVybWlzc2lvbl8xMDUxNjM5Nzg5MDU2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEwNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMDciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEwOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTA5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMTAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24gaWQ9Ik1ldGhvZFBlcm1pc3Npb25fMTA1MTYzOTc4OTExNiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTE3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV82PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV83PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTExOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV84PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc183PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTIwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV85PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc185PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzExPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24gaWQ9Ik1ldGhvZFBlcm1pc3Npb25fMTA1MTYzOTc4OTExNyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMjEiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMjIiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTIzIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMjQiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMjUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgIDxtZXRob2QtcGVybWlzc2lvbiBpZD0iTWV0aG9kUGVybWlzc2lvbl8xMDUxNjM5Nzg5MTI2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEyNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEyNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMjgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEyOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEzMCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uIGlkPSJNZXRob2RQZXJtaXNzaW9uXzEwNTE2Mzk3ODkxMjciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTMxIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTMyIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEzMyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTM0Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTM1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uIGlkPSJNZXRob2RUcmFuc2FjdGlvbl8xMDUxNjM5Nzg5MTQ2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE0NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE0NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE0OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE1MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPk5vdFN1cHBvcnRlZDwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uIGlkPSJNZXRob2RUcmFuc2FjdGlvbl8xMDUxNjM5Nzg5MTQ3Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE1MSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE1MiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNTMiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE1NCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE1NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlN1cHBvcnRzPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24gaWQ9Ik1ldGhvZFRyYW5zYWN0aW9uXzEwNTE2Mzk3ODkxNTYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTU3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTU4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE1OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTYwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTYxIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbiBpZD0iTWV0aG9kVHJhbnNhY3Rpb25fMTA1MTYzOTc4OTE1NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNjIiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNjMiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTY0Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180ODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNjUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNjYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlc05ldzwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uIGlkPSJNZXRob2RUcmFuc2FjdGlvbl8xMDUxNjM5Nzg5MTU4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE2NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE2OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNjkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE3MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE3MSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181ODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPk1hbmRhdG9yeTwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8ZXhjbHVkZS1saXN0IGlkPSJFeGNsdWRlTGlzdF8xMDUxNjM5Nzg5MTY2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE3MiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE3NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNzciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE3OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE3OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L2V4Y2x1ZGUtbGlzdD4KLSAgICAgIDwvYXNzZW1ibHktZGVzY3JpcHRvcj4KLSAgICAgIDxlamItY2xpZW50LWphcj5lamJDbGllbnRKYXJfMDwvZWpiLWNsaWVudC1qYXI+Ci0gICA8L2VqYi1qYXI+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphcjEtMS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphcjEtMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MGQyZDQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2VqYi1qYXIxLTEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjgzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGVqYi1qYXIgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL2VqYi1qYXJfMV8xLmR0ZCI+Ci08ZWpiLWphciBpZD0iZWpiLWphcl9JRCI+Ci0gICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgIDxlbnRlcnByaXNlLWJlYW5zPgotICAgICAgICA8ZW50aXR5IGlkPSJNeUNNUCI+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+TXlDTVA8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+Y29tLmlibS50ZXN0LmVqYi5NeUNNUEhvbWU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmNvbS5pYm0udGVzdC5lamIuTXlDTVA8L3JlbW90ZT4KLSAgICAgICAgICAgIDxlamItY2xhc3M+Y29tLmlibS50ZXN0LmVqYi5NeUNNUEJlYW48L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5jb20uaWJtLnRlc3QuZWpiLk15Q01QS2V5PC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+azE8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHkgaWQ9Ik15Q01QMSI+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+TXlDTVAxPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmNvbS5pYm0udGVzdC5lamIuTXlDTVAxSG9tZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+Y29tLmlibS50ZXN0LmVqYi5NeUNNUDE8L3JlbW90ZT4KLSAgICAgICAgICAgIDxlamItY2xhc3M+Y29tLmlibS50ZXN0LmVqYi5NeUNNUDFCZWFuPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+Y29tLmlibS50ZXN0LmVqYi5NeUNNUDFLZXk8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGNtcC1maWVsZD4KLSAgICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5rMTwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eSBpZD0iTXlDTVAyIj4KLSAgICAgICAgICAgIDxlamItbmFtZT5NeUNNUDI8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+Y29tLmlibS50ZXN0LmVqYi5NeUNNUDJIb21lPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5jb20uaWJtLnRlc3QuZWpiLk15Q01QMjwvcmVtb3RlPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5jb20uaWJtLnRlc3QuZWpiLk15Q01QMkJlYW48L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5jb20uaWJtLnRlc3QuZWpiLk15Q01QMktleTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPmsxPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuTGlzdDwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5zcWwuRGF0YTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLlN0cmluZzwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMDwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8xPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8yPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzQ8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQ8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+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+bG9jYWxIb21lXzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV82PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzY8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV83PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfODwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV85PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF85PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua185PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkvPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV81PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV82PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV83PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV85PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV85PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMjwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8yPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLlN0cmluZzwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuTGlzdDwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEuc3FsLkRhdGE8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5zcWwuRGF0YTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+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+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xMDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTA8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzExPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzExPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xMjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTI8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzEzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xNDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTQ8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+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+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzM8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8zPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzM8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8zPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5TdHJpbmc8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5IYXNoVGFibGU8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5MaXN0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEuc3FsLkRhdGE8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+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+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzE1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTY8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzE3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8xODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTg8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzE5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+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+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV80PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl80PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuTGlzdDwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5zcWwuRGF0YTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzIxPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzIyPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjQ8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yMDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjA8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzIxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yMjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjI8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzIzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yNDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjQ8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+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+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV81PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl81PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNTwvZWpiLW5hbWU+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+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzI1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjY8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzI3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8yODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjg8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzI5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+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+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNjwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzY8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNjwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzY8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5zcWwuRGF0YTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLkludGVnZXI8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5MaXN0PC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5MaXN0PC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+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+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zMDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzA8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMzE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzMxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zMjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzI8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzMzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zNDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzQ8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMxPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNzwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzc8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNzwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzc8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLkludGVnZXI8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEubGFuZy5TdHJpbmc8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkxpc3Q8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnNxbC5EYXRhPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEuc3FsLkRhdGE8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzU8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zODwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zODwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM5PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzM2PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8zNjwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzM4PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8zODwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkvPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfODwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzg8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fODwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLlN0cmluZzwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkxpc3Q8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5zcWwuRGF0YTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+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+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV80MDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNDA8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNDE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV80MjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNDI8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNDM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV80NDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNDQ8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+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+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzk8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl85PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzk8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5MaXN0PC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnNxbC5EYXRhPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+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+bG9jYWxIb21lXzQ1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF80NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNDY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQ2PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzQ3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF80NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNDg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQ4PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180ODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80OTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzQ5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF80OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eS8+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80ODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80OTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICA8L2VudGVycHJpc2UtYmVhbnM+Ci0gICAgPHJlbGF0aW9uc2hpcHM+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzA8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8wPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuTGlzdDwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8xPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8yPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMjwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnNxbC5EYXRhPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzM8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzM8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMjwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzQ8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV81PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV81PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMzwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzY8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkxpc3Q8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNzwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNzwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnNxbC5EYXRhPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzQ8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzg8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV84PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzk8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzk8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgPC9yZWxhdGlvbnNoaXBzPgotICAgIDxhc3NlbWJseS1kZXNjcmlwdG9yPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNTwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV82PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzc8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfODwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV85PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVuY2hlY2tlZC8+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+Ci0gICAgICAgICAgICA8dW5jaGVja2VkLz4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1bmNoZWNrZWQvPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPk5vdFN1cHBvcnRlZDwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlN1cHBvcnRzPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180ODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZXNOZXc8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80OTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181ODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPk1hbmRhdG9yeTwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgPGV4Y2x1ZGUtbGlzdD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81NDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvZXhjbHVkZS1saXN0PgotICAgIDwvYXNzZW1ibHktZGVzY3JpcHRvcj4KLSAgICA8ZWpiLWNsaWVudC1qYXI+ZWpiQ2xpZW50SmFyXzA8L2VqYi1jbGllbnQtamFyPgotPC9lamItamFyPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyMi0wLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyMi0wLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE4ZGMwZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphcjItMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgZWpiLWphciBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZWpiLWphcl8yXzAuZHRkIj4KLTxlamItamFyIGlkPSJlamItamFyX0lEIj4KLSAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0JPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0JPGVudGVycHJpc2UtYmVhbnM+Ci0JCTxlbnRpdHkgaWQ9IkNNUDEiPgotCQkJPGVqYi1uYW1lPkNNUDE8L2VqYi1uYW1lPgotCQkJPGxvY2FsLWhvbWU+ZWpicy5DTVAxTG9jYWxIb21lPC9sb2NhbC1ob21lPgotCQkJPGxvY2FsPmVqYnMuQ01QMUxvY2FsPC9sb2NhbD4KLQkJCTxlamItY2xhc3M+ZWpicy5DTVAxQmVhbjwvZWpiLWNsYXNzPgotCQkJPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotCQkJPHByaW0ta2V5LWNsYXNzPmVqYnMuQ01QMUtleTwvcHJpbS1rZXktY2xhc3M+Ci0JCQk8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0JCQk8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLQkJCTxhYnN0cmFjdC1zY2hlbWEtbmFtZT5DTVAxPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLQkJCTxjbXAtZmllbGQ+Ci0JCQkJPGZpZWxkLW5hbWU+aWQ8L2ZpZWxkLW5hbWU+Ci0JCQk8L2NtcC1maWVsZD4KLQkJPC9lbnRpdHk+Ci0JCTxlbnRpdHkgaWQ9IkNNUDIiPgotCQkJPGVqYi1uYW1lPkNNUDI8L2VqYi1uYW1lPgotCQkJPGxvY2FsLWhvbWU+ZWpicy5DTVAyTG9jYWxIb21lPC9sb2NhbC1ob21lPgotCQkJPGxvY2FsPmVqYnMuQ01QMkxvY2FsPC9sb2NhbD4KLQkJCTxlamItY2xhc3M+ZWpicy5DTVAyQmVhbjwvZWpiLWNsYXNzPgotCQkJPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotCQkJPHByaW0ta2V5LWNsYXNzPmVqYnMuQ01QMktleTwvcHJpbS1rZXktY2xhc3M+Ci0JCQk8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0JCQk8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLQkJCTxhYnN0cmFjdC1zY2hlbWEtbmFtZT5DTVAyPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLQkJCTxjbXAtZmllbGQ+Ci0JCQkJPGZpZWxkLW5hbWU+aWQ8L2ZpZWxkLW5hbWU+Ci0JCQk8L2NtcC1maWVsZD4KLQkJPC9lbnRpdHk+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+cmVtb3RlXzk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18wPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+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+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua181PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua182PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua183PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua184PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua185PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eT48L3VzZS1jYWxsZXItaWRlbnRpdHk+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+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfMzwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV80PC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzEyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzEzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTA8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzExPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzEzPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzEzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE0PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzIxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzExPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzIzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzExPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzExPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzExPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+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+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8wPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5Mb2NhbDwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzA8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+UmVtb3RlPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMTwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18wPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5Mb2NhbDwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzI8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5SZW1vdGU8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8zPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5Mb2NhbDwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzQ8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8c2Vzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLlN0cmluZzwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkxpc3Q8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5zcWwuRGF0YTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8c2Vzc2lvbi10eXBlPlN0YXRlZnVsPC9zZXNzaW9uLXR5cGU+Ci0gICAgICAgICAgICA8dHJhbnNhY3Rpb24tdHlwZT5CZWFuPC90cmFuc2FjdGlvbi10eXBlPgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xNTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xNjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE3PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE4PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTk8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzMxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHk+PC91c2UtY2FsbGVyLWlkZW50aXR5PgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+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+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9zZXNzaW9uPgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMjwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8yPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuTGlzdDwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5zcWwuRGF0YTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzIxPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzIyPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjQ8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80MTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80MzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzM8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMzwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzM8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkxpc3Q8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEuc3FsLkRhdGE8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yNTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI3PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI4PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjk8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzUxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV81MzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV81NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzU3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNTc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzU5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNTk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIAk8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHk+PC91c2UtY2FsbGVyLWlkZW50aXR5PgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+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+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8bWVzc2FnZS1kcml2ZW4+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkxpc3Q8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDx0cmFuc2FjdGlvbi10eXBlPkJlYW48L3RyYW5zYWN0aW9uLXR5cGU+Ci0gICAgICAgICAgICA8bWVzc2FnZS1zZWxlY3Rvcj5tZXNzYWdlU2VsZWN0b3JfMDwvbWVzc2FnZS1zZWxlY3Rvcj4KLSAgICAgICAgICAgIDxhY2tub3dsZWRnZS1tb2RlPkF1dG8tYWNrbm93bGVkZ2U8L2Fja25vd2xlZGdlLW1vZGU+Ci0gICAgICAgICAgICA8bWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24+Ci0gICAgICAgICAgICAgICAgPGRlc3RpbmF0aW9uLXR5cGU+amF2YXguam1zLlF1ZXVlPC9kZXN0aW5hdGlvbi10eXBlPgotICAgICAgICAgICAgICAgIDxzdWJzY3JpcHRpb24tZHVyYWJpbGl0eT5EdXJhYmxlPC9zdWJzY3JpcHRpb24tZHVyYWJpbGl0eT4KLSAgICAgICAgICAgIDwvbWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24+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+aG9tZV82MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzYxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV82MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzYzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNjU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV82NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNjc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV82NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzY5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNjk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMxPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L21lc3NhZ2UtZHJpdmVuPgotICAgICAgICA8c2Vzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLlN0cmluZzwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkxpc3Q8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5zcWwuRGF0YTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8c2Vzc2lvbi10eXBlPlN0YXRlbGVzczwvc2Vzc2lvbi10eXBlPgotICAgICAgICAgICAgPHRyYW5zYWN0aW9uLXR5cGU+Q29udGFpbmVyPC90cmFuc2FjdGlvbi10eXBlPgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzU8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zODwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zODwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM5PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83MTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzczPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzc3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzc5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAJPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5PjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9zZXNzaW9uPgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV80PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl80PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuTGlzdDwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5zcWwuRGF0YTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80NDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDA8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQzPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ0PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzgxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfODE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzgzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfODM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV84NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzg1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV84NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzg3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV84OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQxPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+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+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzU8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzU8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkxpc3Q8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEuc3FsLkRhdGE8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+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+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzkxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfOTE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzkzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzk1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80ODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV85NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV85OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgCTxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eT48L3VzZS1jYWxsZXItaWRlbnRpdHk+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80ODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80OTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80OTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLQk8L2VudGVycHJpc2UtYmVhbnM+Ci0gICAgPHJlbGF0aW9uc2hpcHM+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzA8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlPjwvY2FzY2FkZS1kZWxldGU+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMDwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuTGlzdDwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8xPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEuc3FsLkRhdGE8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMTwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8yPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzM8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzM8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8yPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV80PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZT48L2Nhc2NhZGUtZGVsZXRlPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzQ8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV81PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV81PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5MaXN0PC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzM8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzY8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlPjwvY2FzY2FkZS1kZWxldGU+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNjwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnNxbC5EYXRhPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzc8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzc8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfNDwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfODwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV84PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfOTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfOTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICA8L3JlbGF0aW9uc2hpcHM+Ci0gICAgPGFzc2VtYmx5LWRlc2NyaXB0b3I+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV81PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNzwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV84PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dW5jaGVja2VkPjwvdW5jaGVja2VkPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+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+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVuY2hlY2tlZD48L3VuY2hlY2tlZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1bmNoZWNrZWQ+PC91bmNoZWNrZWQ+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+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphcjItMHNheC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphcjItMHNheC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OTcyNDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2VqYi1qYXIyLTBzYXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjg1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGVqYi1qYXIgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2VqYi1qYXJfMl8wLmR0ZCI+Ci08ZWpiLWphciBpZD0iZWpiLWphcl9JRCI+Ci0gICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgIDxlbnRlcnByaXNlLWJlYW5zPgotICAgICAgICA8ZW50aXR5IGlkPSJDTVAxIj4KLSAgICAgICAgICAgIDxlamItbmFtZT5DTVAxPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmVqYnMuQ01QMUxvY2FsSG9tZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5lamJzLkNNUDFMb2NhbDwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmVqYnMuQ01QMUJlYW48L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5lamJzLkNNUDFLZXk8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGNtcC12ZXJzaW9uPjIueDwvY21wLXZlcnNpb24+Ci0gICAgICAgICAgICA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+Q01QMTwvYWJzdHJhY3Qtc2NoZW1hLW5hbWU+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPmlkPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5IGlkPSJDTVAyIj4KLSAgICAgICAgICAgIDxlamItbmFtZT5DTVAyPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmVqYnMuQ01QMkxvY2FsSG9tZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5lamJzLkNNUDJMb2NhbDwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmVqYnMuQ01QMkJlYW48L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5lamJzLkNNUDJLZXk8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGNtcC12ZXJzaW9uPjIueDwvY21wLXZlcnNpb24+Ci0gICAgICAgICAgICA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+Q01QMjwvYWJzdHJhY3Qtc2NoZW1hLW5hbWU+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPmlkPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuTGlzdDwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5zcWwuRGF0YTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLlN0cmluZzwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV81PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV85PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8xPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnNxbC5EYXRhPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLlN0cmluZzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkxpc3Q8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkxpc3Q8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV81PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV82PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV84PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV84PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV81PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzU8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV82PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV82PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua182PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV83PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua183PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfODwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV84PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfOTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV85PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzEzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV83PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV84PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua184PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua185PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkvPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV81PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV82PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV83PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV85PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV85PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLlN0cmluZzwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuTGlzdDwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEuc3FsLkRhdGE8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnNxbC5EYXRhPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGNtcC12ZXJzaW9uPjIueDwvY21wLXZlcnNpb24+Ci0gICAgICAgICAgICA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+YWJzdHJhY3RTY2hlbWFOYW1lXzA8L2Fic3RyYWN0LXNjaGVtYS1uYW1lPgotICAgICAgICAgICAgPGNtcC1maWVsZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV8xPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzM8L2ZpZWxkLW5hbWU+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+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+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+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eS8+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+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+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+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eS8+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+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkvPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+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+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+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+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+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80ODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgIDwvZW50ZXJwcmlzZS1iZWFucz4KLSAgICA8cmVsYXRpb25zaGlwcz4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMDwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzA8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkxpc3Q8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnNxbC5EYXRhPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzE8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzI8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8yPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzM8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzM8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8yPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV80PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNDwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzU8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzU8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkxpc3Q8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMzwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzY8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5zcWwuRGF0YTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV83PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV83PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzQ8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzg8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV84PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfOTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfOTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICA8L3JlbGF0aW9uc2hpcHM+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+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvcmEueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL3JhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4MTZhZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvcmEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgY29ubmVjdG9yIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIENvbm5lY3RvciAxLjAvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvY29ubmVjdG9yXzFfMC5kdGQiPgotCi0gICA8Y29ubmVjdG9yIGlkPSJDb25uZWN0b3JfSUQiPgotICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICA8aWNvbj4KLSAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICA8L2ljb24+Ci0gICAgICA8dmVuZG9yLW5hbWU+dmVuZG9yTmFtZV8wPC92ZW5kb3ItbmFtZT4KLSAgICAgIDxzcGVjLXZlcnNpb24+MS4wPC9zcGVjLXZlcnNpb24+Ci0gICAgICA8ZWlzLXR5cGU+ZWlzVHlwZV8wPC9laXMtdHlwZT4KLSAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgIDxsaWNlbnNlPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGxpY2Vuc2UtcmVxdWlyZWQ+dHJ1ZTwvbGljZW5zZS1yZXF1aXJlZD4KLSAgICAgIDwvbGljZW5zZT4KLSAgICAgIDxyZXNvdXJjZWFkYXB0ZXIgaWQ9IlJlc291cmNlQWRhcHRlcl8xMDUxNjM5NzY5MDg3Ij4KLSAgICAgICAgIDxtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+bWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3NfMDwvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotICAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT5jb25uZWN0aW9uRmFjdG9yeUludGVyZmFjZV8wPC9jb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Ci0gICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz5jb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzc18wPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotICAgICAgICAgPGNvbm5lY3Rpb24taW50ZXJmYWNlPmNvbm5lY3Rpb25JbnRlcmZhY2VfMDwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0gICAgICAgICA8Y29ubmVjdGlvbi1pbXBsLWNsYXNzPmNvbm5lY3Rpb25JbXBsQ2xhc3NfMDwvY29ubmVjdGlvbi1pbXBsLWNsYXNzPgotICAgICAgICAgPHRyYW5zYWN0aW9uLXN1cHBvcnQ+Tm9UcmFuc2FjdGlvbjwvdHJhbnNhY3Rpb24tc3VwcG9ydD4KLSAgICAgICAgIDxjb25maWctcHJvcGVydHkgaWQ9IkNvbmZpZ1Byb3BlcnR5XzEwNTE2Mzk3NjkxMjciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfMDwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+dHlwZV8wPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfMDwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgICA8Y29uZmlnLXByb3BlcnR5IGlkPSJDb25maWdQcm9wZXJ0eV8xMDUxNjM5NzY5MTI4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzE8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPnR5cGVfMTwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzE8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eSBpZD0iQ29uZmlnUHJvcGVydHlfMTA1MTYzOTc2OTEyOSI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8yPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT50eXBlXzI8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8yPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgIDxjb25maWctcHJvcGVydHkgaWQ9IkNvbmZpZ1Byb3BlcnR5XzEwNTE2Mzk3NjkxMzAiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfMzwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+dHlwZV8zPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfMzwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgICA8Y29uZmlnLXByb3BlcnR5IGlkPSJDb25maWdQcm9wZXJ0eV8xMDUxNjM5NzY5MTMxIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzQ8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPnR5cGVfNDwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzQ8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBpZD0iQXV0aGVudGljYXRpb25NZWNoYW5pc21fMTA1MTYzOTc2OTE0NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+Y3JlZGVudGlhbEludGVyZmFjZV8wPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBpZD0iQXV0aGVudGljYXRpb25NZWNoYW5pc21fMTA1MTYzOTc2OTE0OCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+S2VyYnY1PC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5jcmVkZW50aWFsSW50ZXJmYWNlXzE8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtIGlkPSJBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV8xMDUxNjM5NzY5MTQ5Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5jcmVkZW50aWFsSW50ZXJmYWNlXzI8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtIGlkPSJBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV8xMDUxNjM5NzY5MTUwIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5LZXJidjU8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmNyZWRlbnRpYWxJbnRlcmZhY2VfMzwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gaWQ9IkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtXzEwNTE2Mzk3NjkxNTEiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQ8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmNyZWRlbnRpYWxJbnRlcmZhY2VfNDwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgIDxyZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+dHJ1ZTwvcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PgotICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24gaWQ9IlNlY3VyaXR5UGVybWlzc2lvbl8xMDUxNjM5NzY5MTY3Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8wPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbiBpZD0iU2VjdXJpdHlQZXJtaXNzaW9uXzEwNTE2Mzk3NjkxNzciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzE8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uIGlkPSJTZWN1cml0eVBlcm1pc3Npb25fMTA1MTYzOTc2OTE3OCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fMjwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24gaWQ9IlNlY3VyaXR5UGVybWlzc2lvbl8xMDUxNjM5NzY5MTc5Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8zPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbiBpZD0iU2VjdXJpdHlQZXJtaXNzaW9uXzEwNTE2Mzk3NjkxODAiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzQ8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgIDwvcmVzb3VyY2VhZGFwdGVyPgotICAgPC9jb25uZWN0b3I+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvd2ViLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzgzMWIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIHdlYi1hcHAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiPgotCi0gICA8d2ViLWFwcCBpZD0iV2ViQXBwX0lEIj4KLSAgICAgIDxpY29uPgotICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgIDwvaWNvbj4KLSAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGRpc3RyaWJ1dGFibGU+PC9kaXN0cmlidXRhYmxlPgotICAgICAgPGNvbnRleHQtcGFyYW0gaWQ9IkNvbnRleHRQYXJhbV8xMDUxNjQzNDk5ODUyIj4KLSAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8wPC9wYXJhbS1uYW1lPgotICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgICA8Y29udGV4dC1wYXJhbSBpZD0iQ29udGV4dFBhcmFtXzEwNTE2NDM0OTk4NTMiPgotICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAgIDxjb250ZXh0LXBhcmFtIGlkPSJDb250ZXh0UGFyYW1fMTA1MTY0MzQ5OTg2MiI+Ci0gICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjwvcGFyYW0tbmFtZT4KLSAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9jb250ZXh0LXBhcmFtPgotICAgICAgPGNvbnRleHQtcGFyYW0gaWQ9IkNvbnRleHRQYXJhbV8xMDUxNjQzNDk5ODYzIj4KLSAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zPC9wYXJhbS1uYW1lPgotICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgICA8Y29udGV4dC1wYXJhbSBpZD0iQ29udGV4dFBhcmFtXzEwNTE2NDM0OTk4NzIiPgotICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAgIDxmaWx0ZXIgaWQ9IkZpbHRlcl8xMDUxNjQzNDk5OTAyIj4KLSAgICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgIDwvaWNvbj4KLSAgICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzA8L2ZpbHRlci1uYW1lPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZmlsdGVyLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9maWx0ZXItY2xhc3M+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMDIiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI1PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAwMyI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yNjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDA0Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yNzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI3PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMDUiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI4PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjg8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAwNiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yOTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgPC9maWx0ZXI+Ci0gICAgICA8ZmlsdGVyIGlkPSJGaWx0ZXJfMTA1MTY0MzUwMDAwMiI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8xPC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGZpbHRlci1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9maWx0ZXItY2xhc3M+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMDciPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzMwPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzA8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAxMiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zMTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDEzIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zMjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzMyPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMTQiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzMzPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzM8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAxNSI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zNDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgPC9maWx0ZXI+Ci0gICAgICA8ZmlsdGVyIGlkPSJGaWx0ZXJfMTA1MTY0MzUwMDAxMiI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8yPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzI8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8yPC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMjwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGZpbHRlci1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9maWx0ZXItY2xhc3M+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMTYiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM1PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAxNyI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zNjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDE4Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zNzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM3PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMTkiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM4PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzg8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAyMCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zOTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgPC9maWx0ZXI+Ci0gICAgICA8ZmlsdGVyIGlkPSJGaWx0ZXJfMTA1MTY0MzUwMDAxMyI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8zPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzM8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8zPC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGZpbHRlci1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvZmlsdGVyLWNsYXNzPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDIxIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80MDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQwPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMjIiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQxPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDE8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAzMiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDI8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80MjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDMzIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80MzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQzPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMzQiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ0PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDQ8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgIDwvZmlsdGVyPgotICAgICAgPGZpbHRlciBpZD0iRmlsdGVyXzEwNTE2NDM1MDAwMzIiPgotICAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl80PC9sYXJnZS1pY29uPgotICAgICAgICAgPC9pY29uPgotICAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfNDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzQ8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxmaWx0ZXItY2xhc3M+amF2YS5zcWwuRGF0YTwvZmlsdGVyLWNsYXNzPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDM1Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80NTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ1PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMzYiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ2PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDY8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAzNyI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDc8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80NzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDM4Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80ODwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ4PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwNDIiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ5PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDk8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgIDwvZmlsdGVyPgotICAgICAgPGZpbHRlci1tYXBwaW5nIGlkPSJGaWx0ZXJNYXBwaW5nXzEwNTE2NDM1MDAwODIiPgotICAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8wPC91cmwtcGF0dGVybj4KLSAgICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgICA8ZmlsdGVyLW1hcHBpbmcgaWQ9IkZpbHRlck1hcHBpbmdfMTA1MTY0MzUwMDA4MyI+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8xPC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE8L3VybC1wYXR0ZXJuPgotICAgICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICAgIDxmaWx0ZXItbWFwcGluZyBpZD0iRmlsdGVyTWFwcGluZ18xMDUxNjQzNTAwMDg0Ij4KLSAgICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzI8L2ZpbHRlci1uYW1lPgotICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjwvdXJsLXBhdHRlcm4+Ci0gICAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgICAgPGZpbHRlci1tYXBwaW5nIGlkPSJGaWx0ZXJNYXBwaW5nXzEwNTE2NDM1MDAwODUiPgotICAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMzwvZmlsdGVyLW5hbWU+Ci0gICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zPC91cmwtcGF0dGVybj4KLSAgICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgICA8ZmlsdGVyLW1hcHBpbmcgaWQ9IkZpbHRlck1hcHBpbmdfMTA1MTY0MzUwMDA4NiI+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV80PC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ8L3VybC1wYXR0ZXJuPgotICAgICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICAgIDxsaXN0ZW5lciBpZD0iTGlzdGVuZXJfMTA1MTY0MzUwMDExMiI+Ci0gICAgICAgICA8bGlzdGVuZXItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2xpc3RlbmVyLWNsYXNzPgotICAgICAgPC9saXN0ZW5lcj4KLSAgICAgIDxsaXN0ZW5lciBpZD0iTGlzdGVuZXJfMTA1MTY0MzUwMDExMyI+Ci0gICAgICAgICA8bGlzdGVuZXItY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvbGlzdGVuZXItY2xhc3M+Ci0gICAgICA8L2xpc3RlbmVyPgotICAgICAgPGxpc3RlbmVyIGlkPSJMaXN0ZW5lcl8xMDUxNjQzNTAwMTE0Ij4KLSAgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9saXN0ZW5lci1jbGFzcz4KLSAgICAgIDwvbGlzdGVuZXI+Ci0gICAgICA8bGlzdGVuZXIgaWQ9Ikxpc3RlbmVyXzEwNTE2NDM1MDAxMTUiPgotICAgICAgICAgPGxpc3RlbmVyLWNsYXNzPmphdmEudXRpbC5MaXN0PC9saXN0ZW5lci1jbGFzcz4KLSAgICAgIDwvbGlzdGVuZXI+Ci0gICAgICA8bGlzdGVuZXIgaWQ9Ikxpc3RlbmVyXzEwNTE2NDM1MDAxMTYiPgotICAgICAgICAgPGxpc3RlbmVyLWNsYXNzPmphdmEuc3FsLkRhdGE8L2xpc3RlbmVyLWNsYXNzPgotICAgICAgPC9saXN0ZW5lcj4KLSAgICAgIDxzZXJ2bGV0IGlkPSJTZXJ2bGV0XzEwNTE2NDM1MDAyMTIiPgotICAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgPC9pY29uPgotICAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8wPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxqc3AtZmlsZT5qc3BGaWxlXzA8L2pzcC1maWxlPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjMyIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8wPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyMzMiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDIzNCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjM1Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyMzYiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MDwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICAgPHJ1bi1hcyBpZD0iUnVuQXNTcGVjaWZpZWRJZGVudGl0eV8xMDUxNjQzNTAwMjMyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjcyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMDwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyNzMiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI3NCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjc1Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyNzYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgPC9zZXJ2bGV0PgotICAgICAgPHNlcnZsZXQgaWQ9IlNlcnZsZXRfMTA1MTY0MzUwMDI3MiI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzE8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlcnZsZXQtY2xhc3M+Y2xhc3NOYW1lXzA8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyNzIiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzU8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV81PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI3MyI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzY8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjc0Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV83PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyNzUiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzg8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV84PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI3NiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfOTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzk8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgICAgICA8cnVuLWFzIGlkPSJSdW5Bc1NwZWNpZmllZElkZW50aXR5XzEwNTE2NDM1MDAyNzIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyNzciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua181PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI3OCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzY8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjgyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV83PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNzwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyODMiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua184PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI4NCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzk8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICA8L3NlcnZsZXQ+Ci0gICAgICA8c2VydmxldCBpZD0iU2VydmxldF8xMDUxNjQzNTAwMjgyIj4KLSAgICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzI8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMjwvbGFyZ2UtaWNvbj4KLSAgICAgICAgIDwvaWNvbj4KLSAgICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMjwvc2VydmxldC1uYW1lPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8anNwLWZpbGU+anNwRmlsZV8xPC9qc3AtZmlsZT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI4MiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTA8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjgzIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzExPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyODQiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzEyPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI4NSI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjg2Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE0PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjI8L2xvYWQtb24tc3RhcnR1cD4KLSAgICAgICAgIDxydW4tYXMgaWQ9IlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfMTA1MTY0MzUwMDI4MiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI4NSI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTA8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjg2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMTwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyODciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEyPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI4OCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTM8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjg5Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNDwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgIDwvc2VydmxldD4KLSAgICAgIDxzZXJ2bGV0IGlkPSJTZXJ2bGV0XzEwNTE2NDM1MDAyODMiPgotICAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMzwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8zPC9sYXJnZS1pY29uPgotICAgICAgICAgPC9pY29uPgotICAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8zPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzM8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxzZXJ2bGV0LWNsYXNzPmNsYXNzTmFtZV8xPC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjg3Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xNTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE1PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyODgiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE2PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTY8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI5MiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTc8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xNzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjkzIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xODwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE4PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyOTQiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE5PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTk8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MzwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICAgPHJ1bi1hcyBpZD0iUnVuQXNTcGVjaWZpZWRJZGVudGl0eV8xMDUxNjQzNTAwMjkyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjkyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNTwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyOTMiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE2PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI5NCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTc8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjk1Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xODwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyOTYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE5PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgPC9zZXJ2bGV0PgotICAgICAgPHNlcnZsZXQgaWQ9IlNlcnZsZXRfMTA1MTY0MzUwMDI5MiI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl80PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzQ8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGpzcC1maWxlPmpzcEZpbGVfMjwvanNwLWZpbGU+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyOTUiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzIwPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjA8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI5NiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yMTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjk3Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yMjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzIyPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyOTgiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzIzPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjM8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI5OSI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yNDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGxvYWQtb24tc3RhcnR1cD40PC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgICAgICA8cnVuLWFzIGlkPSJSdW5Bc1NwZWNpZmllZElkZW50aXR5XzEwNTE2NDM1MDAyOTMiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyOTciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIwPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI5OCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjE8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjk5Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMjwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAzMDAiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIzPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDMwMSI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjQ8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICA8L3NlcnZsZXQ+Ci0gICAgICA8c2VydmxldC1tYXBwaW5nIGlkPSJTZXJ2bGV0TWFwcGluZ18xMDUxNjQzNTAwMzEyIj4KLSAgICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMDwvc2VydmxldC1uYW1lPgotICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMDwvdXJsLXBhdHRlcm4+Ci0gICAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICAgIDxzZXJ2bGV0LW1hcHBpbmcgaWQ9IlNlcnZsZXRNYXBwaW5nXzEwNTE2NDM1MDAzMTMiPgotICAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8xPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xPC91cmwtcGF0dGVybj4KLSAgICAgIDwvc2VydmxldC1tYXBwaW5nPgotICAgICAgPHNlcnZsZXQtbWFwcGluZyBpZD0iU2VydmxldE1hcHBpbmdfMTA1MTY0MzUwMDMxNCI+Ci0gICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzI8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI8L3VybC1wYXR0ZXJuPgotICAgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICA8c2VydmxldC1tYXBwaW5nIGlkPSJTZXJ2bGV0TWFwcGluZ18xMDUxNjQzNTAwMzE1Ij4KLSAgICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMzwvc2VydmxldC1uYW1lPgotICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzwvdXJsLXBhdHRlcm4+Ci0gICAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICAgIDxzZXJ2bGV0LW1hcHBpbmcgaWQ9IlNlcnZsZXRNYXBwaW5nXzEwNTE2NDM1MDAzMTYiPgotICAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV80PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80PC91cmwtcGF0dGVybj4KLSAgICAgIDwvc2VydmxldC1tYXBwaW5nPgotICAgICAgPHNlc3Npb24tY29uZmlnIGlkPSJTZXNzaW9uQ29uZmlnXzEwNTE2NDM1MDAzMTIiPgotICAgICAgICAgPHNlc3Npb24tdGltZW91dD4wPC9zZXNzaW9uLXRpbWVvdXQ+Ci0gICAgICA8L3Nlc3Npb24tY29uZmlnPgotICAgICAgPG1pbWUtbWFwcGluZyBpZD0iTWltZU1hcHBpbmdfMTA1MTY0MzUwMDMzMiI+Ci0gICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl8wPC9leHRlbnNpb24+Ci0gICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzA8L21pbWUtdHlwZT4KLSAgICAgIDwvbWltZS1tYXBwaW5nPgotICAgICAgPG1pbWUtbWFwcGluZyBpZD0iTWltZU1hcHBpbmdfMTA1MTY0MzUwMDMzMyI+Ci0gICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl8xPC9leHRlbnNpb24+Ci0gICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzE8L21pbWUtdHlwZT4KLSAgICAgIDwvbWltZS1tYXBwaW5nPgotICAgICAgPG1pbWUtbWFwcGluZyBpZD0iTWltZU1hcHBpbmdfMTA1MTY0MzUwMDMzNCI+Ci0gICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl8yPC9leHRlbnNpb24+Ci0gICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzI8L21pbWUtdHlwZT4KLSAgICAgIDwvbWltZS1tYXBwaW5nPgotICAgICAgPG1pbWUtbWFwcGluZyBpZD0iTWltZU1hcHBpbmdfMTA1MTY0MzUwMDMzNSI+Ci0gICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl8zPC9leHRlbnNpb24+Ci0gICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzM8L21pbWUtdHlwZT4KLSAgICAgIDwvbWltZS1tYXBwaW5nPgotICAgICAgPG1pbWUtbWFwcGluZyBpZD0iTWltZU1hcHBpbmdfMTA1MTY0MzUwMDMzNiI+Ci0gICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl80PC9leHRlbnNpb24+Ci0gICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzQ8L21pbWUtdHlwZT4KLSAgICAgIDwvbWltZS1tYXBwaW5nPgotICAgICAgPHdlbGNvbWUtZmlsZS1saXN0IGlkPSJXZWxjb21lRmlsZUxpc3RfMTA1MTY0MzUwMDMzMiI+Ci0gICAgICAgICA8d2VsY29tZS1maWxlPndlbGNvbWVGaWxlXzA8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgIDx3ZWxjb21lLWZpbGU+d2VsY29tZUZpbGVfMTwvd2VsY29tZS1maWxlPgotICAgICAgICAgPHdlbGNvbWUtZmlsZT53ZWxjb21lRmlsZV8yPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgICA8d2VsY29tZS1maWxlPndlbGNvbWVGaWxlXzM8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgIDx3ZWxjb21lLWZpbGU+d2VsY29tZUZpbGVfNDwvd2VsY29tZS1maWxlPgotICAgICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KLSAgICAgIDxlcnJvci1wYWdlIGlkPSJFeGNlcHRpb25UeXBlRXJyb3JQYWdlXzEwNTE2NDM1MDAzNDIiPgotICAgICAgICAgPGV4Y2VwdGlvbi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2V4Y2VwdGlvbi10eXBlPgotICAgICAgICAgPGxvY2F0aW9uPmxvY2F0aW9uXzA8L2xvY2F0aW9uPgotICAgICAgPC9lcnJvci1wYWdlPgotICAgICAgPGVycm9yLXBhZ2UgaWQ9IkVycm9yQ29kZUVycm9yUGFnZV8xMDUxNjQzNTAwMzQyIj4KLSAgICAgICAgIDxlcnJvci1jb2RlPmVycm9yQ29kZV8wPC9lcnJvci1jb2RlPgotICAgICAgICAgPGxvY2F0aW9uPmxvY2F0aW9uXzE8L2xvY2F0aW9uPgotICAgICAgPC9lcnJvci1wYWdlPgotICAgICAgPGVycm9yLXBhZ2UgaWQ9IkV4Y2VwdGlvblR5cGVFcnJvclBhZ2VfMTA1MTY0MzUwMDM0MyI+Ci0gICAgICAgICA8ZXhjZXB0aW9uLXR5cGU+amF2YS51dGlsLkxpc3Q8L2V4Y2VwdGlvbi10eXBlPgotICAgICAgICAgPGxvY2F0aW9uPmxvY2F0aW9uXzI8L2xvY2F0aW9uPgotICAgICAgPC9lcnJvci1wYWdlPgotICAgICAgPGVycm9yLXBhZ2UgaWQ9IkVycm9yQ29kZUVycm9yUGFnZV8xMDUxNjQzNTAwMzQzIj4KLSAgICAgICAgIDxlcnJvci1jb2RlPmVycm9yQ29kZV8xPC9lcnJvci1jb2RlPgotICAgICAgICAgPGxvY2F0aW9uPmxvY2F0aW9uXzM8L2xvY2F0aW9uPgotICAgICAgPC9lcnJvci1wYWdlPgotICAgICAgPGVycm9yLXBhZ2UgaWQ9IkV4Y2VwdGlvblR5cGVFcnJvclBhZ2VfMTA1MTY0MzUwMDM1MiI+Ci0gICAgICAgICA8ZXhjZXB0aW9uLXR5cGU+amF2YS5zcWwuRGF0YTwvZXhjZXB0aW9uLXR5cGU+Ci0gICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fNDwvbG9jYXRpb24+Ci0gICAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgICA8dGFnbGliIGlkPSJUYWdMaWJSZWZfMTA1MTY0MzUwMDM2MiI+Ci0gICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfMDwvdGFnbGliLXVyaT4KLSAgICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fMDwvdGFnbGliLWxvY2F0aW9uPgotICAgICAgPC90YWdsaWI+Ci0gICAgICA8dGFnbGliIGlkPSJUYWdMaWJSZWZfMTA1MTY0MzUwMDM2MyI+Ci0gICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfMTwvdGFnbGliLXVyaT4KLSAgICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fMTwvdGFnbGliLWxvY2F0aW9uPgotICAgICAgPC90YWdsaWI+Ci0gICAgICA8dGFnbGliIGlkPSJUYWdMaWJSZWZfMTA1MTY0MzUwMDM2NCI+Ci0gICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfMjwvdGFnbGliLXVyaT4KLSAgICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fMjwvdGFnbGliLWxvY2F0aW9uPgotICAgICAgPC90YWdsaWI+Ci0gICAgICA8dGFnbGliIGlkPSJUYWdMaWJSZWZfMTA1MTY0MzUwMDM2NSI+Ci0gICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfMzwvdGFnbGliLXVyaT4KLSAgICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fMzwvdGFnbGliLWxvY2F0aW9uPgotICAgICAgPC90YWdsaWI+Ci0gICAgICA8dGFnbGliIGlkPSJUYWdMaWJSZWZfMTA1MTY0MzUwMDM2NiI+Ci0gICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfNDwvdGFnbGliLXVyaT4KLSAgICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fNDwvdGFnbGliLWxvY2F0aW9uPgotICAgICAgPC90YWdsaWI+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTY0MzUwMDM4MiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2NDM1MDAzODMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2NDM1MDAzODQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2NDM1MDAzODUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjQzNTAwMzg2Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2NDM1MDA0MDIiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzA8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTY0MzUwMDQwMyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTY0MzUwMDQwNCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjQzNTAwNDA1Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8zPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjQzNTAwNDA2Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV80PC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxzZWN1cml0eS1jb25zdHJhaW50IGlkPSJTZWN1cml0eUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQzMiI+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NTIiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8wPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ1MyI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NTQiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8yPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NTUiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8zPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ2MiI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzQ8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8YXV0aC1jb25zdHJhaW50IGlkPSJBdXRoQ29uc3RyYWludF8xMDUxNjQzNTAwNDYyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc180PC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L2F1dGgtY29uc3RyYWludD4KLSAgICAgICAgIDx1c2VyLWRhdGEtY29uc3RyYWludCBpZD0iVXNlckRhdGFDb25zdHJhaW50XzEwNTE2NDM1MDA0NjIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHRyYW5zcG9ydC1ndWFyYW50ZWU+Tk9ORTwvdHJhbnNwb3J0LWd1YXJhbnRlZT4KLSAgICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgICA8c2VjdXJpdHktY29uc3RyYWludCBpZD0iU2VjdXJpdHlDb25zdHJhaW50XzEwNTE2NDM1MDA0NjIiPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDYzIj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfNTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ2NCI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzY8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ2NSI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzc8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NjYiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV84PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NjciPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV85PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDxhdXRoLWNvbnN0cmFpbnQgaWQ9IkF1dGhDb25zdHJhaW50XzEwNTE2NDM1MDA0NjMiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc181PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc184PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICAgPHVzZXItZGF0YS1jb25zdHJhaW50IGlkPSJVc2VyRGF0YUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2MyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5JTlRFR1JBTDwvdHJhbnNwb3J0LWd1YXJhbnRlZT4KLSAgICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgICA8c2VjdXJpdHktY29uc3RyYWludCBpZD0iU2VjdXJpdHlDb25zdHJhaW50XzEwNTE2NDM1MDA0NjMiPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDY4Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTA8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzUwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzUxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzUyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzUzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ2OSI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzExPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NzAiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xMjwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NzEiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xMzwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3MiI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE0PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPGF1dGgtY29uc3RyYWludCBpZD0iQXV0aENvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2NCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzEwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzExPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzEyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzEzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE0PC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L2F1dGgtY29uc3RyYWludD4KLSAgICAgICAgIDx1c2VyLWRhdGEtY29uc3RyYWludCBpZD0iVXNlckRhdGFDb25zdHJhaW50XzEwNTE2NDM1MDA0NjQiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHRyYW5zcG9ydC1ndWFyYW50ZWU+Q09ORklERU5USUFMPC90cmFuc3BvcnQtZ3VhcmFudGVlPgotICAgICAgICAgPC91c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgIDxzZWN1cml0eS1jb25zdHJhaW50IGlkPSJTZWN1cml0eUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2NCI+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzM8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NzMiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xNTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3NCI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE2PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDc1Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTc8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3NiI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE4PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NzciPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xOTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDxhdXRoLWNvbnN0cmFpbnQgaWQ9IkF1dGhDb25zdHJhaW50XzEwNTE2NDM1MDA0NzIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xOTwvcm9sZS1uYW1lPgotICAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQgaWQ9IlVzZXJEYXRhQ29uc3RyYWludF8xMDUxNjQzNTAwNDcyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx0cmFuc3BvcnQtZ3VhcmFudGVlPk5PTkU8L3RyYW5zcG9ydC1ndWFyYW50ZWU+Ci0gICAgICAgICA8L3VzZXItZGF0YS1jb25zdHJhaW50PgotICAgICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgotICAgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQgaWQ9IlNlY3VyaXR5Q29uc3RyYWludF8xMDUxNjQzNTAwNDcyIj4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3OCI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzIwPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTAxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NzkiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8yMTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ4MCI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzIyPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTExPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0ODEiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8yMzwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDgyIj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMjQ8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMjE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTIyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMjQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8YXV0aC1jb25zdHJhaW50IGlkPSJBdXRoQ29uc3RyYWludF8xMDUxNjQzNTAwNDczIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjQ8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICAgPHVzZXItZGF0YS1jb25zdHJhaW50IGlkPSJVc2VyRGF0YUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQ3MyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5JTlRFR1JBTDwvdHJhbnNwb3J0LWd1YXJhbnRlZT4KLSAgICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgICA8bG9naW4tY29uZmlnIGlkPSJMb2dpbkNvbmZpZ18xMDUxNjQzNTAwNDgyIj4KLSAgICAgICAgIDxhdXRoLW1ldGhvZD5CQVNJQzwvYXV0aC1tZXRob2Q+Ci0gICAgICAgICA8cmVhbG0tbmFtZT5yZWFsbU5hbWVfMDwvcmVhbG0tbmFtZT4KLSAgICAgICAgIDxmb3JtLWxvZ2luLWNvbmZpZyBpZD0iRm9ybUxvZ2luQ29uZmlnXzEwNTE2NDM1MDA0ODIiPgotICAgICAgICAgICAgPGZvcm0tbG9naW4tcGFnZT5mb3JtTG9naW5QYWdlXzA8L2Zvcm0tbG9naW4tcGFnZT4KLSAgICAgICAgICAgIDxmb3JtLWVycm9yLXBhZ2U+Zm9ybUVycm9yUGFnZV8wPC9mb3JtLWVycm9yLXBhZ2U+Ci0gICAgICAgICA8L2Zvcm0tbG9naW4tY29uZmlnPgotICAgICAgPC9sb2dpbi1jb25maWc+Ci0gICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2NDM1MDA0OTIiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2NDM1MDA0OTMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2NDM1MDA0OTQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2NDM1MDA0OTUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2NDM1MDA0OTYiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjQzNTAwNTEzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8wPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2NDM1MDA1MTQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2NDM1MDA1MTUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2NDM1MDA1MTYiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTY0MzUwMDUxNyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjQzNTAwNTMzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMDwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjQzNTAwNTM0Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV8xPC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2NDM1MDA1MzUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV8yPC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2NDM1MDA1MzYiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzM8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTY0MzUwMDUzNyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzQ8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjQzNTAwNTUzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV81PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81PC9sb2NhbC1ob21lPgotICAgICAgICAgPGxvY2FsPnJlbW90ZV81PC9sb2NhbD4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzU8L2VqYi1saW5rPgotICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2NDM1MDA1NTQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV82PC9sb2NhbC1ob21lPgotICAgICAgICAgPGxvY2FsPnJlbW90ZV82PC9sb2NhbD4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzY8L2VqYi1saW5rPgotICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2NDM1MDA1NTUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICA8bG9jYWw+cmVtb3RlXzc8L2xvY2FsPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfNzwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTY0MzUwMDU1NiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICA8bG9jYWw+cmVtb3RlXzg8L2xvY2FsPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfODwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTY0MzUwMDU1NyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgIDxsb2NhbD5yZW1vdGVfOTwvbG9jYWw+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua185PC9lamItbGluaz4KLSAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgIDwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9jb20uaWJtLmV0b29scy5qMmVlL2xvb3NlQXBwLnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9jb20uaWJtLmV0b29scy5qMmVlL2xvb3NlQXBwLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUzYWUwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS8ubWV0YWRhdGEvLnBsdWdpbnMvY29tLmlibS5ldG9vbHMuajJlZS9sb29zZUFwcC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+DQotPG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnOkxvb3NlQXBwbGljYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZz0iY29tbW9uYXJjaGl2ZS5sb29zZWNvbmZpZy54bWkiIHVyaT0iXGQ6XHdvcmtcV1RQXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHNcY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSIiBiaW5hcmllc1BhdGg9IlxkOlx3b3JrXFdUUFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzXGNvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUVBUiIgcmVzb3VyY2VzUGF0aD0iXGQ6XHdvcmtcV1RQXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHNcY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSIj4NCi0gIDxsb29zZUFyY2hpdmVzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZU1vZHVsZSIgdXJpPSJMb29zZUVBUkVqYi5qYXIiIGJpbmFyaWVzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSRWpiXGJpbiIgcmVzb3VyY2VzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSRWpiXGJpbiIvPg0KLSAgPGxvb3NlQXJjaGl2ZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnOkxvb3NlV0FSRmlsZSIgdXJpPSJMb29zZUVBUldlYi53YXIiIGJpbmFyaWVzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSV2ViXHdlYkFwcGxpY2F0aW9uIiByZXNvdXJjZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVJXZWJcd2ViQXBwbGljYXRpb24iPg0KLSAgICA8bG9vc2VMaWJzIHVyaT0iV0VCLUlORi9saWIvbGlicmFyeS5qYXIiIGJpbmFyaWVzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlSmF2YVdlYkxpYlxiaW4iIHJlc291cmNlc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUphdmFXZWJMaWJcYmluIi8+DQotICA8L2xvb3NlQXJjaGl2ZXM+DQotICA8bG9vc2VBcmNoaXZlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWc6TG9vc2VMaWJyYXJ5IiB1cmk9InV0aWwuamFyIiBiaW5hcmllc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUphdmFVdGlsXGJpbiIgcmVzb3VyY2VzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlSmF2YVV0aWxcYmluIi8+DQotPC9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZUFwcGxpY2F0aW9uPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9jb20uaWJtLmV0b29scy5qMmVlL2xvb3NlQ29uZmlnLnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9jb20uaWJtLmV0b29scy5qMmVlL2xvb3NlQ29uZmlnLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmZmFmNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS8ubWV0YWRhdGEvLnBsdWdpbnMvY29tLmlibS5ldG9vbHMuajJlZS9sb29zZUNvbmZpZy54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJBU0NJSSI/Pg0KLTxvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZUNvbmZpZ3VyYXRpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWxuczpvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZz0iY29tbW9uYXJjaGl2ZS5sb29zZWNvbmZpZy54bWkiPg0KLSAgPGFwcGxpY2F0aW9ucyB1cmk9IlxkOlx3b3JrXFdUUFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzXGNvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUVBUiIgYmluYXJpZXNQYXRoPSJcZDpcd29ya1xXVFBcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0c1xjb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVIiIHJlc291cmNlc1BhdGg9IlxkOlx3b3JrXFdUUFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzXGNvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUVBUiI+DQotICAgIDxsb29zZUFyY2hpdmVzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZU1vZHVsZSIgdXJpPSJMb29zZUVBUkVqYi5qYXIiIGJpbmFyaWVzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSRWpiXGJpbiIgcmVzb3VyY2VzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSRWpiXGJpbiIvPg0KLSAgICA8bG9vc2VBcmNoaXZlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWc6TG9vc2VXQVJGaWxlIiB1cmk9Ikxvb3NlRUFSV2ViLndhciIgYmluYXJpZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVJXZWJcd2ViQXBwbGljYXRpb24iIHJlc291cmNlc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUVBUldlYlx3ZWJBcHBsaWNhdGlvbiI+DQotICAgICAgPGxvb3NlTGlicyB1cmk9IldFQi1JTkYvbGliL2xpYnJhcnkuamFyIiBiaW5hcmllc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUphdmFXZWJMaWJcYmluIiByZXNvdXJjZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VKYXZhV2ViTGliXGJpbiIvPg0KLSAgICA8L2xvb3NlQXJjaGl2ZXM+DQotICAgIDxsb29zZUFyY2hpdmVzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZUxpYnJhcnkiIHVyaT0idXRpbC5qYXIiIGJpbmFyaWVzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlSmF2YVV0aWxcYmluIiByZXNvdXJjZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VKYXZhVXRpbFxiaW4iLz4NCi0gIDwvYXBwbGljYXRpb25zPg0KLTwvb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWc6TG9vc2VDb25maWd1cmF0aW9uPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VDb25uZWN0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VDb25uZWN0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMWNkNmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VDb25uZWN0b3IvTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIj4KLSAgICA8bW9kdWxlPgotICAgICAgICA8Y29ubmVjdG9yPmZvb1JBUjwvY29ubmVjdG9yPgotICAgIDwvbW9kdWxlPgotPC9hcHBsaWNhdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL2Zvb1JBUi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL2Zvb1JBUi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9mb29SQVIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9mb29SQVIvTUVUQS1JTkYvcmEueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VDb25uZWN0b3IvZm9vUkFSL01FVEEtSU5GL3JhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM0MWM1My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9mb29SQVIvTUVUQS1JTkYvcmEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgY29ubmVjdG9yIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIENvbm5lY3RvciAxLjAvL0VOIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2Nvbm5lY3Rvcl8xXzAuZHRkIj4KLTxjb25uZWN0b3I+Ci0gICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgIDxpY29uPgotICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgPC9pY29uPgotICAgIDx2ZW5kb3ItbmFtZT52ZW5kb3JOYW1lXzA8L3ZlbmRvci1uYW1lPgotICAgIDxzcGVjLXZlcnNpb24+MS4wPC9zcGVjLXZlcnNpb24+Ci0gICAgPGVpcy10eXBlPmVpc1R5cGVfMDwvZWlzLXR5cGU+Ci0gICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDxsaWNlbnNlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxsaWNlbnNlLXJlcXVpcmVkPnRydWU8L2xpY2Vuc2UtcmVxdWlyZWQ+Ci0gICAgPC9saWNlbnNlPgotICAgIDxyZXNvdXJjZWFkYXB0ZXI+Ci0gICAgICAgIDxtYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+bWFuYWdlZENvbm5lY3Rpb25GYWN0b3J5Q2xhc3NfMDwvbWFuYWdlZGNvbm5lY3Rpb25mYWN0b3J5LWNsYXNzPgotICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlXzA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLSAgICAgICAgPGNvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Y29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3NfMDwvY29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz4KLSAgICAgICAgPGNvbm5lY3Rpb24taW50ZXJmYWNlPmNvbm5lY3Rpb25JbnRlcmZhY2VfMDwvY29ubmVjdGlvbi1pbnRlcmZhY2U+Ci0gICAgICAgIDxjb25uZWN0aW9uLWltcGwtY2xhc3M+Y29ubmVjdGlvbkltcGxDbGFzc18wPC9jb25uZWN0aW9uLWltcGwtY2xhc3M+Ci0gICAgICAgIDx0cmFuc2FjdGlvbi1zdXBwb3J0Pk5vVHJhbnNhY3Rpb248L3RyYW5zYWN0aW9uLXN1cHBvcnQ+Ci0gICAgICAgIDxjb25maWctcHJvcGVydHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8wPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT50eXBlXzA8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8wPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8Y29uZmlnLXByb3BlcnR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfMTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+dHlwZV8xPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfMTwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzI8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPnR5cGVfMjwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzI8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgIDxjb25maWctcHJvcGVydHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8zPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT50eXBlXzM8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8zPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8Y29uZmlnLXByb3BlcnR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfNDwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+dHlwZV80PC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfNDwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5jcmVkZW50aWFsSW50ZXJmYWNlXzA8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5LZXJidjU8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmNyZWRlbnRpYWxJbnRlcmZhY2VfMTwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQ8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmNyZWRlbnRpYWxJbnRlcmZhY2VfMjwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPktlcmJ2NTwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+Y3JlZGVudGlhbEludGVyZmFjZV8zPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+Y3JlZGVudGlhbEludGVyZmFjZV80PC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgIDxyZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+dHJ1ZTwvcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PgotICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8wPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fMTwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzI8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8zPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fNDwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgPC9yZXNvdXJjZWFkYXB0ZXI+Ci08L2Nvbm5lY3Rvcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSL01FVEEtSU5GLy5tb2R1bGVtYXBzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVIvTUVUQS1JTkYvLm1vZHVsZW1hcHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMjBhOTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVIvTUVUQS1JTkYvLm1vZHVsZW1hcHMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPG1vZHVsZW1hcDpFQVJQcm9qZWN0TWFwIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6bW9kdWxlbWFwPSJtb2R1bGVtYXAueG1pIiB4bWxuczphcHBsaWNhdGlvbj0iYXBwbGljYXRpb24ueG1pIiB4bWk6aWQ9IkVBUlByb2plY3RNYXBfMSI+DQotICA8bWFwcGluZ3MgeG1pOmlkPSJNb2R1bGVNYXBwaW5nXzEiIHByb2plY3ROYW1lPSJMb29zZUVBUkVqYiI+DQotICAgIDxtb2R1bGUgeG1pOnR5cGU9ImFwcGxpY2F0aW9uOkVqYk1vZHVsZSIgaHJlZj0iTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sI0VqYk1vZHVsZV8xIi8+DQotICA8L21hcHBpbmdzPg0KLSAgPG1hcHBpbmdzIHhtaTppZD0iTW9kdWxlTWFwcGluZ18yIiBwcm9qZWN0TmFtZT0iTG9vc2VFQVJXZWIiPg0KLSAgICA8bW9kdWxlIHhtaTp0eXBlPSJhcHBsaWNhdGlvbjpXZWJNb2R1bGUiIGhyZWY9Ik1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCNXZWJNb2R1bGVfMSIvPg0KLSAgPC9tYXBwaW5ncz4NCi08L21vZHVsZW1hcDpFQVJQcm9qZWN0TWFwPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwNjdmNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUi9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gMS4yLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL2FwcGxpY2F0aW9uXzFfMi5kdGQiPgotPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCI+Ci0JPGRpc3BsYXktbmFtZT5Mb29zZUVBUjwvZGlzcGxheS1uYW1lPgotCTxtb2R1bGUgaWQ9IkVqYk1vZHVsZV8xIj4KLQkJPGVqYj5Mb29zZUVBUkVqYi5qYXI8L2VqYj4KLQk8L21vZHVsZT4KLQk8bW9kdWxlIGlkPSJXZWJNb2R1bGVfMSI+Ci0JCTx3ZWI+Ci0JCQk8d2ViLXVyaT5Mb29zZUVBUldlYi53YXI8L3dlYi11cmk+Ci0JCQk8Y29udGV4dC1yb290Pkxvb3NlRUFSV2ViPC9jb250ZXh0LXJvb3Q+PC93ZWI+Ci0JPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVIvTUVUQS1JTkYvaWJtLWFwcGxpY2F0aW9uLWV4dC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUi9NRVRBLUlORi9pYm0tYXBwbGljYXRpb24tZXh0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmYmQwZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUi9NRVRBLUlORi9pYm0tYXBwbGljYXRpb24tZXh0LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGFwcGxpY2F0aW9uZXh0OkFwcGxpY2F0aW9uRXh0ZW5zaW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6YXBwbGljYXRpb25leHQ9ImFwcGxpY2F0aW9uZXh0LnhtaSIgeG1sbnM6YXBwbGljYXRpb249ImFwcGxpY2F0aW9uLnhtaSIgeG1pOmlkPSJBcHBsaWNhdGlvbl9JRF9FeHQiPg0KLSAgPG1vZHVsZUV4dGVuc2lvbnMgeG1pOnR5cGU9ImFwcGxpY2F0aW9uZXh0OkVqYk1vZHVsZUV4dGVuc2lvbiIgeG1pOmlkPSJFamJNb2R1bGVfMV9FeHQiIGFic29sdXRlUGF0aD0iRDpcV1NBRF9ERVZcZWNsaXBzZVx3b3Jrc3BhY2VcTG9vc2VFQVJFamJcYmluIj4NCi0gICAgPG1vZHVsZSB4bWk6dHlwZT0iYXBwbGljYXRpb246RWpiTW9kdWxlIiBocmVmPSJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwjRWpiTW9kdWxlXzEiLz4NCi0gIDwvbW9kdWxlRXh0ZW5zaW9ucz4NCi0gIDxtb2R1bGVFeHRlbnNpb25zIHhtaTp0eXBlPSJhcHBsaWNhdGlvbmV4dDpXZWJNb2R1bGVFeHRlbnNpb24iIHhtaTppZD0iV2ViTW9kdWxlXzFfRXh0IiBhYnNvbHV0ZVBhdGg9IkQ6XFdTQURfREVWXGVjbGlwc2Vcd29ya3NwYWNlXExvb3NlRUFSV2ViXHdlYkFwcGxpY2F0aW9uIj4NCi0gICAgPG1vZHVsZSB4bWk6dHlwZT0iYXBwbGljYXRpb246V2ViTW9kdWxlIiBocmVmPSJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwjV2ViTW9kdWxlXzEiLz4NCi0gIDwvbW9kdWxlRXh0ZW5zaW9ucz4NCi0gIDxhcHBsaWNhdGlvbiBocmVmPSJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwjQXBwbGljYXRpb25fSUQiLz4NCi08L2FwcGxpY2F0aW9uZXh0OkFwcGxpY2F0aW9uRXh0ZW5zaW9uPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSQXBwL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NGQ5MWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9hcHBsaWNhdGlvbl8xXzQueHNkIj4KLSAgICA8bW9kdWxlPgotICAgICAgICA8amF2YT5mb29BUFA8L2phdmE+Ci0gICAgPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvZm9vQVBQL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvZm9vQVBQL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ5OWJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSQXBwL2Zvb0FQUC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSQXBwL2Zvb0FQUC9NRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvZm9vQVBQL01FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YmVkNzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvZm9vQVBQL01FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbi1jbGllbnQgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiBDbGllbnQgMS4zLy9FTiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbi1jbGllbnRfMV8zLmR0ZCI+Ci08YXBwbGljYXRpb24tY2xpZW50IGlkPSJBcHBsaWNhdGlvbi1jbGllbnRfSUQiPgotICAgIDxpY29uPgotICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgPC9pY29uPgotICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMDwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8wPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMjwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV8wPC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV8wPC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzE8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzE8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzI8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzI8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMzwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfNDwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8wPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMTwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMjwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMzwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV80PC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8wPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMTwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8yPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzM8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxjYWxsYmFjay1oYW5kbGVyPmphdmEudXRpbC5IYXNoVGFibGU8L2NhbGxiYWNrLWhhbmRsZXI+Ci08L2FwcGxpY2F0aW9uLWNsaWVudD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjVjYWUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImVqYk1vZHVsZSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvV2ViU3BoZXJlIEFwcGxpY2F0aW9uIFNlcnZlciB2Ni4wIEpSRSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9ImNvbS5pYm0ud3RwLnNlcnZlci5qYXZhLmNvcmUuY29udGFpbmVyL2NvbS5pYm0ud3MuYXN0LnN0LnJ1bnRpbWUuY29yZS5ydW50aW1lVGFyZ2V0LnY2MC9XZWJTcGhlcmUgQXBwbGljYXRpb24gU2VydmVyIHY2LjAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJlamJNb2R1bGUiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvLmoyZWUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8uajJlZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU5OTY5ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8uajJlZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ajJlZXNldHRpbmdzIHZlcnNpb249IjYwMCI+DQotPG1vZHVsZXZlcnNpb24+MjA8L21vZHVsZXZlcnNpb24+DQotPC9qMmVlc2V0dGluZ3M+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0Zjc1MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPkxvb3NlRUFSRWpiPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+Y29tLmlibS53dHAubWlncmF0aW9uLk1pZ3JhdGlvbkJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+Y29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi52YWxpZGF0aW9uYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5jb20uaWJtLnd0cC5qMmVlLkxpYkNvcHlCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPmNvbS5pYm0uZXRvb2xzLmoyZWUuTGliQ29weUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2guSmF2YUVNRk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPmNvbS5pYm0uZXRvb2xzLmoyZWUuRUpCMl8wTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS53dHAuZWpiLkVKQk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZW0uYmVhbmluZm8uQmVhbkluZm9OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5ydW50aW1lIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvLnJ1bnRpbWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYzVkNDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvLnJ1bnRpbWUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHJ1bnRpbWUgcnVudGltZS1pZD0iV2ViU3BoZXJlIEFwcGxpY2F0aW9uIFNlcnZlciB2Ni4wIi8+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWJhZDI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1DbGFzcy1QYXRoOiB1dGlsLmphciAuLi9ib28uamFyCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9lamItamFyLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9lamItamFyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjZTFlNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvZWpiLWphci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGVqYi1qYXIgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMS4xLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL2VqYi1qYXJfMV8xLmR0ZCI+Ci08ZWpiLWphciBpZD0iZWpiLWphcl9JRCI+Ci0JPGRpc3BsYXktbmFtZT5Mb29zZUVBUkVqYjwvZGlzcGxheS1uYW1lPgotCTxlbnRlcnByaXNlLWJlYW5zPgotCQk8ZW50aXR5IGlkPSJNeUNNUCI+Ci0JCQk8ZWpiLW5hbWU+TXlDTVA8L2VqYi1uYW1lPgotCQkJPGhvbWU+Y29tLmlibS50ZXN0LmVqYi5NeUNNUEhvbWU8L2hvbWU+Ci0JCQk8cmVtb3RlPmNvbS5pYm0udGVzdC5lamIuTXlDTVA8L3JlbW90ZT4KLQkJCTxlamItY2xhc3M+Y29tLmlibS50ZXN0LmVqYi5NeUNNUEJlYW48L2VqYi1jbGFzcz4KLQkJCTxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLQkJCTxwcmltLWtleS1jbGFzcz5jb20uaWJtLnRlc3QuZWpiLk15Q01QS2V5PC9wcmltLWtleS1jbGFzcz4KLQkJCTxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLQkJCTxjbXAtZmllbGQ+Ci0JCQkJPGZpZWxkLW5hbWU+azE8L2ZpZWxkLW5hbWU+Ci0JCQk8L2NtcC1maWVsZD4KLQkJPC9lbnRpdHk+Ci0JPC9lbnRlcnByaXNlLWJlYW5zPgotPC9lamItamFyPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL01FVEEtSU5GL2libS1lamItamFyLWJuZC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTczYWY0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZWpiYm5kOkVKQkphckJpbmRpbmcgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplamJibmQ9ImVqYmJuZC54bWkiIHhtbG5zOmVqYj0iZWpiLnhtaSIgeG1pOmlkPSJlamItamFyX0lEX0JuZCI+DQotICA8ZWpiSmFyIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI2VqYi1qYXJfSUQiLz4NCi0gIDxlamJCaW5kaW5ncyB4bWk6aWQ9Ik15Q01QX0JuZCIgam5kaU5hbWU9ImVqYi9jb20vaWJtL3Rlc3QvZWpiL015Q01QSG9tZSI+DQotICAgIDxlbnRlcnByaXNlQmVhbiB4bWk6dHlwZT0iZWpiOkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI015Q01QIi8+DQotICA8L2VqYkJpbmRpbmdzPg0KLTwvZWpiYm5kOkVKQkphckJpbmRpbmc+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL01FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlNzBhOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZWpiZXh0OkVKQkphckV4dGVuc2lvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVqYmV4dD0iZWpiZXh0LnhtaSIgeG1sbnM6ZWpiPSJlamIueG1pIiB4bWk6aWQ9ImVqYi1qYXJfSUQiPg0KLSAgPGVqYkphciBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNlamItamFyX0lEIi8+DQotPC9lamJleHQ6RUpCSmFyRXh0ZW5zaW9uPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9jb20vaWJtL3Rlc3QvZWpiL015Q01QLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVAuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZjcyNzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVAuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUEJlYW4uY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUEJlYW4uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Y2VkMmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBCZWFuLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBIb21lLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBIb21lLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDkyNTkwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9jb20vaWJtL3Rlc3QvZWpiL015Q01QSG9tZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9jb20vaWJtL3Rlc3QvZWpiL015Q01QS2V5LmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBLZXkuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYjY3MDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBLZXkuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL2VqYi1qYXIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL2VqYi1qYXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmJhZTkwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9NRVRBLUlORi9lamItamFyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgZWpiLWphciBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZWpiLWphcl8yXzAuZHRkIj4KLTxlamItamFyIGlkPSJlamItamFyX0lEIj4KLQk8ZGlzcGxheS1uYW1lPkxvb3NlRUFSRWpiPC9kaXNwbGF5LW5hbWU+Ci0JPGVudGVycHJpc2UtYmVhbnM+Ci0JCTxlbnRpdHkgaWQ9IkNNUDEiPgotCQkJPGVqYi1uYW1lPkNNUDE8L2VqYi1uYW1lPgotCQkJPGxvY2FsLWhvbWU+ZWpicy5DTVAxTG9jYWxIb21lPC9sb2NhbC1ob21lPgotCQkJPGxvY2FsPmVqYnMuQ01QMUxvY2FsPC9sb2NhbD4KLQkJCTxlamItY2xhc3M+ZWpicy5DTVAxQmVhbjwvZWpiLWNsYXNzPgotCQkJPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotCQkJPHByaW0ta2V5LWNsYXNzPmVqYnMuQ01QMUtleTwvcHJpbS1rZXktY2xhc3M+Ci0JCQk8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0JCQk8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLQkJCTxhYnN0cmFjdC1zY2hlbWEtbmFtZT5DTVAxPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLQkJCTxjbXAtZmllbGQ+Ci0JCQkJPGZpZWxkLW5hbWU+aWQ8L2ZpZWxkLW5hbWU+Ci0JCQk8L2NtcC1maWVsZD4KLQkJPC9lbnRpdHk+Ci0JCTxlbnRpdHkgaWQ9IkNNUDIiPgotCQkJPGVqYi1uYW1lPkNNUDI8L2VqYi1uYW1lPgotCQkJPGxvY2FsLWhvbWU+ZWpicy5DTVAyTG9jYWxIb21lPC9sb2NhbC1ob21lPgotCQkJPGxvY2FsPmVqYnMuQ01QMkxvY2FsPC9sb2NhbD4KLQkJCTxlamItY2xhc3M+ZWpicy5DTVAyQmVhbjwvZWpiLWNsYXNzPgotCQkJPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotCQkJPHByaW0ta2V5LWNsYXNzPmVqYnMuQ01QMktleTwvcHJpbS1rZXktY2xhc3M+Ci0JCQk8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0JCQk8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLQkJCTxhYnN0cmFjdC1zY2hlbWEtbmFtZT5DTVAyPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLQkJCTxjbXAtZmllbGQ+Ci0JCQkJPGZpZWxkLW5hbWU+aWQ8L2ZpZWxkLW5hbWU+Ci0JCQk8L2NtcC1maWVsZD4KLQkJPC9lbnRpdHk+Ci0JPC9lbnRlcnByaXNlLWJlYW5zPgotPC9lamItamFyPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL2libS1lamItamFyLWJuZC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4ZGY5OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGVqYmJuZDpFSkJKYXJCaW5kaW5nIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWpiPSJlamIueG1pIiB4bWxuczplamJibmQ9ImVqYmJuZC54bWkiIHhtaTppZD0iRUpCSmFyQmluZGluZ18xMDk5MDc2Njk4NDgxIj4NCi0gIDxlamJKYXIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjZWpiLWphcl9JRCIvPg0KLSAgPGVqYkJpbmRpbmdzIHhtaTppZD0iRW50ZXJwcmlzZUJlYW5CaW5kaW5nXzEwOTkwNzY2OTg0OTEiIGpuZGlOYW1lPSJlamIvZWpicy9DTVAxTG9jYWxIb21lIj4NCi0gICAgPGVudGVycHJpc2VCZWFuIHhtaTp0eXBlPSJlamI6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjQ01QMSIvPg0KLSAgPC9lamJCaW5kaW5ncz4NCi0gIDxlamJCaW5kaW5ncyB4bWk6aWQ9IkVudGVycHJpc2VCZWFuQmluZGluZ18xMDk5MDc2NzI5Mjk1IiBqbmRpTmFtZT0iZWpiL2VqYnMvQ01QMkxvY2FsSG9tZSI+DQotICAgIDxlbnRlcnByaXNlQmVhbiB4bWk6dHlwZT0iZWpiOkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI0NNUDIiLz4NCi0gIDwvZWpiQmluZGluZ3M+DQotICA8ZGVmYXVsdENNUENvbm5lY3Rpb25GYWN0b3J5IHhtaTppZD0iQ01QQ29ubmVjdGlvbkZhY3RvcnlCaW5kaW5nXzEwOTkwNzY2OTg0OTEiIGpuZGlOYW1lPSJqZGJjL0RlZmF1bHQiIHJlc0F1dGg9IlBlcl9Db25uZWN0aW9uX0ZhY3RvcnkiLz4NCi08L2VqYmJuZDpFSkJKYXJCaW5kaW5nPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9NRVRBLUlORi9pYm0tZWpiLWphci1leHQueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZTcwYTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGVqYmV4dDpFSkJKYXJFeHRlbnNpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplamJleHQ9ImVqYmV4dC54bWkiIHhtbG5zOmVqYj0iZWpiLnhtaSIgeG1pOmlkPSJlamItamFyX0lEIj4NCi0gIDxlamJKYXIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjZWpiLWphcl9JRCIvPg0KLTwvZWpiZXh0OkVKQkphckV4dGVuc2lvbj4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2NvbS9pYm0vdGVzdC9lamIvTXlDTVAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJiOGI3Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIGNvbS5pYm0udGVzdC5lamI7Ci0vKioKLSAqIFJlbW90ZSBpbnRlcmZhY2UgZm9yIEVudGVycHJpc2UgQmVhbjogTXlDTVAKLSAqLwotcHVibGljIGludGVyZmFjZSBNeUNNUCBleHRlbmRzIGphdmF4LmVqYi5FSkJPYmplY3QgewotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBCZWFuLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkYjA0NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLXBhY2thZ2UgY29tLmlibS50ZXN0LmVqYjsKLS8qKgotICogQmVhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgRW50ZXJwcmlzZSBCZWFuOiBNeUNNUAotICovCi1wdWJsaWMgY2xhc3MgTXlDTVBCZWFuIGV4dGVuZHMgY29tLmlibS50ZXN0LkEgaW1wbGVtZW50cyBqYXZheC5lamIuRW50aXR5QmVhbiB7Ci0JcHJpdmF0ZSBqYXZheC5lamIuRW50aXR5Q29udGV4dCBteUVudGl0eUN0eDsKLQkvKioKLQkgKiBJbXBsZW1ldGF0aW9uIGZpZWxkIGZvciBwZXJzaXN0ZW50IGF0dHJpYnV0ZTogazEKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBrMTsKLQkvKioKLQkgKiBnZXRFbnRpdHlDb250ZXh0Ci0JICovCi0JcHVibGljIGphdmF4LmVqYi5FbnRpdHlDb250ZXh0IGdldEVudGl0eUNvbnRleHQoKSB7Ci0JCXJldHVybiBteUVudGl0eUN0eDsKLQl9Ci0JLyoqCi0JICogc2V0RW50aXR5Q29udGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eUNvbnRleHQoamF2YXguZWpiLkVudGl0eUNvbnRleHQgY3R4KSB7Ci0JCW15RW50aXR5Q3R4ID0gY3R4OwotCX0KLQkvKioKLQkgKiB1bnNldEVudGl0eUNvbnRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVudGl0eUNvbnRleHQoKSB7Ci0JCW15RW50aXR5Q3R4ID0gbnVsbDsKLQl9Ci0JLyoqCi0JICogZWpiQWN0aXZhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJBY3RpdmF0ZSgpIHsKLQkJX2luaXRMaW5rcygpOwotCX0KLQkvKioKLQkgKiBlamJDcmVhdGUgbWV0aG9kIGZvciBhIENNUCBlbnRpdHkgYmVhbi4KLQkgKi8KLQlwdWJsaWMgY29tLmlibS50ZXN0LmVqYi5NeUNNUEtleSBlamJDcmVhdGUoamF2YS5sYW5nLlN0cmluZyBrMSkgdGhyb3dzIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gewotCQlfaW5pdExpbmtzKCk7Ci0JCXRoaXMuazEgPSBrMTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIGVqYkxvYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJMb2FkKCkgewotCQlfaW5pdExpbmtzKCk7Ci0JfQotCS8qKgotCSAqIGVqYlBhc3NpdmF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlBhc3NpdmF0ZSgpIHsKLQl9Ci0JLyoqCi0JICogZWpiUG9zdENyZWF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlBvc3RDcmVhdGUoamF2YS5sYW5nLlN0cmluZyBrMSkgdGhyb3dzIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gewotCX0KLQkvKioKLQkgKiBlamJSZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJSZW1vdmUoKSB0aHJvd3MgamF2YXguZWpiLlJlbW92ZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlfcmVtb3ZlTGlua3MoKTsKLQkJfSBjYXRjaCAoamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBqYXZheC5lamIuUmVtb3ZlRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQkvKioKLQkgKiBlamJTdG9yZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlN0b3JlKCkgewotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3YXMgZ2VuZXJhdGVkIGZvciBzdXBwb3J0aW5nIHRoZSBhc3NvY2lhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgX2luaXRMaW5rcygpIHsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2FzIGdlbmVyYXRlZCBmb3Igc3VwcG9ydGluZyB0aGUgYXNzb2NpYXRpb25zLgotCSAqLwotCXByb3RlY3RlZCBqYXZhLnV0aWwuVmVjdG9yIF9nZXRMaW5rcygpIHsKLQkJamF2YS51dGlsLlZlY3RvciBsaW5rcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JCXJldHVybiBsaW5rczsKLQl9Ci0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2FzIGdlbmVyYXRlZCBmb3Igc3VwcG9ydGluZyB0aGUgYXNzb2NpYXRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIF9yZW1vdmVMaW5rcygpIHRocm93cyBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24sIGphdmF4LmVqYi5SZW1vdmVFeGNlcHRpb24gewotCQlqYXZhLnV0aWwuTGlzdCBsaW5rcyA9IF9nZXRMaW5rcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmtzLnNpemUoKSA7IGkrKykgewotCQkJdHJ5IHsKLQkJCQkoKGNvbS5pYm0uaXZqLmVqYi5hc3NvY2lhdGlvbnMuaW50ZXJmYWNlcy5MaW5rKSBsaW5rcy5nZXQoaSkpLnJlbW92ZSgpOwotCQkJfSBjYXRjaCAoamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbiBlKSB7fSAvL0NvbnN1bWUgRmluZGVyIGVycm9yIHNpbmNlIEkgYW0gZ29pbmcgYXdheQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBIb21lLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEhvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwOWYyMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEhvbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2UgY29tLmlibS50ZXN0LmVqYjsKLS8qKgotICogSG9tZSBpbnRlcmZhY2UgZm9yIEVudGVycHJpc2UgQmVhbjogTXlDTVAKLSAqLwotcHVibGljIGludGVyZmFjZSBNeUNNUEhvbWUgZXh0ZW5kcyBqYXZheC5lamIuRUpCSG9tZSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEga2V5IGZvciBFbnRpdHkgQmVhbjogTXlDTVAKLQkgKi8KLQlwdWJsaWMgY29tLmlibS50ZXN0LmVqYi5NeUNNUCBjcmVhdGUoamF2YS5sYW5nLlN0cmluZyBrMSkgdGhyb3dzIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24sIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKLQkvKioKLQkgKiBGaW5kcyBhbiBpbnN0YW5jZSB1c2luZyBhIGtleSBmb3IgRW50aXR5IEJlYW46IE15Q01QCi0JICovCi0JcHVibGljIGNvbS5pYm0udGVzdC5lamIuTXlDTVAgZmluZEJ5UHJpbWFyeUtleShjb20uaWJtLnRlc3QuZWpiLk15Q01QS2V5IHByaW1hcnlLZXkpIHRocm93cyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uLCBqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEtleS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FhNmY3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotcGFja2FnZSBjb20uaWJtLnRlc3QuZWpiOwotLyoqCi0gKiBLZXkgY2xhc3MgZm9yIEVudGl0eSBCZWFuOiBNeUNNUAotICovCi1wdWJsaWMgY2xhc3MgTXlDTVBLZXkgZXh0ZW5kcyBjb20uaWJtLnRlc3QuQSBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQotCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjA2MDkzNDU5NzYwODQ2MTYzTDsKLQkvKioKLQkgKiBJbXBsZW1ldGF0aW9uIGZpZWxkIGZvciBwZXJzaXN0ZW50IGF0dHJpYnV0ZTogazEKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBrMTsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVtcHR5IGtleSBmb3IgRW50aXR5IEJlYW46IE15Q01QCi0JICovCi0JcHVibGljIE15Q01QS2V5KCkgewotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYm90aCBrZXlzIGFyZSBlcXVhbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCBvdGhlcktleSkgewotCQlpZiAob3RoZXJLZXkgaW5zdGFuY2VvZiBjb20uaWJtLnRlc3QuZWpiLk15Q01QS2V5KSB7Ci0JCQljb20uaWJtLnRlc3QuZWpiLk15Q01QS2V5IG8gPSAoY29tLmlibS50ZXN0LmVqYi5NeUNNUEtleSlvdGhlcktleTsKLQkJCXJldHVybiAoKHRoaXMuazEuZXF1YWxzKG8uazEpKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgZm9yIHRoZSBrZXkuCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIChrMS5oYXNoQ29kZSgpKTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyBhIGtleSBmb3IgRW50aXR5IEJlYW46IE15Q01QCi0JICovCi0JcHVibGljIE15Q01QS2V5KGphdmEubGFuZy5TdHJpbmcgazEpIHsKLQkJdGhpcy5rMSA9IGsxOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFCZWFuLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAxQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTcyNzQ3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi1wYWNrYWdlIGVqYnM7Ci0vKioKLSAqIEJlYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIEVudGVycHJpc2UgQmVhbjogQ01QMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01QMUJlYW4gaW1wbGVtZW50cyBqYXZheC5lamIuRW50aXR5QmVhbiB7Ci0JcHJpdmF0ZSBqYXZheC5lamIuRW50aXR5Q29udGV4dCBteUVudGl0eUN0eDsKLQkvKioKLQkgKiBzZXRFbnRpdHlDb250ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW50aXR5Q29udGV4dChqYXZheC5lamIuRW50aXR5Q29udGV4dCBjdHgpIHsKLQkJbXlFbnRpdHlDdHggPSBjdHg7Ci0JfQotCS8qKgotCSAqIGdldEVudGl0eUNvbnRleHQKLQkgKi8KLQlwdWJsaWMgamF2YXguZWpiLkVudGl0eUNvbnRleHQgZ2V0RW50aXR5Q29udGV4dCgpIHsKLQkJcmV0dXJuIG15RW50aXR5Q3R4OwotCX0KLQkvKioKLQkgKiB1bnNldEVudGl0eUNvbnRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVudGl0eUNvbnRleHQoKSB7Ci0JCW15RW50aXR5Q3R4ID0gbnVsbDsKLQl9Ci0JLyoqCi0JICogZWpiQ3JlYXRlCi0JICovCi0JcHVibGljIGVqYnMuQ01QMUtleSBlamJDcmVhdGUoamF2YS5sYW5nLkludGVnZXIgaWQpCi0JCXRocm93cyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIHsKLQkJc2V0SWQoaWQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogZWpiUG9zdENyZWF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlBvc3RDcmVhdGUoamF2YS5sYW5nLkludGVnZXIgaWQpCi0JCXRocm93cyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIHsKLQl9Ci0JLyoqCi0JICogZWpiQWN0aXZhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJBY3RpdmF0ZSgpIHsKLQl9Ci0JLyoqCi0JICogZWpiTG9hZAotCSAqLwotCXB1YmxpYyB2b2lkIGVqYkxvYWQoKSB7Ci0JfQotCS8qKgotCSAqIGVqYlBhc3NpdmF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlBhc3NpdmF0ZSgpIHsKLQl9Ci0JLyoqCi0JICogZWpiUmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgZWpiUmVtb3ZlKCkgdGhyb3dzIGphdmF4LmVqYi5SZW1vdmVFeGNlcHRpb24gewotCX0KLQkvKioKLQkgKiBlamJTdG9yZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlN0b3JlKCkgewotCX0KLQkvKioKLQkgKiBHZXQgYWNjZXNzb3IgZm9yIHBlcnNpc3RlbnQgYXR0cmlidXRlOiBpZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuSW50ZWdlciBnZXRJZCgpOwotCS8qKgotCSAqIFNldCBhY2Nlc3NvciBmb3IgcGVyc2lzdGVudCBhdHRyaWJ1dGU6IGlkCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SWQoamF2YS5sYW5nLkludGVnZXIgbmV3SWQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFLZXkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkyNDAxNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAxS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1wYWNrYWdlIGVqYnM7Ci0vKioKLSAqIEtleSBjbGFzcyBmb3IgRW50aXR5IEJlYW46IENNUDEKLSAqLwotcHVibGljIGNsYXNzIENNUDFLZXkgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0Jc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyMDYwOTM0NTk3NjA4NDYxNjNMOwotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIGZpZWxkIGZvciBwZXJzaXN0ZW50IGF0dHJpYnV0ZTogaWQKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLkludGVnZXIgaWQ7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbXB0eSBrZXkgZm9yIEVudGl0eSBCZWFuOiBDTVAxCi0JICovCi0JcHVibGljIENNUDFLZXkoKSB7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBrZXkgZm9yIEVudGl0eSBCZWFuOiBDTVAxCi0JICovCi0JcHVibGljIENNUDFLZXkoamF2YS5sYW5nLkludGVnZXIgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYm90aCBrZXlzIGFyZSBlcXVhbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCBvdGhlcktleSkgewotCQlpZiAob3RoZXJLZXkgaW5zdGFuY2VvZiBlamJzLkNNUDFLZXkpIHsKLQkJCWVqYnMuQ01QMUtleSBvID0gKGVqYnMuQ01QMUtleSkgb3RoZXJLZXk7Ci0JCQlyZXR1cm4gKCh0aGlzLmlkLmVxdWFscyhvLmlkKSkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIGZvciB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAoaWQuaGFzaENvZGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFMb2NhbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUxvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZmRiNTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgZWpiczsKLS8qKgotICogTG9jYWwgaW50ZXJmYWNlIGZvciBFbnRlcnByaXNlIEJlYW46IENNUDEKLSAqLwotcHVibGljIGludGVyZmFjZSBDTVAxTG9jYWwgZXh0ZW5kcyBqYXZheC5lamIuRUpCTG9jYWxPYmplY3QgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFMb2NhbEhvbWUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFMb2NhbEhvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1NmEzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAxTG9jYWxIb21lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIGVqYnM7Ci0vKioKLSAqIExvY2FsIEhvbWUgaW50ZXJmYWNlIGZvciBFbnRlcnByaXNlIEJlYW46IENNUDEKLSAqLwotcHVibGljIGludGVyZmFjZSBDTVAxTG9jYWxIb21lIGV4dGVuZHMgamF2YXguZWpiLkVKQkxvY2FsSG9tZSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEga2V5IGZvciBFbnRpdHkgQmVhbjogQ01QMQotCSAqLwotCXB1YmxpYyBlamJzLkNNUDFMb2NhbCBjcmVhdGUoamF2YS5sYW5nLkludGVnZXIgaWQpCi0JCXRocm93cyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uOwotCS8qKgotCSAqIEZpbmRzIGFuIGluc3RhbmNlIHVzaW5nIGEga2V5IGZvciBFbnRpdHkgQmVhbjogQ01QMQotCSAqLwotCXB1YmxpYyBlamJzLkNNUDFMb2NhbCBmaW5kQnlQcmltYXJ5S2V5KGVqYnMuQ01QMUtleSBwcmltYXJ5S2V5KQotCQl0aHJvd3MgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyQmVhbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMkJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5YWJlMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotcGFja2FnZSBlamJzOwotLyoqCi0gKiBCZWFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBFbnRlcnByaXNlIEJlYW46IENNUDIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENNUDJCZWFuIGltcGxlbWVudHMgamF2YXguZWpiLkVudGl0eUJlYW4gewotCXByaXZhdGUgamF2YXguZWpiLkVudGl0eUNvbnRleHQgbXlFbnRpdHlDdHg7Ci0JLyoqCi0JICogc2V0RW50aXR5Q29udGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eUNvbnRleHQoamF2YXguZWpiLkVudGl0eUNvbnRleHQgY3R4KSB7Ci0JCW15RW50aXR5Q3R4ID0gY3R4OwotCX0KLQkvKioKLQkgKiBnZXRFbnRpdHlDb250ZXh0Ci0JICovCi0JcHVibGljIGphdmF4LmVqYi5FbnRpdHlDb250ZXh0IGdldEVudGl0eUNvbnRleHQoKSB7Ci0JCXJldHVybiBteUVudGl0eUN0eDsKLQl9Ci0JLyoqCi0JICogdW5zZXRFbnRpdHlDb250ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgdW5zZXRFbnRpdHlDb250ZXh0KCkgewotCQlteUVudGl0eUN0eCA9IG51bGw7Ci0JfQotCS8qKgotCSAqIGVqYkNyZWF0ZQotCSAqLwotCXB1YmxpYyBlamJzLkNNUDJLZXkgZWpiQ3JlYXRlKGphdmEubGFuZy5JbnRlZ2VyIGlkKQotCQl0aHJvd3MgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiB7Ci0JCXNldElkKGlkKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qKgotCSAqIGVqYlBvc3RDcmVhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJQb3N0Q3JlYXRlKGphdmEubGFuZy5JbnRlZ2VyIGlkKQotCQl0aHJvd3MgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiB7Ci0JfQotCS8qKgotCSAqIGVqYkFjdGl2YXRlCi0JICovCi0JcHVibGljIHZvaWQgZWpiQWN0aXZhdGUoKSB7Ci0JfQotCS8qKgotCSAqIGVqYkxvYWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJMb2FkKCkgewotCX0KLQkvKioKLQkgKiBlamJQYXNzaXZhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJQYXNzaXZhdGUoKSB7Ci0JfQotCS8qKgotCSAqIGVqYlJlbW92ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlJlbW92ZSgpIHRocm93cyBqYXZheC5lamIuUmVtb3ZlRXhjZXB0aW9uIHsKLQl9Ci0JLyoqCi0JICogZWpiU3RvcmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJTdG9yZSgpIHsKLQl9Ci0JLyoqCi0JICogR2V0IGFjY2Vzc29yIGZvciBwZXJzaXN0ZW50IGF0dHJpYnV0ZTogaWQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgamF2YS5sYW5nLkludGVnZXIgZ2V0SWQoKTsKLQkvKioKLQkgKiBTZXQgYWNjZXNzb3IgZm9yIHBlcnNpc3RlbnQgYXR0cmlidXRlOiBpZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldElkKGphdmEubGFuZy5JbnRlZ2VyIG5ld0lkKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyS2V5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZTliYzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMktleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotcGFja2FnZSBlamJzOwotLyoqCi0gKiBLZXkgY2xhc3MgZm9yIEVudGl0eSBCZWFuOiBDTVAyCi0gKi8KLXB1YmxpYyBjbGFzcyBDTVAyS2V5IGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjA2MDkzNDU5NzYwODQ2MTYzTDsKLQkvKioKLQkgKiBJbXBsZW1lbnRhdGlvbiBmaWVsZCBmb3IgcGVyc2lzdGVudCBhdHRyaWJ1dGU6IGlkCi0JICovCi0JcHVibGljIGphdmEubGFuZy5JbnRlZ2VyIGlkOwotCS8qKgotCSAqIENyZWF0ZXMgYW4gZW1wdHkga2V5IGZvciBFbnRpdHkgQmVhbjogQ01QMgotCSAqLwotCXB1YmxpYyBDTVAyS2V5KCkgewotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEga2V5IGZvciBFbnRpdHkgQmVhbjogQ01QMgotCSAqLwotCXB1YmxpYyBDTVAyS2V5KGphdmEubGFuZy5JbnRlZ2VyIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGJvdGgga2V5cyBhcmUgZXF1YWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKGphdmEubGFuZy5PYmplY3Qgb3RoZXJLZXkpIHsKLQkJaWYgKG90aGVyS2V5IGluc3RhbmNlb2YgZWpicy5DTVAyS2V5KSB7Ci0JCQllamJzLkNNUDJLZXkgbyA9IChlamJzLkNNUDJLZXkpIG90aGVyS2V5OwotCQkJcmV0dXJuICgodGhpcy5pZC5lcXVhbHMoby5pZCkpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhhc2ggY29kZSBmb3IgdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gKGlkLmhhc2hDb2RlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyTG9jYWwuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJMb2NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmFjNzMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJMb2NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1wYWNrYWdlIGVqYnM7Ci0vKioKLSAqIExvY2FsIGludGVyZmFjZSBmb3IgRW50ZXJwcmlzZSBCZWFuOiBDTVAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01QMkxvY2FsIGV4dGVuZHMgamF2YXguZWpiLkVKQkxvY2FsT2JqZWN0IHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyTG9jYWxIb21lLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyTG9jYWxIb21lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMWJkZjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMkxvY2FsSG9tZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSBlamJzOwotLyoqCi0gKiBMb2NhbCBIb21lIGludGVyZmFjZSBmb3IgRW50ZXJwcmlzZSBCZWFuOiBDTVAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01QMkxvY2FsSG9tZSBleHRlbmRzIGphdmF4LmVqYi5FSkJMb2NhbEhvbWUgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGtleSBmb3IgRW50aXR5IEJlYW46IENNUDIKLQkgKi8KLQlwdWJsaWMgZWpicy5DTVAyTG9jYWwgY3JlYXRlKGphdmEubGFuZy5JbnRlZ2VyIGlkKQotCQl0aHJvd3MgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbjsKLQkvKioKLQkgKiBGaW5kcyBhbiBpbnN0YW5jZSB1c2luZyBhIGtleSBmb3IgRW50aXR5IEJlYW46IENNUDIKLQkgKi8KLQlwdWJsaWMgZWpicy5DTVAyTG9jYWwgZmluZEJ5UHJpbWFyeUtleShlamJzLkNNUDJLZXkgcHJpbWFyeUtleSkKLQkJdGhyb3dzIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYmIzOGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IlNFUlZFUkpES19QTFVHSU5ESVIvanJlL2xpYi9ydC5qYXIiCi0gICAgICAgIHJvb3RwYXRoPSJzcmMiIHNvdXJjZXBhdGg9IlNFUlZFUkpES19QTFVHSU5ESVIvc3JjLmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNvdXJjZSIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IldBU19QTFVHSU5ESVIvbGliL2oyZWUuamFyIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iV0FTX1BMVUdJTkRJUi9saWIvd2ViY29udGFpbmVyLmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IldBU19QTFVHSU5ESVIvbGliL2l2amVqYjM1LmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IldBU19QTFVHSU5ESVIvbGliL3dlYnNwaGVyZS5qYXIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJ3ZWJBcHBsaWNhdGlvblxXRUItSU5GXGNsYXNzZXMiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvLndlYnNldHRpbmdzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvLndlYnNldHRpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTViOWE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViLy53ZWJzZXR0aW5ncworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3ZWJzZXR0aW5ncz4KLQk8Y29udGV4dC1yb290Pkxvb3NlRUFSV2ViPC9jb250ZXh0LXJvb3Q+Ci08L3dlYnNldHRpbmdzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvc291cmNlL2NvbS9pYm0vdGVzdC93ZWIvQy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvc291cmNlL2NvbS9pYm0vdGVzdC93ZWIvQy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzFiMzk0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3NvdXJjZS9jb20vaWJtL3Rlc3Qvd2ViL0MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2UgY29tLmlibS50ZXN0LndlYjsKLXB1YmxpYyBjbGFzcyBDIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDCi0JICovCi0JcHVibGljIEMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM1MTYwYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1DbGFzcy1QYXRoOiBMb29zZUVBUkVqYi5qYXIKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi9jbGFzc2VzL2NvbS9pYm0vdGVzdC93ZWIvQy5jbGFzcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3dlYkFwcGxpY2F0aW9uL1dFQi1JTkYvY2xhc3Nlcy9jb20vaWJtL3Rlc3Qvd2ViL0MuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNTExMzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi9jbGFzc2VzL2NvbS9pYm0vdGVzdC93ZWIvQy5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3dlYkFwcGxpY2F0aW9uL1dFQi1JTkYvaWJtLXdlYi1ibmQueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi9pYm0td2ViLWJuZC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NDg0NGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi9pYm0td2ViLWJuZC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTx3ZWJhcHBibmQ6V2ViQXBwQmluZGluZyB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOndlYmFwcGJuZD0id2ViYXBwYm5kLnhtaSIgeG1sbnM6d2ViYXBwbGljYXRpb249IndlYmFwcGxpY2F0aW9uLnhtaSIgeG1pOmlkPSJXZWJBcHBCaW5kaW5nXzEiIHZpcnR1YWxIb3N0TmFtZT0iZGVmYXVsdF9ob3N0Ij4KLQk8d2ViYXBwIGhyZWY9IldFQi1JTkYvd2ViLnhtbCNXZWJBcHAiLz4KLTwvd2ViYXBwYm5kOldlYkFwcEJpbmRpbmc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi9pYm0td2ViLWV4dC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL2libS13ZWItZXh0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlYzI2Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL2libS13ZWItZXh0LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTx3ZWJhcHBleHQ6V2ViQXBwRXh0ZW5zaW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6d2ViYXBwZXh0PSJ3ZWJhcHBleHQueG1pIiB4bWxuczp3ZWJhcHBsaWNhdGlvbj0id2ViYXBwbGljYXRpb24ueG1pIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4bWk6aWQ9IldlYkFwcEV4dGVuc2lvbl8xIgotICByZWxvYWRJbnRlcnZhbD0iMyIKLSAgcmVsb2FkaW5nRW5hYmxlZD0idHJ1ZSIKLSAgZGVmYXVsdEVycm9yUGFnZT0iZXJyb3IuanNwIgotICBhZGRpdGlvbmFsQ2xhc3NQYXRoPSIiCi0gIGZpbGVTZXJ2aW5nRW5hYmxlZD0idHJ1ZSIKLSAgZGlyZWN0b3J5QnJvd3NpbmdFbmFibGVkPSJmYWxzZSIKLSAgc2VydmVTZXJ2bGV0c0J5Q2xhc3NuYW1lRW5hYmxlZD0idHJ1ZSI+Ci0JPHdlYkFwcCBocmVmPSJXRUItSU5GL3dlYi54bWwjV2ViQXBwIi8+Ci08L3dlYmFwcGV4dDpXZWJBcHBFeHRlbnNpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi93ZWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDEyZWZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3dlYkFwcGxpY2F0aW9uL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4yLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1hcHBfMl8yLmR0ZCI+Ci08d2ViLWFwcCBpZD0iV2ViQXBwIj4KLQk8ZGlzcGxheS1uYW1lPkxvb3NlRUFSV2ViPC9kaXNwbGF5LW5hbWU+Ci0JPHdlbGNvbWUtZmlsZS1saXN0PgotCQk8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLQkJPHdlbGNvbWUtZmlsZT5pbmRleC5odG08L3dlbGNvbWUtZmlsZT4KLQkJPHdlbGNvbWUtZmlsZT5pbmRleC5qc3A8L3dlbGNvbWUtZmlsZT4KLQkJPHdlbGNvbWUtZmlsZT5kZWZhdWx0Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLQkJPHdlbGNvbWUtZmlsZT5kZWZhdWx0Lmh0bTwvd2VsY29tZS1maWxlPgotCQk8d2VsY29tZS1maWxlPmRlZmF1bHQuanNwPC93ZWxjb21lLWZpbGU+Ci0JPC93ZWxjb21lLWZpbGUtbGlzdD4KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVV0aWwvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVV0aWwvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiM2ZhMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFVdGlsLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiIHJvb3RwYXRoPSJKUkVfU1JDUk9PVCIgc291cmNlcGF0aD0iSlJFX1NSQyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFVdGlsL2Jpbi9jb20vaWJtL3Rlc3QvQS5jbGFzcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVV0aWwvYmluL2NvbS9pYm0vdGVzdC9BLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNmZmYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVV0aWwvYmluL2NvbS9pYm0vdGVzdC9BLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhVXRpbC9zcmMvY29tL2libS90ZXN0L0EuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVV0aWwvc3JjL2NvbS9pYm0vdGVzdC9BLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZjA5YzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhVXRpbC9zcmMvY29tL2libS90ZXN0L0EuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2UgY29tLmlibS50ZXN0OwotcHVibGljIGNsYXNzIEEgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEEKLQkgKi8KLQlwdWJsaWMgQSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFXZWJMaWIvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIzZmEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJKUkVfTElCIiByb290cGF0aD0iSlJFX1NSQ1JPT1QiIHNvdXJjZXBhdGg9IkpSRV9TUkMiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhV2ViTGliL2Jpbi9jb20vaWJtL3dlYi90ZXN0L0IuY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFXZWJMaWIvYmluL2NvbS9pYm0vd2ViL3Rlc3QvQi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlZTU2NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFXZWJMaWIvYmluL2NvbS9pYm0vd2ViL3Rlc3QvQi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi9zcmMvY29tL2libS93ZWIvdGVzdC9CLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFXZWJMaWIvc3JjL2NvbS9pYm0vd2ViL3Rlc3QvQi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjE4NTMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi9zcmMvY29tL2libS93ZWIvdGVzdC9CLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wYWNrYWdlIGNvbS5pYm0ud2ViLnRlc3Q7Ci1wdWJsaWMgY2xhc3MgQiB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQgotCSAqLwotCXB1YmxpYyBCKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL2Jvby5qYXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9ib28uamFyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzQzZTNkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL2Jvby5qYXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQ2xhc3MtUGF0aDogdXRpbC5qYXIgTG9vc2VFQVJFamIvYmluIGZvb2Jhci5qYXIgCi0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvZm9vYmFyLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL2Zvb2Jhci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNzY3OTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvZm9vYmFyLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL3JlYWRtZS50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGQ1ZDE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGlzIG5vdCBhIGZ1bGwgICAgIHdvcmtzcGFjZTsgaXQgaXMganVzdCB0aGUgZmlsZXMgbmVjZXNzYXJ5IHRvIGVtdWxhdGUgb25lLCBmb3IgdW5pdCB0ZXN0aW5nIHRoZSBydW50aW1lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BbGxET01UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BbGxET01UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWI3NDIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQWxsRE9NVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCA1LCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEFsbERPTVRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQkKLS8vCXByaXZhdGUgUmVuZGVyZXJGYWN0b3J5IGRlZmF1bHRSZW5kZXJlckZhY3Rvcnk7Ci0KLS8vICAgIHB1YmxpYyBBbGxET01UZXN0cyhTdHJpbmcgbmFtZSkgewotLy8JCXN1cGVyKG5hbWUpOwotLy8JfQotCQotLy8JcHVibGljIEFsbERPTVRlc3RzKFN0cmluZyBuYW1lLCBSZW5kZXJlckZhY3RvcnkgcmYpIHsKLS8vCQlzdXBlcihuYW1lKTsKLS8vCQl0aGlzLmRlZmF1bHRSZW5kZXJlckZhY3RvcnkgPSByZjsKLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkFsbCBET00gVGVzdHMgZm9yIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdCIpOwotCQkvLyRKVW5pdC1CRUdJTiQKLQkJc3VpdGUuYWRkVGVzdChBcHBDbGllbnRFTUZFZGl0VGVzdC5zdWl0ZShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQXBwQ2xpZW50RU1GVGVzdC5zdWl0ZShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRWFyRU1GRWRpdFRlc3Quc3VpdGUoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCQlzdWl0ZS5hZGRUZXN0KEVhckVNRlRlc3Quc3VpdGUoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOyAvLwotCQlzdWl0ZS5hZGRUZXN0KEVqYkVNRkVkaXRUZXN0LnN1aXRlKEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQkJc3VpdGUuYWRkVGVzdChFamJFTUZUZXN0LnN1aXRlKEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQkJc3VpdGUuYWRkVGVzdChSYXJFTUZFZGl0VGVzdC5zdWl0ZShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0JCXN1aXRlLmFkZFRlc3QoUmFyRU1GVGVzdC5zdWl0ZShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0JCXN1aXRlLmFkZFRlc3QoV2FyRU1GRWRpdFRlc3Quc3VpdGUoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCQlzdWl0ZS5hZGRUZXN0KFdhckVNRlRlc3Quc3VpdGUoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCQlzdWl0ZS5hZGRUZXN0KFdlYlNlcnZpY2VzRU1GVGVzdC5zdWl0ZShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0JCS8vJEpVbml0LUVORCQKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQkganVuaXQudGV4dHVpLlRlc3RSdW5uZXIubWFpbihuZXcgU3RyaW5nW10geyBBbGxET01UZXN0cy5jbGFzcy5nZXROYW1lKCkgfSk7Ci0JfQkKLQkKLS8vCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hSZW5kZXJlcigpIHsKLS8vCQlSZW5kZXJlckZhY3Rvcnkuc2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKTsKLS8vCQotLy8JfQotLy8KLS8vCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hSZW5kZXJlckJhY2soKSB7Ci0vLwkJUmVuZGVyZXJGYWN0b3J5LnNldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSk7Ci0vLwl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQWxsU0FYVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQWxsU0FYVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5ZjY2Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FsbFNBWFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBTZXAgNSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkVNRjJTQVhSZW5kZXJlckZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxTQVhUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZXsKLQotLy8JcHJpdmF0ZSBSZW5kZXJlckZhY3RvcnkgZGVmYXVsdFJlbmRlcmVyRmFjdG9yeTsKLS8vCQotLy8JQWxsVGVzdHMgdGVzdHMgPSBuZXcgQWxsVGVzdHMoKTsgLy8gZm9yY2UgdGhlIGNsYXNzIHRvIGxvYWQgaWYgdGhpcyB0ZXN0IGlzIGxvYWRlZCAKLS8vICAKLS8vCXB1YmxpYyBBbGxTQVhUZXN0cyhTdHJpbmcgbmFtZSkgewotLy8JCXN1cGVyKG5hbWUpOwotLy8JfSAKLS8vCi0vLwlwdWJsaWMgQWxsU0FYVGVzdHMoU3RyaW5nIG5hbWUsIFJlbmRlcmVyRmFjdG9yeSByZikgewotLy8JCXN1cGVyKG5hbWUpOwotLy8JCXRoaXMuZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9IHJmOwotLy8JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiQWxsIFNBWCBUZXN0cyBmb3IgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0Iik7Ci0JCS8vJEpVbml0LUJFR0lOJAotCQlzdWl0ZS5hZGRUZXN0KEFwcENsaWVudEVNRkVkaXRUZXN0LnN1aXRlKEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQkJc3VpdGUuYWRkVGVzdChBcHBDbGllbnRFTUZUZXN0LnN1aXRlKEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQkJc3VpdGUuYWRkVGVzdChFYXJFTUZFZGl0VGVzdC5zdWl0ZShFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRWFyRU1GVGVzdC5zdWl0ZShFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7IC8vCi0JCXN1aXRlLmFkZFRlc3QoRWpiRU1GRWRpdFRlc3Quc3VpdGUoRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCQlzdWl0ZS5hZGRUZXN0KEVqYkVNRlRlc3Quc3VpdGUoRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSkpOwotCQlzdWl0ZS5hZGRUZXN0KFJhckVNRkVkaXRUZXN0LnN1aXRlKEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQkJc3VpdGUuYWRkVGVzdChSYXJFTUZUZXN0LnN1aXRlKEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQkJc3VpdGUuYWRkVGVzdChXYXJFTUZFZGl0VGVzdC5zdWl0ZShFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0JCXN1aXRlLmFkZFRlc3QoV2FyRU1GVGVzdC5zdWl0ZShFTUYyU0FYUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0JCXN1aXRlLmFkZFRlc3QoV2ViU2VydmljZXNFTUZUZXN0LnN1aXRlKEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQkJLy8kSlVuaXQtRU5EJAotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCSBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5tYWluKG5ldyBTdHJpbmdbXSB7IEFsbFNBWFRlc3RzLmNsYXNzLmdldE5hbWUoKSB9KTsKLQl9CQotCQotLy8JcHVibGljIHZvaWQgdGVzdFN3aXRjaFJlbmRlcmVyKCkgewotLy8JCVJlbmRlcmVyRmFjdG9yeS5zZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KEVNRjJTQVhSZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpOyAKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFN3aXRjaFJlbmRlcmVyQmFjaygpIHsKLS8vCQlSZW5kZXJlckZhY3Rvcnkuc2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeShkZWZhdWx0UmVuZGVyZXJGYWN0b3J5KTsKLS8vCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQWxsVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzMDA4Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3IgQ29tbW9uIEFyY2hpdmUgYW5kIEVNRiBUZXN0cyIpOwotICAgICAgICAvLyRKVW5pdC1CRUdJTiQKLQotCQlzdWl0ZS5hZGRUZXN0KEFsbERPTVRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEFsbFNBWFRlc3RzLnN1aXRlKCkpOwotCi0JCS8vJEpVbml0LUVORCQKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5tYWluKG5ldyBTdHJpbmdbXSB7IEFsbFRlc3RzLmNsYXNzLmdldE5hbWUoKSB9KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQXBwQ2xpZW50RU1GRWRpdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQXBwQ2xpZW50RU1GRWRpdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2NzlkNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FwcENsaWVudEVNRkVkaXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50RU1GRWRpdFRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GRWRpdGluZ1Rlc3QgewotICAgIEVBUkZpbGUgZWFyRmlsZTsKLSAgICBBcHBsaWNhdGlvbkNsaWVudEZpbGUgYXBwQ2xpZW50RmlsZTsKLQotICAgIHB1YmxpYyBBcHBDbGllbnRFTUZFZGl0VGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEFwcENsaWVudEVNRkVkaXRUZXN0KFN0cmluZyBuYW1lLCBSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgIAlzdXBlcihuYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LkFwcENsaWVudEVNRkVkaXRUZXN0IiwgIi1ub2xvYWRpbmciIH07Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQXBwQ2xpZW50RU1GRWRpdFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgQXBwQ2xpZW50RU1GRWRpdFRlc3QoInRlc3RBcHBsaWNhdGlvbkNsaWVudEVkaXQiLCBmYWN0b3J5KSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uQ2xpZW50RWRpdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBnZXRBcHBDbGllbnQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLjMiLCBhcHBDbGllbnRGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UpIGFwcENsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJc2V0TW9kdWxlVHlwZShBUFBfQ0xJRU5UKTsKLSAgICAgICAgZWRpdFJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotICAgICAgICBTdHJpbmcgb3V0ID0gY3VyRGlyICsgInRlc3RPdXRwdXQvRU1GTW9kZWxDcmVhdGlvblRlc3RzL0VkaXRBcHBFQVIiOwotICAgICAgICBhcHBDbGllbnRGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIGFwcENsaWVudEZpbGUuY2xvc2UoKTsKLQotICAgICAgICAvL0NvbXBhcmUKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJFTUZUZXN0cy9hcHBsaWNhdGlvbi1jbGllbnQueG1sIjsKLSAgICAgICAgU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyBvdXQgKyAiL0FwcENsaWVudGZvby9NRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIjsKLQkJc2V0SWdub3JlQXR0KGlnbm9yYWJsZUF0dHJpYnV0ZXMoKSk7Ci0gICAgICAgIC8vY29tcGFyZUNvbnRlbnRzKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZXRBcHBDbGllbnQoKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uLCBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImxvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvZm9vQVBQLyI7Ci0gICAgICAgIGFwcENsaWVudEZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcHBsaWNhdGlvbkNsaWVudEZpbGUoaW4pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQXBwQ2xpZW50RU1GVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BcHBDbGllbnRFTUZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYjg4NTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BcHBDbGllbnRFTUZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFwcGxpY2F0aW9uQ2xpZW50RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50RU1GVGVzdCBleHRlbmRzIEdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCB7Ci0gICAgRUFSRmlsZSBlYXJGaWxlOwotICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbkNsaWVudEZpbGUgYXBwQ2xpZW50RmlsZTsKLQlFQVJGaWxlIGVhckZpbGUxNDsKLQlBcHBsaWNhdGlvbkNsaWVudEZpbGUgYXBwQ2xpZW50RmlsZTE0OwotCi0gICAgcHVibGljIEFwcENsaWVudEVNRlRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBBcHBDbGllbnRFTUZUZXN0KFN0cmluZyBuYW1lLCBSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgIAlzdXBlcihuYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LkFwcENsaWVudEVNRlRlc3QiLCAiLW5vbG9hZGluZyIgfTsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZShSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFwcENsaWVudEVNRlRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgQXBwQ2xpZW50RU1GVGVzdCgidGVzdEFwcGxpY2F0aW9uQ2xpZW50UG9wdWxhdGlvbiIsIGZhY3RvcnkpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgQXBwQ2xpZW50RU1GVGVzdCgidGVzdDE0QXBwbGljYXRpb25DbGllbnRQb3B1bGF0aW9uIiwgZmFjdG9yeSkpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uQ2xpZW50UG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0gICAgICAgIGNyZWF0ZUVBUigpOwotICAgICAgICBjcmVhdGVBcHBDbGllbnQoKTsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UpIGFwcENsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotICAgICAgICBzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLSAgICAgICAgc2V0TW9kdWxlVHlwZShBUFBfQ0xJRU5UKTsKLSAgICAgICAgcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0KLQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9UZXN0QXBwRUFSIjsKLSAgICAgICAgZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotICAgICAgICBlYXJGaWxlLmNsb3NlKCk7Ci0KLSAgICAgICAgLy9Db21wYXJlCi0gICAgICAgIFN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgIkVNRlRlc3ROb0lEL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiOwotICAgICAgICBTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RBcHBFQVIvZm9vQVBQL01FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiOwotCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgdGVzdDE0QXBwbGljYXRpb25DbGllbnRQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCQljcmVhdGVFQVIoKTsKLQkJCWNyZWF0ZUFwcENsaWVudCgpOwotCi0JCQlBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UpIGFwcENsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkJREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLQkJCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQkJc2V0TW9kdWxlVHlwZShBUFBfQ0xJRU5UKTsKLQkJCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCi0JCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RBcHBFQVIxNCI7Ci0JCQllYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQkJCWdldEFwcDE0Q2xpZW50KCk7Ci0JCQlhc3NlcnRFcXVhbHMoIjEuNCIsIGFwcENsaWVudEZpbGUxNC5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFZlcnNpb24oKSk7Ci0JCQlvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdEFwcEVBUjE0XzIiOwotCQkJYXBwQ2xpZW50RmlsZTE0LmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCQlhcHBDbGllbnRGaWxlMTQuY2xvc2UoKTsKLQkJCQotCQkJLy9Db21wYXJlCi0JCQlTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0JCQlTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RBcHBFQVIxNC9mb29BUFAvTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbCI7Ci0JCQlTdHJpbmcgc2Vjb25kRGVwbG95bWVudERlc1VSSSA9IG91dCArICIvTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbCI7Ci0JCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJCWNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoY3VyRGVwbG95bWVudERlc1VSSSwgc2Vjb25kRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUFwcENsaWVudCgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotICAgICAgICBhcHBDbGllbnRGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVJbml0aWFsaXplZCgiZm9vQVBQIik7Ci0gICAgICAgIGFwcENsaWVudEZpbGUgPSAoQXBwbGljYXRpb25DbGllbnRGaWxlKSBlYXJGaWxlLmFkZENvcHkoYXBwQ2xpZW50RmlsZSk7Ci0gICAgICAgIGFwcENsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5zZXREaXNwbGF5TmFtZSgiZm9vQVBQIik7Ci0gICAgICAgIGFzc2VydFRydWUoYXBwQ2xpZW50RmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUVBUigpIHsKLSAgICAgICAgU3RyaW5nIGVhck5hbWUgPSAiVGVzdC5lYXIiOwotICAgICAgICBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoZWFyTmFtZSk7Ci0gICAgICAgIGFzc2VydFRydWUoZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotICAgIH0KLSAgICAKLSAgICAKLQlwdWJsaWMgdm9pZCBnZXRBcHAxNENsaWVudCgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9UZXN0QXBwRUFSMTQvZm9vQVBQIjsKLQkJYXBwQ2xpZW50RmlsZTE0ID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXBwbGljYXRpb25DbGllbnRGaWxlKGluKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VhckVNRkVkaXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VhckVNRkVkaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDU3OTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FYXJFTUZFZGl0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEVhckVNRkVkaXRUZXN0IGV4dGVuZHMgR2VuZXJhbEVNRkVkaXRpbmdUZXN0IHsKLSAgICBFQVJGaWxlIGVhckZpbGU7Ci0gICAgaW50IGNyZWF0ZWRNb2R1bGVzID0gMDsKLQotICAgIHByaXZhdGUgaW50IE5VTV9NT0RVTEVTID0gNDsKLQotICAgIHB1YmxpYyBFYXJFTUZFZGl0VGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEVhckVNRkVkaXRUZXN0KFN0cmluZyBuYW1lLCBSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgIAlzdXBlcihuYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0JCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LkVhckVNRkVkaXRUZXN0IiwgIi1ub2xvYWRpbmciIH07Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShFYXJFTUZFZGl0VGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBFYXJFTUZFZGl0VGVzdCgidGVzdEVBUkVkaXQiLCBmYWN0b3J5KSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RUFSRWRpdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBnZXRFQVIoKTsKLQotCQlhc3NlcnRFcXVhbHMoIjEuMiIsIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRWZXJzaW9uKCkpOwotCi0gICAgICAgIEFwcGxpY2F0aW9uUmVzb3VyY2UgREQgPSAoQXBwbGljYXRpb25SZXNvdXJjZSkgZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlzZXRNb2R1bGVUeXBlKEFQUElDQVRJT04pOyAKLSAgICAgICAgZWRpdFJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG91dCA9IGN1ckRpciArInRlc3RPdXRwdXQvRWRpdE91dHB1dC9FTUZNb2RlbENyZWF0aW9uVGVzdHMvRWRpdEVBUiI7Ci0gICAgICAgIGVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLSAgICAgICAgZWFyRmlsZS5jbG9zZSgpOwotCi0gICAgICAgIC8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0gICAgICAgCi0gICAgICAgIFN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJFTUZUZXN0cy9hcHBsaWNhdGlvbi54bWwiOwotICAgICAgICBTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArIG91dCArICIvTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIjsKLSAgICAgICAgLy9jb21wYXJlQ29udGVudHMoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldEVBUigpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImxvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVIvIjsKLSAgICAgICAgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoaW4pOwotICAgICAgICBhc3NlcnRUcnVlKGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLSAgICB9Ci0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIk1vZHVsZSIpKSB7Ci0JCQljcmVhdGVkTW9kdWxlcysrOwotCQkJc3dpdGNoIChjcmVhdGVkTW9kdWxlcykgewotCQkJCWNhc2UgKDEpIDoKLQkJCQkJcmV0dXJuIGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQkJY2FzZSAoMikgOgotCQkJCQlyZXR1cm4gY3JlYXRlRUpCTW9kdWxlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJCWNhc2UgKDMpIDoKLQkJCQkJcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCQljYXNlICg0KSA6Ci0JCQkJCXJldHVybiBjcmVhdGVDb25uZXRvck1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlQ29ubmV0b3JNb2R1bGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoQXBwbGljYXRpb25GYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlQ29ubmVjdG9yTW9kdWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVdlYk1vZHVsZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChBcHBsaWNhdGlvbkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVXZWJNb2R1bGUoKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlRUpCTW9kdWxlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiAoKEFwcGxpY2F0aW9uRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZUVqYk1vZHVsZSgpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVKYXZhTW9kdWxlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiAoKEFwcGxpY2F0aW9uRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZUphdmFDbGllbnRNb2R1bGUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFNoYXJlZE9iamVjdEJ5VHlwZShFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoIm1vZHVsZSIpKQotCQkJcmV0dXJuIGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZSgoRUNsYXNzKSByZWYuZ2V0RVR5cGUoKSk7Ci0JCXJldHVybiBzdXBlci5nZXRTaGFyZWRPYmplY3RCeVR5cGUob3duZXIsIHJlZik7Ci0JfQotCi0JcHVibGljIGludCBnZXREZXB0aEZvckF0dHJpYnV0ZShFUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoIm1vZHVsZXMiKSkKLQkJCXJldHVybiBOVU1fTU9EVUxFUzsKLQkJcmV0dXJuIHN1cGVyLmdldERlcHRoRm9yQXR0cmlidXRlKHJlZik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FYXJFTUZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VhckVNRlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzM2Q4OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VhckVNRlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgRWFyRU1GVGVzdCBleHRlbmRzIEdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCB7Ci0gICAgcHJvdGVjdGVkIEVBUkZpbGUgZWFyRmlsZTsKLSAgICBpbnQgY3JlYXRlZE1vZHVsZXMgPSAwOwotCi0gICAgcHJpdmF0ZSBpbnQgTlVNX01PRFVMRVMgPSA1OwotCi0gICAgcHVibGljIEVhckVNRlRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBFYXJFTUZUZXN0KFN0cmluZyBuYW1lLCBSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgIAlzdXBlcihuYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LkVhckVNRlRlc3QiLCAiLW5vbG9hZGluZyIgfTsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZShSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEVhckVNRlRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgRWFyRU1GVGVzdCgidGVzdEVBUlBvcHVsYXRpb24iLCBmYWN0b3J5KSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVhckVNRlRlc3QoInRlc3QxNEVBUlBvcHVsYXRpb24iLCBmYWN0b3J5KSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RUFSUG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0gICAgICAgIGNyZWF0ZUVBUigpOwotICAgICAgICAvL2NyZWF0ZUFwcENsaWVudCgpOwotCi0gICAgICAgIEFwcGxpY2F0aW9uUmVzb3VyY2UgREQgPSAoQXBwbGljYXRpb25SZXNvdXJjZSkgZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCS8vVE9ETzogaW5kaXZpZHVhbCB0ZXN0IGZvciBlYWNoIHZlcnNpb24KLQkJREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXNldE1vZHVsZVR5cGUoQVBQTElDQVRJT04pOwotICAgICAgICBwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RFQVIiOwotICAgICAgICBlYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIGVhckZpbGUuY2xvc2UoKTsKLQotICAgICAgICAvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotICAgICAgICBTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0gICAgICAgIFN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJFTUZUZXN0Tm9JRC9hcHBsaWNhdGlvbi54bWwiOwotICAgICAgICBTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RFQVIvTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIjsKLQkJc2V0SWdub3JlQXR0KGlnbm9yYWJsZUF0dHJpYnV0ZXMoKSk7Ci0JCWNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkksIG51bGwpOwotICAgIH0KLSAgICAKLQlwdWJsaWMgdm9pZCB0ZXN0MTRFQVJQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJY3JlYXRlRUFSKCk7Ci0JCS8vY3JlYXRlQXBwQ2xpZW50KCk7Ci0KLQkJQXBwbGljYXRpb25SZXNvdXJjZSBERCA9IChBcHBsaWNhdGlvblJlc291cmNlKSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJc2V0TW9kdWxlVHlwZShBUFBMSUNBVElPTik7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdEVBUjE0IjsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQkJZ2V0RUFSKCk7Ci0JCWFzc2VydEVxdWFscygiMS40IiwgZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFZlcnNpb24oKSk7Ci0JCW91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9UZXN0RUFSMTRfMiI7Ci0JCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJCi0JCWVhckZpbGUuY2xvc2UoKTsKLQotCQkvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotCQlTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0JCVN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IG91dCArICIvTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIjsKLQkJU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9UZXN0RUFSMTQvTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIjsKLQkJc2V0SWdub3JlQXR0KGlnbm9yYWJsZUF0dHJpYnV0ZXMoKSk7Ci0JCWNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkksIG51bGwpOwotCX0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVFQVIoKSB7Ci0gICAgICAgIFN0cmluZyBlYXJOYW1lID0gIlRlc3QuZWFyIjsKLSAgICAgICAgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKGVhck5hbWUpOwotICAgICAgICBhc3NlcnRUcnVlKGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCBnZXRFQVIoKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgaW4gPUF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9UZXN0RUFSMTQiOwotCQllYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShpbik7Ci0JCWFzc2VydFRydWUoZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotCX0KLQotICAgIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZUluc3RhbmNlKEVSZWZlcmVuY2UgcmVmLCBFT2JqZWN0IGVPYmplY3QpIHsKLQkJRUNsYXNzIGVDbGFzc2lmaWVyID0gKEVDbGFzcylyZWYuZ2V0RVR5cGUoKTsKLSAgICAgICAgaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIk1vZHVsZSIpKSB7Ci0gICAgICAgICAgICBjcmVhdGVkTW9kdWxlcysrOwotICAgICAgICAgICAgc3dpdGNoIChjcmVhdGVkTW9kdWxlcykgewotICAgICAgICAgICAgICAgIGNhc2UgKDEpIDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0gICAgICAgICAgICAgICAgY2FzZSAoMikgOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRUpCTW9kdWxlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgICAgICAgICAgICAgIGNhc2UgKDMpIDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICAgICAgICAgICAgICBjYXNlICg0KSA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVDb25uZXRvck1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUluc3RhbmNlKHJlZixlT2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVPYmplY3QgY3JlYXRlQ29ubmV0b3JNb2R1bGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLSAgICAgICAgcmV0dXJuICgoQXBwbGljYXRpb25GYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlQ29ubmVjdG9yTW9kdWxlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVdlYk1vZHVsZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotICAgICAgICByZXR1cm4gKChBcHBsaWNhdGlvbkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVXZWJNb2R1bGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVPYmplY3QgY3JlYXRlRUpCTW9kdWxlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIHJldHVybiAoKEFwcGxpY2F0aW9uRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZUVqYk1vZHVsZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRU9iamVjdCBjcmVhdGVKYXZhTW9kdWxlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIHJldHVybiAoKEFwcGxpY2F0aW9uRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZUphdmFDbGllbnRNb2R1bGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFNoYXJlZE9iamVjdEJ5VHlwZShFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZikgewotICAgICAgICBpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoIm1vZHVsZSIpKQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZSgoRUNsYXNzKSByZWYuZ2V0RVR5cGUoKSk7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRTaGFyZWRPYmplY3RCeVR5cGUob3duZXIsIHJlZik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXREZXB0aEZvckF0dHJpYnV0ZShFU3RydWN0dXJhbEZlYXR1cmUgcmVmKSB7Ci0gICAgICAgIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygibW9kdWxlcyIpKQotICAgICAgICAgICAgcmV0dXJuIE5VTV9NT0RVTEVTOwotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGVwdGhGb3JBdHRyaWJ1dGUocmVmKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FamJFTUZFZGl0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FamJFTUZFZGl0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDBjZjFiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvRWpiRU1GRWRpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJvbGVTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuTWV0aG9kUGVybWlzc2lvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmludGVybmFsLmltcGwuUXVlcnlNZXRob2RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkVNRjJTQVhSZW5kZXJlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBFamJFTUZFZGl0VGVzdCBleHRlbmRzIEdlbmVyYWxFTUZFZGl0aW5nVGVzdCB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVqYlBhY2thZ2UgRUpCX1BLRyA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCUVBUkZpbGUgZWFyRmlsZTsKLQlFSkJKYXJGaWxlIGVqYkZpbGU7Ci0JRU9iamVjdCBtZXNCZWFuLCBlbnRpdHlCZWFuOwotCVNlY3VyaXR5SWRlbnRpdHkgc2VjSUQ7Ci0JUm9sZVNvdXJjZSByb2xlU291cmNlOwotCWludCBOVU1fQkVBTlMgPSAxMDsKLQlmaW5hbCBpbnQgTlVNX1JFTEFUSU9OX1JPTEVTID0gMjsKLQlpbnQgY3JlYXRlZEJlYW5zID0gMDsKLQlpbnQgY3JlYXRlZFNlY1JvbGVzID0gMDsKLQlwcm90ZWN0ZWQgaW50IGNyZWF0ZWRTZWN1cml0eUlkZW50aXRpZXMgPSAwOwotCWJvb2xlYW4gbXBGbGFnID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgRWpiRU1GRWRpdFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBFamJFTUZFZGl0VGVzdChTdHJpbmcgbmFtZSwgUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAJc3VwZXIobmFtZSwgZmFjdG9yeSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCWp1bml0LnRleHR1aS5UZXN0UnVubmVyLm1haW4obmV3IFN0cmluZ1tdIHsgRWpiRU1GRWRpdFRlc3QuY2xhc3MuZ2V0TmFtZSgpIH0pOyAKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoRWpiRU1GRWRpdFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgRWpiRU1GRWRpdFRlc3QoInRlc3RFSkJKYXJFZGl0IixmYWN0b3J5KSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IEVqYkVNRkVkaXRUZXN0KCJ0ZXN0V0NDTUphciIsZmFjdG9yeSkpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVKQkphckVkaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0RUpCKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIyLjAiLCBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJc2V0TW9kdWxlVHlwZShFSkIpOyAKLSAgICAgICAgZWRpdFJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotICAgICAgICBTdHJpbmcgb3V0ID0gY3VyRGlyICsgInRlc3RPdXRwdXQvRU1GTW9kZWxDcmVhdGlvblRlc3RzL0VkaXRFamJFQVIiOwotICAgICAgICBlamJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIGVqYkZpbGUuY2xvc2UoKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gbnVsbDsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7Ci0gICAgICAgIGlmIChSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpIGluc3RhbmNlb2YgRU1GMlNBWFJlbmRlcmVyRmFjdG9yeSl7Ci0gICAgICAgICAgICBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJFTUZUZXN0cy9lamItamFyMi0wc2F4LnhtbCI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAiRU1GVGVzdHMvZWpiLWphcjItMC54bWwiOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRmlsZTogIiArIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJKTsKLSAgICAgICAgU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBvdXQgKyAiL01FVEEtSU5GL2VqYi1qYXIueG1sIjsKLSAgICAgICAgLy9UT0RPIFJlbW92ZSBhZnRlciB3ZWJzZXJ2aWNlcyB4c2QgaXMgcmVzdG9yZWQKLSAgICAgICAgLy9jb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJLCAiIik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdDQ01KYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiLi4vdGVzdERhdGEvZWpiIjsKLQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQlvcHRpb25zLnNldElzUmVhZE9ubHkodHJ1ZSk7Ci0JCWVqYkZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FSkJKYXJGaWxlKG9wdGlvbnMsIGluKTsgCi0JCSAKLSAgICAgICAgRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlERC5nZXRSb290T2JqZWN0KCk7Ci0KLSAgICAgICAgU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIi4uL3Rlc3REYXRhL3Rlc3RPdXRwdXQiOwotICAgICAgICBlamJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIGVqYkZpbGUuY2xvc2UoKTsKLQotICAgICAgICAvKkRELnNhdmUoU3lzdGVtLm91dCwgbnVsbCk7ICovCi0gICAgICAgIAotICAgICAgICAvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotICAgICAgICBTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0gICAgICAgIFN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGluICsgIi9NRVRBLUlORi9lamItamFyLnhtbCI7Ci0gICAgICAgIFN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gb3V0ICsgIi9NRVRBLUlORi9lamItamFyLnhtbCI7Ci0KLSAgICAgICAgY29tcGFyZUNvbnRlbnRzKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVxdWlyZXMgajJlZS5jb3JlLndzLmV4dCB0byBiZSBvbiB0aGUgY2xhc3NwYXRoCi0gICAgICogQHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24KLSAgICAgKiBAdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uCi0gICAgICovCi0vKiAgICBwdWJsaWMgdm9pZCB0ZXN0V0NDTVByb3ZpZGVkQ2FzZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIi4uL3djY20vZWFyIjsKLSAgICAgICAgRUFSRmlsZSBlYXJGaWxlID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAKLSAgICAgICAgICAgIENvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkgPQotICAgICAgICAgICAgICAgICAgICBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpOwotICAgICAgICAgICAgQXJjaGl2ZU9wdGlvbnMgb3B0ID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0gICAgICAgICAgICBvcHQuc2V0SXNSZWFkT25seSAodHJ1ZSk7Ci0gICAgICAgICAgICBvcHQuc2V0VXNlSmF2YVJlZmxlY3Rpb24gKGZhbHNlKTsKLSAKLSAgICAgICAgICAgIGVhckZpbGUgPSBmYWN0b3J5Lm9wZW5FQVJGaWxlIChvcHQsIGluKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoInVyaTogIiArIGVhckZpbGUuZ2V0VVJJKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuICgib3JpZ3VyaTogIiArIGVhckZpbGUuZ2V0T3JpZ2luYWxVUkkoKSk7Ci0gCi0gICAgICAgICAgICBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIEFwcGxpY2F0aW9uQmluZGluZyBhcHBCaW5kaW5ncyA9IGVhckZpbGUuZ2V0QmluZGluZ3MoKTsKLSAgICAgICAgICAgIEFwcGxpY2F0aW9uRXh0ZW5zaW9uIGFwcEV4dGVuc2lvbnMgPSBlYXJGaWxlLmdldEV4dGVuc2lvbnMoKTsKLSAKLQotICAgICAgICBJdGVyYXRvciBycyA9IGVhckZpbGUuZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKHJzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVzb3VyY2UgciA9IChSZXNvdXJjZSkgcnMubmV4dCgpOwotIAotICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmbyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtIChyLmdldFVSSSgpLnRvU3RyaW5nKCkucmVwbGFjZSgnLycsICctJykpOwotICAgICAgICAgICAgci5zYXZlIChmbywgbmV3IEhhc2hNYXAoKSk7Ci0gICAgICAgICAgICBmby5mbHVzaCgpOwotICAgICAgICAgICAgZm8uY2xvc2UoKTsKLSAgICAgICAgfQotIAotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PERvbmUgQXBwIEREPj09PT09PT09PT0iKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoIiIpOwotIAotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkgewotICAgICAgICAgICAgaWYoZWFyRmlsZSAhPSBudWxsKQotICAgICAgICAgICAgZWFyRmlsZS5jbG9zZSgpOwotICAgICAgICB9Ci0KLSAgICB9Ki8KLQotICAgIHB1YmxpYyB2b2lkIGdldEVKQigpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAibG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvIjsKLQkJIGVqYkZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FSkJKYXJGaWxlKGluKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0gICAgfQotCi0JcHVibGljIEVPYmplY3QgY3JlYXRlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCWlmIChlQ2xhc3NpZmllci5nZXROYW1lKCkuZXF1YWxzKCJFbnRlcnByaXNlQmVhbiIpKSB7Ci0JCQljcmVhdGVkQmVhbnMrKzsKLQkJCXN3aXRjaCAoY3JlYXRlZEJlYW5zKSB7Ci0JCQkJY2FzZSAoMykgOgotCQkJCQlyZXR1cm4gY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCQljYXNlICg3KSA6Ci0JCQkJCXJldHVybiBjcmVhdGVNZXNzYWdlQmVhbkluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCQljYXNlICg0KSA6Ci0JCQkJY2FzZSAoOCkgOgotCQkJCQlyZXR1cm4gY3JlYXRlU2Vzc2lvbkJlYW5JbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBjcmVhdGVFbnRpdHlCZWFuSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJfQotCQl9IGVsc2UgaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIlNlY3VyaXR5SWRlbnRpdHkiKSkKLQkJCXJldHVybiBjcmVhdGVTZWN1cml0eUlkZW50aXRpeUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJZWxzZSBpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiUm9sZVNvdXJjZSIpKQotCQkJcmV0dXJuIGNyZWF0ZVJvbGVTb3VyY2VJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCWVsc2UgaWYgKGVDbGFzc2lmaWVyID09IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUF0dHJpYnV0ZSgpKQotCQkJcmV0dXJuIGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlU2VjdXJpdHlJZGVudGl0aXlJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJLyogQWx0ZXJuYXRlIHR5cGVzICovCi0JCWNyZWF0ZWRTZWNSb2xlcysrOwotCQlpZiAoKGNyZWF0ZWRTZWNSb2xlcyAmIDEpID09IDApCi0JCQlyZXR1cm4gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVXNlQ2FsbGVySWRlbnRpdHkoKTsKLQkJZWxzZQotCQkJcmV0dXJuIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlUm9sZVNvdXJjZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlUm9sZVNvdXJjZSgpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVNZXNzYWdlQmVhbkluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlTWVzc2FnZURyaXZlbigpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVTZXNzaW9uQmVhbkluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlU2Vzc2lvbigpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVFbnRpdHlCZWFuSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVFbnRpdHkoKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0LkdlbmVyYWxFTUZUZXN0I2dldERlcHRoRm9yQXR0cmlidXRlKEVSZWZlcmVuY2UpCi0JICovCi0JcHVibGljIGludCBnZXREZXB0aEZvckF0dHJpYnV0ZShFUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoImVudGVycHJpc2VCZWFucyIpKQotCQkJcmV0dXJuIE5VTV9CRUFOUzsKLQkJZWxzZSBpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoImVudGl0eUJlYW5zIikpCi0JCQlyZXR1cm4gTlVNX0JFQU5TOwotCQllbHNlIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygicmVsYXRpb25zaGlwUm9sZXMiKSkKLQkJCXJldHVybiBOVU1fUkVMQVRJT05fUk9MRVM7Ci0JCXJldHVybiBzdXBlci5nZXREZXB0aEZvckF0dHJpYnV0ZShyZWYpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0LkdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCNwb3B1bGF0ZUZlYXR1cmVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSovCi0JcHVibGljIHZvaWQgcG9wdWxhdGVGZWF0dXJlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QuZUNsYXNzKCkgPT0gRUpCX1BLRy5nZXRDTVBBdHRyaWJ1dGUoKSkgewotCQkJKChDTVBBdHRyaWJ1dGUpIGVPYmplY3QpLnNldE5hbWUoKFN0cmluZykgRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVBdHRyaWJ1dGUoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKSxlT2JqZWN0KSk7Ci0JCQkoKENNUEF0dHJpYnV0ZSkgZU9iamVjdCkuc2V0RVR5cGUoKEVDbGFzc2lmaWVyKSBjcmVhdGVKYXZhQ2xhc3NQcm94eShudWxsKSk7Ci0JCX0gZWxzZQotCQkJc3VwZXIuZWRpdEZlYXR1cmVzKGVPYmplY3QpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdC5HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QjcG9wdWxhdGVBdHRyaWJ1dGVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQXR0cmlidXRlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBRdWVyeU1ldGhvZEltcGwpIHsKLQkJCUxpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotCQkJCUVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJCU9iamVjdCB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCQkJaWYgKGF0dC5nZXROYW1lKCkuZXF1YWxzKCJwYXJtcyIpICYmIHZhbHVlID09IG51bGwpewotCQkJCQl2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCQkJfQotCQkJCWlmIChhdHQuaXNDaGFuZ2VhYmxlKCkpCi0JCQkJCWVPYmplY3QuZVNldChhdHQsIHZhbHVlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGVybWlzc2lvbkltcGwpIHsKLQkJCUxpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotCQkJCUVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJCWlmKGF0dC5nZXROYW1lKCkuZXF1YWxzKCJ1bmNoZWNrZWQiKSAmJiBtcEZsYWcpewotCQkJCQljb250aW51ZTsJCQkJCQotCQkJCX0JCi0JCQkJCi0JCQkJT2JqZWN0IHZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJCQlpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpKQotCQkJCQllT2JqZWN0LmVTZXQoYXR0LCB2YWx1ZSk7Ci0JCQl9IAotCQkJbXBGbGFnID0gIW1wRmxhZzsKLQkJfSBlbHNlCi0JCQlzdXBlci5lZGl0QXR0cmlidXRlcyhlT2JqZWN0KTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQZXJtaXNzaW9uSW1wbCAmJiByZWYuZ2V0TmFtZSgpLmVxdWFscygicm9sZXMiKSl7Ci0JCQltcEZsYWcgPSAhbXBGbGFnOwotCQkJLy9pZiBtZXRob2QgcGVybWlzc2lvbiB1bmNoZWNrZWQgaWdub3JlIHJvbGVzCi0JCQlpZighbXBGbGFnKXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIucG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoZU9iamVjdCwgcmVmKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWVhckZpbGUgPSBudWxsOwotCQllamJGaWxlID0gbnVsbDsKLQkJbWVzQmVhbiA9IG51bGw7Ci0JCWVudGl0eUJlYW4gPSBudWxsOwotCQlzZWNJRCAgPSBudWxsOwotCQlyb2xlU291cmNlID0gbnVsbDsKLQotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvRWpiRU1GVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FamJFTUZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYmZmY2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FamJFTUZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFDbGFzc0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RQZXJtaXNzaW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeU1ldGhvZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUluaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBFamJFTUZUZXN0IGV4dGVuZHMgR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0IHsKLQlzdGF0aWMgewotCQkvL1RlbXBvcmFyeSB3b3JrYXJvdW5kIHRvIGtlZXAgcGFja2FnZXMgZnJvbSBiZWluZyByZWdpc3RlcmVkIHR3aWNlCi0JCUoyRUVJbml0LmluaXQoKTsKLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFamJQYWNrYWdlIEVKQl9QS0cgPSBFamJQYWNrYWdlLmVJTlNUQU5DRTsKLQlFQVJGaWxlIGVhckZpbGU7Ci0JcHJvdGVjdGVkIEVKQkphckZpbGUgZWpiRmlsZTsKLQlFT2JqZWN0IG1lc0JlYW4sIGVudGl0eUJlYW47Ci0JU2VjdXJpdHlJZGVudGl0eSBzZWNJRDsKLQlSb2xlU291cmNlIHJvbGVTb3VyY2U7Ci0JaW50IE5VTV9CRUFOUyA9IDEwOwotCWZpbmFsIGludCBOVU1fUkVMQVRJT05fUk9MRVMgPSAyOwotCWludCBjcmVhdGVkQmVhbnMgPSAwOwotCWludCBjcmVhdGVkU2VjUm9sZXMgPSAwOwotCXByb3RlY3RlZCBpbnQgY3JlYXRlZFNlY3VyaXR5SWRlbnRpdGllcyA9IDA7Ci0JYm9vbGVhbiBtcEZsYWcgPSBmYWxzZTsKLQlib29sZWFuIGZpcnN0UmV0dXJuVHlwZU1hcHBpbmcgPSB0cnVlOwotCQotCXB1YmxpYyBFamJFTUZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLSAgICBwdWJsaWMgRWpiRU1GVGVzdChTdHJpbmcgbmFtZSwgUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAJc3VwZXIobmFtZSwgZmFjdG9yeSk7Ci0gICAgfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCWp1bml0LnRleHR1aS5UZXN0UnVubmVyLm1haW4obmV3IFN0cmluZ1tdIHsgRWpiRU1GVGVzdC5jbGFzcy5nZXROYW1lKCl9KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoRWpiRU1GVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFamJFTUZUZXN0KCJ0ZXN0RUpCSmFyUG9wdWxhdGlvbiIsZmFjdG9yeSkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFamJFTUZUZXN0KCJ0ZXN0MTRFSkJKYXJQb3B1bGF0aW9uIixmYWN0b3J5KSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RUpCSmFyUG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCWNyZWF0ZUVBUigpOwotCQljcmVhdGVFSkIoKTsKLQotCQlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCS8vVE9ETzogaW5kaXZpZHVhbCB0ZXN0IGZvciBlYWNoIHZlcnNpb24KLQkJREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXNldE1vZHVsZVR5cGUoRUpCKTsKLQkJcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0KLQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9UZXN0RUpCRUFSIjsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0JCXNldEVxdWl2YWxlbnRMaW5lcyhnZXRFcXVpdmFsZW50TGluZXNNYXAoKSk7Ci0JCS8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0JCVN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLQkJU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgIi9FTUZUZXN0Tm9JRC9lamItamFyLnhtbCI7Ci0JCVN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgInRlc3RPdXRwdXQvVGVzdEVKQkVBUi9mb29FSkIvTUVUQS1JTkYvZWpiLWphci54bWwiOwotCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0vLwkJREQudW5sb2FkKCk7Ci0vLwkJREQubG9hZChuZXcgSGFzaE1hcCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDE0RUpCSmFyUG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCWNyZWF0ZUVBUigpOwotCQljcmVhdGVFSkIoKTsKLQotCQlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCS8vVE9ETzogaW5kaXZpZHVhbCB0ZXN0IGZvciBlYWNoIHZlcnNpb24KLQkJREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCXNldE1vZHVsZVR5cGUoRUpCKTsKLQkJLy9zZXRHZW5lcmFsRGVwdGgoMik7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RFSkJFQVIxNCI7Ci0JCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJZWFyRmlsZS5jbG9zZSgpOwotCQkKLQkJc2V0RXF1aXZhbGVudExpbmVzKGdldEVxdWl2YWxlbnRMaW5lc01hcCgpKTsKLQkJZ2V0RUpCKCk7Ci0JCWFzc2VydEVxdWFscygiMi4xIiwgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFZlcnNpb24oKSk7Ci0JCW91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9UZXN0RUpCRUFSMTRfMiI7Ci0JCWVqYkZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJZWpiRmlsZS5jbG9zZSgpOwotCi0JCS8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0JCVN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLQkJU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gb3V0ICsgIi9NRVRBLUlORi9lamItamFyLnhtbCI7Ci0JCVN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgInRlc3RPdXRwdXQvVGVzdEVKQkVBUjE0L2Zvb0VKQi9NRVRBLUlORi9lamItamFyLnhtbCI7Ci0JCXNldElnbm9yZUF0dChpZ25vcmFibGVBdHRyaWJ1dGVzKCkpOwotCQljb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTWFwIGdldEVxdWl2YWxlbnRMaW5lc01hcCgpIHsKLQkJTWFwIGxpbmVzID0gbmV3IEhhc2hNYXAoKTsKLQkJbGluZXMucHV0KCI8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4iLCAiPGNhc2NhZGUtZGVsZXRlLz4iKTsKLQkJbGluZXMucHV0KCI8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+IiwiPG1ldGhvZC1wYXJhbXMvPiIpOwotCQlsaW5lcy5wdXQoIjx1bmNoZWNrZWQ+PC91bmNoZWNrZWQ+IiwiPHVuY2hlY2tlZC8+Iik7IAotCQlsaW5lcy5wdXQoIjx1c2UtY2FsbGVyLWlkZW50aXR5PjwvdXNlLWNhbGxlci1pZGVudGl0eT4iLCI8dXNlLWNhbGxlci1pZGVudGl0eS8+Iik7Ci0JCXJldHVybiBsaW5lczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZXRFSkIoKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uLCBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9UZXN0RUpCRUFSMTQvZm9vRUpCIjsKLQkJZWpiRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVKQkphckZpbGUoaW4pOwotCQlhc3NlcnRUcnVlKGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVFSkIoKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJZWpiRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUpCSmFyRmlsZUluaXRpYWxpemVkKCJmb29FSkIiKTsKLQkJZWpiRmlsZSA9IChFSkJKYXJGaWxlKSBlYXJGaWxlLmFkZENvcHkoZWpiRmlsZSk7Ci0JCWVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5zZXREaXNwbGF5TmFtZSgiZm9vRUpCIik7Ci0JCWFzc2VydFRydWUoZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUVBUigpIHsKLQkJU3RyaW5nIGVhck5hbWUgPSAiVGVzdC5lYXIiOwotCQllYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoZWFyTmFtZSk7Ci0JCWFzc2VydFRydWUoZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUluc3RhbmNlKEVSZWZlcmVuY2UgcmVmLCBFT2JqZWN0IGVPYmplY3QpIHsKLQkJRUNsYXNzIGVDbGFzc2lmaWVyID0gKEVDbGFzcylyZWYuZ2V0RVR5cGUoKTsKLQkJaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIkVudGVycHJpc2VCZWFuIikpIHsKLQkJCWNyZWF0ZWRCZWFucysrOwotCQkJc3dpdGNoIChjcmVhdGVkQmVhbnMpIHsKLQkJCQljYXNlICgzKSA6Ci0JCQkJCXJldHVybiBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5SW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJCWNhc2UgKDcpIDoKLQkJCQkJcmV0dXJuIGNyZWF0ZU1lc3NhZ2VCZWFuSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJCWNhc2UgKDQpIDoKLQkJCQljYXNlICg4KSA6Ci0JCQkJCXJldHVybiBjcmVhdGVTZXNzaW9uQmVhbkluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGNyZWF0ZUVudGl0eUJlYW5JbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiU2VjdXJpdHlJZGVudGl0eSIpKQotCQkJcmV0dXJuIGNyZWF0ZVNlY3VyaXR5SWRlbnRpdGl5SW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQllbHNlIGlmIChlQ2xhc3NpZmllci5nZXROYW1lKCkuZXF1YWxzKCJSb2xlU291cmNlIikpCi0JCQlyZXR1cm4gY3JlYXRlUm9sZVNvdXJjZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJZWxzZSBpZiAoZUNsYXNzaWZpZXIgPT0gRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFQXR0cmlidXRlKCkpCi0JCQlyZXR1cm4gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotCQlyZXR1cm4gc3VwZXIuY3JlYXRlSW5zdGFuY2UocmVmLGVPYmplY3QpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVTZWN1cml0eUlkZW50aXRpeUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQkvKiBBbHRlcm5hdGUgdHlwZXMgKi8KLQkJY3JlYXRlZFNlY1JvbGVzKys7Ci0JCWlmICgoY3JlYXRlZFNlY1JvbGVzICYgMSkgPT0gMCkKLQkJCXJldHVybiBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVc2VDYWxsZXJJZGVudGl0eSgpOwotCQllbHNlCi0JCQlyZXR1cm4gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVSb2xlU291cmNlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVSb2xlU291cmNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZU1lc3NhZ2VCZWFuSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVNZXNzYWdlRHJpdmVuKCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVNlc3Npb25CZWFuSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVTZXNzaW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUVudGl0eUJlYW5JbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZUVudGl0eSgpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5SW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3QuR2VuZXJhbEVNRlRlc3QjZ2V0RGVwdGhGb3JBdHRyaWJ1dGUoRVJlZmVyZW5jZSkKLQkgKi8KLQlwdWJsaWMgaW50IGdldERlcHRoRm9yQXR0cmlidXRlKEVTdHJ1Y3R1cmFsRmVhdHVyZSByZWYpIHsKLQkJaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKCJlbnRlcnByaXNlQmVhbnMiKSkKLQkJCXJldHVybiBOVU1fQkVBTlM7Ci0JCWVsc2UgaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKCJlbnRpdHlCZWFucyIpKQotCQkJcmV0dXJuIE5VTV9CRUFOUzsKLQkJZWxzZSBpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoInJlbGF0aW9uc2hpcFJvbGVzIikpCi0JCQlyZXR1cm4gTlVNX1JFTEFUSU9OX1JPTEVTOwotCQlyZXR1cm4gc3VwZXIuZ2V0RGVwdGhGb3JBdHRyaWJ1dGUocmVmKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdC5HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QjcG9wdWxhdGVGZWF0dXJlcyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkqLwotCXB1YmxpYyB2b2lkIHBvcHVsYXRlRmVhdHVyZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0LmVDbGFzcygpID09IEVKQl9QS0cuZ2V0Q01QQXR0cmlidXRlKCkpIHsKLQkJCSgoQ01QQXR0cmlidXRlKSBlT2JqZWN0KS5zZXROYW1lKChTdHJpbmcpIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlQXR0cmlidXRlKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU5hbWVkRWxlbWVudF9OYW1lKCksZU9iamVjdCkpOwotCQkJKChDTVBBdHRyaWJ1dGUpIGVPYmplY3QpLnNldEVUeXBlKChFQ2xhc3NpZmllcikgRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVKYXZhQ2xhc3NQcm94eShFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVUeXBlZEVsZW1lbnRfRVR5cGUoKSxlT2JqZWN0KSk7Ci0JCX0gZWxzZSBpZiAoZU9iamVjdC5lQ2xhc3MoKSA9PSBFSkJfUEtHLmdldENNUkZpZWxkKCkpIHsKLQkJCSgoQ01SRmllbGQpIGVPYmplY3QpLnNldE5hbWUoKFN0cmluZykgRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVBdHRyaWJ1dGUoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKSxlT2JqZWN0KSk7Ci0JCQlwb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShlT2JqZWN0LCBFSkJfUEtHLmdldENNUkZpZWxkX0NvbGxlY3Rpb25UeXBlKCkpOwotCQkJcG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoZU9iamVjdCwgRUpCX1BLRy5nZXRDTVJGaWVsZF9Sb2xlKCkpOwkJCi0JCX0gZWxzZQotCQkJc3VwZXIucG9wdWxhdGVGZWF0dXJlcyhlT2JqZWN0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmVtZnRlc3QuR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0I3BvcHVsYXRlQXR0cmlidXRlcyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUF0dHJpYnV0ZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgUXVlcnlNZXRob2RJbXBsKSB7Ci0JCQlMaXN0IGF0dHJpYnV0ZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsgCi0JCQkJRUF0dHJpYnV0ZSBhdHQgPSAoRUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0JCQkJaWYgKGF0dC5lcXVhbHMoRUpCX1BLRy5nZXRNZXRob2RFbGVtZW50X0Rlc2NyaXB0aW9uKCkpIHx8IGF0dC5lcXVhbHMoRUpCX1BLRy5nZXRNZXRob2RFbGVtZW50X0VudGVycHJpc2VCZWFuKCkpIHx8IGF0dC5lcXVhbHMoRUpCX1BLRy5nZXRNZXRob2RFbGVtZW50X1R5cGUoKSkgKQotCQkJCQljb250aW51ZTsKLQkJCQlPYmplY3QgdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCQkJCWlmIChhdHQuZ2V0TmFtZSgpLmVxdWFscygicGFybXMiKSAmJiB2YWx1ZSA9PSBudWxsKXsKLQkJCQkJdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCQkJCX0KLQkJCQlpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpKQotCQkJCQllT2JqZWN0LmVTZXQoYXR0LCB2YWx1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZU9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb25JbXBsKSB7Ci0JCQlMaXN0IGF0dHJpYnV0ZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFQXR0cmlidXRlIGF0dCA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLQkJCQlpZihhdHQuZ2V0TmFtZSgpLmVxdWFscygidW5jaGVja2VkIikgJiYgbXBGbGFnKXsKLQkJCQkJY29udGludWU7CQkJCQkKLQkJCQl9CQotCQkJCQotCQkJCU9iamVjdCB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCQkJaWYgKGF0dC5pc0NoYW5nZWFibGUoKSkKLQkJCQkJZU9iamVjdC5lU2V0KGF0dCwgdmFsdWUpOwotCQkJfSAKLQkJCW1wRmxhZyA9ICFtcEZsYWc7Ci0JCX0gZWxzZSBpZiAoZU9iamVjdCBpbnN0YW5jZW9mIEVKQlJlbGF0aW9uc2hpcFJvbGVJbXBsKSB7Ci0JCQlMaXN0IGF0dHJpYnV0ZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQlFQXR0cmlidXRlIGxhc3RBdHRyID0gbnVsbDsKLQkJCU9iamVjdCB2YWx1ZSA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFQXR0cmlidXRlIGF0dCA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLQkJCQlpZiAoYXR0LmdldE5hbWUoKS5lcXVhbHMoImNhc2NhZGVEZWxldGUiKSAmJiAobGFzdEF0dHIuZ2V0TmFtZSgpLmVxdWFscygibXVsdGlwbGljaXR5IikgJiYgIXZhbHVlLnRvU3RyaW5nKCkuZXF1YWxzKCJNYW55IikpKQotCQkJCQljb250aW51ZTsKLQotCQkJCXZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJCQlpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpKQotCQkJCQllT2JqZWN0LmVTZXQoYXR0LCB2YWx1ZSk7Ci0JCQkJbGFzdEF0dHIgPSBhdHQ7Ci0JCX0KLQkJCW1wRmxhZyA9ICFtcEZsYWc7Ci0JCX0gZWxzZQotCQkJc3VwZXIucG9wdWxhdGVBdHRyaWJ1dGVzKGVPYmplY3QpOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKEVPYmplY3QgZU9iamVjdCwgRVJlZmVyZW5jZSByZWYpIHsKLQkJaWYgKHJlZiA9PSBFSkJfUEtHLmdldENNUkZpZWxkX0NvbGxlY3Rpb25UeXBlKCkpIHsKLQkJCXNldFJlZmVyZW5jZVZhbHVlKGVPYmplY3QsIHJlZiwgSmF2YUNsYXNzSW1wbC5jcmVhdGVDbGFzc1JlZigiamF2YS51dGlsLkNvbGxlY3Rpb24iKSk7Ci0JCQlyZXR1cm47Ci0JCX0gZWxzZSBpZihlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGVybWlzc2lvbiAmJiByZWYuZ2V0TmFtZSgpLmVxdWFscygicm9sZXMiKSl7Ci0JCQkvL2lmIG1ldGhvZCBwZXJtaXNzaW9uIHVuY2hlY2tlZCBpZ25vcmUgcm9sZXMKLQkJCWlmKG1wRmxhZyl7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJbXBGbGFnID0gIW1wRmxhZzsKLQkJfQotCQlzdXBlci5wb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShlT2JqZWN0LCByZWYpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdC5HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QjY3JlYXRlQXR0cmlidXRlVmFsdWUob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGUsIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlQXR0cmlidXRlVmFsdWUoRUF0dHJpYnV0ZSBhdHQsIEVPYmplY3QgZU9iamVjdCkgewotCQkvL2VhdCB0aGUgZmlyc3QgcmV0dXJuIHR5cGUgbWFwcGluZyBiZWNhdXNlIHRoZSBvcmRlciB3YXMgY2hhbmdlZC4KLQkJaWYgKGZpcnN0UmV0dXJuVHlwZU1hcHBpbmcgJiYgYXR0LmVxdWFscyhFSkJfUEtHLmdldFF1ZXJ5X1JldHVyblR5cGVNYXBwaW5nKCkpKXsKLQkJCXN1cGVyLmNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCxlT2JqZWN0KTsKLQkJCWZpcnN0UmV0dXJuVHlwZU1hcHBpbmcgPSBmYWxzZTsKLQkJfSBlbHNlIGlmIChhdHQuZXF1YWxzKEVKQl9QS0cuZ2V0RW50ZXJwcmlzZUJlYW5fTmFtZSgpKSkKLQkJCXJldHVybiBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUF0dHJpYnV0ZShhdHQsRUpCX1BLRy5nZXRFbnRpdHkoKSk7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJZWFyRmlsZSA9IG51bGw7Ci0JCWVqYkZpbGUgPSBudWxsOwotCQltZXNCZWFuID0gbnVsbDsKLQkJZW50aXR5QmVhbiA9IG51bGw7Ci0JCXNlY0lEID0gbnVsbDsKLQkJcm9sZVNvdXJjZSA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9HZW5lcmFsRU1GRWRpdGluZ1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvR2VuZXJhbEVNRkVkaXRpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YTIyZGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9HZW5lcmFsRU1GRWRpdGluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uTGluZU51bWJlclJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuSjJFRVZlcnNpb25DaGVjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuVGVzdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmFsRU1GRWRpdGluZ1Rlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GVGVzdCB7Ci0JLy9pbm5lciBjbGFzcyB0byBoYW5kbGUgZGVmZmVyZWQgc2hhcmVkIHJlZmVyZW5jZXMKLQlwcm90ZWN0ZWQgY2xhc3MgRGVmZXJyZWRTaGFyZWRSZWZlcmVuY2VBY3Rpb24gewotCQlFT2JqZWN0IG93bmVyOwotCQlFUmVmZXJlbmNlIHJlZjsKLQotCQlwdWJsaWMgRGVmZXJyZWRTaGFyZWRSZWZlcmVuY2VBY3Rpb24oRU9iamVjdCBvd25lciwgRVJlZmVyZW5jZSByZWYpIHsKLQkJCXRoaXMub3duZXIgPSBvd25lcjsKLQkJCXRoaXMucmVmID0gcmVmOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcGVyZm9ybUFjdGlvbigpIHsKLQkJCU9iamVjdCB2YWx1ZSA9IGdldFNoYXJlZE9iamVjdEJ5VHlwZShvd25lciwgcmVmKTsKLQkJCXNldFJlZmVyZW5jZVZhbHVlKG93bmVyLCByZWYsIHZhbHVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBNYXAgZXF1aXZhbGVudExpbmVzOwotCXB1YmxpYyBMaXN0IGRlZmVyZWRSZWZlcmVuY2VzOwotCXB1YmxpYyBzdGF0aWMgaW50IGdlbkRlcHRoID0gNTsKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBzaGFyZWRWYWx1ZTsKLQlwdWJsaWMgaW50IGNsYXNzSW5kZXggPSAwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF2Q2xhc3NbXTsKLQlwdWJsaWMgc3RhdGljIEhhc2hTZXQgaWdub3JlQXR0OwotCi0JcHVibGljIGludCB2ZXJzaW9uOwotCXB1YmxpYyBpbnQgbW9kdWxlVHlwZTsKLQkvL3N0YXRpYyB2ZXJzaW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8yID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfMyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzQgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQSUNBVElPTiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQX0NMSUVOVCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVE9SID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFSkIgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFQiA9IDQ7Ci0KLQlwdWJsaWMgR2VuZXJhbEVNRkVkaXRpbmdUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLSAgICBwdWJsaWMgR2VuZXJhbEVNRkVkaXRpbmdUZXN0KFN0cmluZyBuYW1lLCBSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgIAlzdXBlcihuYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCBlZGl0Um9vdChFT2JqZWN0IGVPYmplY3QpIHsKLQkJZWRpdEZlYXR1cmVzKGVPYmplY3QpOwotCQkvL2lmIChkZWZlcmVkUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCS8vCWZvciAoaW50IGkgPSAwOyBpIDwgZGVmZXJlZFJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKLQkJLy8JCSgoRGVmZXJyZWRTaGFyZWRSZWZlcmVuY2VBY3Rpb24pIGRlZmVyZWRSZWZlcmVuY2VzLmdldChpKSkucGVyZm9ybUFjdGlvbigpOwotCQkvLwl9Ci0JCS8vfQotCX0KLQotCXB1YmxpYyB2b2lkIGVkaXRGZWF0dXJlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQllZGl0QXR0cmlidXRlcyhlT2JqZWN0KTsKLQkJCWVkaXRSZWZlcmVuY2VzKGVPYmplY3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWRpdFJlZmVyZW5jZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCUxpc3QgcmVmZXJlbmNlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbFJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlFUmVmZXJlbmNlIHJlZiA9IChFUmVmZXJlbmNlKSByZWZlcmVuY2VzLmdldChpKTsKLQkJCWlmICghcmVmLmlzTWFueSgpICYmIGVPYmplY3QuZUdldChyZWYpICE9IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAocmVmLmlzQ29udGFpbm1lbnQoKSkKLQkJCQlwb3B1bGF0ZUNvbnRhaW5tZW50UmVmZXJlbmNlKGVPYmplY3QsIHJlZik7Ci0JCQllbHNlCi0JCQkJcG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoZU9iamVjdCwgcmVmKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKEVPYmplY3QgZU9iamVjdCwgRVJlZmVyZW5jZSByZWYpIHsKLQkJaWYgKHJlZi5nZXRFVHlwZSgpID09IEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhQ2xhc3MoKSkKLQkJCXNldFJlZmVyZW5jZVZhbHVlKGVPYmplY3QsIHJlZiwgY3JlYXRlSmF2YUNsYXNzUHJveHkoKEVDbGFzcykgcmVmLmdldEVUeXBlKCkpKTsKLQkJZWxzZSB7Ci0JCQlFUGFja2FnZSBwa2cgPSByZWYuZ2V0RVR5cGUoKS5nZXRFUGFja2FnZSgpOwotCQkJaWYgKHBrZyA9PSBlT2JqZWN0LmVDbGFzcygpLmdldEVQYWNrYWdlKCkgfHwgcGtnID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKSB7Ci0JCQkJaWYgKGVPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiRUFubm90YXRpb24iKSB8fCBlT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoIkVBbm5vdGF0aW9uSW1wbCIpIHx8ICFKMkVFVmVyc2lvbkNoZWNrLmNoZWNrUmVmZXJlbmNlVmVyc2lvbihyZWYsIHZlcnNpb24sIG1vZHVsZVR5cGUpKQotCQkJCQlyZXR1cm47Ci0JCQkJaWYgKGRlZmVyZWRSZWZlcmVuY2VzID09IG51bGwpCi0JCQkJCWRlZmVyZWRSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWRlZmVyZWRSZWZlcmVuY2VzLmFkZChuZXcgRGVmZXJyZWRTaGFyZWRSZWZlcmVuY2VBY3Rpb24oZU9iamVjdCwgcmVmKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUNvbnRhaW5tZW50UmVmZXJlbmNlKEVPYmplY3QgZU9iamVjdCwgRVJlZmVyZW5jZSByZWYpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXREZXB0aEZvckF0dHJpYnV0ZShyZWYpOyBpKyspIHsKLQkJCUVPYmplY3QgaW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSgoRUNsYXNzKSByZWYuZ2V0RVR5cGUoKSk7Ci0JCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoIUoyRUVWZXJzaW9uQ2hlY2suY2hlY2tSZWZlcmVuY2VWZXJzaW9uKHJlZiwgdmVyc2lvbiwgbW9kdWxlVHlwZSkpCi0JCQkJY29udGludWU7Ci0JCQlzZXRSZWZlcmVuY2VWYWx1ZShlT2JqZWN0LCByZWYsIGluc3RhbmNlKTsKLQkJCWlmICgoKEludGVybmFsRU9iamVjdCkgaW5zdGFuY2UpLmVJc1Byb3h5KCkpCi0JCQkJcmV0dXJuOwotCQkJaWYgKHJlZi5nZXRFVHlwZSgpID09IGVPYmplY3QuZUNsYXNzKCkpCi0JCQkJZWRpdEF0dHJpYnV0ZXMoaW5zdGFuY2UpOwotCQkJZWxzZQotCQkJCWVkaXRGZWF0dXJlcyhpbnN0YW5jZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZWZlcmVuY2VWYWx1ZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKCJFQW5ub3RhdGlvbiIpIHx8IHJlZi5nZXROYW1lKCkuZXF1YWxzKCJFQW5ub3RhdGlvbkltcGwiKSB8fCAhSjJFRVZlcnNpb25DaGVjay5jaGVja1JlZmVyZW5jZVZlcnNpb24ocmVmLCB2ZXJzaW9uLCBtb2R1bGVUeXBlKSkKLQkJCXJldHVybjsKLQkJaWYgKHJlZi5pc01hbnkoKSkgewotCQkJTGlzdCBsaXN0ID0gKExpc3QpIGVPYmplY3QuZUdldChyZWYpOwotCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikKLQkJCQlsaXN0LmFkZEFsbCgoQ29sbGVjdGlvbikgdmFsdWUpOwotCQkJZWxzZQotCQkJCWxpc3QuYWRkKHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCWVPYmplY3QuZVNldChyZWYsIHZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlpZiAoZUNsYXNzaWZpZXIgPT0gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFDbGFzcygpKQotCQkJcmV0dXJuIGNyZWF0ZUphdmFDbGFzc1Byb3h5KGVDbGFzc2lmaWVyKTsKLQkJcmV0dXJuIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpLmNyZWF0ZShlQ2xhc3NpZmllcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWRpdEF0dHJpYnV0ZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCUxpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlFQXR0cmlidXRlIGF0dCA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLQkJCWlmIChhdHQuaXNDaGFuZ2VhYmxlKCkgJiYgSjJFRVZlcnNpb25DaGVjay5jaGVja0F0dHJpYnV0ZVZlcnNpb24oYXR0LCB2ZXJzaW9uLCBtb2R1bGVUeXBlKSkgewotCQkJCU9iamVjdCB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCQkJZU9iamVjdC5lU2V0KGF0dCwgdmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShFQXR0cmlidXRlIGF0dCwgRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChhdHQuZ2V0RVR5cGUoKSA9PSBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzKCkpIHsKLQkJCXJldHVybiBjcmVhdGVKYXZhQ2xhc3NQcm94eShhdHQuZUNsYXNzKCkpLmdldENsYXNzKCk7Ci0JCX0gCi0JCS8vIGlmIChtb2R1bGVUeXBlID09IFdFQikKLQkJCXJldHVybiBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUF0dHJpYnV0ZShhdHQsIGVPYmplY3QsIHRydWUsIHZlcnNpb24sIG1vZHVsZVR5cGUpOwotCQkvL3JldHVybiBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUF0dHJpYnV0ZShhdHQpOwotCX0KLQotCXByb3RlY3RlZCBFT2JqZWN0IGNyZWF0ZUphdmFDbGFzc1Byb3h5KEVDbGFzcyBtZXRhQ2xhc3MpIHsKLQkJaWYgKGF2Q2xhc3MgPT0gbnVsbCkgewotCQkJYXZDbGFzcyA9IG5ldyBTdHJpbmdbXSB7ICJqYXZhLnV0aWwuSGFzaFRhYmxlIiwgImphdmEudXRpbC5MaXN0IiwgImphdmEuc3FsLkRhdGEiLCAiamF2YS5sYW5nLkludGVnZXIiLCAiamF2YS5sYW5nLlN0cmluZyIgfTsKLQkJfQotCQlTdHJpbmcgbmFtZSA9IGF2Q2xhc3NbY2xhc3NJbmRleF07Ci0JCWNsYXNzSW5kZXgrKzsKLQkJaWYgKGNsYXNzSW5kZXggPT0gNSkKLQkJCWNsYXNzSW5kZXggPSAwOwotCQlyZXR1cm4gSmF2YUNsYXNzSW1wbC5jcmVhdGVDbGFzc1JlZihuYW1lKTsKLQl9Ci0KLQkvLyBPbGQgQ29tcGFyZSBtZXRob2QuLi4ubm93IHVzaW5nIERPTUNvbXBhcmF0b3IuLi5yZW1vdmUgb25jZSBzdGFibGUKLQlwdWJsaWMgdm9pZCBjb21wYXJlQ29udGVudHMoU3RyaW5nIGZpbGUxLCBTdHJpbmcgZmlsZTIpIHRocm93cyBFeGNlcHRpb24gewotCSAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIxID0gbnVsbDsKLQkgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyMiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnQgbGluZW5vID0gMTsKLQkJCXJlYWRlcjEgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMSkpKTsKLQkJCXJlYWRlcjIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMikpKTsKLQkJCVN0cmluZyBsaW5lMSA9ICIiLCBsaW5lMiA9ICIiOwotCQkJd2hpbGUgKHJlYWRlcjEucmVhZHkoKSAmJiByZWFkZXIyLnJlYWR5KCkpIHsKLQkJCQlsaW5lMSA9IHJlYWRMaW5lVHJpbUNvbW1lbnRzKHJlYWRlcjEpOyAKLQkJCQlsaW5lMiA9IHJlYWRMaW5lVHJpbUNvbW1lbnRzKHJlYWRlcjIpOwotCQkJCWlmIChsaW5lMSA9PSBudWxsICYmIGxpbmUyID09IG51bGwgJiYgbGluZW5vICE9IDApCi0JCQkJCXJldHVybjsKLQkJCQkJCQkgICAgCi0JCQkJaWYgKCFsaW5lMS50cmltKCkuZXF1YWxzKGxpbmUyLnRyaW0oKSkpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiRXJyb3IgYXQgbGluZSAjOiAiICsgbGluZW5vICsgJ1xuJyArIGxpbmUxICsgJ1xuJyArIGxpbmUyICsgJ1xuJzsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotCQkJCQkvL2Fzc2VydFRydWUobWVzc2FnZSwgZmFsc2UpOwotCQkJCX0KLQkJCQlsaW5lbm8rKzsKLQkJCX0KLQkJCWFzc2VydFRydWUoIlRoZSBmaWxlcyBoYXZlIGEgZGlmZmVyZW50IG51bWJlciBvZiBsaW5lczoiICsgbGluZW5vICsgJ1xuJyArIGxpbmUxICsgJ1xuJyArIGxpbmUyICsgJ1xuJywgKCFyZWFkZXIxLnJlYWR5KCkgJiYgIXJlYWRlcjIucmVhZHkoKSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlhc3NlcnRUcnVlKCJJTyBmYWlsZWQiLCBmYWxzZSk7Ci0JCX0gZmluYWxseSB7Ci0JCSAgICBpZihyZWFkZXIxICE9IG51bGwpCi0JCSAgICAgICAgcmVhZGVyMS5jbG9zZSgpOwotCQkgICAgaWYocmVhZGVyMiAhPSBudWxsKQotCQkgICAgICAgIHJlYWRlcjIuY2xvc2UoKTsKLQkJfQotCX0gCi0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gc3RyaW5nCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIHJlYWRMaW5lVHJpbUNvbW1lbnRzKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHJlYWRlci5yZWFkTGluZSgpOyAKLSAgICAgICAgaWYocmVzdWx0LmluZGV4T2YoIjwhLS0iKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGludCBlbmRDb21tZW50SW5keCA9IDA7Ci0gICAgICAgICAgICB3aGlsZShyZWFkZXIucmVhZHkoKSkgewotICAgICAgICAgICAgICAgIGlmKCAoZW5kQ29tbWVudEluZHggPSByZXN1bHQuaW5kZXhPZigiLS0+IikpID49IDApIAotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZWFkZXIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShTdHJpbmcgZmlsZTEsIFN0cmluZyBmaWxlMiwgU3RyaW5nIGlkZW50aWZpZXIpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxpbmVOdW1iZXJSZWFkZXIgcmVhZGVyMSA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihnZXRGaWxlSW5wdXRTdHJlYW0oZmlsZTEpKSk7Ci0JCUxpbmVOdW1iZXJSZWFkZXIgcmVhZGVyMiA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihnZXRGaWxlSW5wdXRTdHJlYW0oZmlsZTIpKSk7Ci0JCWNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UocmVhZGVyMSwgcmVhZGVyMiwgaWRlbnRpZmllcik7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKExpbmVOdW1iZXJSZWFkZXIgcmVhZGVyMSwgTGluZU51bWJlclJlYWRlciByZWFkZXIyLCBTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJd2hpbGUgKHJlYWRlcjEucmVhZHkoKSB8fCByZWFkZXIyLnJlYWR5KCkpIHsKLQkJCVN0cmluZyBsaW5lMSA9ICIiLCBsaW5lMiA9ICIiOwotCQkJd2hpbGUgKHJlYWRlcjEucmVhZHkoKSAmJiBsaW5lMS5lcXVhbHMoIiIpKSB7Ci0JCQkJbGluZTEgPSByZWFkZXIxLnJlYWRMaW5lKCkudHJpbSgpOwotCQkJfQotCQkJd2hpbGUgKHJlYWRlcjIucmVhZHkoKSAmJiBsaW5lMi5lcXVhbHMoIiIpKSB7Ci0JCQkJbGluZTIgPSByZWFkZXIyLnJlYWRMaW5lKCkudHJpbSgpOwotCQkJfQotCQkJaWYgKCFpc0VxdWl2YWxlbnRMaW5lcyhsaW5lMSwgbGluZTIpKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJYnVmZi5hcHBlbmQoIkRpZmZlcmVuY2UgZm91bmQgaW4gdGVzdCAiKTsKLQotCQkJCWJ1ZmYuYXBwZW5kKGlkZW50aWZpZXIpOwotCQkJCWJ1ZmYuYXBwZW5kKCJcblNvdXJjZSBsaW5lICM6ICIpOwotCQkJCWJ1ZmYuYXBwZW5kKHJlYWRlcjEuZ2V0TGluZU51bWJlcigpKTsKLQkJCQlidWZmLmFwcGVuZCgnXG4nKTsKLQkJCQlidWZmLmFwcGVuZChsaW5lMSk7Ci0JCQkJYnVmZi5hcHBlbmQoIlxuRGVzdGluYXRpb24gbGluZSAjOiAiKTsKLQkJCQlidWZmLmFwcGVuZChyZWFkZXIyLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJYnVmZi5hcHBlbmQoJ1xuJyk7Ci0JCQkJYnVmZi5hcHBlbmQobGluZTIpOwotCQkJCWFzc2VydFRydWUoYnVmZi50b1N0cmluZygpLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGxpbmVFcXVhbHMoU3RyaW5nIGxpbmUxLCBTdHJpbmcgbGluZTIpIHsKLQkJcmV0dXJuIGxpbmUxLmVxdWFscyhsaW5lMik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50TGluZXMoU3RyaW5nIGxpbmUxLCBTdHJpbmcgbGluZTIpIHsKLQkJaWYgKGxpbmVFcXVhbHMobGluZTEsIGxpbmUyKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZXF1YWxUYWdzKGxpbmUxLCBsaW5lMikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJU3RyaW5nIGVxdWl2ID0gKFN0cmluZykgZ2V0RXF1aXZhbGVudExpbmVzKCkuZ2V0KGxpbmUxKTsKLQkJcmV0dXJuIGVxdWl2ICE9IG51bGwgJiYgZXF1aXYuZXF1YWxzKGxpbmUyKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxUYWdzKFN0cmluZyBsaW5lMSwgU3RyaW5nIGxpbmUyKXsKLQkJLy9kYXRhIGNoZWNrLCB0aGVyZSBzaG91bGQgYmUgbm8gZGF0YSBmb3IgdGhpcyB0ZXN0IHRvIHJldHVybiB0cnVlCi0JCWludCBzaG9ydEVuZEluZGV4MSA9IGxpbmUxLmluZGV4T2YoIi8+Iik7Ci0JCWludCBzaG9ydEVuZEluZGV4MiA9IGxpbmUyLmluZGV4T2YoIi8+Iik7Ci0JCWlmIChzaG9ydEVuZEluZGV4MSA9PSAtMSAmJiBzaG9ydEVuZEluZGV4MiA9PSAtMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZSBpZiAoc2hvcnRFbmRJbmRleDEgIT0gLTEpewotCQkJU3RyaW5nIHRhZ05hbWUxID0gbGluZTEuc3Vic3RyaW5nKDEsc2hvcnRFbmRJbmRleDEpOwotCQkJU3RyaW5nIHRhZ05hbWUyID0gZXh0cmFjdFRhZ05hbWUobGluZTIpOwotCQkJaWYgKGNoZWNrTm9EYXRhKGxpbmUyKSAmJiB0YWdOYW1lMS5lcXVhbHModGFnTmFtZTIpKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChzaG9ydEVuZEluZGV4MiAhPSAtMSl7Ci0JCQlTdHJpbmcgdGFnTmFtZTEgPSBleHRyYWN0VGFnTmFtZShsaW5lMSk7IAotCQkJU3RyaW5nIHRhZ05hbWUyID0gbGluZTIuc3Vic3RyaW5nKDEsc2hvcnRFbmRJbmRleDIpOwotCQkJaWYgKGNoZWNrTm9EYXRhKGxpbmUxKSAmJiB0YWdOYW1lMS5lcXVhbHModGFnTmFtZTIpKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBsaW5lMgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBleHRyYWN0VGFnTmFtZShTdHJpbmcgbGluZSkgewotCQlpbnQgZW5kT3BlblRhZyA9IGxpbmUuaW5kZXhPZigiPiIpOwotCQlyZXR1cm4gbGluZS5zdWJzdHJpbmcoMSxlbmRPcGVuVGFnKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGluZTIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrTm9EYXRhKFN0cmluZyBsaW5lKSB7Ci0JCWludCBlbmRPcGVuVGFnID0gbGluZS5pbmRleE9mKCI+Iik7Ci0JCWludCBzdGFydEVuZFRhZyA9IGxpbmUubGFzdEluZGV4T2YoIjwiKTsKLQkJaWYgKGVuZE9wZW5UYWcgPT0gbGluZS5sZW5ndGgoKSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChlbmRPcGVuVGFnKzEgPT0gc3RhcnRFbmRUYWcpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0RXF1aXZhbGVudExpbmVzKCkgewotCQlpZiAoZXF1aXZhbGVudExpbmVzID09IG51bGwpCi0JCQllcXVpdmFsZW50TGluZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZXF1aXZhbGVudExpbmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVxdWl2YWxlbnRMaW5lcyhNYXAgZXF1aXZhbGVudExpbmVzKSB7Ci0JCXRoaXMuZXF1aXZhbGVudExpbmVzID0gZXF1aXZhbGVudExpbmVzOwotCX0KLQkvKgotCQlwdWJsaWMgdm9pZCBjb21wYXJlQ29udGVudHMoU3RyaW5nIGZpbGUxLCBTdHJpbmcgZmlsZTIpIHRocm93cyBFeGNlcHRpb24gewotCQkJSW5wdXRTdHJlYW0gaXMxLCBpczI7Ci0JCQlpczEgPSBnZXRGaWxlSW5wdXRTdHJlYW0oZmlsZTEpOwotCQkJaXMyID0gZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUyKTsKLQkJCUlucHV0U291cmNlIGlucHV0MSA9IG5ldyBJbnB1dFNvdXJjZShpczEpOwotCQkJSW5wdXRTb3VyY2UgaW5wdXQyID0gbmV3IElucHV0U291cmNlKGlzMik7Ci0JCQl0cnkgewotCQkJCVN0cmluZyByZXN1bHRzOwotCQkJCWlmKGlnbm9yZUF0dCA9PSBudWxsKQotCQkJCQlyZXN1bHRzID0gRG9tQ29tcGFyaXRvci5jb21wYXJlRG9tcyhpbnB1dDEsIGlucHV0Mik7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHRzID0gRG9tQ29tcGFyaXRvci5jb21wYXJlRG9tcyhpbnB1dDEsIGlucHV0MiwgaWdub3JlQXR0KTsKLQkJCQlpZiAocmVzdWx0cyAhPSBudWxsKSB7Ci0JCQkJCWFzc2VydFRydWUoIlVuZXF1YWwgZG9tcyBjb21wYXJlZCBhcyBlcXVhbCAiICsgZmlsZTEgKyAiICIgKyBmaWxlMiArICJEZXRhaWxzOiAiICsgcmVzdWx0cywgZmFsc2UpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXMxLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlpczIuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlBc3NlcnQuZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0RmlsZUlucHV0U3RyZWFtKFN0cmluZyBwYXRoKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aCk7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJQ2xhc3NMb2FkZXIgbG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCQlpZiAobG9hZGVyID09IG51bGwpIHsKLQkJCWluID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbiA9IGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lKTsKLQkJfQotCQlhc3NlcnRUcnVlKCJVbmFibGUgdG8gZmluZCByZXNvdXJjZTogIiArIGZpbGVOYW1lLCBpbiAhPSBudWxsKTsKLQkJcmV0dXJuIGluOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYWxEZXB0aChpbnQgZGVwdGgpIHsKLQkJR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0LmdlbkRlcHRoID0gZGVwdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kdWxlVHlwZShpbnQgdHlwZSkgewotCQltb2R1bGVUeXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKGludCB2ZXJzaW9uKSB7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JcHVibGljIGludCBnZXREZXB0aEZvckF0dHJpYnV0ZShFUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmLmlzTWFueSgpKQotCQkJcmV0dXJuIGdlbkRlcHRoOwotCQllbHNlCi0JCQlyZXR1cm4gMTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFNoYXJlZE9iamVjdEJ5VHlwZShFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZikgewotCQlzaGFyZWRWYWx1ZSA9IFRlc3RVdGlsaXRpZXMuZ2V0T2JqZWN0QnlUeXBlKG93bmVyLmVSZXNvdXJjZSgpLCByZWYuZ2V0RVR5cGUoKSwgcmVmLmlzTWFueSgpKTsKLQkJcmV0dXJuIHNoYXJlZFZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SWdub3JlQXR0KEhhc2hTZXQgc2V0KSB7Ci0JCWlnbm9yZUF0dCA9IHNldDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvIjsKLQkJCUZpbGUgZGVsID0gbmV3IEZpbGUob3V0KTsKLQkJCWRlbGV0ZURpcmVjdG9yeShkZWwpOwotCQkJZGVsLmRlbGV0ZSgpOwotCQkJb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiLi4vdGVzdERhdGEvdGVzdE91dHB1dC8iOwotCQkJZGVsID0gbmV3IEZpbGUob3V0KTsKLQkJCWRlbGV0ZURpcmVjdG9yeShkZWwpOwotCQkJZGVsLmRlbGV0ZSgpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkKLQkgICB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCWlmIChkaXJlY3RvcnkuZXhpc3RzKCkpewotCQkgICBGaWxlW10gZGVsRmlsZXMgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0JCi0JCSAgIGZvcihpbnQgaT0wOyBpPGRlbEZpbGVzLmxlbmd0aDsgKytpKQotCQkgICB7Ci0JCSAgICAgIGlmKGRlbEZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpCi0JCSAgICAgICAgIGRlbGV0ZURpcmVjdG9yeShkZWxGaWxlc1tpXSk7Ci0JCSAgICAgIGRlbEZpbGVzW2ldLmRlbGV0ZSgpOwotCQkgICB9ICAKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCS8vVE9ETzogUmVtb3ZlIHRoaXMgbGluZSBhZnRlciB3cyB4c2QncyBhcmUgcmVzdG9yZWQuCi0JCVJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMDU5NGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uTGluZU51bWJlclJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljRmVhdHVyZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5GZWF0dXJlTWFwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRUF0dHJpYnV0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkoyRUVWZXJzaW9uQ2hlY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLlRlc3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzQXV0aFR5cGVCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GVGVzdCB7Ci0gICAgLy9pbm5lciBjbGFzcyB0byBoYW5kbGUgZGVmZmVyZWQgc2hhcmVkIHJlZmVyZW5jZXMKLSAgICBwcm90ZWN0ZWQgY2xhc3MgRGVmZXJyZWRTaGFyZWRSZWZlcmVuY2VBY3Rpb24gewotICAgICAgICBFT2JqZWN0IG93bmVyOwotICAgICAgICBFUmVmZXJlbmNlIHJlZjsKLQotICAgICAgICBwdWJsaWMgRGVmZXJyZWRTaGFyZWRSZWZlcmVuY2VBY3Rpb24oRU9iamVjdCBvd25lciwgRVJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKLSAgICAgICAgICAgIHRoaXMucmVmID0gcmVmOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGVyZm9ybUFjdGlvbigpIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldFNoYXJlZE9iamVjdEJ5VHlwZShvd25lciwgcmVmKTsKLSAgICAgICAgICAgIHNldFJlZmVyZW5jZVZhbHVlKG93bmVyLCByZWYsIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNYXAgZXF1aXZhbGVudExpbmVzOwotICAgIHB1YmxpYyBMaXN0IGRlZmVyZWRSZWZlcmVuY2VzOwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdlbkRlcHRoID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBzaGFyZWRWYWx1ZTsKLSAgICBwdWJsaWMgc3RhdGljIEhhc2hTZXQgaWdub3JlQXR0OwotCi0gICAgcHVibGljIGludCB2ZXJzaW9uOwotICAgIHB1YmxpYyBpbnQgbW9kdWxlVHlwZTsKLSAgICAvL3N0YXRpYyB2ZXJzaW9ucwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8yID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfMyA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzQgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fNV8wID0gMzsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUExJQ0FUSU9OID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBfQ0xJRU5UID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUT1IgPSAyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVKQiA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCID0gNDsKLQotICAgIHB1YmxpYyBHZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBHZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QoU3RyaW5nIG5hbWUsIFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgCXN1cGVyKG5hbWUsIGZhY3RvcnkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlUm9vdChFT2JqZWN0IGVPYmplY3QpIHsKLSAgICAgICAgcG9wdWxhdGVGZWF0dXJlcyhlT2JqZWN0KTsKLSAgICAgICAgaWYgKGRlZmVyZWRSZWZlcmVuY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVmZXJlZFJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAoKERlZmVycmVkU2hhcmVkUmVmZXJlbmNlQWN0aW9uKSBkZWZlcmVkUmVmZXJlbmNlcy5nZXQoaSkpLnBlcmZvcm1BY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlRmVhdHVyZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0gICAgICAgIGlmIChlT2JqZWN0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcG9wdWxhdGVBdHRyaWJ1dGVzKGVPYmplY3QpOwotICAgICAgICAgICAgcG9wdWxhdGVSZWZlcmVuY2VzKGVPYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVSZWZlcmVuY2VzKEVPYmplY3QgZU9iamVjdCkgewotICAgICAgICBMaXN0IHJlZmVyZW5jZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoIXJlZi5pc01hbnkoKSAmJiBlT2JqZWN0LmVHZXQocmVmKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuICYmIChyZWYuZXF1YWxzKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0hvbWVJbnRlcmZhY2UoKSkgfHwgcmVmLmVxdWFscyhFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9SZW1vdGVJbnRlcmZhY2UoKSkgfHwgcmVmLmVxdWFscyhFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpKSB8fCByZWYuZXF1YWxzKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0xvY2FsSG9tZUludGVyZmFjZSgpKSB8fCByZWYuZXF1YWxzKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSkpKQotCQkJCWNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKHJlZi5pc0NvbnRhaW5tZW50KCkpCi0gICAgICAgICAgICAgICAgcG9wdWxhdGVDb250YWlubWVudFJlZmVyZW5jZShlT2JqZWN0LCByZWYpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKGVPYmplY3QsIHJlZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgIGlmIChyZWYuZ2V0RVR5cGUoKSA9PSBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzKCkpCi0gICAgICAgICAgICBzZXRSZWZlcmVuY2VWYWx1ZShlT2JqZWN0LCByZWYsIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlSmF2YUNsYXNzUHJveHkocmVmLGVPYmplY3QpKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBFUGFja2FnZSBwa2cgPSByZWYuZ2V0RVR5cGUoKS5nZXRFUGFja2FnZSgpOwotICAgICAgICAgICAgLy9pZiAocGtnID09IGVPYmplY3QuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSB8fCBwa2cgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpIHsKLSAgICAgICAgICAgICAgICBpZiAoZU9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJFQW5ub3RhdGlvbiIpIHx8IGVPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiRUFubm90YXRpb25JbXBsIikgfHwgIUoyRUVWZXJzaW9uQ2hlY2suY2hlY2tSZWZlcmVuY2VWZXJzaW9uKHJlZiwgdmVyc2lvbiwgbW9kdWxlVHlwZSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBpZiAoZGVmZXJlZFJlZmVyZW5jZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZGVmZXJlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgZGVmZXJlZFJlZmVyZW5jZXMuYWRkKG5ldyBEZWZlcnJlZFNoYXJlZFJlZmVyZW5jZUFjdGlvbihlT2JqZWN0LCByZWYpKTsKLSAgICAgICAgICAgIC8vfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVDb250YWlubWVudFJlZmVyZW5jZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0RGVwdGhGb3JBdHRyaWJ1dGUocmVmKTsgaSsrKSB7Ci0gICAgICAgICAgICBFT2JqZWN0IGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UocmVmLGVPYmplY3QpOwotICAgICAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgaWYgKCFKMkVFVmVyc2lvbkNoZWNrLmNoZWNrUmVmZXJlbmNlVmVyc2lvbihyZWYsIHZlcnNpb24sIG1vZHVsZVR5cGUpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgc2V0UmVmZXJlbmNlVmFsdWUoZU9iamVjdCwgcmVmLCBpbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoKChJbnRlcm5hbEVPYmplY3QpIGluc3RhbmNlKS5lSXNQcm94eSgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGlmIChyZWYuZ2V0RVR5cGUoKSA9PSBlT2JqZWN0LmVDbGFzcygpKQotICAgICAgICAgICAgICAgIHBvcHVsYXRlQXR0cmlidXRlcyhpbnN0YW5jZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcG9wdWxhdGVGZWF0dXJlcyhpbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSZWZlcmVuY2VWYWx1ZShFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSByZWYsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoIkVBbm5vdGF0aW9uIikgfHwgcmVmLmdldE5hbWUoKS5lcXVhbHMoIkVBbm5vdGF0aW9uSW1wbCIpIHx8ICFKMkVFVmVyc2lvbkNoZWNrLmNoZWNrUmVmZXJlbmNlVmVyc2lvbihyZWYsIHZlcnNpb24sIG1vZHVsZVR5cGUpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAocmVmLmlzTWFueSgpKSB7Ci0gICAgICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgZU9iamVjdC5lR2V0KHJlZik7Ci0gICAgICAgICAgICBpZiAobGlzdCBpbnN0YW5jZW9mIEJhc2ljRmVhdHVyZU1hcCkgewotICAgICAgICAgICAgCUJhc2ljRmVhdHVyZU1hcCBhTWFwID0gKEJhc2ljRmVhdHVyZU1hcClsaXN0OwotICAgICAgICAgICAgCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLSAgICAgICAgICAgIAkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9ICgoQ29sbGVjdGlvbil2YWx1ZSkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJT2JqZWN0IG9iaiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJCWFNYXAuYWRkKEZlYXR1cmVNYXBVdGlsLmNyZWF0ZUVudHJ5KHJlZiwgb2JqKSk7Ci0JCQkJCX0KLSAgICAgICAgICAgIAl9IGVsc2UgYU1hcC5hZGQoRmVhdHVyZU1hcFV0aWwuY3JlYXRlRW50cnkocmVmLCB2YWx1ZSkpOwotICAgICAgICAgICAgCQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pCi0gICAgICAgICAgICAJbGlzdC5hZGRBbGwoKENvbGxlY3Rpb24pIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBsaXN0LmFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlT2JqZWN0LmVTZXQocmVmLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRU9iamVjdCBjcmVhdGVJbnN0YW5jZShFUmVmZXJlbmNlIHJlZiwgRU9iamVjdCBlT2JqZWN0KSB7Ci0gICAgICAgIGlmIChyZWYuZ2V0RVR5cGUoKSA9PSBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzKCkpCi0gICAgICAgICAgICByZXR1cm4gRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVKYXZhQ2xhc3NQcm94eShyZWYsIGVPYmplY3QpOwotICAgICAgICByZXR1cm4gcmVmLmdldEVUeXBlKCkuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkuY3JlYXRlKChFQ2xhc3MpcmVmLmdldEVUeXBlKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQXR0cmlidXRlcyhFT2JqZWN0IGVPYmplY3QpIHsKLSAgICAJaWYgKGVPYmplY3QuZUNsYXNzKCkgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UU5hbWUoKSkgewotICAgIAkJcG9wdWxhdGVBdHRyaWJ1dGVzUU5hbWUoZU9iamVjdCk7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAgICAgTGlzdCBhdHRyaWJ1dGVzID0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBFSkJMb2NhbFJlZiAmJiAoYXR0LmVxdWFscyhDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfSG9tZSgpKSB8fCBhdHQuZXF1YWxzKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYlJlZl9SZW1vdGUoKSkpKQotICAgICAgICAgICAgCWNvbnRpbnVlOwotICAgICAgICAgICAgRUF0dHJpYnV0ZURlc2NyaXB0b3IgZGVzYyA9IG5ldyBFQXR0cmlidXRlRGVzY3JpcHRvcihhdHQsZU9iamVjdC5lQ2xhc3MoKSk7Ci0gICAgICAgICAgICBpZiAoZGVzYy5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygiZ3JvdXAiKSkgY29udGludWU7Ci0gICAgICAgICAgICBwcmltUG9wdWxhdGVBdHRyYnV0ZShlT2JqZWN0LCBhdHQpOwotICAgICAgICB9Ci0gICAgfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbVBvcHVsYXRlQXR0cmJ1dGUoRU9iamVjdCBlT2JqZWN0LCBFQXR0cmlidXRlIGF0dCkgewotICAgICAgICAgICAgaWYgKGF0dC5pc0NoYW5nZWFibGUoKSAmJiBKMkVFVmVyc2lvbkNoZWNrLmNoZWNrQXR0cmlidXRlVmVyc2lvbihhdHQsIHZlcnNpb24sIG1vZHVsZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAgOyBqIDwgZ2V0RGVwdGhGb3JBdHRyaWJ1dGUoYXR0KTtqKyspewotCSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCSAgICAgICAgICAgICAgICBzZXRSZWZlcmVuY2VWYWx1ZShlT2JqZWN0LGF0dCx2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgCi0KLSAgICAvKioKLQkgKiBAcGFyYW0gZU9iamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQXR0cmlidXRlc1FOYW1lKEVPYmplY3QgZU9iamVjdCkgewotCQlTdHJpbmcgcHJlZml4ID0gKFN0cmluZyljcmVhdGVBdHRyaWJ1dGVWYWx1ZShDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRRTmFtZV9JbnRlcm5hbFByZWZpeE9yTnNVUkkoKSwgZU9iamVjdCk7Ci0JCVN0cmluZyBsb2NhbFBhcnQgPSAoU3RyaW5nKWNyZWF0ZUF0dHJpYnV0ZVZhbHVlKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFFOYW1lX0xvY2FsUGFydCgpLCBlT2JqZWN0KTsKLQkJKChRTmFtZSllT2JqZWN0KS5zZXRWYWx1ZXMocHJlZml4LCAiaHR0cDovL3d3dy5pYm0uY29tIiwgbG9jYWxQYXJ0KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKEVBdHRyaWJ1dGUgYXR0LCBFT2JqZWN0IGVPYmplY3QpIHsKLSAgICAgICAgaWYgKGF0dC5nZXRFVHlwZSgpID09IEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhQ2xhc3MoKSkgewotICAgICAgICAgICAgcmV0dXJuIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlSmF2YUNsYXNzUHJveHkoYXR0LGVPYmplY3QpLmdldENsYXNzKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXR0ID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFJlc291cmNlUmVmX0F1dGgoKSkKLQkJCXJldHVybiBjcmVhdGVSZXNBdXRoKGF0dCwgZU9iamVjdCk7Ci0JCWVsc2UgaWYgKGF0dCA9PSBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXRob2RFbGVtZW50X1R5cGUoKSkKLQkJCXJldHVybiBjcmVhdGVNZXRob2RFbGVtZW50VHlwZShhdHQsIGVPYmplY3QpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcHJpbUNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0gICAgICAgIC8vcmV0dXJuIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlQXR0cmlidXRlKGF0dCk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBPYmplY3QgcHJpbUNyZWF0ZUF0dHJpYnV0ZVZhbHVlKEVBdHRyaWJ1dGUgYXR0LCBFT2JqZWN0IGVPYmplY3QpIHsKLQkJcmV0dXJuIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlQXR0cmlidXRlKGF0dCwgZU9iamVjdCwgdHJ1ZSwgdmVyc2lvbiwgbW9kdWxlVHlwZSk7Ci0gICAgfQotCi0gICAgLy8gT2xkIENvbXBhcmUgbWV0aG9kLi4uLm5vdyB1c2luZyBET01Db21wYXJhdG9yLi4ucmVtb3ZlIG9uY2Ugc3RhYmxlCi0gICAgcHVibGljIHZvaWQgY29tcGFyZUNvbnRlbnRzKFN0cmluZyBmaWxlMSwgU3RyaW5nIGZpbGUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCBsaW5lbm8gPSAxOwotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyMSA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUxKSkpOwotICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyMiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUyKSkpOwotICAgICAgICAgICAgU3RyaW5nIGxpbmUxID0gIiIsIGxpbmUyID0gIiI7Ci0gICAgICAgICAgICB3aGlsZSAocmVhZGVyMS5yZWFkeSgpICYmIHJlYWRlcjIucmVhZHkoKSkgewotICAgICAgICAgICAgICAgIGxpbmUxID0gcmVhZGVyMS5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgIGxpbmUyID0gcmVhZGVyMi5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lMSA9PSBudWxsICYmIGxpbmUyID09IG51bGwgJiYgbGluZW5vICE9IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBpZiAoIWxpbmUxLmVxdWFscyhsaW5lMikpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiRXJyb3IgYXQgbGluZSAjOiAiICsgbGluZW5vICsgJ1xuJyArIGxpbmUxICsgJ1xuJyArIGxpbmUyICsgJ1xuJzsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBhZGRlZCB0byBlc2NhcGUgY29tcGFyZSAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGluZW5vKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgZmlsZXMgaGF2ZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgbGluZXM6IiArIGxpbmVubyArICdcbicgKyBsaW5lMSArICdcbicgKyBsaW5lMiArICdcbicsICghcmVhZGVyMS5yZWFkeSgpICYmICFyZWFkZXIyLnJlYWR5KCkpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIklPIGZhaWxlZCIsIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBjb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKFN0cmluZyBmaWxlMSwgU3RyaW5nIGZpbGUyLCBTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgTGluZU51bWJlclJlYWRlciByZWFkZXIxID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMSkpKTsKLSAgICAgICAgTGluZU51bWJlclJlYWRlciByZWFkZXIyID0gbmV3IExpbmVOdW1iZXJSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMikpKTsKLSAgICAgICAgY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShyZWFkZXIxLCByZWFkZXIyLCBpZGVudGlmaWVyKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoTGluZU51bWJlclJlYWRlciByZWFkZXIxLCBMaW5lTnVtYmVyUmVhZGVyIHJlYWRlcjIsIFN0cmluZyBpZGVudGlmaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZyBtc2cgPSBudWxsOwotICAgICAgICB3aGlsZSAocmVhZGVyMS5yZWFkeSgpIHx8IHJlYWRlcjIucmVhZHkoKSkgewotICAgICAgICAgICAgU3RyaW5nIGxpbmUxID0gIiIsIGxpbmUyID0gIiI7Ci0gICAgICAgICAgICB3aGlsZSAocmVhZGVyMS5yZWFkeSgpICYmIGxpbmUxICE9IG51bGwgJiYgbGluZTEuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIGxpbmUxID0gcmVhZGVyMS5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lMSAhPSBudWxsKQotICAgICAgICAgICAgICAgIAlsaW5lMSA9IGxpbmUxLnRyaW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChyZWFkZXIyLnJlYWR5KCkgJiYgbGluZTIgIT0gbnVsbCAmJiBsaW5lMi5lcXVhbHMoIiIpKSB7Ci0gICAgICAgICAgICAgICAgbGluZTIgPSByZWFkZXIyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgCWxpbmUyID0gbGluZTIudHJpbSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxpbmUxICE9IG51bGwgJiYgbGluZTIgIT0gbnVsbCAmJiAhaXNFcXVpdmFsZW50TGluZXMobGluZTEsIGxpbmUyKSkgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIik7Ci0gICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoIlxuU291cmNlIGxpbmUgIzogIik7Ci0gICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQocmVhZGVyMS5nZXRMaW5lTnVtYmVyKCkpOwotICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCdcbicpOwotICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKGxpbmUxKTsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCgiXG5EZXN0aW5hdGlvbiBsaW5lICM6ICIpOwotICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKHJlYWRlcjIuZ2V0TGluZU51bWJlcigpKTsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZChsaW5lMik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGJ1ZmYudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgZXJyb3JzLmFkZChidWZmKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWVycm9ycy5pc0VtcHR5KCkpCi0JCQlhc3NlcnRUcnVlKCJFcnJvcnMgRm91bmQsIENoZWNrIENvbnNvbGUuIiwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGxpbmVFcXVhbHMoU3RyaW5nIGxpbmUxLCBTdHJpbmcgbGluZTIpIHsKLSAgICAgICAgcmV0dXJuIGxpbmUxICE9IG51bGwgJiYgbGluZTEuZXF1YWxzKGxpbmUyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VxdWl2YWxlbnRMaW5lcyhTdHJpbmcgbGluZTEsIFN0cmluZyBsaW5lMikgewotICAgICAgICBpZiAobGluZUVxdWFscyhsaW5lMSwgbGluZTIpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgU3RyaW5nIGVxdWl2ID0gKFN0cmluZykgZ2V0RXF1aXZhbGVudExpbmVzKCkuZ2V0KGxpbmUxKTsKLSAgICAgICAgaWYgKGVxdWl2ID09IG51bGwpewotICAgICAgICAJZXF1aXYgPSAoU3RyaW5nKWdldEVxdWl2YWxlbnRMaW5lcygpLmdldChsaW5lMik7Ci0gICAgICAgIAlpZiAoZXF1aXYgIT0gbnVsbCkKLSAgICAgICAgCQlyZXR1cm4gZXF1aXYuZXF1YWxzKGxpbmUxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXF1aXYgIT0gbnVsbCAmJiBlcXVpdi5lcXVhbHMobGluZTIpOwotICAgIH0KLSAgICBwdWJsaWMgTWFwIGdldEVxdWl2YWxlbnRMaW5lcygpIHsKLSAgICAgICAgaWYgKGVxdWl2YWxlbnRMaW5lcyA9PSBudWxsKQotICAgICAgICAgICAgZXF1aXZhbGVudExpbmVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgcmV0dXJuIGVxdWl2YWxlbnRMaW5lczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFcXVpdmFsZW50TGluZXMoTWFwIGVxdWl2YWxlbnRMaW5lcykgewotICAgICAgICB0aGlzLmVxdWl2YWxlbnRMaW5lcyA9IGVxdWl2YWxlbnRMaW5lczsKLSAgICB9Ci0gICAgLyoKLSAgICAJcHVibGljIHZvaWQgY29tcGFyZUNvbnRlbnRzKFN0cmluZyBmaWxlMSwgU3RyaW5nIGZpbGUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJCUlucHV0U3RyZWFtIGlzMSwgaXMyOwotICAgIAkJaXMxID0gZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUxKTsKLSAgICAJCWlzMiA9IGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMik7Ci0gICAgCQlJbnB1dFNvdXJjZSBpbnB1dDEgPSBuZXcgSW5wdXRTb3VyY2UoaXMxKTsKLSAgICAJCUlucHV0U291cmNlIGlucHV0MiA9IG5ldyBJbnB1dFNvdXJjZShpczIpOwotICAgIAkJdHJ5IHsKLSAgICAJCQlTdHJpbmcgcmVzdWx0czsKLSAgICAJCQlpZihpZ25vcmVBdHQgPT0gbnVsbCkKLSAgICAJCQkJcmVzdWx0cyA9IERvbUNvbXBhcml0b3IuY29tcGFyZURvbXMoaW5wdXQxLCBpbnB1dDIpOwotICAgIAkJCWVsc2UKLSAgICAJCQkJcmVzdWx0cyA9IERvbUNvbXBhcml0b3IuY29tcGFyZURvbXMoaW5wdXQxLCBpbnB1dDIsIGlnbm9yZUF0dCk7Ci0gICAgCQkJaWYgKHJlc3VsdHMgIT0gbnVsbCkgewotICAgIAkJCQlhc3NlcnRUcnVlKCJVbmVxdWFsIGRvbXMgY29tcGFyZWQgYXMgZXF1YWwgIiArIGZpbGUxICsgIiAiICsgZmlsZTIgKyAiRGV0YWlsczogIiArIHJlc3VsdHMsIGZhbHNlKTsKLSAgICAJCQl9Ci0gICAgCQl9IGZpbmFsbHkgewotICAgIAkJCXRyeSB7Ci0gICAgCQkJCWlzMS5jbG9zZSgpOwotICAgIAkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQkJCUFzc2VydC5mYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAJCQl9Ci0gICAgCQkJdHJ5IHsKLSAgICAJCQkJaXMyLmNsb3NlKCk7Ci0gICAgCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAJCQkJQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJfQotICAgICovCi0gICAgcHVibGljIElucHV0U3RyZWFtIGdldEZpbGVJbnB1dFN0cmVhbShTdHJpbmcgcGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgpOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyBmaWxlTmFtZSkgewotICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0gICAgICAgIENsYXNzTG9hZGVyIGxvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLSAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbiA9IENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW4gPSBsb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIGZpbmQgcmVzb3VyY2U6ICIgKyBmaWxlTmFtZSwgaW4gIT0gbnVsbCk7Ci0gICAgICAgIHJldHVybiBpbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmFsRGVwdGgoaW50IGRlcHRoKSB7Ci0gICAgICAgIEdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdC5nZW5EZXB0aCA9IGRlcHRoOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1vZHVsZVR5cGUoaW50IHR5cGUpIHsKLSAgICAgICAgbW9kdWxlVHlwZSA9IHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbihpbnQgdmVyc2lvbikgewotICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RGVwdGhGb3JBdHRyaWJ1dGUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLSAgICAgICAgaWYgKGZlYXR1cmUuaXNNYW55KCkpCi0gICAgICAgICAgICByZXR1cm4gZ2VuRGVwdGg7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0U2hhcmVkT2JqZWN0QnlUeXBlKEVPYmplY3Qgb3duZXIsIEVSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgIHNoYXJlZFZhbHVlID0gVGVzdFV0aWxpdGllcy5nZXRPYmplY3RCeVR5cGUob3duZXIuZVJlc291cmNlKCksIHJlZi5nZXRFVHlwZSgpLCByZWYuaXNNYW55KCkpOwotICAgICAgICByZXR1cm4gc2hhcmVkVmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHNldAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJZ25vcmVBdHQoSGFzaFNldCBzZXQpIHsKLSAgICAgICAgaWdub3JlQXR0ID0gc2V0OwotICAgIH0KLSAgICAKLQkKLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVJlc0F1dGgoRUF0dHJpYnV0ZSBhdHQsIEVPYmplY3QgZU9iamVjdCkgewotCQlPYmplY3QgYXV0aCA9IG51bGw7Ci0JCWRvIHsKLQkJCWF1dGggPSBwcmltQ3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJfSB3aGlsZSAoIWlzVmFsaWRBdXRoKChSZXNBdXRoVHlwZUJhc2UpYXV0aCkpOwotCQlyZXR1cm4gYXV0aDsKLQl9Ci0JCi0JLyoqCi0JICogV2ViIHdpbGwgbmVlZCB0byBvdmVycmlkZSAgZm9yIEoyRUUgMS4yLzEvMwotCSAqIEBwYXJhbSBhdXRoCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRBdXRoKFJlc0F1dGhUeXBlQmFzZSBhdXRoKSB7Ci0JCXJldHVybiBhdXRoID09IFJlc0F1dGhUeXBlQmFzZS5BUFBMSUNBVElPTl9MSVRFUkFMIHx8IGF1dGggPT0gUmVzQXV0aFR5cGVCYXNlLkNPTlRBSU5FUl9MSVRFUkFMOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZU1ldGhvZEVsZW1lbnRUeXBlKEVBdHRyaWJ1dGUgYXR0LCBFT2JqZWN0IGVPYmplY3QpIHsKLQkJT2JqZWN0IHR5cGUgPSBudWxsOwotCQlkbyB7Ci0JCQl0eXBlID0gcHJpbUNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCX0gd2hpbGUgKCFpc1ZhbGlkTWV0aG9kRWxlbWVudFR5cGUoKE1ldGhvZEVsZW1lbnRLaW5kKXR5cGUpKTsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogV2ViIHdpbGwgbmVlZCB0byBvdmVycmlkZSAgZm9yIEoyRUUgMS4yLzEvMwotCSAqIEBwYXJhbSBhdXRoCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRNZXRob2RFbGVtZW50VHlwZShNZXRob2RFbGVtZW50S2luZCB0eXBlKSB7Ci0JCWlmICAodmVyc2lvbiA9PSBWRVJTSU9OXzFfNCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gdmVyc2lvbiAhPSBWRVJTSU9OXzFfNCAmJiB0eXBlICE9IE1ldGhvZEVsZW1lbnRLaW5kLlNFUlZJQ0VfRU5EUE9JTlRfTElURVJBTDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvIjsKLQkJCUZpbGUgZGVsID0gbmV3IEZpbGUob3V0KTsKLQkJCWRlbGV0ZURpcmVjdG9yeShkZWwpOwotCQkJZGVsLmRlbGV0ZSgpOwotCQkJb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiLi4vdGVzdERhdGEvdGVzdE91dHB1dC8iOwotCQkJZGVsID0gbmV3IEZpbGUob3V0KTsKLQkJCWRlbGV0ZURpcmVjdG9yeShkZWwpOwotCQkJZGVsLmRlbGV0ZSgpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkKLQkgICB0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCWlmIChkaXJlY3RvcnkuZXhpc3RzKCkpewotCQkgICBGaWxlW10gZGVsRmlsZXMgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0JCi0JCSAgIGZvcihpbnQgaT0wOyBpPGRlbEZpbGVzLmxlbmd0aDsgKytpKQotCQkgICB7Ci0JCSAgICAgIGlmKGRlbEZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpCi0JCSAgICAgICAgIGRlbGV0ZURpcmVjdG9yeShkZWxGaWxlc1tpXSk7Ci0JCSAgICAgIGRlbEZpbGVzW2ldLmRlbGV0ZSgpOwotCQkgICB9ICAKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9HZW5lcmFsRU1GVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9HZW5lcmFsRU1GVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQ5OTcyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvR2VuZXJhbEVNRlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKgotICogCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkJhc2VUZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIGl0ZXdrCi0gKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJhbEVNRlRlc3QgZXh0ZW5kcyBCYXNlVGVzdENhc2UgewotCXByaXZhdGUgUmVuZGVyZXJGYWN0b3J5IHRlc3RpbmdGYWN0b3J5OwotCXByaXZhdGUgUmVuZGVyZXJGYWN0b3J5IGRlZmF1bHRGYWN0b3J5OwotCQotCXB1YmxpYyBHZW5lcmFsRU1GVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJCi0JCWRlZmF1bHRGYWN0b3J5ID0gUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKTsKLQkJdGVzdGluZ0ZhY3RvcnkgPSBSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgR2VuZXJhbEVNRlRlc3QoU3RyaW5nIG5hbWUsIFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyKG5hbWUpOwotCQkKLQkJZGVmYXVsdEZhY3RvcnkgPSBSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpOwotCQl0ZXN0aW5nRmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vc2V0IHRoZSBkZWZhdWx0IGZhY3RvcnkgdG8gdGhlIGZhY3RvcnkgbmVlZGVkIGZvciB0aGlzIHRlc3QgcnVuCi0JCVJlbmRlcmVyRmFjdG9yeS5zZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KHRlc3RpbmdGYWN0b3J5KTsKLQkJCi0JCXN1cGVyLnNldFVwKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vc2V0IHRoZSBkZWZhdWx0IGZhY3RvcnkgYmFjayB0byB0aGUgb3JnaW5hbCBkZWZhdWx0Ci0JCVJlbmRlcmVyRmFjdG9yeS5zZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KGRlZmF1bHRGYWN0b3J5KTsKLQkJCi0JCXN1cGVyLnNldFVwKCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotICAgIH0KLQotCXByb3RlY3RlZCBFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0gICAgfQotCi0JcHJvdGVjdGVkIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotCXByb3RlY3RlZCBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0V2ViQXBwRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCBIYXNoU2V0IGlnbm9yYWJsZUF0dHJpYnV0ZXMoKXsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlzZXQuYWRkKCJpZCIpOwotCQlyZXR1cm4gc2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvUmFyRU1GRWRpdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvUmFyRU1GRWRpdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI0NDYzZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1JhckVNRkVkaXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgUmFyRU1GRWRpdFRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GRWRpdGluZ1Rlc3QgewotICAgIFJBUkZpbGUgcmFyRmlsZTsKLQotICAgIHB1YmxpYyBSYXJFTUZFZGl0VGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFJhckVNRkVkaXRUZXN0KFN0cmluZyBuYW1lLCBSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgIAlzdXBlcihuYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LlJhckVNRkVkaXRUZXN0IiwgIi1ub2xvYWRpbmciIH07Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShSYXJFTUZFZGl0VGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBSYXJFTUZFZGl0VGVzdCgidGVzdFJBUkVkaXQiLGZhY3RvcnkpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSQVJFZGl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFJhcigpOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRTcGVjVmVyc2lvbigpKTsKLQotCQlDb25uZWN0b3JSZXNvdXJjZSBERCA9IChDb25uZWN0b3JSZXNvdXJjZSkgcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgICAgCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotICAgICAgIAlzZXRNb2R1bGVUeXBlKENPTk5FQ1RPUik7ICAgICAgIAotICAgICAgICBlZGl0Um9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgb3V0ID0gY3VyRGlyICsgInRlc3RPdXRwdXQvRU1GTW9kZWxDcmVhdGlvblRlc3RzL0VkaXRSYXJFQVIiOwotICAgICAgICByYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIHJhckZpbGUuY2xvc2UoKTsKLQotICAgICAgICAvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgIkVNRlRlc3RzL3JhLnhtbCI7Ci0gICAgICAgIFN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgb3V0ICsgIi9mb29SQVIvTUVUQS1JTkYvcmEueG1sIjsKLSAgICAgICAgLy9jb21wYXJlQ29udGVudHMoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldFJhcigpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAibG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9mb29SQVIvIjsKLSAgICAgICAgcmFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlblJBUkZpbGUoaW4pOwotICAgICAgICBhc3NlcnRUcnVlKHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1JhckVNRlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvUmFyRU1GVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTk0ZmRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvUmFyRU1GVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgUmFyRU1GVGVzdCBleHRlbmRzIEdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCB7Ci0JRUFSRmlsZSBlYXJGaWxlOwotCXByb3RlY3RlZCBSQVJGaWxlIHJhckZpbGU7Ci0KLQlwdWJsaWMgUmFyRU1GVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0gICAgcHVibGljIFJhckVNRlRlc3QoU3RyaW5nIG5hbWUsIFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0gICAgCXN1cGVyKG5hbWUsIGZhY3RvcnkpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZ1tdIGNsYXNzTmFtZSA9IHsgImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5SYXJFTUZUZXN0IiwgIi1ub2xvYWRpbmciIH07Ci0JCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShSYXJFTUZUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFJhckVNRlRlc3QoInRlc3RSQVJQb3B1bGF0aW9uIixmYWN0b3J5KSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFJhckVNRlRlc3QoInRlc3QxNFJBUlBvcHVsYXRpb24iLGZhY3RvcnkpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSQVJQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJY3JlYXRlRUFSKCk7Ci0JCWNyZWF0ZVJBUigpOwotCi0JCUNvbm5lY3RvclJlc291cmNlIEREID0gKENvbm5lY3RvclJlc291cmNlKSByYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJc2V0TW9kdWxlVHlwZShDT05ORUNUT1IpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9UZXN0UmFyRUFSIjsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQkJLy9Db21wYXJlIHdvcmsgaW4gcHJvZ3Jlc3MKLQkJU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotCQlTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAiRU1GVGVzdE5vSUQvcmEueG1sIjsKLQkJU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9UZXN0UmFyRUFSL2Zvb1JBUi9NRVRBLUlORi9yYS54bWwiOwotCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3QxNFJBUlBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlUkFSKCk7Ci0KLQkJQ29ubmVjdG9yUmVzb3VyY2UgREQgPSAoQ29ubmVjdG9yUmVzb3VyY2UpIHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCURELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlzZXRNb2R1bGVUeXBlKENPTk5FQ1RPUik7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1Rlc3QxNFJhckVBUiI7Ci0JCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJZWFyRmlsZS5jbG9zZSgpOwotCi0JCWdldFJhcigpOwotCQlhc3NlcnRUcnVlKCIxLjUiLmVxdWFscyhyYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0U3BlY1ZlcnNpb24oKSkpOwotCQlvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1Rlc3QxNFJhckVBUjIiOwotCQlyYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCXJhckZpbGUuY2xvc2UoKTsKLQotCQkvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotCQlTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0JCVN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3QxNFJhckVBUjIvTUVUQS1JTkYvcmEueG1sIjsKLQkJU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9UZXN0MTRSYXJFQVIvZm9vUkFSL01FVEEtSU5GL3JhLnhtbCI7Ci0JCXNldElnbm9yZUF0dChpZ25vcmFibGVBdHRyaWJ1dGVzKCkpOwotCQljb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZXRSYXIoKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uLCBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvVGVzdDE0UmFyRUFSL2Zvb1JBUiI7Ci0JCXJhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5SQVJGaWxlKGluKTsKLQkJYXNzZXJ0VHJ1ZShyYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlUkFSKCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCXJhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVJBUkZpbGVJbml0aWFsaXplZCgiZm9vUkFSIik7Ci0JCXJhckZpbGUgPSAoUkFSRmlsZSkgZWFyRmlsZS5hZGRDb3B5KHJhckZpbGUpOwotCQlyYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuc2V0RGlzcGxheU5hbWUoImZvb1JBUiIpOwotCQlhc3NlcnRUcnVlKHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVFQVIoKSB7Ci0JCVN0cmluZyBlYXJOYW1lID0gIlRlc3QuZWFyIjsKLQkJZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKGVhck5hbWUpOwotCQlhc3NlcnRUcnVlKGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmVtZnRlc3QuR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0I2NyZWF0ZUF0dHJpYnV0ZVZhbHVlKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlQXR0cmlidXRlVmFsdWUoRUF0dHJpYnV0ZSBhdHQsIEVPYmplY3QgZU9iamVjdCkgewotCQkvL1RPRE86IGRlbGV0ZSB0aGlzIGFmdGVyIHRoZSBtb2RlbCBpcyBmaXhlZAotCQlpZiAoYXR0ID09IEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbmZpZ1Byb3BlcnR5X1R5cGUoKSkKLQkJCXJldHVybiAiamF2YS5sYW5nLlN0cmluZyI7Ci0JCWVsc2UgaWYgKGF0dCA9PSBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV9DcmVkZW50aWFsSW50ZXJmYWNlKCkpCi0JCQlyZXR1cm4gImphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWwiOwotCQllbHNlIGlmIChhdHQgPT0gSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29ubmVjdG9yX1NwZWNWZXJzaW9uKCkgJiYgdmVyc2lvbiA9PSBWRVJTSU9OXzFfMykKLQkJCXJldHVybiAiMS4wIjsKLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9SZXNvbHZlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvUmVzb2x2ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YjA1OWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9SZXNvbHZlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RQZXJtaXNzaW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeU1ldGhvZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBSZXNvbHZlclRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GRWRpdGluZ1Rlc3QgewotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgX01FVEFfSU5GX0VKQl9KQVJfWE1MID0gIi9NRVRBLUlORi9lamItamFyLnhtbCI7Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVqYlBhY2thZ2UgRUpCX1BLRyA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCi0gICAgRUFSRmlsZSBlYXJGaWxlOwotCi0gICAgRUpCSmFyRmlsZSBlamJGaWxlOwotCi0gICAgRU9iamVjdCBtZXNCZWFuLCBlbnRpdHlCZWFuOwotCi0gICAgU2VjdXJpdHlJZGVudGl0eSBzZWNJRDsKLQotICAgIFJvbGVTb3VyY2Ugcm9sZVNvdXJjZTsKLQotICAgIGludCBOVU1fQkVBTlMgPSAxMDsKLQotICAgIGZpbmFsIGludCBOVU1fUkVMQVRJT05fUk9MRVMgPSAyOwotCi0gICAgaW50IGNyZWF0ZWRCZWFucyA9IDA7Ci0KLSAgICBpbnQgY3JlYXRlZFNlY1JvbGVzID0gMDsKLQotICAgIHByb3RlY3RlZCBpbnQgY3JlYXRlZFNlY3VyaXR5SWRlbnRpdGllcyA9IDA7Ci0KLSAgICBib29sZWFuIG1wRmxhZyA9IGZhbHNlOwotCi0gICAgcHVibGljIFJlc29sdmVyVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFJlc29sdmVyVGVzdChTdHJpbmcgbmFtZSwgUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAJc3VwZXIobmFtZSwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAganVuaXQudGV4dHVpLlRlc3RSdW5uZXIubWFpbihuZXcgU3RyaW5nW10geyBSZXNvbHZlclRlc3QuY2xhc3MuZ2V0TmFtZSgpfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZShSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKFJlc29sdmVyVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlclRlc3QoInRlc3RSZXNvbHZlciIsZmFjdG9yeSkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlclRlc3QoInRlc3RSZXNvbHZlck5vU2NoZW1hTG9jYXRpb24iLGZhY3RvcnkpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICIuLi90ZXN0RGF0YS9zbCI7Ci0gICAgICAgIGdldEVKQihpbik7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIyLjEiLCBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICBzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLSAgICAgICAgc2V0TW9kdWxlVHlwZShFSkIpOwotCi0gICAgICAgIFN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICIuLi90ZXN0RGF0YS90ZXN0T3V0cHV0L3NsIjsKLSAgICAgICAgZWpiRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotICAgICAgICBlamJGaWxlLmNsb3NlKCk7Ci0KLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gaW4gKyBfTUVUQV9JTkZfRUpCX0pBUl9YTUw7Ci0gICAgICAgIFN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gb3V0ICsgX01FVEFfSU5GX0VKQl9KQVJfWE1MOwotICAgICAgICBjb21wYXJlQ29udGVudHMoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlck5vU2NoZW1hTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBib29sZWFuIHZhbGlkYXRpbmcgPSBSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpLmlzVmFsaWRhdGluZygpOwotICAgICAgICB0cnkgeyAKLSAgICAgICAgICAgIFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIi4uL3Rlc3REYXRhL25vLXNsIjsKLSAgICAgICAgICAgIGdldEVKQihpbik7Ci0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscygiMi4xIiwgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFZlcnNpb24oKSk7Ci0gICAgICAgICAgICBFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgICAgICAgICBzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLSAgICAgICAgICAgIHNldE1vZHVsZVR5cGUoRUpCKTsKLQotICAgICAgICAgICAgU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIi4uL3Rlc3REYXRhL3Rlc3RPdXRwdXQvbm8tc2wiOwotICAgICAgICAgICAgZWpiRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotICAgICAgICAgICAgZWpiRmlsZS5jbG9zZSgpOwotCi0gICAgICAgICAgICBTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBpbiArIF9NRVRBX0lORl9FSkJfSkFSX1hNTDsKLSAgICAgICAgICAgIFN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gb3V0ICsgX01FVEFfSU5GX0VKQl9KQVJfWE1MOwotICAgICAgICAgICAgY29tcGFyZUNvbnRlbnRzKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJKTsKLSAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotICAgICAgICAgICAgcmUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpLnNldFZhbGlkYXRpbmcodmFsaWRhdGluZyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZXRFSkIoU3RyaW5nIGluKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uLCBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGVqYkZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FSkJKYXJGaWxlKGluKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVPYmplY3QgY3JlYXRlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIGlmIChlQ2xhc3NpZmllci5nZXROYW1lKCkuZXF1YWxzKCJFbnRlcnByaXNlQmVhbiIpKSB7Ci0gICAgICAgICAgICBjcmVhdGVkQmVhbnMrKzsKLSAgICAgICAgICAgIHN3aXRjaCAoY3JlYXRlZEJlYW5zKSB7Ci0gICAgICAgICAgICBjYXNlICgzKToKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICAgICAgICAgIGNhc2UgKDcpOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVNZXNzYWdlQmVhbkluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICAgICAgICAgIGNhc2UgKDQpOgotICAgICAgICAgICAgY2FzZSAoOCk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNlc3Npb25CZWFuSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRW50aXR5QmVhbkluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChlQ2xhc3NpZmllci5nZXROYW1lKCkuZXF1YWxzKCJTZWN1cml0eUlkZW50aXR5IikpCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlU2VjdXJpdHlJZGVudGl0aXlJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0gICAgICAgIGVsc2UgaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIlJvbGVTb3VyY2UiKSkKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVSb2xlU291cmNlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgICAgICBlbHNlIGlmIChlQ2xhc3NpZmllciA9PSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVBdHRyaWJ1dGUoKSkgcmV0dXJuIGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVPYmplY3QgY3JlYXRlU2VjdXJpdHlJZGVudGl0aXlJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLSAgICAgICAgLyogQWx0ZXJuYXRlIHR5cGVzICovCi0gICAgICAgIGNyZWF0ZWRTZWNSb2xlcysrOwotICAgICAgICBpZiAoKGNyZWF0ZWRTZWNSb2xlcyAmIDEpID09IDApCi0gICAgICAgICAgICByZXR1cm4gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVXNlQ2FsbGVySWRlbnRpdHkoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVPYmplY3QgY3JlYXRlUm9sZVNvdXJjZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotICAgICAgICByZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlUm9sZVNvdXJjZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRU9iamVjdCBjcmVhdGVNZXNzYWdlQmVhbkluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotICAgICAgICByZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlTWVzc2FnZURyaXZlbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgRU9iamVjdCBjcmVhdGVTZXNzaW9uQmVhbkluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotICAgICAgICByZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlU2Vzc2lvbigpOwotICAgIH0KLQotICAgIHByaXZhdGUgRU9iamVjdCBjcmVhdGVFbnRpdHlCZWFuSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIHJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVFbnRpdHkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVPYmplY3QgY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotICAgICAgICByZXR1cm4gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0LkdlbmVyYWxFTUZUZXN0I2dldERlcHRoRm9yQXR0cmlidXRlKEVSZWZlcmVuY2UpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXREZXB0aEZvckF0dHJpYnV0ZShFUmVmZXJlbmNlIHJlZikgewotICAgICAgICBpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoImVudGVycHJpc2VCZWFucyIpKQotICAgICAgICAgICAgcmV0dXJuIE5VTV9CRUFOUzsKLSAgICAgICAgZWxzZSBpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoImVudGl0eUJlYW5zIikpCi0gICAgICAgICAgICByZXR1cm4gTlVNX0JFQU5TOwotICAgICAgICBlbHNlIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygicmVsYXRpb25zaGlwUm9sZXMiKSkgcmV0dXJuIE5VTV9SRUxBVElPTl9ST0xFUzsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldERlcHRoRm9yQXR0cmlidXRlKHJlZik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmVtZnRlc3QuR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0I3BvcHVsYXRlRmVhdHVyZXMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcG9wdWxhdGVGZWF0dXJlcyhFT2JqZWN0IGVPYmplY3QpIHsKLSAgICAgICAgaWYgKGVPYmplY3QuZUNsYXNzKCkgPT0gRUpCX1BLRy5nZXRDTVBBdHRyaWJ1dGUoKSkgewotICAgICAgICAgICAgKChDTVBBdHRyaWJ1dGUpIGVPYmplY3QpLnNldE5hbWUoKFN0cmluZykgRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVBdHRyaWJ1dGUoCi0gICAgICAgICAgICAgICAgICAgIEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU5hbWVkRWxlbWVudF9OYW1lKCksIGVPYmplY3QpKTsKLSAgICAgICAgICAgICgoQ01QQXR0cmlidXRlKSBlT2JqZWN0KS5zZXRFVHlwZSgoRUNsYXNzaWZpZXIpIGNyZWF0ZUphdmFDbGFzc1Byb3h5KG51bGwpKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBzdXBlci5lZGl0RmVhdHVyZXMoZU9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmVtZnRlc3QuR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0I3BvcHVsYXRlQXR0cmlidXRlcyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUF0dHJpYnV0ZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0gICAgICAgIGlmIChlT2JqZWN0IGluc3RhbmNlb2YgUXVlcnlNZXRob2RJbXBsKSB7Ci0gICAgICAgICAgICBMaXN0IGF0dHJpYnV0ZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBFQXR0cmlidXRlIGF0dCA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotICAgICAgICAgICAgICAgIGlmIChhdHQuZ2V0TmFtZSgpLmVxdWFscygicGFybXMiKSAmJiB2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGF0dC5pc0NoYW5nZWFibGUoKSkgZU9iamVjdC5lU2V0KGF0dCwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQZXJtaXNzaW9uSW1wbCkgewotICAgICAgICAgICAgTGlzdCBhdHRyaWJ1dGVzID0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRUF0dHJpYnV0ZSBhdHQgPSAoRUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dC5nZXROYW1lKCkuZXF1YWxzKCJ1bmNoZWNrZWQiKSAmJiBtcEZsYWcpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpKSBlT2JqZWN0LmVTZXQoYXR0LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtcEZsYWcgPSAhbXBGbGFnOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHN1cGVyLmVkaXRBdHRyaWJ1dGVzKGVPYmplY3QpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKEVPYmplY3QgZU9iamVjdCwgRVJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQZXJtaXNzaW9uSW1wbCAmJiByZWYuZ2V0TmFtZSgpLmVxdWFscygicm9sZXMiKSkgewotICAgICAgICAgICAgbXBGbGFnID0gIW1wRmxhZzsKLSAgICAgICAgICAgIC8vaWYgbWV0aG9kIHBlcm1pc3Npb24gdW5jaGVja2VkIGlnbm9yZSByb2xlcwotICAgICAgICAgICAgaWYgKCFtcEZsYWcpIHsgcmV0dXJuOyB9Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIucG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoZU9iamVjdCwgcmVmKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZWFyRmlsZSA9IG51bGw7Ci0gICAgICAgIGVqYkZpbGUgPSBudWxsOwotICAgICAgICBtZXNCZWFuID0gbnVsbDsKLSAgICAgICAgZW50aXR5QmVhbiA9IG51bGw7Ci0gICAgICAgIHNlY0lEID0gbnVsbDsKLSAgICAgICAgcm9sZVNvdXJjZSA9IG51bGw7Ci0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1dhckVNRkVkaXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1dhckVNRkVkaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMmM5MzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9XYXJFTUZFZGl0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuRmlsdGVyTWFwcGluZ0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBXYXJFTUZFZGl0VGVzdCBleHRlbmRzIEdlbmVyYWxFTUZFZGl0aW5nVGVzdCB7Ci0JcHJvdGVjdGVkIEVBUkZpbGUgZWFyRmlsZTsJCi0JcHJvdGVjdGVkIFdBUkZpbGUgd2FyRmlsZTsKLQlwcm90ZWN0ZWQgaW50IGNyZWF0ZWRXZWJUeXBlcyA9IDA7Ci0JcHJvdGVjdGVkIGludCBjcmVhdGVkRXJyb3JQYWdlcyA9IDA7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZm1GbGFnID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgV2FyRU1GRWRpdFRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBXYXJFTUZFZGl0VGVzdChTdHJpbmcgbmFtZSwgUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAJc3VwZXIobmFtZSwgZmFjdG9yeSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LldhckVNRlRlc3QiLCAiLW5vbG9hZGluZyIgfTsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShXYXJFTUZFZGl0VGVzdC5jbGFzcy5nZXROYW1lKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBXYXJFTUZFZGl0VGVzdCgidGVzdFdBUkVkaXQiLGZhY3RvcnkpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXQVJFZGl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFdBUkNsaWVudCgpOwotCi0gICAgICAgIFdlYkFwcFJlc291cmNlIEREID0gKFdlYkFwcFJlc291cmNlKSB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXNldE1vZHVsZVR5cGUoV0VCKTsgCi0gICAgICAgIGVkaXRSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0gICAgICAgIFN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLSAgICAgICAgU3RyaW5nIG91dCA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L0VNRk1vZGVsQ3JlYXRpb25UZXN0cy9FZGl0V2FyRUFSIjsKLSAgICAgICAgd2FyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotICAgICAgICB3YXJGaWxlLmNsb3NlKCk7Ci0KLSAgICAgICAgLy9Db21wYXJlIHdvcmsgaW4gcHJvZ3Jlc3MKLSAgICAgICAKLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgIkVNRlRlc3RzL3dlYi54bWwiOwotICAgICAgICBTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArIG91dCArICIvZm9vV0FSL1dFQi1JTkYvd2ViLnhtbCI7Ci0gICAgICAgIC8vY29tcGFyZUNvbnRlbnRzKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBnZXRXQVJDbGllbnQoKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uLCBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImxvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vIjsKLSAgICAgICAgd2FyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbldBUkZpbGUoaW4pOwotICAgICAgICBhc3NlcnRUcnVlKHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLSAgICB9Ci0JcHVibGljIEVPYmplY3QgY3JlYXRlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0KLQkJaWYgKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViVHlwZSgpLmVxdWFscyhlQ2xhc3NpZmllcikpCi0JCQlyZXR1cm4gY3JlYXRlV2ViVHlwZSgpOwotCQllbHNlIGlmIChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEVycm9yUGFnZSgpLmVxdWFscyhlQ2xhc3NpZmllcikpCi0JCQlyZXR1cm4gY3JlYXRlRXJyb3JQYWdlKCk7Ci0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQl9Ci0JLyogVGhlIHdlYiB0eXBlIGlzIGFic3RyYWN0LiAgQWx0ZXJuYXRlIGJldHdlZW4gc2VydmxldC1jbGFzcwotCSAqIGFuZCBqc3AtZmlsZQotCSAqLwotCXB1YmxpYyBXZWJUeXBlIGNyZWF0ZVdlYlR5cGUoKSB7Ci0JCWNyZWF0ZWRXZWJUeXBlcysrOwotCQlpZiAoKGNyZWF0ZWRXZWJUeXBlcyAmIDEpID09IDApCi0JCQlyZXR1cm4gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2bGV0VHlwZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKU1BUeXBlKCk7Ci0KLQl9Ci0JLyogVGhlIGVycm9yIHBhZ2UgaXMgYWJzdHJhY3QuICBBbHRlcm5hdGUgYmV0d2VlbiBleGNlcHRpb250eXBlCi0JICogYW5kIGVycm9yIGNvZGUKLQkgKi8KLQlwdWJsaWMgRXJyb3JQYWdlIGNyZWF0ZUVycm9yUGFnZSgpIHsKLQkJY3JlYXRlZEVycm9yUGFnZXMrKzsKLQkJaWYgKChjcmVhdGVkRXJyb3JQYWdlcyAmIDEpID09IDApCi0JCQlyZXR1cm4gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFcnJvckNvZGVFcnJvclBhZ2UoKTsKLQkJZWxzZQotCQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZSgpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmVtZnRlc3QuR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0I3BvcHVsYXRlQXR0cmlidXRlcyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUF0dHJpYnV0ZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgRmlsdGVyTWFwcGluZ0ltcGwpewotCQkJTGlzdCBhdHRyaWJ1dGVzID0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRUF0dHJpYnV0ZSBhdHQgPSAoRUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0JCQkJaWYoYXR0LmdldE5hbWUoKS5lcXVhbHMoInVybFBhdHRlcm4iKSAmJiBmbUZsYWcpewotCQkJCQljb250aW51ZTsJCQkJCQotCQkJCX0JCi0JCQkJCi0JCQkJT2JqZWN0IHZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJCQlpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpKQotCQkJCQllT2JqZWN0LmVTZXQoYXR0LCB2YWx1ZSk7Ci0JCQl9IAotCQkJZm1GbGFnID0gIWZtRmxhZzsKLQkJfQotCQllbHNlIAotCQkJc3VwZXIuZWRpdEF0dHJpYnV0ZXMoZU9iamVjdCk7Ci0JfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoRU9iamVjdCBlT2JqZWN0LCBFUmVmZXJlbmNlIHJlZikgewotCQlpZihlT2JqZWN0IGluc3RhbmNlb2YgRmlsdGVyTWFwcGluZ0ltcGwgJiYgcmVmLmdldE5hbWUoKS5lcXVhbHMoInNlcnZsZXQiKSl7Ci0JCQlmbUZsYWcgPSAhZm1GbGFnOwotCQkJLy9pZiBtZXRob2QgcGVybWlzc2lvbiB1bmNoZWNrZWQgaWdub3JlIHJvbGVzCi0JCQlpZighZm1GbGFnKXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIucG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoZU9iamVjdCwgcmVmKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1dhckVNRlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvV2FyRU1GVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGZkYzljLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvV2FyRU1GVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzQXV0aFR5cGVCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHBSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5GaWx0ZXJNYXBwaW5nSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIFdhckVNRlRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QgewotICAgIHByb3RlY3RlZCBFQVJGaWxlIGVhckZpbGU7Ci0gICAgcHJvdGVjdGVkIFdBUkZpbGUgd2FyRmlsZTsKLSAgICBwcm90ZWN0ZWQgaW50IGNyZWF0ZWRXZWJUeXBlcyA9IDA7Ci0gICAgcHJvdGVjdGVkIGludCBjcmVhdGVkRXJyb3JQYWdlcyA9IDA7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZm1GbGFnID0gZmFsc2U7Ci0JCi0gICAgcHVibGljIFdhckVNRlRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBXYXJFTUZUZXN0KFN0cmluZyBuYW1lLCBSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgIAlzdXBlcihuYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5tYWluKG5ldyBTdHJpbmdbXXsgV2FyRU1GVGVzdC5jbGFzcy5nZXROYW1lKCkgfSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoUmVuZGVyZXJGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShXYXJFTUZUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFdhckVNRlRlc3QoInRlc3RXQVJQb3B1bGF0aW9uIixmYWN0b3J5KSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFdhckVNRlRlc3QoInRlc3QxNFdBUlBvcHVsYXRpb24iLGZhY3RvcnkpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXQVJQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLSAgICAgICAgY3JlYXRlRUFSKCk7Ci0gICAgICAgIGNyZWF0ZVdBUkNsaWVudCgpOwotCi0gICAgICAgIFdlYkFwcFJlc291cmNlIEREID0gKFdlYkFwcFJlc291cmNlKSB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJc2V0TW9kdWxlVHlwZShXRUIpOwotICAgICAgICBwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RXYXJFQVIiOwotICAgICAgICBlYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIGVhckZpbGUuY2xvc2UoKTsKLQotICAgICAgICAvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotICAgICAgICBTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0gICAgICAgIFN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJFTUZUZXN0Tm9JRC93ZWIueG1sIjsKLSAgICAgICAgU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9UZXN0V2FyRUFSL2Zvb1dBUi9XRUItSU5GL3dlYi54bWwiOwotCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJc2V0RXF1aXZhbGVudExpbmVzKGdldEVxdWl2YWxlbnRMaW5lc01hcCgpKTsKLQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyB2b2lkIHRlc3QxNFdBUlBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlV0FSQ2xpZW50KCk7Ci0KLQkJV2ViQXBwUmVzb3VyY2UgREQgPSAoV2ViQXBwUmVzb3VyY2UpIHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlzZXRNb2R1bGVUeXBlKFdFQik7Ci0JCS8vc2V0R2VuZXJhbERlcHRoKDIpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RXYXJFQVIxNCI7Ci0JCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJZWFyRmlsZS5jbG9zZSgpOwotCQkKLQkJZ2V0V0FSQ2xpZW50KCk7Ci0JCWFzc2VydEVxdWFscygiMi40Iiwgd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFZlcnNpb24oKSk7Ci0JCW91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9UZXN0V2FyRUFSMTRfMiI7Ci0JCXdhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJd2FyRmlsZS5jbG9zZSgpOwotCi0JCS8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0JCVN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLQkJU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gb3V0ICsgIi9XRUItSU5GL3dlYi54bWwiOwotCQlTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RXYXJFQVIxNC9mb29XQVIvV0VCLUlORi93ZWIueG1sIjsKLQkJc2V0SWdub3JlQXR0KGlnbm9yYWJsZUF0dHJpYnV0ZXMoKSk7Ci0JCWNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkksIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBNYXAgZ2V0RXF1aXZhbGVudExpbmVzTWFwKCkgewotCQlNYXAgbGluZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlsaW5lcy5wdXQoIjxkaXN0cmlidXRhYmxlPjwvZGlzdHJpYnV0YWJsZT4iLCAiPGRpc3RyaWJ1dGFibGUvPiIpOyAKLQkJcmV0dXJuIGxpbmVzOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVdBUkNsaWVudCgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotICAgICAgICB3YXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVXQVJGaWxlSW5pdGlhbGl6ZWQoImZvb1dBUiIpOwotICAgICAgICB3YXJGaWxlID0gKFdBUkZpbGUpIGVhckZpbGUuYWRkQ29weSh3YXJGaWxlKTsKLSAgICAgICAgd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLnNldERpc3BsYXlOYW1lKCJmb29XQVIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlRUFSKCkgewotICAgICAgICBTdHJpbmcgZWFyTmFtZSA9ICJUZXN0LmVhciI7Ci0gICAgICAgIGVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChlYXJOYW1lKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyB2b2lkIGdldFdBUkNsaWVudCgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9UZXN0V2FyRUFSMTQvZm9vV0FSIjsKLQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQlvcHRpb25zLnNldFJlbmRlcmVyVHlwZShvcHRpb25zLlNBWCk7Ci0JCXdhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5XQVJGaWxlKG9wdGlvbnMsIGluKTsKLQkJYXNzZXJ0VHJ1ZSh3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JfQotCi0gICAgcHVibGljIEVPYmplY3QgY3JlYXRlSW5zdGFuY2UoRVJlZmVyZW5jZSByZWYsRU9iamVjdCBlT2JqZWN0KSB7Ci0KLSAgICAgICAgaWYgKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViVHlwZSgpLmVxdWFscyhyZWYuZ2V0RVR5cGUoKSkpCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlV2ViVHlwZSgpOwotICAgICAgICBlbHNlIGlmIChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEVycm9yUGFnZSgpLmVxdWFscyhyZWYuZ2V0RVR5cGUoKSkpCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlRXJyb3JQYWdlKCk7Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUluc3RhbmNlKHJlZiwgZU9iamVjdCk7Ci0gICAgfQotICAgIC8qIFRoZSB3ZWIgdHlwZSBpcyBhYnN0cmFjdC4gIEFsdGVybmF0ZSBiZXR3ZWVuIHNlcnZsZXQtY2xhc3MKLSAgICAgKiBhbmQganNwLWZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgV2ViVHlwZSBjcmVhdGVXZWJUeXBlKCkgewotICAgICAgICBjcmVhdGVkV2ViVHlwZXMrKzsKLSAgICAgICAgaWYgKChjcmVhdGVkV2ViVHlwZXMgJiAxKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmxldFR5cGUoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSlNQVHlwZSgpOwotCi0gICAgfQotICAgIC8qIFRoZSBlcnJvciBwYWdlIGlzIGFic3RyYWN0LiAgQWx0ZXJuYXRlIGJldHdlZW4gZXhjZXB0aW9udHlwZQotICAgICAqIGFuZCBlcnJvciBjb2RlCi0gICAgICovCi0gICAgcHVibGljIEVycm9yUGFnZSBjcmVhdGVFcnJvclBhZ2UoKSB7Ci0gICAgICAgIGNyZWF0ZWRFcnJvclBhZ2VzKys7Ci0gICAgICAgIGlmICgoY3JlYXRlZEVycm9yUGFnZXMgJiAxKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoKTsKLSAgICB9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0LkdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCNwb3B1bGF0ZUF0dHJpYnV0ZXMob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVBdHRyaWJ1dGVzKEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoZU9iamVjdCBpbnN0YW5jZW9mIEZpbHRlck1hcHBpbmdJbXBsKXsKLQkJCUxpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotCQkJCUVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJCWlmKGF0dC5nZXROYW1lKCkuZXF1YWxzKCJ1cmxQYXR0ZXJuIikgJiYgZm1GbGFnKXsKLQkJCQkJY29udGludWU7CQkJCQkKLQkJCQl9CQotCQkJCQotCQkJCU9iamVjdCB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCQkJaWYgKGF0dC5pc0NoYW5nZWFibGUoKSkKLQkJCQkJZU9iamVjdC5lU2V0KGF0dCwgdmFsdWUpOwotCQkJfSAKLQkJCWZtRmxhZyA9ICFmbUZsYWc7Ci0JCX0KLQkJZWxzZSAKLQkJCXN1cGVyLnBvcHVsYXRlQXR0cmlidXRlcyhlT2JqZWN0KTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmKGVPYmplY3QgaW5zdGFuY2VvZiBGaWx0ZXJNYXBwaW5nSW1wbCAmJiByZWYuZ2V0TmFtZSgpLmVxdWFscygic2VydmxldCIpKXsKLQkJCWZtRmxhZyA9ICFmbUZsYWc7Ci0JCQkvL2lmIG1ldGhvZCBwZXJtaXNzaW9uIHVuY2hlY2tlZCBpZ25vcmUgcm9sZXMKLQkJCWlmKCFmbUZsYWcpewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5wb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShlT2JqZWN0LCByZWYpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkQXV0aChSZXNBdXRoVHlwZUJhc2UgYXV0aCkgewotCQlpZiAodmVyc2lvbiA9PSBWRVJTSU9OXzFfMikKLQkJCXJldHVybiBhdXRoID09IFJlc0F1dGhUeXBlQmFzZS5TRVJWTEVUX0xJVEVSQUwgfHwgYXV0aCA9PSBSZXNBdXRoVHlwZUJhc2UuQ09OVEFJTkVSX0xJVEVSQUw7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5pc1ZhbGlkQXV0aChhdXRoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvV2ViU2VydmljZXNFTUZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1dlYlNlcnZpY2VzRU1GVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWU2YjE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvV2ViU2VydmljZXNFTUZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBBdWcgNiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSW50ZXJmYWNlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXZhV1NETE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY2xpZW50LldlYlNlcnZpY2VzUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotCi0KLS8qKgotICogQGF1dGhvciBkZmhvbHR0cAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJTZXJ2aWNlc0VNRlRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QgewotCXB1YmxpYyBFQVJGaWxlIGVhckZpbGU7Ci0JcHVibGljIEVKQkphckZpbGUgZWpiRmlsZTsKLQlpbnQgY3VycmVudFZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQlwcml2YXRlIGludCBjcmVhdGVkSW50ZXJmYWNlTWFwcyA9IDA7Ci0KLQlwdWJsaWMgV2ViU2VydmljZXNFTUZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLSAgICBwdWJsaWMgV2ViU2VydmljZXNFTUZUZXN0KFN0cmluZyBuYW1lLCBSZW5kZXJlckZhY3RvcnkgZmFjdG9yeSkgewotICAgIAlzdXBlcihuYW1lLCBmYWN0b3J5KTsKLSAgICB9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuV2ViU2VydmljZXNFTUZUZXN0IiwgIi1ub2xvYWRpbmciIH07Ci0JCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotCX0KLQlwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKFJlbmRlcmVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoV2ViU2VydmljZXNFTUZUZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFdlYlNlcnZpY2VzRU1GVGVzdCgidGVzdDEzV2ViU2VydmljZXNDbGllbnRQb3B1bGF0aW9uIixmYWN0b3J5KSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFdlYlNlcnZpY2VzRU1GVGVzdCgidGVzdDEzV2ViU2VydmljZXNERFBvcHVsYXRpb24iLGZhY3RvcnkpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgV2ViU2VydmljZXNFTUZUZXN0KCJ0ZXN0MTRXZWJTZXJ2aWNlc0REUG9wdWxhdGlvbiIsZmFjdG9yeSkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBXZWJTZXJ2aWNlc0VNRlRlc3QoInRlc3Q1MFdlYlNlcnZpY2VzRERQb3B1bGF0aW9uIixmYWN0b3J5KSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFdlYlNlcnZpY2VzRU1GVGVzdCgidGVzdEpheFJQQ01hcFBvcHVsYXRpb24iLGZhY3RvcnkpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MTNXZWJTZXJ2aWNlc0NsaWVudFBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3VycmVudFZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlRUpCKCk7Ci0JCQotCi0JCVdlYlNlcnZpY2VzUmVzb3VyY2Ugd2Vic2VyREQgPSAoV2ViU2VydmljZXNSZXNvdXJjZSllamJGaWxlLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiTUVUQS1JTkYvd2Vic2VydmljZXNjbGllbnQueG1sIikpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCXdlYnNlckRELnNldFZlcnNpb25JRChjdXJyZW50VmVyc2lvbik7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlwb3B1bGF0ZVJvb3Qod2Vic2VyREQuZ2V0Um9vdE9iamVjdCgpKTsKLQkJCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArZ2V0UHJvamVjdExvY2F0aW9uKCk7Ci0JCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJZWFyRmlsZS5jbG9zZSgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEpheFJQQ01hcFBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3VycmVudFZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlRUpCKCk7Ci0JCVN0cmluZyBtYXBwaW5nRmlsZVBhdGhVUkkgPSAiTUVUQS1JTkYvdGVzdG1hcC54bWwiOwotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShtYXBwaW5nRmlsZVBhdGhVUkkpOwotCQlSZXNvdXJjZVNldCByZXNTZXQgPSBlamJGaWxlLmdldFJlc291cmNlU2V0KCk7Ci0JCUoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IChKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkpIHJlc1NldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpOwotCQlyZWdpc3RyeS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudCh1cmkubGFzdFNlZ21lbnQoKSwgbmV3IEpheHJwY21hcFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSk7Ci0JCXJlc1NldCA9IGVhckZpbGUuZ2V0UmVzb3VyY2VTZXQoKTsKLQkJcmVnaXN0cnkgPSAoSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KSByZXNTZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQodXJpLmxhc3RTZWdtZW50KCksIG5ldyBKYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkpOwotCi0JCUpheHJwY21hcFJlc291cmNlIGpheHJwY21hcFJlcyA9IChKYXhycGNtYXBSZXNvdXJjZSkgcmVzU2V0LmNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCQotCQlqYXhycGNtYXBSZXMuc2V0VmVyc2lvbklEKGN1cnJlbnRWZXJzaW9uKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCQotCQlKYXZhV1NETE1hcHBpbmcgbWFwID0gSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YVdTRExNYXBwaW5nKCk7Ci0JCWpheHJwY21hcFJlcy5nZXRDb250ZW50cygpLmFkZChtYXApOwotCQlwb3B1bGF0ZVJvb3QoamF4cnBjbWFwUmVzLmdldFJvb3RPYmplY3QoKSk7Ci0JCQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgK2dldFByb2plY3RMb2NhdGlvbigpOwotCQllYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCWVhckZpbGUuY2xvc2UoKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MTNXZWJTZXJ2aWNlc0REUG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCWN1cnJlbnRWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCWNyZWF0ZUVBUigpOwotCQljcmVhdGVFSkIoKTsKLQotCQlXc2RkUmVzb3VyY2Ugd2Vic2VyREQgPSAoV3NkZFJlc291cmNlKWVqYkZpbGUuZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiKSk7Ci0JCS8vVE9ETzogaW5kaXZpZHVhbCB0ZXN0IGZvciBlYWNoIHZlcnNpb24KLQkJd2Vic2VyREQuc2V0VmVyc2lvbklEKGN1cnJlbnRWZXJzaW9uKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXBvcHVsYXRlUm9vdCh3ZWJzZXJERC5nZXRSb290T2JqZWN0KCkpOwotCQkKLQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICtnZXRQcm9qZWN0TG9jYXRpb24oKTsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQl9Ci0JcHVibGljIHZvaWQgdGVzdDE0V2ViU2VydmljZXNERFBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljdXJyZW50VmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlRUpCKCk7Ci0KLQkJV3NkZFJlc291cmNlIHdlYnNlckREID0gKFdzZGRSZXNvdXJjZSllamJGaWxlLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiTUVUQS1JTkYvd2Vic2VydmljZXMueG1sIikpOwotCQl3ZWJzZXJERC5nZXRDb250ZW50cygpLmFkZChXc2RkRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlV2ViU2VydmljZXMoKSk7Ci0JCS8vVE9ETzogaW5kaXZpZHVhbCB0ZXN0IGZvciBlYWNoIHZlcnNpb24KLQkJd2Vic2VyREQuc2V0VmVyc2lvbklEKGN1cnJlbnRWZXJzaW9uKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCXBvcHVsYXRlUm9vdCh3ZWJzZXJERC5nZXRSb290T2JqZWN0KCkpOwotCQkKLQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICtnZXRQcm9qZWN0TG9jYXRpb24oKTsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQl9Ci0JcHVibGljIHZvaWQgdGVzdDUwV2ViU2VydmljZXNERFBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljdXJyZW50VmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQ7Ci0JCWNyZWF0ZUVBUigpOwotCQljcmVhdGVFSkIoKTsKLQotCQlXc2RkUmVzb3VyY2Ugd2Vic2VyREQgPSAoV3NkZFJlc291cmNlKWVqYkZpbGUuZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCJNRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwiKSk7Ci0JCXdlYnNlckRELmdldENvbnRlbnRzKCkuYWRkKFdzZGRGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXZWJTZXJ2aWNlcygpKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQl3ZWJzZXJERC5zZXRWZXJzaW9uSUQoY3VycmVudFZlcnNpb24pOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fNV8wKTsKLQkJcG9wdWxhdGVSb290KHdlYnNlckRELmdldFJvb3RPYmplY3QoKSk7Ci0JCQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgK2dldFByb2plY3RMb2NhdGlvbigpOwotCQllYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCWVhckZpbGUuY2xvc2UoKTsKLQotCX0KLQkKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVJbnN0YW5jZShFUmVmZXJlbmNlIHJlZixFT2JqZWN0IGVPYmplY3QpIHsKLQotICAgICAgICBpZiAoSmF4cnBjbWFwUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW50ZXJmYWNlTWFwcGluZygpLmVxdWFscyhyZWYuZ2V0RVR5cGUoKSkpCi0gICAgICAgICAgICByZXR1cm4gY3JlYXRlSW50ZXJmYWNlTWFwKCk7Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUluc3RhbmNlKHJlZiwgZU9iamVjdCk7Ci0gICAgfQotCQotICAgIC8qIFRoZSB3ZWIgdHlwZSBpcyBhYnN0cmFjdC4gIEFsdGVybmF0ZSBiZXR3ZWVuIHNlcnZsZXQtY2xhc3MKLSAgICAgKiBhbmQganNwLWZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZXJmYWNlTWFwcGluZyBjcmVhdGVJbnRlcmZhY2VNYXAoKSB7Ci0gICAgICAgIGNyZWF0ZWRJbnRlcmZhY2VNYXBzKys7Ci0gICAgICAgIGlmICgoY3JlYXRlZEludGVyZmFjZU1hcHMgJiAxKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZpY2VFbmRwb2ludEludGVyZmFjZU1hcHBpbmcoKTsKLQotICAgIH0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3RMb2NhdGlvbigpIHsKLQkJaWYgKGN1cnJlbnRWZXJzaW9uID09IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKQotCQkJcmV0dXJuICJ0ZXN0T3V0cHV0L1Rlc3RXZWJTZXJ2aWNlcyI7Ci0JCWlmIChjdXJyZW50VmVyc2lvbiA9PSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkKLQkJCXJldHVybiAidGVzdE91dHB1dC9UZXN0V2ViU2VydmljZXMxNCI7Ci0JCWVsc2UKLQkJCXJldHVybiAidGVzdE91dHB1dC9UZXN0V2ViU2VydmljZXM1MCI7Ci0JfQotCXB1YmxpYyB2b2lkIGdldEVKQigpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgK2dldFByb2plY3RMb2NhdGlvbigpICsiL2Zvb1dlYlNlcnZpY2VzIjsKLQkJZWpiRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVKQkphckZpbGUoaW4pOwotCQlhc3NlcnRUcnVlKGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0JcHVibGljIHZvaWQgY3JlYXRlRUpCKCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCWVqYkZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVKQkphckZpbGVJbml0aWFsaXplZCgiZm9vV2ViU2VydmljZXMiKTsKLQkJZWpiRmlsZSA9IChFSkJKYXJGaWxlKSBlYXJGaWxlLmFkZENvcHkoZWpiRmlsZSk7Ci0JCWVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5zZXREaXNwbGF5TmFtZSgiZm9vV2ViU2VydmljZXMiKTsKLQkJYXNzZXJ0VHJ1ZShlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JfQotCXB1YmxpYyB2b2lkIGNyZWF0ZUVBUigpIHsKLQkJU3RyaW5nIGVhck5hbWUgPSAiVGVzdC5lYXIiOwotCQllYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoZWFyTmFtZSk7Ci0JCWFzc2VydFRydWUoZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BYnN0cmFjdEFyY2hpdmVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQWJzdHJhY3RBcmNoaXZlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTFhMzE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BYnN0cmFjdEFyY2hpdmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotIC8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMDIvMDcvMDEgMTo0ODoxOCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0QXJjaGl2ZVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMS4iOy8vJE5PTi1OTFMtMSQKLS8qKgotICogQWJzdHJhY3RBcmNoaXZlVGVzdCBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgQWJzdHJhY3RBcmNoaXZlVGVzdChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIFNldCBnZXRBbGxVbnJlc29sdmVkUHJveGllcyhFT2JqZWN0IHJvb3QpIHsKLQlTZXQgdmlzaXRlZCA9IG5ldyBIYXNoU2V0KCk7Ci0JU2V0IHByb3hpZXMgPSBuZXcgSGFzaFNldCgpOwotCWdldEFsbFVucmVzb2x2ZWRQcm94aWVzKHJvb3QsIHByb3hpZXMsIHZpc2l0ZWQsIHJvb3QuZVJlc291cmNlKCkpOwotCXJldHVybiBwcm94aWVzOwotfQotcHVibGljIHZvaWQgZ2V0QWxsVW5yZXNvbHZlZFByb3hpZXMoRU9iamVjdCBvYmplY3QsIFNldCBwcm94aWVzLCBTZXQgdmlzaXRlZE9iamVjdHMsIFJlc291cmNlIG9yaWdpbmFsUmVzb3VyY2UpIHsKLQotCWlmICh2aXNpdGVkT2JqZWN0cy5jb250YWlucyhvYmplY3QpKQotCQlyZXR1cm47Ci0JZWxzZQotCQl2aXNpdGVkT2JqZWN0cy5hZGQob2JqZWN0KTsKLQotCWlmIChvYmplY3QuZVJlc291cmNlKCkgIT0gb3JpZ2luYWxSZXNvdXJjZSkgewotCQlpZiAoKChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IClvYmplY3QpLmVJc1Byb3h5KCkpIHsKLQkJCXByb3hpZXMuYWRkKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCUxpc3QgcmVmcyA9IG9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpOwotCWlmIChyZWZzICE9IG51bGwpIHsKLQkJSXRlcmF0b3IgaXIgPSByZWZzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpci5oYXNOZXh0KCkpIHsKLQkJCUVSZWZlcmVuY2UgciA9IChFUmVmZXJlbmNlKSBpci5uZXh0KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBvYmplY3QuZUdldChyKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoci5pc01hbnkoKSkgewotCQkJCUNvbGxlY3Rpb24gYyA9IChDb2xsZWN0aW9uKSB2YWx1ZTsKLQkJCQlJdGVyYXRvciBpcjIgPSBjLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGlyMi5oYXNOZXh0KCkpIHsKLQkJCQkJRU9iamVjdCByZWZPYmogPSAoRU9iamVjdCkgaXIyLm5leHQoKTsKLQkJCQkJZ2V0QWxsVW5yZXNvbHZlZFByb3hpZXMocmVmT2JqLCBwcm94aWVzLCB2aXNpdGVkT2JqZWN0cywgb3JpZ2luYWxSZXNvdXJjZSk7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJZ2V0QWxsVW5yZXNvbHZlZFByb3hpZXMoKEVPYmplY3QpIHZhbHVlLCBwcm94aWVzLCB2aXNpdGVkT2JqZWN0cywgb3JpZ2luYWxSZXNvdXJjZSk7Ci0JCX0KLQl9Ci19Ci1wdWJsaWMgc3RhdGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLX0KLXB1YmxpYyB2b2lkIHZlcmlmeVByb3hpZXMoRU9iamVjdCByb290KSB7Ci0KLQlTZXQgcHJveGllcyA9IGdldEFsbFVucmVzb2x2ZWRQcm94aWVzKHJvb3QpOwotCWFzc2VydFRydWUoIlNvbWUgcHJveGllcyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQiLCBwcm94aWVzLmlzRW1wdHkoKSk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQWxsQXJjaGl2ZVRlc3RzRWNsaXBzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0FsbEFyY2hpdmVUZXN0c0VjbGlwc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5ZmM2ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQWxsQXJjaGl2ZVRlc3RzRWNsaXBzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDE4LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFsbEFyY2hpdmVUZXN0c0VjbGlwc2UgZXh0ZW5kcyBBbGxBcmNoaXZlVGVzdHNKYXZhIHsKLQotICAgIHB1YmxpYyBBbGxBcmNoaXZlVGVzdHNFY2xpcHNlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BbGxBcmNoaXZlVGVzdHNKYXZhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQWxsQXJjaGl2ZVRlc3RzSmF2YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTZjOGViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BbGxBcmNoaXZlVGVzdHNKYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotIC8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSAqLwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzE5LzAwIDQ6NDQ6MDQgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxBcmNoaXZlVGVzdHNKYXZhIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMS4iOy8vJE5PTi1OTFMtMSQKLS8qKgotICogQWxsVGVzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIEFsbEFyY2hpdmVUZXN0c0phdmEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLS8qKgotICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5BbGxUZXN0cyIsICItbm9sb2FkaW5nIn07Ci0JVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdCIpOwotCXN1aXRlLmFkZFRlc3QoRGlzY3JpbWluYXRvclRlc3Quc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChMb29zZUFyY2hpdmVUZXN0cy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KEluaXRpYWxpemF0aW9uVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChTaW1wbGVUZXN0cy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KENvcHlUZXN0cy5zdWl0ZSgpKTsKLS8vCXN1aXRlLmFkZFRlc3QoRUpCSmFyQ29udmVyc2lvblRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoV0FSRmlsZVRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoU2F2ZVRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoSmF2YVRlc3RzLnN1aXRlKCkpOwotLy8Jc3VpdGUuYWRkVGVzdChJRFRlc3RzLnN1aXRlKCkpOwotCS8vc3VpdGUuYWRkVGVzdChBbHRERFRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoU2VjdXJpdHlSb2xlVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChSYXJGaWxlVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChSZXNvdXJjZVRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoQ2xpZW50Q29udGFpbmVyUmVzb3VyY2VMb2FkVGVzdC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3RNb2R1bGVDbGFzc0xvYWRpbmcuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0SW52YWxpZFhtbE11bHRpcGxpY2l0eS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KERlZmVjdFZlcmlmaWNhdGlvblRlc3RzLnN1aXRlKCkpOwotCQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9DbGllbnRDb250YWluZXJSZXNvdXJjZUxvYWRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQ2xpZW50Q29udGFpbmVyUmVzb3VyY2VMb2FkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWQ4MTk4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9DbGllbnRDb250YWluZXJSZXNvdXJjZUxvYWRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUluaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotCi0KLQotcHVibGljIGNsYXNzIENsaWVudENvbnRhaW5lclJlc291cmNlTG9hZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZXsKLQlwdWJsaWMgc3RhdGljIEVBUkZpbGUgZWFyRmlsZSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBTaW1wbGVUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ2xpZW50Q29udGFpbmVyUmVzb3VyY2VMb2FkVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnNldFVwKCk7Ci0JCUFyY2hpdmVJbml0LmluaXQoKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShDbGllbnRDb250YWluZXJSZXNvdXJjZUxvYWRUZXN0LmNsYXNzKTsKLQl9Ci0JLyoqCi0JICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LkNsaWVudENvbnRhaW5lclJlc291cmNlTG9hZFRlc3QiLCAiLW5vbG9hZGluZyIgfTsKLQkJVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDbGllbnRDb250YWluZXJMb2FkICgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRyeSB7Ci0KLQkJCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpOwotCQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAibXRhcHAyLmVhciI7Ci0JCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAibXRhcHAyRmluaXNoZWQuZWFyIjsKLQkJCWVhckZpbGUgPSBmYWN0b3J5Lm9wZW5FQVJGaWxlIChpbik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJ1cmk6ICIgKyBlYXJGaWxlLmdldFVSSSgpKTsKLQotCQkJTGlzdCBhcHBDbGllbnRzID0gZWFyRmlsZS5nZXRBcHBsaWNhdGlvbkNsaWVudEZpbGVzKCk7Ci0JCQlib29sZWFuIGV4Rm91bmQxID0gZmFsc2U7Ci0JCQlib29sZWFuIGV4Rm91bmQyID0gZmFsc2U7Ci0JCQkKLQkJCWZvcihpbnQgaSA9IDA7IGk8YXBwQ2xpZW50cy5zaXplKCk7IGkrKyl7Ci0JCQkJQXBwbGljYXRpb25DbGllbnRGaWxlIGZpbGUgPSAoQXBwbGljYXRpb25DbGllbnRGaWxlKWFwcENsaWVudHMuZ2V0KDApOwotCQkJCVJlc291cmNlIHJlczsKLQotCQkJCXRyeXsKLQkJCQkJcmVzID0gZmlsZS5nZXRNb2ZSZXNvdXJjZSgiTUVUQS1JTkYvRk9PY2xpZW50LXJlc291cmNlLnhtaSIpOwotCQkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpewkKLQkJCQkJZXhGb3VuZDEgPSB0cnVlOwotCQkJCQlpZighKGUgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24pKXsKLQkJCQkJCWFzc2VydFRydWUoIkV4cGVjdGVkIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIsIGZhbHNlKTsKLQkJCQkJfQkJCi0JCQkJfQotCQkJCQotCQkJCXRyeSB7Ci0JCQkJCXJlcyA9IGZpbGUuZ2V0TW9mUmVzb3VyY2UoIk1FVEEtSU5GL2NsaWVudC1yZXNvdXJjZS54bWkiKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlleEZvdW5kMiA9IHRydWU7Ci0JCQkJCWlmKCEoZSBpbnN0YW5jZW9mIFJlc291cmNlTG9hZEV4Y2VwdGlvbikpewotCQkJCQkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgUmVzb3VyY2VMb2FkRXhjZXB0aW9uIiwgZmFsc2UpOwotCQkJCQl9CQotCQkJCX0KLQkJCX0KLQkJCWFzc2VydFRydWUoIk5vIGV4Y2VwdGlvbiBsb2dnZWQgZm9yIG5vbi1leGlzdGluZyBmaWxlIiwgZXhGb3VuZDEpOwotCQkJYXNzZXJ0VHJ1ZSgiTm8gZXhjZXB0aW9uIGxvZ2dlZCBmb3IgZXhpc3RpbmciLCBleEZvdW5kMik7Ci0KLQkJCQotCQkJZWFyRmlsZS5zYXZlQXMob3V0KTsKLQkJCWVhckZpbGUuY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0NvcHlUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0NvcHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWU2MTY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9Db3B5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotLyoKLSogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0qLwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUmVhZE9ubHlEaXJlY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMTQvMDAgMTI6MTA6MzYgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBDb3B5VGVzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENvcHlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0JfQotCXB1YmxpYyBFamJGYWN0b3J5IGdldEVKQkZhY3RvcnkoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIEVqYlBhY2thZ2UgZ2V0RUpCUGFja2FnZSgpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQlwdWJsaWMgV2ViYXBwbGljYXRpb25GYWN0b3J5IGdldFdlYkZhY3RvcnkoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYmFwcGxpY2F0aW9uRmFjdG9yeSgpOwotCX0KLQkvKioKLQkgKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotCSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuQ29weVRlc3RzIiwgIi1ub2xvYWRpbmciIH07Ci0JCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotCX0KLQlwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShDb3B5VGVzdHMuY2xhc3MpOwotCX0KLQkvKioKLQkgKiBUZXN0cyB0aGUgYWRkQ29weShSZWFkT25seURpcmVjdG9yeSkgYXBpIG9uIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29weURpcmVjdG9yeSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVdBUkZpbGUgYVdhckZpbGUgPSAoV0FSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJleGFtcGxlMi53YXIiKTsKLQotCQlSZWFkT25seURpcmVjdG9yeSBzYW1wbGVEaXJlY3RvcnkgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5SZWFkT25seURpcmVjdG9yeShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJXYXJUZXN0Q2xhc3NlcyIpOwotCQkKLQkJaW50IGluaXRpYWxTaXplID0gYVdhckZpbGUuZ2V0RmlsZXMoKS5zaXplKCk7Ci0KLQkJYVdhckZpbGUuYWRkQ29weShzYW1wbGVEaXJlY3RvcnkpOwotCQlJdGVyYXRvciBpdGVyID0gYVdhckZpbGUuZ2V0RmlsZXMoKS5pdGVyYXRvcigpOwotCQkvL0ZvciBydW5uaW5nIGluc2lkZSBlY2xpcHNlCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHVyaSA9ICgoRmlsZSlpdGVyLm5leHQoKSkuZ2V0VVJJKCk7Ci0JCQlpZiAodXJpLmluZGV4T2YoIkNWUyIpID49IDApIAotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGZpbGVzICIsIGFXYXJGaWxlLmdldEZpbGVzKCkuc2l6ZSgpID09IGluaXRpYWxTaXplICsgNyk7Ci0JCWFXYXJGaWxlLnNhdmVBc05vUmVvcGVuKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvQ29weVRlc3RzL2FkZENvcHlEaXIud2FyIik7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29weU1vZHVsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotCQlFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0JCUxpc3QgbW9kdWxlcyA9IGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCk7Ci0JCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IG51bGw7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGUgYU1vZHVsZSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJaWYgKGFNb2R1bGUuaXNFamJNb2R1bGUoKSkgewotCQkJCWVqYkphckZpbGUgPSAoRUpCSmFyRmlsZSkgZWFyRmlsZS5nZXRGaWxlKGFNb2R1bGUuZ2V0VXJpKCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZSgiRUpCSmFyRmlsZSBzaG91bGQgbm90IGJlIG51bGwiLCBlamJKYXJGaWxlICE9IG51bGwpOwotCQllamJKYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJRUFSRmlsZSBuZXdFYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9Db3B5VGVzdHMvbmV3RWFyV2l0aENvcGllZE1vZHVsZS5lYXIiKTsKLQkJbmV3RWFyRmlsZS5hZGRDb3B5KGVqYkphckZpbGUpOwotCQlFSkJKYXJGaWxlIGNvcGllZCA9IChFSkJKYXJGaWxlKSBuZXdFYXJGaWxlLmdldE1vZHVsZUZpbGVzKCkuZ2V0KDApOwotCQlhc3NlcnRUcnVlKGNvcGllZC5pc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkpOwotCQlhc3NlcnRUcnVlKGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpID09IGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5nZXQoMCkpOwotCQlhc3NlcnRUcnVlKGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IGVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSk7Ci0JCWFzc2VydFRydWUoZWpiSmFyRmlsZS5nZXRGaWxlcygpLnNpemUoKSA9PSBjb3BpZWQuZ2V0RmlsZXMoKS5zaXplKCkpOwotCi0JCW5ld0VhckZpbGUuc2F2ZU5vUmVvcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBwZXIgQ01WQyBkZWZlY3QgcmVwb3J0IDk2MTk3Ci0JICogQ3JlYXRlIGEgbmV3IGFwcGxpY2F0aW9uLCBvcGVuIGVqYiBqYXIgZmlsZSwgdXNlIGFkZGNvcHkgdG8gYWRkIHRoZSBtb2R1bGUsIGFuZCBzYXZlCi0JICogdXNpbmcgb3JpZ2luYWwgZWFyLCBnZXQgdGhlIGVqYiBqYXIsIGFuZCBtb2RpZnkgYmluZGluZ3MKLQkgKiBzYXZlIGFnYWluCi0JICogUmVzdWx0OiAgYmluZGluZ3Mgbm90IHVwZGF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29weU1vZHVsZUZpbGVzVG9FQVIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHVyaSA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvQ29weVRlc3RzL3Rlc3RBZGRDb3B5TW9kdWxlRmlsZXNUb0VBUi5lYXIiOwotCQkvL0NyZWF0ZSBhIG5ldyBlYXIgZmlsZSwgYWRkIGEgc3RhbmRhbG9uZSBlamIgamFyIGZpbGUgYW5kIHN0YW5kYWxvbmUgd2FyIGZpbGUsIGFuZCBzYXZlCi0JCUVBUkZpbGUgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKHVyaSk7Ci0JCWVhckZpbGUuc2V0SjJFRVZlcnNpb24oSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQllYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuc2V0RGlzcGxheU5hbWUodXJpKTsKLQkJRUpCSmFyRmlsZSBlamJKYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUpCSmFyRmlsZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJiYW5rZWpicy5qYXIiKTsKLQkJZWFyRmlsZS5hZGRDb3B5KGVqYkphckZpbGUpOwotCQlXQVJGaWxlIHdhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5XQVJGaWxlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImV4YW1wbGUyLndhciIpOwotCQllYXJGaWxlLmFkZENvcHkod2FyRmlsZSk7Ci0JCSgoV2ViTW9kdWxlKSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0Rmlyc3RNb2R1bGUod2FyRmlsZS5nZXRVUkkoKSkpLnNldENvbnRleHRSb290KCIvIik7Ci0JCWVhckZpbGUuc2F2ZSgpOwotCi0JCWVqYkphckZpbGUgPSAoRUpCSmFyRmlsZSkgZWFyRmlsZS5nZXRFSkJKYXJGaWxlcygpLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgiZWpiIGRkIHJlc291cmNlIG5vdCByaWdodCIsIGVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5lUmVzb3VyY2UoKSA9PSBlamJKYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSk7Ci0KLQkJCi0KLQkJd2FyRmlsZSA9IChXQVJGaWxlKSBlYXJGaWxlLmdldFdBUkZpbGVzKCkuZ2V0KDApOwotCQlhc3NlcnRUcnVlKCJ3YXIgZGQgcmVzb3VyY2Ugbm90IHJpZ2h0Iiwgd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmVSZXNvdXJjZSgpID09IHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKTsKLQotCQkKLQkJZWFyRmlsZS5zYXZlTm9SZW9wZW4oKTsKLQotCQkKLQkJZWFyRmlsZS5jbG9zZSgpOwotCi0JfQotCS8qKgotCSAqIFRlc3RzIG9wZW5pbmcgYSBzdGFuZGFsb25lIG1vZHVsZSB3aXRoIGFuIGFic29sdXRlIHBhdGgsIGFuZCBhZGRpbmcgdGhhdCB0byBhIG5ldyBlYXIgZmlsZSwgcGVyIGRlZmVjdCByZXBvcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29weVN0YW5kYWxvbmVNb2R1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiYmFua2VqYnMuamFyIjsKLQotCQlFSkJKYXJGaWxlIGVqYkphckZpbGUgPSAoRUpCSmFyRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShmaWxlTmFtZSk7Ci0JCWVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQlFQVJGaWxlIG5ld0VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L0NvcHlUZXN0cy9uZXdFYXJXaXRoU3RhbmRBbG9uZU1vZHVsZS1vdXQuZWFyIik7Ci0JCW5ld0VhckZpbGUuYWRkQ29weShlamJKYXJGaWxlKTsKLQkJRUpCSmFyRmlsZSBjb3BpZWQgPSAoRUpCSmFyRmlsZSkgbmV3RWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZShjb3BpZWQuaXNEZXBsb3ltZW50RGVzY3JpcHRvclNldCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb3BpZWQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSA9PSBjb3BpZWQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0VHJ1ZShjb3BpZWQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBlamJKYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkpOwotCQlhc3NlcnRUcnVlKGVqYkphckZpbGUuZ2V0RmlsZXMoKS5zaXplKCkgPT0gY29waWVkLmdldEZpbGVzKCkuc2l6ZSgpKTsKLQotCQluZXdFYXJGaWxlLnNhdmVOb1Jlb3BlbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW5hbWVBbmREZWxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIjsKLQkJRUFSRmlsZSBlYXJGaWxlID0gKEVBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotCQlMaXN0IG1vZHVsZXMgPSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpOwotCQlFSkJKYXJGaWxlIGVqYkphckZpbGUgPSBudWxsOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlIGFNb2R1bGUgPSAoTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCWlmIChhTW9kdWxlLmlzRWpiTW9kdWxlKCkpIHsKLQkJCQllamJKYXJGaWxlID0gKEVKQkphckZpbGUpIGVhckZpbGUuZ2V0RmlsZShhTW9kdWxlLmdldFVyaSgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydFRydWUoIkVKQkphckZpbGUgc2hvdWxkIG5vdCBiZSBudWxsIiwgZWpiSmFyRmlsZSAhPSBudWxsKTsKLQkJZWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCUVBUkZpbGUgbmV3RWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvQ29weVRlc3RzL25ld0VhcldpdGhDb3BpZWRNb2R1bGUuZWFyIik7Ci0JCUVKQk1vZHVsZVJlZiBhZGRlZENvcHkgPSAoRUpCTW9kdWxlUmVmKSBuZXdFYXJGaWxlLmFkZENvcHlSZWYoZWpiSmFyRmlsZSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZSBmaWxlcyBzaG91bGQgbm90IGJlIGVtcHR5IiwgIW5ld0VhckZpbGUuZ2V0TW9kdWxlRmlsZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGVzIHNob3VsZCBub3QgYmUgZW1wdHkiLCAhbmV3RWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGUgc2hvdWxkIGJlIGFjY2Vzc2libGUgYW5kIGhhdmUgdGhlIHNhbWUgdXJpIGFzIGZpbGUiLCBhZGRlZENvcHkuZ2V0TW9kdWxlKCkuZ2V0VXJpKCkuZXF1YWxzKGFkZGVkQ29weS5nZXRNb2R1bGVGaWxlKCkuZ2V0VVJJKCkpKTsKLQotCQlTdHJpbmcgbmV3VVJJID0gInRlbXAvZm9vYmFyLmphciI7Ci0JCWFkZGVkQ29weS5zZXRVUkkobmV3VVJJKTsKLQkJYXNzZXJ0VHJ1ZSgiTW9kdWxlIHNob3VsZCBiZSBhY2Nlc3NpYmxlIGFuZCBoYXZlIHRoZSBuZXcgcmVuYW1lZCB1cmkgYXMgd2VsbCBhcyB0aGUgZmlsZSIsIGFkZGVkQ29weS5nZXRNb2R1bGUoKS5nZXRVcmkoKS5lcXVhbHMoYWRkZWRDb3B5LmdldE1vZHVsZUZpbGUoKS5nZXRVUkkoKSkgJiYgYWRkZWRDb3B5LmdldE1vZHVsZSgpLmdldFVyaSgpLmVxdWFscyhuZXdVUkkpKTsKLQkJbmV3RWFyRmlsZS5yZW1vdmUoYWRkZWRDb3B5KTsKLQkJYXNzZXJ0VHJ1ZSgiTW9kdWxlIGZpbGVzIHNob3VsZCBiZSBlbXB0eSIsIG5ld0VhckZpbGUuZ2V0TW9kdWxlRmlsZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGVzIHNob3VsZCBiZSBlbXB0eSIsIG5ld0VhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCkuaXNFbXB0eSgpKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW5hbWVBbmREZWxldGVTdGFuZGFsb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIGZpbGVOYW1lID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiYmFua2VqYnMuamFyIjsKLQotCQlFSkJKYXJGaWxlIGVqYkphckZpbGUgPSAoRUpCSmFyRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShmaWxlTmFtZSk7Ci0KLQkJRUFSRmlsZSBuZXdFYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9Db3B5VGVzdHMvbmV3RWFyV2l0aENvcGllZE1vZHVsZS5lYXIiKTsKLQkJRUpCTW9kdWxlUmVmIGFkZGVkQ29weSA9IChFSkJNb2R1bGVSZWYpIG5ld0VhckZpbGUuYWRkQ29weVJlZihlamJKYXJGaWxlKTsKLQkJYXNzZXJ0VHJ1ZSgiTW9kdWxlIGZpbGVzIHNob3VsZCBub3QgYmUgZW1wdHkiLCAhbmV3RWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZXMgc2hvdWxkIG5vdCBiZSBlbXB0eSIsICFuZXdFYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZSBzaG91bGQgYmUgYWNjZXNzaWJsZSBhbmQgaGF2ZSB0aGUgc2FtZSB1cmkgYXMgZmlsZSIsIGFkZGVkQ29weS5nZXRNb2R1bGUoKS5nZXRVcmkoKS5lcXVhbHMoYWRkZWRDb3B5LmdldE1vZHVsZUZpbGUoKS5nZXRVUkkoKSkpOwotCi0JCVN0cmluZyBuZXdVUkkgPSAidGVtcC9mb29iYXIuamFyIjsKLQkJYWRkZWRDb3B5LnNldFVSSShuZXdVUkkpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGUgc2hvdWxkIGJlIGFjY2Vzc2libGUgYW5kIGhhdmUgdGhlIG5ldyByZW5hbWVkIHVyaSBhcyB3ZWxsIGFzIHRoZSBmaWxlIiwgYWRkZWRDb3B5LmdldE1vZHVsZSgpLmdldFVyaSgpLmVxdWFscyhhZGRlZENvcHkuZ2V0TW9kdWxlRmlsZSgpLmdldFVSSSgpKSAmJiBhZGRlZENvcHkuZ2V0TW9kdWxlKCkuZ2V0VXJpKCkuZXF1YWxzKG5ld1VSSSkpOwotCQluZXdFYXJGaWxlLnJlbW92ZShhZGRlZENvcHkpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGUgZmlsZXMgc2hvdWxkIGJlIGVtcHR5IiwgbmV3RWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZXMgc2hvdWxkIGJlIGVtcHR5IiwgbmV3RWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKS5pc0VtcHR5KCkpOwotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9EZWZlY3RWZXJpZmljYXRpb25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0RlZmVjdFZlcmlmaWNhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MzkzZjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0RlZmVjdFZlcmlmaWNhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDIwLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldlYk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlck1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLQotICogUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERlZmVjdFZlcmlmaWNhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBEZWZlY3RWZXJpZmljYXRpb25UZXN0cygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBEZWZlY3RWZXJpZmljYXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCSAgICAvKlRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkgICAgc3VpdGUuYWRkVGVzdChuZXcgRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMoInRlc3RGaWx0ZXJNYXBwaW5nVHJhbnNsYXRvciIpKTsKLQkgICAgcmV0dXJuIHN1aXRlOyovCi0JCXJldHVybiBuZXcgVGVzdFN1aXRlKERlZmVjdFZlcmlmaWNhdGlvblRlc3RzLmNsYXNzKTsgCi0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlck1hcHBpbmdUcmFuc2xhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vKgkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQlvcHRpb25zLnNldFJlbmRlcmVyVHlwZShBcmNoaXZlT3B0aW9ucy5ET00pOwotCQlmaW5hbCBTdHJpbmcgZWFyUGF0aCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotCQlDb21tb25hcmNoaXZlUGFja2FnZSBwa2cgPSBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUVBUkZpbGUgZWFyRmlsZSA9IHBrZy5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKG9wdGlvbnMsCi0JCQkJZWFyUGF0aCk7Ci0JCS8vIG9wZW4gdGhlIGVhcgotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm9wZW5pbmcgIiArIGFyY2hpdmUgKyAiIC4uLiAiKTsqLwotCSAgICAKLQkgICAgU3RyaW5nIGFyY2hpdmUgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJRSURlZmVjdHNOZXcuZWFyIjsKLQkgICAgU3RyaW5nIG5hbWUgPSAiUUlEZWZlY3RzLndhciI7Ci0JCSAgLyoKLQkJICAgKiBjcmFjayBvcGVuIHRoZSBlYXIgZmlsZSB1c2luZyB0aGUgY29tbW9uIGFyY2hpdmU6Ci0JCSAgICovCi0JCSAgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgYXJjaGl2ZUZhY3RvcnkgPSAoQ29tbW9uYXJjaGl2ZUZhY3RvcnkpIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JCSAgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQkgIG9wdGlvbnMuc2V0UmVuZGVyZXJUeXBlKEFyY2hpdmVPcHRpb25zLlNBWCk7Ci0JCSAgb3B0aW9ucy5zZXRVc2VKYXZhUmVmbGVjdGlvbihmYWxzZSk7Ci0JCSAgLy8gICBvcHRpb25zLnNldERpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzKGV4dHJhUHJvY2Vzc2luZyk7Ci0JCSAgCQkKLQkJICAJCUVBUkZpbGUgZWFyRmlsZSA9IGFyY2hpdmVGYWN0b3J5Lm9wZW5FQVJGaWxlKG9wdGlvbnMsIGFyY2hpdmUpOwotCQkJCVdlYk1vZHVsZVJlZiB3YXJGaWxlID0gbnVsbDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBlYXJGaWxlLmdldE1vZHVsZVJlZnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkgICAgTW9kdWxlUmVmIG1yZWYgPSAoTW9kdWxlUmVmKSBpLm5leHQoKTsKLQkJCQkgICAgaWYgKG5hbWUuZXF1YWxzKG1yZWYuZ2V0VXJpKCkpKSB7IAotCQkJCSAgICAgICAgd2FyRmlsZSA9ICAoV2ViTW9kdWxlUmVmKSBtcmVmOwotCQkJCSAgICB9Ci0JCQkJfQotICAgCi0JCQkJV2ViQXBwIGRkID0gKFdlYkFwcCl3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0gICAKLQkJCQlFTGlzdCBmaWx0ZXJNYXBwaW5ncyA9IGRkLmdldEZpbHRlck1hcHBpbmdzKCk7Ci0JCQkJYXNzZXJ0VHJ1ZSgiVGhlIHRlc3QgcmVxdWlyZXMgdHdvIGZpbHRlciBtYXBwaW5ncy4iLCBmaWx0ZXJNYXBwaW5ncy5zaXplKCkgPT0gMik7IAotCQkJCUZpbHRlck1hcHBpbmcgZmlsdGVyTWFwcGluZzEgPSAoRmlsdGVyTWFwcGluZylmaWx0ZXJNYXBwaW5ncy5nZXQoMCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiQSBVUkwgUGF0dGVybiB3YXMgbm90IGZvdW5kIGZvciBmaWx0ZXIgd2l0aCBuYW1lICIgKyBmaWx0ZXJNYXBwaW5nMS5nZXRGaWx0ZXIoKS5nZXROYW1lKCksZmlsdGVyTWFwcGluZzEuZ2V0VXJsUGF0dGVybigpKTsKLQkJCQlGaWx0ZXJNYXBwaW5nIGZpbHRlck1hcHBpbmcyID0gKEZpbHRlck1hcHBpbmcpZmlsdGVyTWFwcGluZ3MuZ2V0KDEpOwotCQkJCWFzc2VydE5vdE51bGwoIkEgU2VydmxldCBuYW1lIHdhcyBub3QgZm91bmQgZm9yIGZpbHRlciB3aXRoIG5hbWUgIiArIGZpbHRlck1hcHBpbmcyLmdldEZpbHRlcigpLmdldE5hbWUoKSxmaWx0ZXJNYXBwaW5nMi5nZXRTZXJ2bGV0TmFtZSgpKTsKLQkJCQlhc3NlcnROb3ROdWxsKCJBIFNlcnZsZXQgd2FzIG5vdCBmb3VuZCBmb3IgZmlsdGVyIHdpdGggbmFtZSAiICsgZmlsdGVyTWFwcGluZzIuZ2V0RmlsdGVyKCkuZ2V0TmFtZSgpLGZpbHRlck1hcHBpbmcyLmdldFNlcnZsZXQoKSk7Ci0JCQkJICAgICAgCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZvcm1lckRlZmVjdDI5NygpIHRocm93cyBFeGNlcHRpb24gewotCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCW9wdGlvbnMuc2V0UmVuZGVyZXJUeXBlKEFyY2hpdmVPcHRpb25zLkRPTSk7Ci0JCWZpbmFsIFN0cmluZyBlYXJQYXRoID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0JCUNvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJRUFSRmlsZSBlYXJGaWxlID0gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUob3B0aW9ucywKLQkJCQllYXJQYXRoKTsKLQkJZWFyRmlsZS5leHRyYWN0Tm9SZW9wZW4oQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Rm9ybWVyRGVmZWN0MTQ1OSgpIHRocm93cyBFeGNlcHRpb24gewotCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCW9wdGlvbnMuc2V0UmVuZGVyZXJUeXBlKEFyY2hpdmVPcHRpb25zLkRPTSk7Ci0JCUNvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeSA9IHBrZy5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCi0JCUVBUkZpbGUgZWFyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKG9wdGlvbnMsICJUZXN0LmVhciIpOwotCQllYXJGaWxlLnNhdmVBcygiQzpcXFRlc3QuZWFyIik7Ci0JfQotCi0JLyoKLQkgKiBwdWJsaWMgdm9pZCB0ZXN0Q29ycnVwdGVkRUFSKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IEFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPQotCSAqIG5ldyBBcmNoaXZlT3B0aW9ucygpOyBvcHRpb25zLnNldFJlbmRlcmVyVHlwZShBcmNoaXZlT3B0aW9ucy5ET00pOyBmaW5hbAotCSAqIFN0cmluZyBlYXJQYXRoID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAib2NjYW0uZWFyIjsKLQkgKiBDb21tb25hcmNoaXZlUGFja2FnZSBwa2cgPSBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JICogQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeSA9IHBrZy5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCSAqIAotCSAqIEVBUkZpbGUgZWFyRmlsZSA9IGZhY3Rvcnkub3BlbkVBUkZpbGUob3B0aW9ucywgZWFyUGF0aCk7Ci0JICogCi0JICogTGlzdCBmaWxlcyA9IGVhckZpbGUuZ2V0RmlsZXMoKTsKLQkgKiAKLQkgKiBmb3IoaW50IGk9MDsgaSA8ZmlsZXMuc2l6ZSgpOyBpKyspIHsgU3lzdGVtLmVyci5wcmludGxuKGZpbGVzLmdldChpKSk7Ci0JICogcmVhZEZpbGUoIChGaWxlKSBmaWxlcy5nZXQoaSkpOyBpZihmaWxlcy5nZXQoaSkgaW5zdGFuY2VvZiBXQVJGaWxlKSB7Ci0JICogV0FSRmlsZSB3YXIgPSAoV0FSRmlsZSkgZmlsZXMuZ2V0KGkpOyBMaXN0IHdhckZpbGVzID0gd2FyLmdldEZpbGVzKCk7Ci0JICogZm9yKGludCBqPTA7IGogPHdhckZpbGVzLnNpemUoKTsgaisrKSB7Ci0JICogU3lzdGVtLmVyci5wcmludGxuKHdhckZpbGVzLmdldChqKSk7IHJlYWRGaWxlKChGaWxlKXdhckZpbGVzLmdldChqKSk7IH0gfSB9Ci0JICogU3lzdGVtLm91dC5wcmludGxuKCJEb25lIik7IH0KLQkgKi8KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRGaWxlKEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpcyA9IGZpbGUuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJWmlwSW5wdXRTdHJlYW0gemlzID0gbmV3IFppcElucHV0U3RyZWFtKGlzKTsKLQkJdHJ5IHsKLQkJCXdoaWxlICh6aXMuZ2V0TmV4dEVudHJ5KCkgIT0gbnVsbCk7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpcyAhPSBudWxsKQotCQkJCWlzLmNsb3NlKCk7Ci0JCQlpZiAoemlzICE9IG51bGwpCi0JCQkJemlzLmNsb3NlKCk7Ci0JCQlpcyA9IG51bGw7Ci0JCQl6aXMgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNhdmluZ0VBUldoaWxlRGVwbG95aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCQlvcHRpb25zLnNldFJlbmRlcmVyVHlwZShBcmNoaXZlT3B0aW9ucy5TQVgpOwotCQkJb3B0aW9ucy5zZXRVc2VKYXZhUmVmbGVjdGlvbih0cnVlKTsKLQkJCWZpbmFsIFN0cmluZyBlYXJQYXRoID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkKLQkJCQkJKyAiQXVjdGlvbkFwcC5lYXIiOwotCQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2UgcGtnID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCQkJRUFSRmlsZSBlYXJGaWxlID0gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoCi0JCQkJCW9wdGlvbnMsIGVhclBhdGgpOwotCQkJcHJpbnRGaWxlcyhlYXJGaWxlKTsKLQkJCWVhckZpbGUuc2F2ZSgpOwotCi0JCQllYXJGaWxlLnJlb3BlbigpOwotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIHdlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UpOwotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldE1lc3NhZ2UoKSk7Ci0JCQlpZiAod2UuZ2V0Q2F1c2UoKSAhPSBudWxsKQotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXRDYXVzZSgpKTsKLQkJCWlmICh3ZS5nZXROZXN0ZWRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXROZXN0ZWRFeGNlcHRpb24oKSk7Ci0JCQlpZiAod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKSk7Ci0JCQl0aHJvdyB3ZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGluZ0VBUkZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21tb25hcmNoaXZlUGFja2FnZSBwa2cgPSBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkgPSBwa2cuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQkJZmluYWwgU3RyaW5nIGVhclBhdGggPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeQotCQkJCSsgIkluaXRpYWxpemVkRUFSLmVhciI7Ci0KLQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQlvcHRpb25zLnNldElzUmVhZE9ubHkodHJ1ZSk7Ci0JCW9wdGlvbnMuc2V0UmVuZGVyZXJUeXBlKEFyY2hpdmVPcHRpb25zLkRPTSk7Ci0KLQkJLy8gbmV3IGVhciBmaWxlCi0JCUVBUkZpbGUgZWFyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKG9wdGlvbnMsIGVhclBhdGgpOwotCi0JCUFwcGxpY2F0aW9uIGFwcGwgPSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VydmljZVFOYW1lVHJhbnNsYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotCQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQkJb3B0aW9ucy5zZXRSZW5kZXJlclR5cGUoQXJjaGl2ZU9wdGlvbnMuU0FYKTsgCi0JCQlmaW5hbCBTdHJpbmcgZWFyUGF0aCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIldTU2VjdXJlZF9JbnN1cmFuY2VTZXJ2aWNlc19FSkJfV1MuZWFyIjsKLQkJCUNvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkgPSBwa2cuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQkJCUVBUkZpbGUgZWFyRmlsZSA9IGZhY3Rvcnkub3BlbkVBUkZpbGUob3B0aW9ucywgZWFyUGF0aCk7Ci0JCQlwcmludEZpbGVzKGVhckZpbGUpOwotCQkJU3RyaW5nIHRtcCA9ICJDOlxcdGVtcFxcIitTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWVhckZpbGUuZXh0cmFjdFRvKHRtcCwgMCk7ICAKLQkJCQkKLQkJCUxpc3QgZWpiTW9kdWxlUmVmcyA9IGVhckZpbGUuZ2V0RUpCTW9kdWxlUmVmcygpOwotCi0JCQlmb3IoaW50IGk9MDsgaTxlamJNb2R1bGVSZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRUpCTW9kdWxlUmVmIGVqYm1vZHJlZiA9IChFSkJNb2R1bGVSZWYpIGVqYk1vZHVsZVJlZnMuZ2V0KGkpOwotCQkJCWlmKGVqYm1vZHJlZi5nZXRVcmkoKS5lcXVhbHMoIldTSW5zU2Vzc2lvbjIwRUpCLmphciIpKSB7Ci0JCQkJCVJlc291cmNlIHJlcyA9IGVqYm1vZHJlZi5nZXRNb2ZSZXNvdXJjZSgiTUVUQS1JTkYvd2Vic2VydmljZXNjbGllbnQueG1sIik7IAotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4ocmVzLmdldFVSSSgpKTsKLQkJCQkJIAotCQkJCX0KLQkJCX0KLQkJCS8qCi0JCQkgKiBBcHBsaWNhdGlvbiBhcHAgPSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7IExpc3QgbW9kdWxlcyA9Ci0JCQkgKiBhcHAuZ2V0TW9kdWxlcygpOyBmb3IoaW50IGk9MDsgaSA8bW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJICogU3lzdGVtLmVyci5wcmludGxuKG1vZHVsZXMuZ2V0KGkpKTsgTW9kdWxlCi0JCQkgKiBtb2Q9KE1vZHVsZSltb2R1bGVzLmdldChpKTsgaWYoIG1vZC5pc0VqYk1vZHVsZSgpICkgeyBFamJNb2R1bGUKLQkJCSAqIGVqYk1vZHVsZSA9IChFamJNb2R1bGUpIG1vZDsgRUpCSmFyRmlsZSBlamJKYXJGaWxlID0KLQkJCSAqIGZhY3Rvcnkub3BlbkVKQkphckZpbGUob3B0aW9ucywgIldTSW5zU2Vzc2lvbjIwRUpCLmphciIpOyBFSkJKYXIKLQkJCSAqIGVqYmphciA9IGVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsgfQotCQkJICogIH0KLQkJCSAqLwotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIHdlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UpOwotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldE1lc3NhZ2UoKSk7Ci0JCQlpZih3ZS5nZXRDYXVzZSgpICE9IG51bGwpIAotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXRDYXVzZSgpKTsKLQkJCWlmKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpKTsKLQkJCWlmKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKCkpOwotCQkJdGhyb3cgd2U7Ci0JCX0gIAotICAgIH0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFJlYWRDcmltc29uQ2FzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQkJb3B0aW9ucy5zZXRSZW5kZXJlclR5cGUoQXJjaGl2ZU9wdGlvbnMuRE9NKTsgCi0JCQlmaW5hbCBTdHJpbmcgZWFyUGF0aCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5Ci0JCQkJCSsgImVqYl9zYW1fSGVsbG8uZWFyIjsKLQkJCUNvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCUVBUkZpbGUgZWFyRmlsZSA9IHBrZy5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKAotCQkJCQlvcHRpb25zLCBlYXJQYXRoKTsKLQkJCUFwcGxpY2F0aW9uIGFwcCA9IGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCWFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCByZWFkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4iLCBhcHApOwotCQkJU3lzdGVtLmVyci5wcmludGxuKCJcblxuKioqKioqKioqKioqKioqKioqUHJpbnRpbmcgZmlsZXMgZnJvbSAiICsgYXBwLmdldERpc3BsYXlOYW1lKCkpOwotCQkJYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IHJlYWQgZGlzcGxheSBuYW1lIGZyb20gZGVwbG95bWVudCBkZXNjcmlwdG9yLiIsIGFwcC5nZXREaXNwbGF5TmFtZSgpKTsKLQkJCXByaW50RmlsZXMoZWFyRmlsZSk7Ci0JCQllYXJGaWxlLmV4dHJhY3RUbyhBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L3RlbXAiLCAwKTsKLQkJCWVhckZpbGUucmVvcGVuKCk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gd2UpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZSk7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0TWVzc2FnZSgpKTsKLQkJCWlmICh3ZS5nZXRDYXVzZSgpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldENhdXNlKCkpOwotCQkJaWYgKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpKTsKLQkJCWlmICh3ZS5nZXROZXN0ZWRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXRDb25jYXRlbmF0ZWRNZXNzYWdlcygpKTsKLQkJCXRocm93IHdlOwotCQl9Ci0JfQotCQotCS8qcHVibGljIHZvaWQgdGVzdFJlYWRJbml0UGFybXMxMygpIHRocm93cyBFeGNlcHRpb24gewotCSAgICByZWFkSW5pdFBhcm1zKHRydWUpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVhZEluaXRQYXJtczE0KCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkgICAgcmVhZEluaXRQYXJtcyhmYWxzZSk7Ci0JfQkqLwotCQotCS8qcHVibGljIHZvaWQgcmVhZEluaXRQYXJtcyhib29sZWFuIGlzMTMpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgeyAKLQkJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgSjJFRSAiICsgKGlzMTM/IjEuMyIgOiIxLjQiKSApOwotCQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQkJb3B0aW9ucy5zZXRSZW5kZXJlclR5cGUoQXJjaGl2ZU9wdGlvbnMuRE9NKTsgCi0JCQlmaW5hbCBTdHJpbmcgZWFyUGF0aCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5Ci0JCQkJCSsgKChpczEzKSA/ICJmaWx0ZXIxM3dhci5lYXIiIDogICJzZXJ2bGV0X2pzX2ZpbHRlci5lYXIiKTsKLQkJCUNvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCUVBUkZpbGUgZWFyRmlsZSA9IHBrZy5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKAotCQkJCQlvcHRpb25zLCBlYXJQYXRoKTsKLQkJCVdBUkZpbGUgd2FyRmlsZSA9IChXQVJGaWxlKSAoaXMxMyA/IGVhckZpbGUuZ2V0RmlsZSgiRmlsdGVyV2FyLndhciIpIDplYXJGaWxlLmdldEZpbGUoInNlcnZsZXRfanNfZmlsdGVyX3dlYi53YXIiKSk7Ci0JCQlXZWJBcHAgd2ViYXBwID0gd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOyAKLQkJCWFzc2VydE5vdE51bGwoIlRoZSB3ZWIgYXBwIEREIGNvdWxkIG5vdCBiZSBsb2NhdGVkIiwgd2ViYXBwKTsKLQkJCUVMaXN0IGZpbHRlcnMgPSB3ZWJhcHAuZ2V0RmlsdGVycygpOwotCQkJRmlsdGVyIGYgPSBudWxsOwotCQkJRUxpc3QgcGFybXMsIHBhcmFtVmFsdWVzOwotCQkJZm9yKGludCBpPTA7IGk8ZmlsdGVycy5zaXplKCk7IGkrKykgewotCQkJICAgIGYgPSAoRmlsdGVyKSBmaWx0ZXJzLmdldChpKTsKLQkJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oZik7Ci0JCQkgICAgRUxpc3QgcGFybXMgPSBmLmdldEluaXRQYXJhbXMoKTsKLQkJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZXJlIGFyZSAiICsgcGFybXMuc2l6ZSgpICsgIiBJbml0UGFyYW1zIik7Ci0JCQkgICAgZm9yKGludCBqPTA7IGo8cGFybXMuc2l6ZSgpOyBqKyspIHsKLQkJCSAgICAgICAgSW5pdFBhcmFtIHAgPSAoSW5pdFBhcmFtKSBwYXJtcy5nZXQoaik7Ci0JCQkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwKTsKLQkJCSAgICB9Ci0JCQkgICAgRUxpc3QgcGFyYW1WYWx1ZXMgPSBmLmdldEluaXRQYXJhbVZhbHVlcygpOwotCQkJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlcmUgYXJlICIgKyBwYXJhbVZhbHVlcy5zaXplKCkgKyAiIEluaXRQYXJhbVZhbHVlcyIpOwotCQkJICAgIGZvcihpbnQgaj0wOyBqPHBhcmFtVmFsdWVzLnNpemUoKTsgaisrKSB7Ci0JCQkgICAgICAgIFBhcmFtVmFsdWUgcCA9IChQYXJhbVZhbHVlKSBwYXJhbVZhbHVlcy5nZXQoaik7Ci0JCQkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwKTsKLQkJCSAgICB9Ci0JCQkgICAgCi0JCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZW1vIHZlcnNpb24gY2FzZSIpOwotCQkJICAgIAotCQkJICAgIAotCQkJICAgIFdlYkFwcCBjb250YWluZXIgPSAoV2ViQXBwKSBmLmVDb250YWluZXIoKTsKLQkJCSAgICBzd2l0Y2goY29udGFpbmVyLmdldEoyRUVWZXJzaW9uSUQoKSkgewotCQkJICAgICAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOiAKLQkJCSAgICAgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDoKLQotCQkJCQkgICAgcGFybXMgPSBmLmdldEluaXRQYXJhbXMoKTsKLQkJCQkJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlcmUgYXJlICIgKyBwYXJtcy5zaXplKCkgKyAiIEluaXRQYXJhbXMiKTsKLQkJCQkJICAgIGFzc2VydEVxdWFscygiVGhlcmUgbXVzdCBiZSAyIEZpbHRlciBJbml0IFBhcmFtcyIsIHBhcm1zLnNpemUoKSwgMik7Ci0JCQkJCSAgICBmb3IoaW50IGo9MDsgajxwYXJtcy5zaXplKCk7IGorKykgewotCQkJCQkgICAgICAgIEluaXRQYXJhbSBpcCA9IChJbml0UGFyYW0pIHBhcm1zLmdldChqKTsKLQkJCQkJICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocCk7Ci0JCQkJCSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHBhcmFtIG5hbWVzIG11Y2ggbWF0Y2giLCAoInBhcmFtIitqKyJuYW1lIikuZXF1YWxzKGlwLmdldFBhcmFtTmFtZSgpKSk7Ci0JCQkJCSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHBhcmFtIHZhbHVlcyBtdWNoIG1hdGNoIiwgKCJwYXJhbSIraisidmFsdWUiKS5lcXVhbHMoaXAuZ2V0UGFyYW1WYWx1ZSgpKSk7Ci0JCQkJCSAgICB9Ci0JCQkJCSAgICBicmVhazsKLQkJCSAgICAgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDogZGVmYXVsdDogewotCi0JCQkJCSAgICBwYXJhbVZhbHVlcyA9IGYuZ2V0SW5pdFBhcmFtVmFsdWVzKCk7Ci0JCQkgICAgICAgIAlhc3NlcnRFcXVhbHMoIlRoZXJlIG11c3QgYmUgMSBGaWx0ZXIgSW5pdCBQYXJhbSBWYWx1ZXMiLCBwYXJhbVZhbHVlcy5zaXplKCksIDEpOwotCQkJCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGVyZSBhcmUgIiArIHBhcmFtVmFsdWVzLnNpemUoKSArICIgSW5pdFBhcmFtVmFsdWVzIik7Ci0JCQkJCSAgICAKLQkJCQkgICAgICAgIFBhcmFtVmFsdWUgcHYgPSAoUGFyYW1WYWx1ZSkgcGFyYW1WYWx1ZXMuZ2V0KDApOyAKLQkJCQkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwdik7IAotCQkJCSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHBhcmFtIG5hbWVzIG11Y2ggbWF0Y2giLCAoImF0dHJpYnV0ZSIpLmVxdWFscyhwdi5nZXROYW1lKCkpKTsKLQkJCQkgICAgICAgIFN0cmluZyBleHBlY3RlZFZhbHVlID0gKGkgPT0gMCkgPyAiY29tLnN1bi50cy50ZXN0cy5zZXJ2bGV0LmFwaS5qYXZheF9zZXJ2bGV0LmZpbHRlci5Eb0ZpbHRlcl9GaWx0ZXIuU0VSVkxFVF9NQVBQRUQiIDogImNvbS5zdW4udHMudGVzdHMuc2VydmxldC5hcGkuamF2YXhfc2VydmxldC5maWx0ZXIuSW5pdEZpbHRlcl9GaWx0ZXIuU0VSVkxFVF9NQVBQRUQiOyAKLQkJCQkgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHBhcmFtIHZhbHVlcyBtdWNoIG1hdGNoIiwgZXhwZWN0ZWRWYWx1ZSAsIHB2LmdldFZhbHVlKCkpOwotCQkJICAgICAgICB9Ci0JCQkJCSAgICBicmVhazsKLQkJCSAgICB9Ci0JCQl9Ci0JCQkKLQkJCSAgICAKLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiB3ZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlKTsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXRNZXNzYWdlKCkpOwotCQkJaWYgKHdlLmdldENhdXNlKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0Q2F1c2UoKSk7Ci0JCQlpZiAod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkpOwotCQkJaWYgKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKCkpOwotCQkJdGhyb3cgd2U7Ci0JCX0KLQl9Ki8KLQkgCi0JCi0JcHJpdmF0ZSB2b2lkIHByaW50RmlsZXMoQ29udGFpbmVyIGFyKSB7Ci0JCUxpc3QgZmlsZXMgPSBhci5nZXRGaWxlcygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihmaWxlcy5nZXQoaSkpOwotCQkJaWYgKGZpbGVzLmdldChpKSBpbnN0YW5jZW9mIENvbnRhaW5lcikgewotCQkJCUNvbnRhaW5lciB0YWluZXIgPSAoQ29udGFpbmVyKSBmaWxlcy5nZXQoaSk7Ci0JCQkJcHJpbnRGaWxlcyh0YWluZXIpOwotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0Rpc2NyaW1pbmF0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvRGlzY3JpbWluYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0Nzg2ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvRGlzY3JpbWluYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci0KLQotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwMiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqLwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgRGlzY3JpbWluYXRvclRlc3QKLSAgICAgICAgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhc3NlcnRCYXJGaWxlID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgRGlzY3JpbWluYXRvclRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJEaXNjcmltaW5hdG9yVGVzdCIpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBEaXNjcmltaW5hdG9yVGVzdCgidGVzdERpc2NyaW1pbmF0b3IiKSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPIEltcGxlbWVudCB1bml0IHRlc3QgZm9yIGRpc2NyaW1pbmF0b3IgZnJhbWV3b3JrCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2NyaW1pbmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0QmFyRmlsZSA9IHRydWU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeS5yZWdpc3RvckRpc2NyaW1pbmF0b3IobmV3IEJldmVyYWdlQXJjaGl2ZURpc2NyaW1pbmF0b3IoKSk7Ci0gICAgICAgICAgICBBcmNoaXZlIGFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeS5lSU5TVEFOQ0Uub3BlbkFyY2hpdmUoIEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgRmlsZS5zZXBhcmF0b3IgKyAibXkuYmFyIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJUaGUgYXJjaGl2ZSB3YXMgbm90IGZvdW5kISIsIGFyY2hpdmUpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgYXJjaGl2ZSBleHRlbnNpb24gKC5iYXIpIHdhcyBub3QgcmVjb2duaXplZCBhcyBhIGN1c3RvbSBleHRlbnNpb24hIiwgYXJjaGl2ZS5pc05lc3RlZEFyY2hpdmUoIm15LmJhciIpKTsKLQotICAgICAgICAgICAgYm9vbGVhbiB0eXBlQ29udHJpYnV0ZWRTdWNjZXNzZnVsbHkgPSBmYWxzZTsKLSAgICAgICAgICAgIEVMaXN0IHR5cGVzID0gYXJjaGl2ZS5nZXRUeXBlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICh0eXBlcy5nZXQoaSkuZXF1YWxzKEJldmVyYWdlQXJjaGl2ZURpc2NyaW1pbmF0b3IuQkVWRVJBR0VfQVJDSElWRV9UWVBFX0tFWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZUNvbnRyaWJ1dGVkU3VjY2Vzc2Z1bGx5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIEJFVkVSQUdFX0FSQ0hJVkVfVFlQRV9LRVkgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdCBvZiB0eXBlcyBvZiB0aGUgYXJjaGl2ZSEiLCB0eXBlQ29udHJpYnV0ZWRTdWNjZXNzZnVsbHkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgYXNzZXJ0QmFyRmlsZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEJldmVyYWdlQXJjaGl2ZURpc2NyaW1pbmF0b3IKLSAgICAgICAgICAgIGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBHZW5lcmljQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRVZFUkFHRV9BUkNISVZFX1RZUEVfS0VZID0gImNvbS5pYm0uYmV2ZXJhZ2UuYXJjaGl2ZSI7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLkdlbmVyaWNBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IjZGlzY3JpbWluYXRlKGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuQXJjaGl2ZSkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2NyaW1pbmF0ZShBcmNoaXZlIGFuQXJjaGl2ZSkgewotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBhbkFyY2hpdmUuY29udGFpbnNGaWxlKCJNRVRBLUlORi9hZHVsdC1iZXZlcmFnZS1pbWJpYmVtZW50LW9wdGlvbnMueG1sIik7Ci0gICAgICAgICAgICBpZiAoYXNzZXJ0QmFyRmlsZSkKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIEJldmVyYWdlQXJjaGl2ZURpc2NyaW1pbmF0b3IgZGlkIG5vdCByZWNvZ25pWmUgdGhlIGZpbGUhIChFbnN1cmUgaXQgY29udGFpbnMgYSBmaWxlIG5hbWVkIE1FVEEtSU5GL2FkdWx0LWJldmVyYWdlLWltYmliZW1lbnQtdmVudWVzLnhtbCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLkdlbmVyaWNBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IjZ2V0Q3VzdG9tRmlsZUV4dGVuc2lvbnMoKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldEN1c3RvbUZpbGVFeHRlbnNpb25zKCkgewotCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgImJhciJ9OwotCi0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvciNnZXRUeXBlS2V5KCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZUtleSgpIHsKLQotICAgICAgICAgICAgcmV0dXJuIEJFVkVSQUdFX0FSQ0hJVkVfVFlQRV9LRVk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0RvbUNvbXBhcml0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9Eb21Db21wYXJpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NGMxZTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0RvbUNvbXBhcml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTcsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLQotLyoqCi0gKiBUSEUgTUFTVEVSIENPUFkgb2YgdGhpcyBjbGFzcyBpcyBpbiBjb20uaWJtLmV0b29scy5jb21tb250ZXN0cwotICogUGxlYXNlIHVwZGF0ZSB0aGUgY29weSBpbiBjb21tb250ZXN0cyBhbmQgdGhlbiBjb3B5IHRoaXMgY2xhc3MgdG8KLSAqIHdoZXJlIHlvdSBuZWVkIGl0IGlmIHlvdSBhcmUgbG9va2luZyBhdCBhIGRpZmZlcmVudCBjb3B5Ci0gKiAKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERvbUNvbXBhcml0b3IgewotCXByaXZhdGUgc3RhdGljIEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyOwotCXByaXZhdGUgc3RhdGljIEhhc2hTZXQgYXR0cmlidXRlTGlzdDsKLS8vIFRPRE8gcmVwbGFjZSB0aGlzIHdpdGggbm9uIHhlcmNlcwkKLS8vICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBhcmVEb21zKElucHV0U291cmNlIHNvdXJjZTEsIElucHV0U291cmNlIHNvdXJjZTIsIEhhc2hTZXQgaWdub3JhYmxlQXR0cykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAJYXR0cmlidXRlTGlzdCA9IGlnbm9yYWJsZUF0dHM7Ci0vLyAgICAJRE9NUGFyc2VyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKLS8vICAgIAlpZiAoZW50aXR5UmVzb2x2ZXIgPT0gbnVsbCkgewotLy8gICAgICAgICBwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IEVudGl0eVJlc29sdmVyKCkgewotLy8JICAgICAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0vLwkgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0vLwkgICAgICAgICAgICB9Ci0vLwkKLS8vCSAgICAgICAgfSk7Ci0vLyAgICAJfSBlbHNlIHsKLS8vICAgIAkJcGFyc2VyLnNldEVudGl0eVJlc29sdmVyKGVudGl0eVJlc29sdmVyKTsKLS8vICAgIAl9Ci0vLyAgICAgICAgcGFyc2VyLnBhcnNlKHNvdXJjZTEpOwotLy8gICAgICAgIERvY3VtZW50IGRvYzEgPSBwYXJzZXIuZ2V0RG9jdW1lbnQoKTsKLS8vICAgICAgICBwYXJzZXIucGFyc2Uoc291cmNlMik7Ci0vLyAgICAgICAgRG9jdW1lbnQgZG9jMiA9IHBhcnNlci5nZXREb2N1bWVudCgpOwotLy8gICAgICAgIHJldHVybiBjb21wYXJlTm9kZXMoZG9jMSwgZG9jMik7Ci0vLyAgICB9Ci0KLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBhcmVEb21zKElucHV0U291cmNlIHNvdXJjZTEsIElucHV0U291cmNlIHNvdXJjZTIpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXJldHVybiBjb21wYXJlRG9tcyhzb3VyY2UxLCBzb3VyY2UyLCBudWxsKTsKLS8vCX0KLQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGFyZU5vZGVzKE5vZGUgbm9kZTEsIE5vZGUgbm9kZTIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjaGVja2luZyBBOiIgKyBub2RlMSk7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNoZWNraW5nIEI6IiArIG5vZGUyKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibm9kZVR5cGU9IiArIG5vZGUxLmdldE5vZGVUeXBlKCkpOwotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXROb2RlTmFtZT0iICsgbm9kZTEuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldE5vZGVWYWx1ZT0iICsgbm9kZTEuZ2V0Tm9kZVZhbHVlKCkpOwotCi0gICAgICAgIC8vR2VuZXJpYyBOb2RlIFRlc3RpbmcgCi0gICAgICAgIGlmIChub2RlMSA9PSBudWxsICYmIG5vZGUyID09IG51bGwpCi0gICAgICAgIAlyZXR1cm4gbnVsbDsgCi0gICAgICAgIGVsc2UgaWYgKChub2RlMSAhPSBudWxsICYmIG5vZGUyID09IG51bGwpIHx8IG5vZGUxID09IG51bGwgJiYgbm9kZTIgIT0gbnVsbCkKLSAgICAgICAgCXJldHVybiBudWxsTm9kZUVuY291bnRlcmVkKG5vZGUxLCBub2RlMik7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGVsc2UgaWYgKG5vZGUxLmdldE5vZGVUeXBlKCkgIT0gbm9kZTIuZ2V0Tm9kZVR5cGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmdldE5vZGVUeXBlKCkgIiArIG5vZGUxLmdldE5vZGVUeXBlKCkgKyAiICIgKyBub2RlMi5nZXROb2RlVHlwZSgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICB9IGVsc2UgaWYgKG5vZGUxLmdldE5vZGVOYW1lKCkgIT0gbm9kZTIuZ2V0Tm9kZU5hbWUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmdldE5vZGVOYW1lKCkgPCIgKyBub2RlMS5nZXROb2RlTmFtZSgpICsgIj4gPCIgKyBub2RlMi5nZXROb2RlTmFtZSgpICsgIj4iLCBub2RlMSwgbm9kZTIpOwotICAgICAgICB9IGVsc2UgaWYgKCEobm9kZTEuZ2V0Tm9kZVZhbHVlKCkgPT0gbnVsbCAmJiBub2RlMi5nZXROb2RlVmFsdWUoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgaWYgKG5vZGUxLmdldE5vZGVWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIk5vZGUuZ2V0Tm9kZVZhbHVlKCkgbm9kZSBBIGlzIG51bGwiLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlMi5nZXROb2RlVmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmdldE5vZGVWYWx1ZSgpIG5vZGUgQiBpcyBudWxsIiwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5vZGUxLmdldE5vZGVWYWx1ZSgpLmVxdWFscyhub2RlMi5nZXROb2RlVmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIk5vZGUuZ2V0Tm9kZVZhbHVlKCkgPCIgKyBub2RlMS5nZXROb2RlVmFsdWUoKSArICI+IDwiICsgbm9kZTIuZ2V0Tm9kZVZhbHVlKCkgKyAiPiIsIG5vZGUxLCBub2RlMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobm9kZTEuaGFzQXR0cmlidXRlcygpICE9IG5vZGUyLmhhc0F0dHJpYnV0ZXMoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmhhc0F0dHJpYnV0ZXMoKSAiICsgbm9kZTEuaGFzQXR0cmlidXRlcygpICsgIiAiICsgbm9kZTIuaGFzQXR0cmlidXRlcygpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICB9IGVsc2UgaWYgKG5vZGUxLmhhc0NoaWxkTm9kZXMoKSAhPSBub2RlMi5oYXNDaGlsZE5vZGVzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiTm9kZS5oYXNDaGlsZE5vZGVzKCkgIiArIG5vZGUxLmhhc0NoaWxkTm9kZXMoKSArICIgIiArIG5vZGUyLmhhc0NoaWxkTm9kZXMoKSwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgfQotCQkvL1RPRE8gc3RyZW5ndGhlbiBub2RlIGNvbXBhcmlzb25zIGFzIG5lY2Vzc2FyeQotICAgICAgICAvL1NwZWNpYWxpemVkIE5vZGUgVGVzdGluZwotICAgICAgICBzd2l0Y2ggKG5vZGUxLmdldE5vZGVUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgotICAgICAgICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0gICAgICAgICAgICAgICAgQ2hhcmFjdGVyRGF0YSBjZGF0YTEgPSAoQ2hhcmFjdGVyRGF0YSkgbm9kZTE7Ci0gICAgICAgICAgICAgICAgQ2hhcmFjdGVyRGF0YSBjZGF0YTIgPSAoQ2hhcmFjdGVyRGF0YSkgbm9kZTI7Ci0gICAgICAgICAgICAgICAgaWYgKCFjZGF0YTEuZ2V0RGF0YSgpLmVxdWFscyhjZGF0YTIuZ2V0RGF0YSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIkNoYXJhY3RlckRhdGEuZ2V0RGF0YSgpICIgKyBjZGF0YTEuZ2V0RGF0YSgpICsgIiAiICsgY2RhdGEyLmdldERhdGEoKSwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgotICAgICAgICAgICAgICAgIEF0dHIgYXR0cjEgPSAoQXR0cikgbm9kZTE7Ci0gICAgICAgICAgICAgICAgQXR0ciBhdHRyMiA9IChBdHRyKSBub2RlMjsKLSAgICAgICAgICAgICAgICAJaWYgKCFhdHRyMS5nZXROYW1lKCkuZXF1YWxzKGF0dHIyLmdldE5hbWUoKSkpIHsKLQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiQXR0ci5nZXROYW1lKCkgIiArIGF0dHIxLmdldE5hbWUoKSArICIgIiArIGF0dHIyLmdldE5hbWUoKSwgbm9kZTEsIG5vZGUyKTsKLQkgICAgICAgICAgICAgICAgfSAKLQkgICAgICAgICAgICAgICAgZWxzZSBpZiggYXR0cmlidXRlTGlzdCAhPSBudWxsICYmICFhdHRyaWJ1dGVMaXN0LmNvbnRhaW5zKGF0dHIxLmdldE5hbWUoKSkgJiYgIWF0dHJpYnV0ZUxpc3QuY29udGFpbnMoYXR0cjIuZ2V0TmFtZSgpKSkgewotCQkJCQkJaWYgKCFhdHRyMS5nZXRWYWx1ZSgpLmVxdWFscyhhdHRyMi5nZXRWYWx1ZSgpKSkgewotCQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiQXR0ci5nZXRWYWx1ZSgpICIgKyBhdHRyMS5nZXRWYWx1ZSgpICsgIiAiICsgYXR0cjIuZ2V0VmFsdWUoKSwgbm9kZTEsIG5vZGUyKTsKLQkJICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cjEuZ2V0U3BlY2lmaWVkKCkgIT0gYXR0cjIuZ2V0U3BlY2lmaWVkKCkpIHsKLQkJICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIkF0dHIuZ2V0U3BlY2lmaWVkKCkgIiArIGF0dHIxLmdldFNwZWNpZmllZCgpICsgIiAiICsgYXR0cjIuZ2V0U3BlY2lmaWVkKCksIG5vZGUxLCBub2RlMik7Ci0JCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDoKLSAgICAgICAgICAgIAlEb2N1bWVudCBkb2MxID0gKERvY3VtZW50KW5vZGUxOwotCQkJCURvY3VtZW50IGRvYzIgPSAoRG9jdW1lbnQpbm9kZTI7Ci0JCQkJU3RyaW5nIHJlc3VsdCA9IGNvbXBhcmVOb2Rlcyhkb2MxLmdldERvY3R5cGUoKSwgZG9jMi5nZXREb2N0eXBlKCkpOwotCQkJCWlmKHJlc3VsdCAhPSBudWxsKXsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgotCQkJCURvY3VtZW50VHlwZSBkb2NUeXBlMSA9IChEb2N1bWVudFR5cGUpbm9kZTE7Ci0JCQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUyID0gKERvY3VtZW50VHlwZSlub2RlMjsKLQkJCQlpZighZG9jVHlwZTEuZ2V0UHVibGljSWQoKS5lcXVhbHMoZG9jVHlwZTIuZ2V0UHVibGljSWQoKSkpewotCQkJCQlyZXR1cm4gbWlzbWF0Y2goIkRvY3VtZW50VHlwZS5nZXRQdWJsaWNJZCgpICIrZG9jVHlwZTEuZ2V0UHVibGljSWQoKSsgIiAiK2RvY1R5cGUyLmdldFB1YmxpY0lkKCksIG5vZGUxLCBub2RlMik7Ci0JCQkJfQotCQkJCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0gICAgICAgICAgICAJUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBJbnN0MSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pbm9kZTE7Ci0JCQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBJbnN0MiA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pbm9kZTI7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NpbmdJbnN0cnVjdGlvbiB0b2RvIik7Ci0gICAgICAgICAgICAJYnJlYWs7Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA6Ci0JCQkJRG9jdW1lbnRGcmFnbWVudCBmcmFnMSA9IChEb2N1bWVudEZyYWdtZW50KW5vZGUxOwotCQkJCURvY3VtZW50RnJhZ21lbnQgZnJhZzIgPSAoRG9jdW1lbnRGcmFnbWVudClub2RlMjsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiRG9jdW1lbnRGcmFnbWVudCB0b2RvIik7Ci0gICAgICAgICAgICAJYnJlYWs7Ci0JCQkKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0gICAgICAgICAgICBjYXNlIE5vZGUuRU5USVRZX05PREUgOgotCQkJY2FzZSBOb2RlLk5PVEFUSU9OX05PREUgOgotCQkJCWJyZWFrOwotCi0gICAgICAgIH0KLQotICAgICAgICAvL1JlY3Vyc2lvbgotICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlczEgPSBub2RlMS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzMiA9IG5vZGUyLmdldEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICBpZiAoYXR0cmlidXRlczEgIT0gbnVsbCAmJiBhdHRyaWJ1dGVzMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlczEuZ2V0TGVuZ3RoKCkgIT0gYXR0cmlidXRlczIuZ2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goImdldEF0dHJpYnV0ZXMoKS5nZXRMZW5ndGgoKSAiICsgYXR0cmlidXRlczEuZ2V0TGVuZ3RoKCkgKyAiICIgKyBhdHRyaWJ1dGVzMi5nZXRMZW5ndGgoKSwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlczEuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUF0dHIgYXR0cjEgPSAoQXR0cikgYXR0cmlidXRlczEuaXRlbShpKTsKLQkJCQlBdHRyIGF0dHIyID0gKEF0dHIpIGF0dHJpYnV0ZXMyLml0ZW0oaSk7Ci0JCQkJaWYoIWF0dHIxLmdldE5hbWUoKS5lcXVhbHMoYXR0cjIuZ2V0TmFtZSgpKSl7Ci0JCQkJCXJldHVybiBtaXNtYXRjaCgiQXR0ci5nZXROYW1lKCkgIiArIGF0dHIxLmdldE5hbWUoKSArICIgIiArIGF0dHIyLmdldE5hbWUoKSwgYXR0cjEsIGF0dHIyKTsKLQkJCQl9Ci0JCQkJaWYoYXR0cmlidXRlTGlzdCAhPSBudWxsICYmICFhdHRyaWJ1dGVMaXN0LmNvbnRhaW5zKGF0dHIxLmdldE5hbWUoKSkgJiYgIWF0dHJpYnV0ZUxpc3QuY29udGFpbnMoYXR0cjIuZ2V0TmFtZSgpKSkgewotCSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0cyA9IGNvbXBhcmVOb2RlcyhhdHRyMSwgYXR0cjIpOwotCSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSByZXN1bHRzKSB7Ci0JICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKLQkgICAgICAgICAgICAgICAgfQotCQkJCX0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZXMxICE9IG51bGwgfHwgYXR0cmlidXRlczIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJnZXRBdHRyaWJ1dGVzKCkgbnVsbCIsIG5vZGUxLCBub2RlMik7Ci0gICAgICAgIH0KLQotICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbjEgPSBub2RlMS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuMiA9IG5vZGUyLmdldENoaWxkTm9kZXMoKTsKLQotICAgICAgICAvLyAgICAgICAgaWYgKGNoaWxkcmVuMS5nZXRMZW5ndGgoKSAhPSBjaGlsZHJlbjIuZ2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgLy8gICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goImdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSAiK2NoaWxkcmVuMS5nZXRMZW5ndGgoKSsiICIrY2hpbGRyZW4yLmdldExlbmd0aCgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAvLyAgICAgICAgfQotCi0gICAgICAgIGludCBjb3VudDEgPSAwOwotICAgICAgICBpbnQgY291bnQyID0gMDsKLQotICAgICAgICAvL2NvbXBhcmUgYWxsIGNoaWxkcmVuLCBza2lwcGluZyBlbXB0eSB0ZXh0IG5vZGVzCi0gICAgICAgIHdoaWxlIChjb3VudDEgPCBjaGlsZHJlbjEuZ2V0TGVuZ3RoKCkgJiYgY291bnQyIDwgY2hpbGRyZW4yLmdldExlbmd0aCgpKSB7Ci0gICAgICAgICAgICBOb2RlIGNoaWxkMSA9IGNoaWxkcmVuMS5pdGVtKGNvdW50MSk7Ci0gICAgICAgICAgICBOb2RlIGNoaWxkMiA9IGNoaWxkcmVuMi5pdGVtKGNvdW50Mik7Ci0gICAgICAgICAgICBpZiAoY2hpbGQxLmdldE5vZGVUeXBlKCkgIT0gY2hpbGQyLmdldE5vZGVUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQxLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgKGNoaWxkMS5nZXROb2RlVmFsdWUoKSA9PSBudWxsIHx8IGNoaWxkMS5nZXROb2RlVmFsdWUoKS50cmltKCkuZXF1YWxzKCIiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnQxKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQyLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgKGNoaWxkMi5nZXROb2RlVmFsdWUoKSAhPSBudWxsIHx8IGNoaWxkMi5nZXROb2RlVmFsdWUoKS50cmltKCkuZXF1YWxzKCIiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnQyKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvdW50MSsrOwotICAgICAgICAgICAgY291bnQyKys7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0cyA9IGNvbXBhcmVOb2RlcyhjaGlsZDEsIGNoaWxkMik7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSByZXN1bHRzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9UT0RPIHRoZXJlIG11c3QgYmUgYSB3YXkgdG8gdGVsbCB0aGUgcGFyc2VyIHRvIGlnbm9yZSB3aGl0ZXNwYWNlLgotICAgICAgICAvL2JlIHN1cmUgc2tpcCBhbnkgZW1wdHkgdGV4dCBub2RlcyBhdCB0aGUgZW5kCi0gICAgICAgIHdoaWxlIChjb3VudDEgPCBjaGlsZHJlbjEuZ2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQxID0gY2hpbGRyZW4xLml0ZW0oY291bnQxKTsKLSAgICAgICAgICAgIGlmIChjaGlsZDEuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZDEuZ2V0Tm9kZVZhbHVlKCkgPT0gbnVsbCB8fCBjaGlsZDEuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICBjb3VudDErKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBub2RlTm90Q29tcGFyZWQoY2hpbGQxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChjb3VudDIgPCBjaGlsZHJlbjIuZ2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQyID0gY2hpbGRyZW4yLml0ZW0oY291bnQyKTsKLSAgICAgICAgICAgIGlmIChjaGlsZDIuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZDIuZ2V0Tm9kZVZhbHVlKCkgPT0gbnVsbCB8fCBjaGlsZDIuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICBjb3VudDIrKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBub2RlTm90Q29tcGFyZWQoY2hpbGQyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuMS5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIC8vICAgICAgICAgICAgTm9kZSBjaGlsZDEgPSBjaGlsZHJlbjEuaXRlbShpKTsKLSAgICAgICAgLy8gICAgICAgICAgICBOb2RlIGNoaWxkMiA9IGNoaWxkcmVuMi5pdGVtKGkpOwotICAgICAgICAvLyAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG51bGxOb2RlRW5jb3VudGVyZWQoTm9kZSBub2RlMSwgTm9kZSBub2RlMikgewotCQlTdHJpbmcgbWVzc2FnZSA9ICJOdWxsIG5vZGUgZW5jb3VudGVyZWQiOwotCQlOb2RlIG5vbk51bGxOb2RlID0gbm9kZTEgPT0gbnVsbCA/IG5vZGUyIDogbm9kZTE7Ci0JCWNoYXIgc291cmNlID0gbm9kZTEgPT0gbnVsbCA/ICdCJyA6ICdBJzsKLQkJd2hpbGUgKG5vbk51bGxOb2RlICE9IG51bGwpIHsKLQkJCW1lc3NhZ2UgKz0gc291cmNlICsgbm9uTnVsbE5vZGUuZ2V0Tm9kZU5hbWUoKSArICJcbiI7Ci0JCQlub25OdWxsTm9kZSA9IG5vbk51bGxOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZTsKLQotCQkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub2RlTm90Q29tcGFyZWQoTm9kZSBub2RlKSB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gIk5vZGUgbm9kZSBjb21wYXJlZDoiOwotICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlICs9IG5vZGUuZ2V0Tm9kZU5hbWUoKSArICJcbiI7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNtYXRjaChTdHJpbmcgbWlzbWF0Y2h0eXBlLCBOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiTm9kZXMgQSBhbmQgQiBkbyBub3QgbWF0Y2ggYmVjYXVzZSBvZiBub2RlLiIgKyBtaXNtYXRjaHR5cGUgKyAiXG4iOwotICAgICAgICB3aGlsZSAobm9kZTEgIT0gbnVsbCAmJiBub2RlMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlICs9ICJBOiIgKyBub2RlMS5nZXROb2RlTmFtZSgpICsgIlxuIjsKLSAgICAgICAgICAgIG1lc3NhZ2UgKz0gIkI6IiArIG5vZGUyLmdldE5vZGVOYW1lKCkgKyAiXG4iOwotICAgICAgICAgICAgbm9kZTEgPSBub2RlMS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICBub2RlMiA9IG5vZGUyLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICB9Ci0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKSB7Ci0JCXJldHVybiBlbnRpdHlSZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb2x2ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLQkJZW50aXR5UmVzb2x2ZXIgPSByZXNvbHZlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9Jbml0aWFsaXphdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvSW5pdGlhbGl6YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTRjNGY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9Jbml0aWFsaXphdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotIC8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldlYk1vZHVsZVJlZjsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8xOC8wMCA3OjQxOjM5IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbGl6YXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsvLyROT04tTkxTLTEkCi0vKioKLSAqIEluaXRpYWxpemF0aW9uVGVzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIEluaXRpYWxpemF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci19Ci0vKioKLSAqIFN0YXJ0cyB0aGUgYXBwbGljYXRpb24uCi0gKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JU3RyaW5nW10gY2xhc3NOYW1lID0geyJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuSW5pdGlhbGl6YXRpb25UZXN0cyIsICItbm9sb2FkaW5nIn07Ci0JVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgVGVzdFN1aXRlKEluaXRpYWxpemF0aW9uVGVzdHMuY2xhc3MpOwotfQotcHVibGljIHZvaWQgdGVzdE5ld0FyY2hpdmVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLS8vICAgICAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgiKiIsIG5ldyBYTUlSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCUFwcGxpY2F0aW9uQ2xpZW50RmlsZSBjbGllbnRGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVJbml0aWFsaXplZCgiZm9vIik7Ci0JYXNzZXJ0VHJ1ZShjbGllbnRGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JCi0KLQljbGllbnRGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVJbml0aWFsaXplZCgiZm9vIik7Ci0KLQlFSkJKYXJGaWxlIGVqYkphckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVKQkphckZpbGVJbml0aWFsaXplZCgiZm9vIik7Ci0JYXNzZXJ0VHJ1ZShlamJKYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JCi0JLy9UaGUgbmV4dCBwaWVjZSBpcyB0byB2ZXJpZnkgbm8gZXhjZXB0aW9ucyBvY2N1cgotCWVqYkphckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVKQkphckZpbGVJbml0aWFsaXplZCgiZm9vIik7Ci0JRUpCTW9kdWxlUmVmIGVqYk1vZHVsZVJlZiA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUpCTW9kdWxlUmVmKCk7Ci0JZWpiTW9kdWxlUmVmLnNldE1vZHVsZUZpbGUoZWpiSmFyRmlsZSk7Ci0JCi0KLQlFQVJGaWxlIGVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZCgiZm9vIik7Ci0JCi0JYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JCi0KLQlXQVJGaWxlIHdhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVdBUkZpbGVJbml0aWFsaXplZCgiZm9vIik7Ci0JCi0JYXNzZXJ0VHJ1ZSh3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JCi0KLQl3YXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVXQVJGaWxlSW5pdGlhbGl6ZWQoImZvbyIpOwotCVdlYk1vZHVsZVJlZiB3ZWJNb2R1bGVSZWYgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVdlYk1vZHVsZVJlZigpOwotCXdlYk1vZHVsZVJlZi5zZXRNb2R1bGVGaWxlKHdhckZpbGUpOwotCQotCi19Ci0JCi0JCi0KLQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0phdmFUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0phdmFUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTMzYmQ4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9KYXZhVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0gLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICovCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxLzE3LzIwMDEgMTA6MTc6MjkgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7Ly8kTk9OLU5MUy0xJAotLyoqCi0gKiBKYXZhVGVzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIEphdmFUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLX0KLS8qKgotICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5KYXZhVGVzdHMiLCAiLW5vbG9hZGluZyJ9OwotCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotfQotcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShKYXZhVGVzdHMuY2xhc3MpOwotfQotLyoqCi0gKiBUaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGF0IGphdmEgcmVmbGVjdGlvbiB3b3JrcyBvbiBhcmNoaXZlcywgYW5kIHRoYXQKLSAqIGNsYXNzIGxvYWRpbmcgYW5kIGphdmEgcmVmbGVjdGlvbiBpcyBkeW5hbWljIHdpdGggY2hhbmdlcyB0byB0aGUgY2xhc3MKLSAqIHBhdGggb2YgdGhlIGFyY2hpdmUKLSAqLwotcHVibGljIHZvaWQgdGVzdEphdmFSZWZsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vKgotCUFyY2hpdmUgYW5BcmNoaXZlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5wcmltT3BlbkFyY2hpdmUoImJhbmszNWRlcGxveWVkLmphciIpOwotCUphdmFDbGFzcyBjbHMgPSAoSmF2YUNsYXNzKW9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmltcGwuSmF2YUNsYXNzSW1wbC5yZWZsZWN0KCJjb20uaWJtLmVqYi5iYW5rLlZhcEFjY291bnRCZWFuIiwgYW5BcmNoaXZlLmdldENvbnRleHQoKSk7Ci0JLy9JZ25vcmUgdGhlIGNvbnN0cnVjdG9yCi0JYXNzZXJ0VHJ1ZSgiU2hvdWxkIG5vdCBoYXZlIGJlZW4gYWJsZSB0byByZWZsZWN0IG1ldGhvZHMiICxjbHMuZ2V0TWV0aG9kcygpLnNpemUoKSA9PSAxICYmICgoTWV0aG9kKWNscy5nZXRNZXRob2RzKCkuZ2V0KDApKS5nZXROYW1lKCkuZXF1YWxzKGNscy5nZXROYW1lKCkpKTsKLQotCWFuQXJjaGl2ZS5zZXRFeHRyYUNsYXNzcGF0aCgiaXZqZWpiMzUuamFyIik7Ci0KLQlhc3NlcnRUcnVlKCJNZXRob2RzIHNob3VsZCBoYXZlIGJlZW4gcmVmbGVjdGVkIiwgY2xzLmdldE1ldGhvZHMoKS5zaXplKCkgPiAxKTsKLSovCQotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0xvb3NlQXJjaGl2ZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvTG9vc2VBcmNoaXZlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlYjM3YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvTG9vc2VBcmNoaXZlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlSW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VDb25maWdSZWdpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLQotCi1wdWJsaWMgY2xhc3MgTG9vc2VBcmNoaXZlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFyY2hpdmVUZXN0IHsKLQotCS8qKiBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY3dkOwotCXByb3RlY3RlZCBVUkkgbG9vc2VDb25maWdMb2M7Ci0JcHJvdGVjdGVkIFVSSSBsb29zZUFwcExvYzsKLQlwcm90ZWN0ZWQgU3RyaW5nIGxvb3NlTW9kdWxlV29ya3NwYWNlOwotCXByb3RlY3RlZCBTdHJpbmcgbG9vc2VFQVJVcmk7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0pBUl9VUkkgPSAiTG9vc2VFQVJFamIuamFyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfVVJJID0gIkxvb3NlRUFSV2ViLndhciI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRJTF9KQVJfVVJJID0gInV0aWwuamFyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJMSUJfVVJJID0gIldFQi1JTkYvbGliL2xpYnJhcnkuamFyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJMSUJfRlVMTF9VUkkgPSAiV0VCLUlORi9saWIvbGlicmFyeS5qYXIiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9FQVJfRklMRV9VUkkgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvTG9vc2VBcmNoaXZlVGVzdHMvTG9vc2VBcHAuZWFyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGNoYXIgc2VwID0gamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExvb3NlQXJjaGl2ZVRlc3RzLgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIExvb3NlQXJjaGl2ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TG9vc2VDb25maWdDcmVhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShsb29zZUNvbmZpZ0xvYykuY3JlYXRlUmVzb3VyY2UobG9vc2VDb25maWdMb2MpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChjcmVhdGVMb29zZUNvbmZpZygpKTsKLQkJcmVzb3VyY2Uuc2F2ZShuZXcgamF2YS51dGlsLkhhc2hNYXAoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb29zZUFwcENyZWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KGxvb3NlQXBwTG9jKS5jcmVhdGVSZXNvdXJjZShsb29zZUFwcExvYyk7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGNyZWF0ZUxvb3NlQXBwbGljYXRpb24oKSk7Ci0JCXJlc291cmNlLnNhdmUobmV3IGphdmEudXRpbC5IYXNoTWFwKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TG9vc2VDb25maWdPcGVuQW5kU2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0uc2V0UHJvcGVydHkoTG9vc2VDb25maWdSZWdpc3Rlci5MT09TRV9DT05GSUdfUFJPUEVSVFksIGxvb3NlQ29uZmlnTG9jLnRvU3RyaW5nKCkpOwotCQlFQVJGaWxlIGVhciA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUobG9vc2VFQVJVcmkpOwotCQl2ZXJpZnkoZWFyKTsKLQkJLy9wcmludENsYXNzcGF0aHMoZWFyKTsKLQkJZWFyLnNhdmVBcyhPVVRQVVRfRUFSX0ZJTEVfVVJJKTsKLQkJZWFyLmNsb3NlKCk7Ci0JCWVhciA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoT1VUUFVUX0VBUl9GSUxFX1VSSSk7Ci0JCXZlcmlmeShlYXIpOwotCQllYXIuY2xvc2UoKTsKLQkJCQotCX0KLQkKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb29zZUNvbmZpZ1VuaW1vZGVPcGVuQW5kU2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0uc2V0UHJvcGVydHkoTG9vc2VDb25maWdSZWdpc3Rlci5MT09TRV9DT05GSUdfUFJPUEVSVFksICIiKTsKLQotCQlMb29zZUNvbmZpZ1JlZ2lzdGVyLnNpbmdsZXRvbigpLmFkZExvb3NlTWFwcGluZyhsb29zZUVBUlVyaSwgbG9vc2VBcHBMb2MudG9TdHJpbmcoKSk7Ci0JCUVBUkZpbGUgZWFyID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShsb29zZUVBUlVyaSk7Ci0JCXZlcmlmeShlYXIpOwotCQkvL3ByaW50Q2xhc3NwYXRocyhlYXIpOwotCQllYXIuc2F2ZUFzKE9VVFBVVF9FQVJfRklMRV9VUkkpOwotCQllYXIuY2xvc2UoKTsgCi0KLQkJZWFyID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShPVVRQVVRfRUFSX0ZJTEVfVVJJKTsKLQkJdmVyaWZ5KGVhcik7Ci0JCWVhci5jbG9zZSgpOwotCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb29zZUNvbmZpZ09wZW5BbmRSZU9wZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLnNldFByb3BlcnR5KExvb3NlQ29uZmlnUmVnaXN0ZXIuTE9PU0VfQ09ORklHX1BST1BFUlRZLCBsb29zZUNvbmZpZ0xvYy50b1N0cmluZygpKTsKLQkJRUFSRmlsZSBlYXIgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKGxvb3NlRUFSVXJpKTsKLQkJZWFyLmNsb3NlKCk7Ci0JCWVhci5yZW9wZW4oKTsKLQkJTGlzdCBqYXJzID0gZWFyLmdldEFyY2hpdmVGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGphcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUFyY2hpdmUgYXJjaGl2ZSA9IChBcmNoaXZlKSBqYXJzLmdldChpKTsKLQkJCWFyY2hpdmUuY2xvc2UoKTsKLQkJCWFyY2hpdmUucmVvcGVuKGVhcik7Ci0JCX0KLQkJZWFyLmNsb3NlKCk7Ci0JCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnkoRUFSRmlsZSBlYXIpIHRocm93cyBFeGNlcHRpb24gewotCQl2ZXJpZnlNb2R1bGVzKGVhcik7Ci0JCXZlcmlmeU1vZHVsZVJlZnMoZWFyKTsKLQkJdmVyaWZ5VXRpbEFuZExpYihlYXIpOwotCX0KLQotCS8qKgotCSAqIEFub3RoZXIgbGV2ZWwgb2YgdmVyaWZpY2F0aW9uIHRoYXQgZm9yIGVhY2ggbW9kdWxlLCB0aGUgbW9kdWxlIGZpbGVzIGV4aXN0cwotCSAqIGFuZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNhbiBiZSByZWFkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5TW9kdWxlUmVmcyhFQVJGaWxlIGVhcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3QgbW9kdWxlUmVmcyA9IGVhci5nZXRNb2R1bGVSZWZzKCk7Ci0JCWludCBzaXplID0gbW9kdWxlUmVmcy5zaXplKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIG1vZHVsZXMiLCAyLCBzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSBtb2R1bGVSZWZzLmdldChpKTsKLQkJCWFzc2VydE5vdE51bGwoIk1vZHVsZVJlZiBzaG91bGQgaGF2ZSBhIG1vZHVsZSBmaWxlOiIrcmVmLmdldE1vZHVsZSgpLmdldFVyaSgpLCByZWYuZ2V0TW9kdWxlRmlsZSgpKTsKLQkJCWFzc2VydE5vdE51bGwoIkRlcGxveW1lbnQgZGVzY3JpcHRvciBzaG91bGQgbm90IGJlIG51bGwiLCByZWYuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSk7CQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmeSB0aGF0IHRoZSB1dGlsIGphciBpbiB0aGUgZWFyIGFuZCB0aGUgbGlicmFyeSBpbiB0aGUgd2FyIGV4aXN0IGFuZCBhcmUgbm90IGVtcHR5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5VXRpbEFuZExpYihFQVJGaWxlIGVhcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXZlcmlmeUpBUihlYXIsIFVUSUxfSkFSX1VSSSk7Ci0JCXZlcmlmeUpBUigoQXJjaGl2ZSllYXIuZ2V0RmlsZShXQVJfVVJJKSwgV0VCTElCX0ZVTExfVVJJKTsKLQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5SkFSKEFyY2hpdmUgcGFyZW50LCBTdHJpbmcgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGNvbnRhaW4gSkFSOiAiK3VyaSwgcGFyZW50LmNvbnRhaW5zRmlsZSh1cmkpKTsKLQkJQXJjaGl2ZSBqYXIgPSAoQXJjaGl2ZSlwYXJlbnQuZ2V0RmlsZSh1cmkpOwotCQkvL2F0IGxlYXNlIG9uZSBmaWxlIHBsdXMgdGhlIG1hbmlmZXN0Ci0JCWFzc2VydFRydWUoIkpBUiBzaG91bGQgY29udGFpbiBhIGNsYXNzIGZpbGU6ICIrdXJpLCBjb250YWluc0NsYXNzRmlsZShqYXIpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNDbGFzc0ZpbGUoQXJjaGl2ZSBqYXIpIHsKLQkJTGlzdCBmaWxlcyA9IGphci5nZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKLQkJCWlmIChhRmlsZS5nZXRVUkkoKS5lbmRzV2l0aCgiLmNsYXNzIikpOwotCQkJCXJldHVybiB0cnVlOwkKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIE1ha2Ugc3VyZSB7QGxpbmsgQ29udGFpbmVyI2NvbnRhaW5zRmlsZShTdHJpbmcpIHdvcmtzIGZvciBsb29zZSBtb2R1bGVzCi0JICovCi0JcHVibGljIHZvaWQgdmVyaWZ5TW9kdWxlcyhFQVJGaWxlIGVhcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3QgbW9kdWxlcyA9IGVhci5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKTsKLQkJaW50IHNpemUgPSBtb2R1bGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGUgbSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJYXNzZXJ0VHJ1ZSgiRUFSIGZpbGUgc2hvdWxkIGNvbnRhaW4gbW9kdWxlIGZpbGU6ICIrbS5nZXRVcmkoKSwgZWFyLmNvbnRhaW5zRmlsZShtLmdldFVyaSgpKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgbW9kdWxlcyIsIDIsIHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZSBtID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlhc3NlcnRUcnVlKCJFQVIgZmlsZSBzaG91bGQgY29udGFpbiBtb2R1bGUgZmlsZTogIittLmdldFVyaSgpLCBlYXIuY29udGFpbnNGaWxlKG0uZ2V0VXJpKCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgTG9vc2VDb25maWd1cmF0aW9uIGNyZWF0ZUxvb3NlQ29uZmlnKCkgewotCQlMb29zZUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbG9vc2VDb25maWdGYWN0b3J5KCkuY3JlYXRlTG9vc2VDb25maWd1cmF0aW9uKCk7Ci0JCWNvbmZpZy5nZXRBcHBsaWNhdGlvbnMoKS5hZGQoY3JlYXRlTG9vc2VBcHBsaWNhdGlvbigpKTsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JCi0JcHJvdGVjdGVkIExvb3NlQXBwbGljYXRpb24gY3JlYXRlTG9vc2VBcHBsaWNhdGlvbigpIHsKLQkJTG9vc2VBcHBsaWNhdGlvbiBhcHAgPSBsb29zZUNvbmZpZ0ZhY3RvcnkoKS5jcmVhdGVMb29zZUFwcGxpY2F0aW9uKCk7Ci0JCWFwcC5zZXRVcmkobG9vc2VFQVJVcmkpOwotCQlhcHAuc2V0UmVzb3VyY2VzUGF0aChsb29zZUVBUlVyaSk7Ci0JCWFwcC5zZXRCaW5hcmllc1BhdGgobG9vc2VFQVJVcmkpOwotCQlMaXN0IGxvb3NlQXJjaGl2ZXMgPSBhcHAuZ2V0TG9vc2VBcmNoaXZlcygpOwotCQlsb29zZUFyY2hpdmVzLmFkZChjcmVhdGVMb29zZUVKQigpKTsKLQkJbG9vc2VBcmNoaXZlcy5hZGQoY3JlYXRlTG9vc2VXRUIoKSk7Ci0JCWxvb3NlQXJjaGl2ZXMuYWRkKGNyZWF0ZUxvb3NlVXRpbCgpKTsKLQkJcmV0dXJuIGFwcDsKLQl9Ci0JCi0JcHJvdGVjdGVkIExvb3NlTW9kdWxlIGNyZWF0ZUxvb3NlRUpCKCkgewotCQlMb29zZU1vZHVsZSBtb2QgPSBsb29zZUNvbmZpZ0ZhY3RvcnkoKS5jcmVhdGVMb29zZU1vZHVsZSgpOwotCQltb2Quc2V0VXJpKEVKQl9KQVJfVVJJKTsKLQkJU3RyaW5nIGFic1BhdGggPSBsb29zZU1vZHVsZVdvcmtzcGFjZStzZXArIkxvb3NlRUFSRWpiIitzZXArImJpbiI7Ci0JCW1vZC5zZXRCaW5hcmllc1BhdGgoYWJzUGF0aCk7Ci0JCW1vZC5zZXRSZXNvdXJjZXNQYXRoKGFic1BhdGgpOwotCQlyZXR1cm4gbW9kOwotCX0KLQkKLQlwcm90ZWN0ZWQgTG9vc2VNb2R1bGUgY3JlYXRlTG9vc2VXRUIoKSB7Ci0JCUxvb3NlV0FSRmlsZSBtb2QgPSBsb29zZUNvbmZpZ0ZhY3RvcnkoKS5jcmVhdGVMb29zZVdBUkZpbGUoKTsKLQkJbW9kLnNldFVyaShXQVJfVVJJKTsKLQkJU3RyaW5nIGFic1BhdGggPSBsb29zZU1vZHVsZVdvcmtzcGFjZStzZXArIkxvb3NlRUFSV2ViIitzZXArIndlYkFwcGxpY2F0aW9uIjsKLQkJbW9kLnNldEJpbmFyaWVzUGF0aChhYnNQYXRoKTsKLQkJbW9kLnNldFJlc291cmNlc1BhdGgoYWJzUGF0aCk7Ci0JCW1vZC5nZXRMb29zZUxpYnMoKS5hZGQoY3JlYXRlTG9vc2VXZWJMaWIoKSk7Ci0JCXJldHVybiBtb2Q7Ci0JfQotCQotCXByb3RlY3RlZCBMb29zZUxpYnJhcnkgY3JlYXRlTG9vc2VVdGlsKCkgewotCQlMb29zZUxpYnJhcnkgbGliID0gbG9vc2VDb25maWdGYWN0b3J5KCkuY3JlYXRlTG9vc2VMaWJyYXJ5KCk7Ci0JCWxpYi5zZXRVcmkoVVRJTF9KQVJfVVJJKTsKLQkJU3RyaW5nIGFic1BhdGggPSBsb29zZU1vZHVsZVdvcmtzcGFjZStzZXArIkxvb3NlSmF2YVV0aWwiK3NlcCsiYmluIjsKLQkJbGliLnNldEJpbmFyaWVzUGF0aChhYnNQYXRoKTsKLQkJbGliLnNldFJlc291cmNlc1BhdGgoYWJzUGF0aCk7Ci0JCXJldHVybiBsaWI7Ci0JfQotCQotCXByb3RlY3RlZCBMb29zZUxpYnJhcnkgY3JlYXRlTG9vc2VXZWJMaWIoKSB7Ci0JCUxvb3NlTGlicmFyeSBsaWIgPSBsb29zZUNvbmZpZ0ZhY3RvcnkoKS5jcmVhdGVMb29zZUxpYnJhcnkoKTsKLQkJbGliLnNldFVyaShXRUJMSUJfVVJJKTsKLQkJU3RyaW5nIGFic1BhdGggPSBsb29zZU1vZHVsZVdvcmtzcGFjZStzZXArIkxvb3NlSmF2YVdlYkxpYiIrc2VwKyJiaW4iOwotCQlsaWIuc2V0QmluYXJpZXNQYXRoKGFic1BhdGgpOwotCQlsaWIuc2V0UmVzb3VyY2VzUGF0aChhYnNQYXRoKTsKLQkJcmV0dXJuIGxpYjsKLQl9Ci0JCi0JcHJvdGVjdGVkIExvb3NlY29uZmlnRmFjdG9yeSBsb29zZUNvbmZpZ0ZhY3RvcnkoKSB7Ci0JCXJldHVybiBMb29zZWNvbmZpZ1BhY2thZ2UuZUlOU1RBTkNFLmdldExvb3NlY29uZmlnRmFjdG9yeSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwcmludENsYXNzcGF0aHMoRUFSRmlsZSBlYXIpIHsKLQkJTGlzdCBhcmNoaXZlcyA9IGVhci5nZXRBcmNoaXZlRmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmNoaXZlcy5zaXplKCk7IGkrKykgewotCQkJQXJjaGl2ZSBhcmNoaXZlID0gKEFyY2hpdmUpIGFyY2hpdmVzLmdldChpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9jYWwgcnVudGltZSBjbGFzc3BhdGggZm9yOiAiK2FyY2hpdmUuZ2V0VVJJKCkpOwotCQkJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGFyY2hpdmUuZ2V0TG9jYWxSdW50aW1lQ2xhc3NQYXRoKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZW50cmllc1tqXSk7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZ1bGwgcnVudGltZSBjbGFzc3BhdGggZm9yOiAiK2FyY2hpdmUuZ2V0VVJJKCkpOwotCQkJZW50cmllcyA9IGFyY2hpdmUuZ2V0RnVsbFJ1bnRpbWVDbGFzc1BhdGgoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7IGorKykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlbnRyaWVzW2pdKTsKLQkJCX0KLQkJfQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0Lkxvb3NlQXJjaGl2ZVRlc3RzIiwgIi1ub2xvYWRpbmciIH07Ci0JCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiTG9vc2VBcmNoaXZlVGVzdHMiKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgTG9vc2VBcmNoaXZlVGVzdHMoInRlc3RMb29zZUNvbmZpZ0NyZWF0aW9uIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBMb29zZUFyY2hpdmVUZXN0cygidGVzdExvb3NlQXBwQ3JlYXRpb24iKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IExvb3NlQXJjaGl2ZVRlc3RzKCJ0ZXN0TG9vc2VDb25maWdPcGVuQW5kU2F2ZSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgTG9vc2VBcmNoaXZlVGVzdHMoInRlc3RMb29zZUNvbmZpZ09wZW5BbmRSZU9wZW4iKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IExvb3NlQXJjaGl2ZVRlc3RzKCJ0ZXN0TG9vc2VDb25maWdVbmltb2RlT3BlbkFuZFNhdmUiKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCS8qCi0JCSAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCXN1cGVyLnNldFVwKCk7Ci0JCQlBcmNoaXZlSW5pdC5pbml0KCk7Ci0JCQlMb29zZUNvbmZpZ1JlZ2lzdGVyLnNpbmdsZXRvbigpLmZsdXNoKCk7Ci0JCQljd2QgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLQkJCWxvb3NlTW9kdWxlV29ya3NwYWNlID0gY3dkKyJsb29zZV9tb2R1bGVfd29ya3NwYWNlIjsKLQkJCWxvb3NlQ29uZmlnTG9jID0gVVJJLmNyZWF0ZUZpbGVVUkkobG9vc2VNb2R1bGVXb3Jrc3BhY2Urc2VwKyIubWV0YWRhdGEiK3NlcCsiLnBsdWdpbnMiK3NlcCsiY29tLmlibS5ldG9vbHMuajJlZSIrc2VwKyJsb29zZUNvbmZpZy54bWkiKTsKLQkJCWxvb3NlQXBwTG9jID0gVVJJLmNyZWF0ZUZpbGVVUkkobG9vc2VNb2R1bGVXb3Jrc3BhY2Urc2VwKyIubWV0YWRhdGEiK3NlcCsiLnBsdWdpbnMiK3NlcCsiY29tLmlibS5ldG9vbHMuajJlZSIrc2VwKyJsb29zZUFwcC54bWkiKTsKLQkJCWxvb3NlRUFSVXJpID0gQXJjaGl2ZVV0aWwuZ2V0T1NVcmkobG9vc2VNb2R1bGVXb3Jrc3BhY2Urc2VwKyJMb29zZUVBUiIpOwotCQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9SYXJGaWxlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9SYXJGaWxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzNThkMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvUmFyRmlsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLS8qCi0qIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0qIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0qIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotKi8KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc207Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuU2VjdXJpdHlQZXJtaXNzaW9uOwotCi0vKioKLSAqIFRlc3RzIGZvciB2ZXJmaWNhdGlvbiB0aGF0IFJBUiBzdXBwb3J0IHdvcmtzIGNvcnJlY3RseSBpbiBXQ0NNLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzExLzAwIDEwOjI2OjExIEFNKQotICogQGF1dGhvcjogSmFyZWQgSnVya2lld2ljeiwgZXQgYWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBSYXJGaWxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiBTaW1wbGVUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotICAgICAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgUmFyRmlsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LlJhckZpbGVUZXN0cyIsICItbm9sb2FkaW5nIiB9OwotICAgICAgICBUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcHJpbnRSQVJUb0NvbnNvbGUoQ29ubmVjdG9yIGNvbm5lY3RvcikgewotICAgICAgICBSZXNvdXJjZUFkYXB0ZXIgcmEgPSBjb25uZWN0b3IuZ2V0UmVzb3VyY2VBZGFwdGVyKCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZUFkYXB0ZXIgZnJvbSBYTUwgRGVwbG95bWVudCBEZXNjcmlwdG9yIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY29ubmVjdG9yLmdldERpc3BsYXlOYW1lKCkgKyAiOiAiICsgY29ubmVjdG9yLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlZlbmRvciA6ICIgKyBjb25uZWN0b3IuZ2V0VmVuZG9yTmFtZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWZXJzaW9uIDogIiArIGNvbm5lY3Rvci5nZXRWZXJzaW9uKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNwZWMgVmVyc2lvbiA6ICIgKyBjb25uZWN0b3IuZ2V0U3BlY1ZlcnNpb24oKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRUlTIFR5cGUgOiAiICsgY29ubmVjdG9yLmdldEVpc1R5cGUoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0IDogIiArIHJhLmlzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJhbnNhY3Rpb24gU3VwcG9ydCA6ICIgKyByYS5nZXRUcmFuc2FjdGlvblN1cHBvcnQoKS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSk7Ci0KLSAgICAgICAgaWYgKGNvbm5lY3Rvci5nZXRMaWNlbnNlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMaWNlbnNlIFJlcXVpcmVkIDogIiArIGNvbm5lY3Rvci5nZXRMaWNlbnNlKCkuaXNSZXF1aXJlZCgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTGljZW5zZSBEZXNjcmlwdGlvbiA6ICIgKyBjb25uZWN0b3IuZ2V0TGljZW5zZSgpLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTbWFsbCBJY29uIDogIiArIGNvbm5lY3Rvci5nZXRTbWFsbEljb24oKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTGFyZ2UgSWNvbiA6ICIgKyBjb25uZWN0b3IuZ2V0TGFyZ2VJY29uKCkpOwotCi0gICAgICAgIExpc3QgYXV0aE1lY2hzID0gcmEuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXV0aE1lY2hzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBhdXRoID0gKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKSBhdXRoTWVjaHMuZ2V0KGkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbToiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVzY3JpcHRpb24gOiAiICsgYXV0aC5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZSA6ICIgKyBhdXRoLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlZGVudGlhbCBJbnRlcmZhY2UgOiAiICsgYXV0aC5nZXRDcmVkZW50aWFsSW50ZXJmYWNlKCkpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5SZWdpc3RlcmVkIGNsYXNzZXM6Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgcmEuZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSArICIgaW1wbGVtZW50cyAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IiArIHJhLmdldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIHJhLmdldENvbm5lY3Rpb25JbXBsQ2xhc3MoKSArICIgaW1wbGVtZW50cyAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IiArIHJhLmdldENvbm5lY3Rpb25JbnRlcmZhY2UoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRNYW5hZ2VkQ29ubmVjdGlvbkZhY3Rvcnk6ICIgKyByYS5nZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpKTsKLQotICAgICAgICBMaXN0IGNvbmZpZ3MgPSByYS5nZXRDb25maWdQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5Db25maWctcHJvcGVydGllczoiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBDb25maWdQcm9wZXJ0eSBwcm9wID0gKENvbmZpZ1Byb3BlcnR5KSBjb25maWdzLmdldChpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRDb25maWctcHJvcGVydHkgOiAiICsgcHJvcC5nZXROYW1lKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdFR5cGUgOiAiICsgcHJvcC5nZXRUeXBlKCkgKyAiIC8gVmFsdWUgOiAiICsgcHJvcC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHREZXNjcmlwdGlvbiA6ICIgKyBwcm9wLmdldERlc2NyaXB0aW9uKCkgKyAiXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Qgc2VjcyA9IHJhLmdldFNlY3VyaXR5UGVybWlzc2lvbnMoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNlY3VyaXR5LVBlcm1pc3Npb25zOiIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlY3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFNlY3VyaXR5UGVybWlzc2lvbiBwcm9wID0gKFNlY3VyaXR5UGVybWlzc2lvbikgc2Vjcy5nZXQoaSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0Q29uZmlnLURlc2NyaXB0aW9uIDogIiArIHByb3AuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0U3BlY2lmaWNhdGlvbiA6ICIgKyBwcm9wLmdldFNwZWNpZmljYXRpb24oKSArICJcbiIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmFyRmlsZVRlc3RzLmNsYXNzKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdGFkZENvcHlNb2R1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUucmFyIjsKLSAgICAgICAgUkFSRmlsZSByYXJGaWxlID0gKFJBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotCi0gICAgICAgIHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotICAgICAgICBFQVJGaWxlIG5ld0VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L0NvcHlUZXN0cy9uZXdFYXJXaXRoUmFyQ29waWVkTW9kdWxlLmVhciIpOwotCi0gICAgICAgIG5ld0VhckZpbGUuYWRkQ29weShyYXJGaWxlKTsKLSAgICAgICAgUkFSRmlsZSBjb3BpZWQgPSAoUkFSRmlsZSkgbmV3RWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3BpZWQuaXNEZXBsb3ltZW50RGVzY3JpcHRvclNldCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3BpZWQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSA9PSBjb3BpZWQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3BpZWQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSByYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJhckZpbGUuZ2V0RmlsZXMoKS5zaXplKCkgPT0gY29waWVkLmdldEZpbGVzKCkuc2l6ZSgpKTsKLQotICAgICAgICBuZXdFYXJGaWxlLnNhdmVOb1Jlb3BlbigpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0ZXhwYW5kUmFyTW9kdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLnJhciI7Ci0gICAgICAgIFJBUkZpbGUgcmFyRmlsZSA9IChSQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLSAgICAgICAgcmFyRmlsZS5zZXRVUkkoInNhbXBsZS5yYXIiKTsKLQotICAgICAgICByYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgRUFSRmlsZSBuZXdFYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9SYXJUZXN0cy9uZXdFYXJXaXRoUmFyTW9kdWxlLmVhciIpOwotICAgICAgICBuZXdFYXJGaWxlLmFkZENvcHkocmFyRmlsZSk7Ci0KLSAgICAgICAgbmV3RWFyRmlsZS5zYXZlTm9SZW9wZW4oKTsKLQotICAgICAgICBTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9SYXJUZXN0cy9SYXItY29udGFpbmluZy1lYXItb3V0LmVhciI7Ci0gICAgICAgIG5ld0VhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfUkFSX0ZJTEVTKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVmVyeSBiYXNpYyBtZXRob2QgdG8gb3BlbiBhbiBhcmNoaXZlIGFuZCBzYXZlIGl0IGFzIGEgZGlyZWN0b3J5IHRvIGEgbmV3IGRlc3RpbmF0aW9uLiAgUmVxdWlyZXMgdmlzdWFsIGluc3BlY3Rpb24KLSAgICAgKiBmb3IgdmVyaWZpY2F0aW9uLiAgTmVzdGVkIHdhcnMgYW5kIGVqYiBqYXJzIHdpbGwgYmUgZXhwbG9kZWQgYnV0IG90aGVyIG5lc3RlZCBqYXJzIHdpbGwgbm90Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbmRFeHRyYWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLnJhciI7Ci0gICAgICAgIFJBUkZpbGUgcmFyRmlsZSA9IChSQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLSAgICAgICAgU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvRXhwbG9kZWRfUkFSX0Rpci8iOwotICAgICAgICByYXJGaWxlLmV4dHJhY3RUb0Nvbm5lY3RvckRpcmVjdG9yeShvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIE9wZW5zIGFuIGVhciBmaWxlLCBhbmQgZm9yIGVhY2ggbW9kdWxlLCB3cml0ZXMgaXQncyBkZCBjb21wb25lbnRzIHRvIHRoZSBjb25zb2xlLiAgUmVxdWlyZXMgdmlzdWFsIGluc3BlY3Rpb24KLSAgICAgKiBmb3IgdmVyaWZpY2F0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFuZFJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUucmFyIjsKLSAgICAgICAgUkFSRmlsZSByYXJGaWxlID0gKFJBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotCi0JCUNvbm5lY3RvciBkZCA9IHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJLy9wcmludFJBUlRvQ29uc29sZShkZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RvcGVuUmFyRWFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVBUkZpbGUgZWFyRmlsZSA9IChFQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RyYXIuZWFyIik7Ci0JCWFzc2VydFRydWUoZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEZpcnN0TW9kdWxlKCJzYW1wbGUucmFyIikgIT0gbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlUmFyRWFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5yYXIiOwotCQlSQVJGaWxlIHJhckZpbGUgPSAoUkFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0JCXJhckZpbGUuc2V0VVJJKCJzYW1wbGUucmFyIik7Ci0KLSAgICAgICAgcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0gICAgICAgIEVBUkZpbGUgbmV3RWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvUmFyVGVzdHMvbmV3RWFyV2l0aFJhck1vZHVsZV9zYXZlZC5lYXIiKTsKLSAgICAgICAgbmV3RWFyRmlsZS5hZGRDb3B5KHJhckZpbGUpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIk1vZHVsZSB3YXNuJ3QgZm91bmQhIiwgbmV3RWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEZpcnN0TW9kdWxlKCJzYW1wbGUucmFyIikpOwotCi0gICAgICAgIG5ld0VhckZpbGUuc2F2ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKMkNhdXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5yYXIiOwotICAgICAgICBSQVJGaWxlIHJhckZpbGUgPSAoUkFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0KLSAgICAgICAgQ29ubmVjdG9yIGRkID0gcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0gICAgICAgIFJlc291cmNlQWRhcHRlciByZCA9IGRkLmdldFJlc291cmNlQWRhcHRlcigpOwotCi0gICAgICAgIEVMaXN0IG15QXV0aExpc3QgPSByZC5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiBhdXRoIG1lY2hhbmlzbXMgaXM6ICIgKyBteUF1dGhMaXN0LnNpemUoKSk7Ci0vLyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBteUF1dGhMaXN0LnNpemUoKTsgaSsrKSB7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXV0aCB0eXBlIGlzOiAiICsgKChBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSkgbXlBdXRoTGlzdC5nZXQoaSkpLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpKTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBdXRoIHR5cGUgaXM6ICIgKyAoKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKSBteUF1dGhMaXN0LmdldChpKSkuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkuZ2V0TmFtZSgpKTsKLS8vICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvUmVzb3VyY2VUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1Jlc291cmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljYTUxMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvUmVzb3VyY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXBwbGljYXRpb25DbGllbnRGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVJbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFyY2hpdmVUZXN0IHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFJlc291cmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgYXBwbGljYXRpb24uCi0JICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZ1tdIGNsYXNzTmFtZSA9IHsiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LlJlc291cmNlVGVzdHMiLCAiLW5vbG9hZGluZyJ9OwotCQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVzb3VyY2VUZXN0cy5jbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZmluZE9jY3VycmVuY2VzKExpc3QgcmVzb3VyY2VzLCBTdHJpbmcgdXJpKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVJlc291cmNlIGFSZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChpKTsKLQkJCWlmICh1cmkuZXF1YWxzKGFSZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpKSkKLQkJCQlyZXN1bHQuYWRkKGFSZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VDcmVhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdXJpID0gIk1FVEEtSU5GL2NsaWVudC1yZXNvdXJjZS54bWkiOwotCQlBcHBsaWNhdGlvbkNsaWVudEZpbGUgYXBwQ2xpZW50RmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlSW5pdGlhbGl6ZWQoInRlc3QuamFyIik7Ci0JCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCWJvb2xlYW4gZXhjZXB0aW9uQ2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlyZXMgPSBhcHBDbGllbnRGaWxlLmdldE1vZlJlc291cmNlKHVyaSk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbkNhdWdodCA9IHRydWU7Ci0JCQlMaXN0IGZvdW5kUmVzb3VyY2VzID0gZmluZE9jY3VycmVuY2VzKGFwcENsaWVudEZpbGUuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSwgdXJpKTsKLQkJCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBleGlzdCBleGFjdGx5IG9uZSByZXNvdXJjZSIsIGZvdW5kUmVzb3VyY2VzLnNpemUoKSA9PSAxKTsKLQkJCVJlc291cmNlIGZvdW5kUmVzb3VyY2UgPSAoUmVzb3VyY2UpZm91bmRSZXNvdXJjZXMuZ2V0KDApOwotCQkJYXNzZXJ0RmFsc2UoIlRoZSByZXNvdXJjZSBzaG91bGQgYmUgdW5sb2FkZWQiLCBmb3VuZFJlc291cmNlLmlzTG9hZGVkKCkpOwotCQkJcmVzID0gYXBwQ2xpZW50RmlsZS5tYWtlTW9mUmVzb3VyY2UodXJpKTsKLQkJCWFzc2VydFRydWUoIlJlc291cmNlIHNob3VsZCBub3QgYmUgbnVsbCIsIHJlcyAhPSBudWxsKTsKLQkJCWZvdW5kUmVzb3VyY2VzID0gZmluZE9jY3VycmVuY2VzKGFwcENsaWVudEZpbGUuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSwgdXJpKTsKLQkJCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBleGlzdCBleGFjdGx5IG9uZSByZXNvdXJjZSIsIGZvdW5kUmVzb3VyY2VzLnNpemUoKSA9PSAxKTsKLQkJCWZvdW5kUmVzb3VyY2UgPSAoUmVzb3VyY2UpZm91bmRSZXNvdXJjZXMuZ2V0KDApOwotCQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlc291cmNlIHNob3VsZCBleGlzdCIsIGZvdW5kUmVzb3VyY2UgIT0gbnVsbCk7Ci0JCQlhc3NlcnRGYWxzZSgiVGhlIHJlc291cmNlIHNob3VsZCBiZSB1bmxvYWRlZCIsIGZvdW5kUmVzb3VyY2UuaXNMb2FkZWQoKSk7CQkKLQkJfQotCQlhc3NlcnRUcnVlKCJFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiBjYXVnaHQiLCBleGNlcHRpb25DYXVnaHQpOwotCQlDb2xsZWN0aW9uIGxvYWRlZFJlc291cmNlcyA9IGFwcENsaWVudEZpbGUuZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCk7Ci0JCWFzc2VydFRydWUoIkxvYWRlZCByZXNvdXJjZXMgc2hvdWxkIGJlIHNpemUgMSIsIGxvYWRlZFJlc291cmNlcy5zaXplKCkgPT0gMSk7Ci0JCUVqYlJlZiBhUmVmID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZUVqYlJlZigpOwotCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQoYVJlZik7Ci0JCWxvYWRlZFJlc291cmNlcyA9IGFwcENsaWVudEZpbGUuZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCk7Ci0JCWFzc2VydFRydWUoIkxvYWRlZCByZXNvdXJjZXMgc2hvdWxkIGJlIHNpemUgMiIsIGxvYWRlZFJlc291cmNlcy5zaXplKCkgPT0gMik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZURpcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVKQkphckZpbGUgamFyID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUpCMTFKYXJGaWxlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImJhbmtlamJzLmphciIpOwotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKWphci5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEVudGVycHJpc2VCZWFucygpLmdldCgwKTsKLQkJCi0JCUVBUkZpbGUgbmV3RWFyID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoInRlc3QiKTsKLQkJRUpCSmFyRmlsZSBjb3B5SmFyID0gKEVKQkphckZpbGUpIG5ld0Vhci5hZGRDb3B5KGphcik7Ci0JCQotCQlhc3NlcnRGYWxzZSgiZGQgc2hvdWxkIG5vdCBiZSBkaXJ0eSIsIGNvcHlKYXIuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmlzTW9kaWZpZWQoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlBcmNoaXZlSW5pdC5pbml0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvU2F2ZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvU2F2ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NmMxMTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1NhdmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzIxLzAwIDM6MDQ6MzYgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiBTYXZlVGVzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLSAgICAgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFNhdmVUZXN0cyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFN0YXJ0cyB0aGUgYXBwbGljYXRpb24uCi0gICAgICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFN0cmluZ1tdIGNsYXNzTmFtZSA9IHsgImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5TYXZlVGVzdHMiLCAiLW5vbG9hZGluZyIgfTsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFNhdmVUZXN0cy5jbGFzcyk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFRoaXMgc2NlbmFyaW8gdGVzdHMgdGhlIGNhc2Ugb2Ygb3BlbmluZyBhbiBhcmNoaXZlLCBtb2RpZnlpbmcgaXQncyBjb250ZW50cywgYW5kIHNhdmluZyB0byB0aGUgc2FtZSB1cmkgZnJvbSB3aGljaCBpdCB3YXMKLSAgICAgKiBsb2FkZWQuICBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSByZWFkaW5nIG9mIGlucHV0IHN0cmVhbXMgb2YgaW5kaXZpZHVhbCBlbnRyaWVzIGluIGFuIGFyY2hpdmUgaXMgZGVmZXJyZWQgdW50aWwgcmVxdWVzdGVkIHRocm91Z2gKLSAgICAgKiB0aGUgYXBpIG9yIHNhdmUgdGltZTsgdGhlcmVmb3JlLCBhbiBvcGVuIGZpbGUgZXhpc3RzIG9uIHRoZSBzb3VyY2UgZmlsZS4gIFRvIGdldCBhcm91bmQgdGhpcywgdGhlIGltcGxlbWVudGF0aW9uIHNhdmVzIHRoZSBhcmNoaXZlCi0gICAgICogdG8gYSB0ZW1wIGZpbGUsIHRoZW4gZGVsZXRlcyAob3IgcmVuYW1lcywgYmFzZWQgb24gc2V0dGluZywgdG8gYmUgaW1wbGVtZW50ZWQpIHRoZSBvbGQgZmlsZSwgcmVuYW1lcyB0aGUgdGVtcCBmaWxlLCBhbmQgZG9lcyBzb21lCi0gICAgICogaG91c2VrZWVwaW5nIG9uIHRoZSBzYXZlZCBhcmNoaXZlLCB3aXRoIGl0J3MgbG9hZCBzdHJhdGVneSBhbmQgY29udGFpbmVkIGZpbGVzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNhdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvL0ZpcnN0IG1ha2UgYSBjb3B5IG9mIG91ciByZWZlcmVuY2UgZmlsZQotICAgICAgICBBcmNoaXZlIGFuQXJjaGl2ZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiZXhhbXBsZTIud2FyIik7Ci0gICAgICAgIGFuQXJjaGl2ZS5zYXZlQXNOb1Jlb3BlbihBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1NhdmVUZXN0cy9jb3B5LndhciIpOwotICAgICAgICBhbkFyY2hpdmUgPSBudWxsOwotCi0gICAgICAgIFdBUkZpbGUgYVdhckZpbGUgPSAoV0FSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1NhdmVUZXN0cy9jb3B5LndhciIpOwotICAgICAgICBSZWFkT25seURpcmVjdG9yeSBzYW1wbGVEaXJlY3RvcnkgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5SZWFkT25seURpcmVjdG9yeShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJXYXJUZXN0Q2xhc3NlcyIpOwotICAgICAgICBpbnQgaW5pdGlhbFNpemUgPSBhV2FyRmlsZS5nZXRDbGFzc2VzKCkuc2l6ZSgpOwotICAgICAgICBGaWxlIGFGaWxlID0gc2FtcGxlRGlyZWN0b3J5LmdldEZpbGVJblNlbGZPclN1YmRpcmVjdG9yeSgiY29tL2libS9ldG9vbHMvYXJjaGl2ZS90ZXN0L1dBUkZpbGVUZXN0cy5jbGFzcyIpOwotICAgICAgICBhV2FyRmlsZS5hZGRDb3B5Q2xhc3MoYUZpbGUpOwotICAgICAgICBhc3NlcnRUcnVlKGFXYXJGaWxlLmdldENsYXNzZXMoKS5zaXplKCkgPT0gaW5pdGlhbFNpemUgKyAxKTsKLQotICAgICAgICBTdHJpbmcgY2xhc3NVUkkgPSBBcmNoaXZlVXRpbC5jb25jYXRVcmkoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkksIGFGaWxlLmdldFVSSSgpLCAnLycpOwotICAgICAgICBhc3NlcnRUcnVlKGFXYXJGaWxlLmNvbnRhaW5zRmlsZShjbGFzc1VSSSkpOwotICAgICAgICBhV2FyRmlsZS5zYXZlKCk7Ci0KLSAgICAgICAgRmlsZSBjbGFzc0ZpbGUgPSBhV2FyRmlsZS5nZXRGaWxlKGNsYXNzVVJJKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBzaG91bGQgbm90IGJlIG51bGwiLCBjbGFzc0ZpbGUgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoIldyb25nIGxvYWRpbmcgYXJjaGl2ZSIsIGNsYXNzRmlsZS5nZXRMb2FkaW5nQ29udGFpbmVyKCkgPT0gYVdhckZpbGUpOwotICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBvcmlnaW5hbCBVUkkiLCBjbGFzc0ZpbGUuZ2V0T3JpZ2luYWxVUkkoKS5lcXVhbHMoY2xhc3NVUkkpKTsKLQotICAgICAgICBhV2FyRmlsZS5zYXZlQXMoInRlc3RPdXRwdXQvU2F2ZVRlc3RzL2NvcHkyLndhciIpOwotICAgICAgICBhV2FyRmlsZS5zYXZlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBzY2VuYXJpbyBpcyBzaW1pbGFyIHRvIEBsaW5rICN0ZXN0U2F2ZSwgZXhjZXB0IHRoYXQgaXQgdGVzdHMgd2l0aCBhIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIGEgamFyIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZURpcmVjdG9yeSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vRmlyc3QgbWFrZSBhIGNvcHkgb2Ygb3VyIHJlZmVyZW5jZSBmaWxlCi0gICAgICAgIEFyY2hpdmUgYW5BcmNoaXZlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIik7Ci0gICAgICAgIGFuQXJjaGl2ZS5zYXZlQXNOb1Jlb3BlbihBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1NhdmVUZXN0cy9zYW1wbGUtY29waWVkLmVhciIpOwotICAgICAgICBhbkFyY2hpdmUgPSBudWxsOwotCi0gICAgICAgIEVBUkZpbGUgYW5FQVJGaWxlID0gKEVBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9TYXZlVGVzdHMvc2FtcGxlLWNvcGllZC5lYXIiKTsKLQotICAgICAgICBhbkVBUkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgICAgICAgCi0KLSAgICAgICAgYW5FQVJGaWxlLmV4dHJhY3ROb1Jlb3BlbihBcmNoaXZlLkVYUEFORF9XQVJfRklMRVMpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvU2VjdXJpdHlSb2xlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TZWN1cml0eVJvbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWMwZGM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TZWN1cml0eVJvbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0gLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICovCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldlYk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgwMi8wOS8wMSAxMjowNToxOCBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5Um9sZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RBcmNoaXZlVGVzdCB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7Ly8kTk9OLU5MUy0xJAotLyoqCi0gKiBTZWN1cml0eVJvbGVUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgU2VjdXJpdHlSb2xlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBDb21tb25GYWN0b3J5IGdldENvbW1vbkZhY3RvcnkoKSB7Ci0JcmV0dXJuIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLX0KLS8qKgotICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5TZWN1cml0eVJvbGVUZXN0cyIsICItbm9sb2FkaW5nIn07Ci0JVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgVGVzdFN1aXRlKFNlY3VyaXR5Um9sZVRlc3RzLmNsYXNzKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RQdXNoRG93bkNvcHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCUVBUkZpbGUgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciIpOwotCi0JV0FSRmlsZSB3YXJGaWxlID0gKFdBUkZpbGUpZWFyRmlsZS5nZXRXQVJGaWxlcygpLmdldCgwKTsKLQotCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBlYXJGaWxlLmdldEVKQkphckZpbGVzKCkuZ2V0KDApOwotCi0JU2VjdXJpdHlSb2xlIGFSb2xlID0gZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCWFSb2xlLnNldFJvbGVOYW1lKCJhZG1pbmlzdHJhdG9yIik7Ci0JYVJvbGUuc2V0RGVzY3JpcHRpb24oIlRoZSBhbGwgcG93ZXJmdWwiKTsKLQllYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChhUm9sZSk7Ci0JZWFyRmlsZS5wdXNoRG93blJvbGUoYVJvbGUpOwotCi0JYXNzZXJ0VHJ1ZSgiUHVzaCBkb3duIGZhaWxlZCBmb3IgZWpiIGphciIsIGVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKS5nZXRTZWN1cml0eVJvbGVOYW1lZCgiYWRtaW5pc3RyYXRvciIpICE9IG51bGwpOwotCWFzc2VydFRydWUoIlB1c2ggZG93biBmYWlsZWQgZm9yIHdhciIsIHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRTZWN1cml0eVJvbGVOYW1lZCgiYWRtaW5pc3RyYXRvciIpICE9IG51bGwpOwotCi0JZWFyRmlsZS5jbG9zZSgpOwotCi19Ci1wdWJsaWMgdm9pZCB0ZXN0Um9sbHVwQWRkQW5kUHVzaERvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCUVBUkZpbGUgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJzYW1wbGUuZWFyIik7Ci0KLQlXZWJNb2R1bGVSZWYgd2ViUmVmID0gKFdlYk1vZHVsZVJlZillYXJGaWxlLmdldFdlYk1vZHVsZVJlZnMoKS5nZXQoMCk7Ci0KLQlFSkJNb2R1bGVSZWYgZWpiTW9kUmVmID0gKEVKQk1vZHVsZVJlZikgZWFyRmlsZS5nZXRFSkJNb2R1bGVSZWZzKCkuZ2V0KDApOwotCi0JU2VjdXJpdHlSb2xlIGFSb2xlID0gZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCWFSb2xlLnNldFJvbGVOYW1lKCJKb2UiKTsKLQlhUm9sZS5zZXREZXNjcmlwdGlvbigiTmV3IGRlc2NyaXB0aW9uIik7Ci0Jd2ViUmVmLmdldFdlYkFwcCgpLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoYVJvbGUpOwotCi0JYVJvbGUgPSBnZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JYVJvbGUuc2V0Um9sZU5hbWUoImFkbWluaXN0cmF0b3IiKTsKLQlhUm9sZS5zZXREZXNjcmlwdGlvbigiVGhlIGFsbCBwb3dlcmZ1bCIpOwotCQotCXdlYlJlZi5nZXRXZWJBcHAoKS5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKGFSb2xlKTsKLQotCS8vVGVzdCB0aGUgcm9sbHVwCi0JZWFyRmlsZS5yb2xsVXBSb2xlcygpOwotCS8vV2UgY2hlYXRlZCBoZXJlIGJlY2F1c2Ugd2UgYWxyZWFkeSBrbmV3IHRoZXJlIHdlcmUgdHdvIHJvbGVzIGluIHRoZSBlamIgamFyCi0JLy9vbmUgb2Ygd2hpY2ggaXMgbmFtZWQgSm9lLCBhbmQgemVybyByb2xlcyBpbiB0aGUgd2FyIGZpbGUKLQlhc3NlcnRUcnVlKCJSb2xsIHVwIG5vdCByaWdodCIsIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRTZWN1cml0eVJvbGVzKCkuc2l6ZSgpID09IDUpOwotCi0JYVJvbGUgPSBnZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JYVJvbGUuc2V0Um9sZU5hbWUoIm1hbmFnZXIiKTsKLQlhUm9sZS5zZXREZXNjcmlwdGlvbigidGhlIG1hbmFnZXIiKTsKLQllYXJGaWxlLmFkZENvcHkoYVJvbGUsIHdlYlJlZi5nZXRNb2R1bGUoKSk7Ci0KLQkvL1Rlc3QgdGhlIGFkZCBhbmQgcm9sbHVwCi0JYXNzZXJ0VHJ1ZSgiQWRkIGNvcHkgbm90IHJpZ2h0IiwgZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFNlY3VyaXR5Um9sZXMoKS5zaXplKCkgPT0gNiAKLQkJJiYgZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmNvbnRhaW5zU2VjdXJpdHlSb2xlKGFSb2xlLmdldFJvbGVOYW1lKCkpCi0JCSYmIHdlYlJlZi5nZXRXZWJBcHAoKS5jb250YWluc1NlY3VyaXR5Um9sZShhUm9sZS5nZXRSb2xlTmFtZSgpKSk7Ci0KLQkvL1Rlc3QgdGhlIHB1c2ggZG93bgotCWVhckZpbGUucmVuYW1lU2VjdXJpdHlSb2xlKCJKb2UiLCAiZ3Vlc3QiKTsKLQotCWFzc2VydFRydWUoIlB1c2ggZG93biBub3QgcmlnaHQiLCAhZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmNvbnRhaW5zU2VjdXJpdHlSb2xlKCJKb2UiKQotCQkmJiBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuY29udGFpbnNTZWN1cml0eVJvbGUoImd1ZXN0IikKLQkJJiYgIXdlYlJlZi5nZXRXZWJBcHAoKS5jb250YWluc1NlY3VyaXR5Um9sZSgiSm9lIikKLQkJJiYgd2ViUmVmLmdldFdlYkFwcCgpLmNvbnRhaW5zU2VjdXJpdHlSb2xlKCJndWVzdCIpCi0JCSYmICFlamJNb2RSZWYuZ2V0RUpCSmFyKCkuY29udGFpbnNTZWN1cml0eVJvbGUoIkpvZSIpCi0JCSYmIGVqYk1vZFJlZi5nZXRFSkJKYXIoKS5jb250YWluc1NlY3VyaXR5Um9sZSgiZ3Vlc3QiKSk7Ci0KLQllYXJGaWxlLnNhdmVBc05vUmVvcGVuKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9TZWN1cml0eVJvbGVUZXN0cy9uZXdTYW1wbGUuZWFyIik7Ci0JCi19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvU2ltcGxlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TaW1wbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmE4NzNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TaW1wbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuVmFsaWRhdGVYbWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlhtbFZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUluaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzExLzAwIDEwOjI2OjExIEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiBTaW1wbGVUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotICAgICAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU2ltcGxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoQ29sbGVjdGlvbiBhZGFwdGVycykgewotICAgICAgICBpZiAoYWRhcHRlcnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgaWYgKGl0ZXIubmV4dCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LlNpbXBsZVRlc3RzIiwgIi1ub2xvYWRpbmciIH07Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBwcmludEFwcGxUb0NvbnNvbGUoQXBwbGljYXRpb24gYXBwbCkgewotCi0gICAgICAgIExpc3QgbW9kdWxlcyA9IGFwcGwuZ2V0TW9kdWxlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtb2R1bGVzLmdldChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcHJpbnRFSkJKYXJUb0NvbnNvbGUoRUpCSmFyIGVqYkphcikgewotCi0gICAgICAgIExpc3QgZWpicyA9IGVqYkphci5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlamJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZWpicy5nZXQoaSkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcHJpbnRXZWJBcHBUb0NvbnNvbGUoV2ViQXBwIHdlYkFwcCkgewotICAgICAgICBMaXN0IHNlcnZsZXRzID0gd2ViQXBwLmdldFNlcnZsZXRzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2bGV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZsZXRzLmdldChpKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShTaW1wbGVUZXN0cy5jbGFzcyk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uUmVhZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0gICAgICAgIEVKQkphckZpbGUgamFyRmlsZSA9IChFSkJKYXJGaWxlKSBmYWN0b3J5Lm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImNtcHNhbXBsZS5qYXIiKTsKLSAgICAgICAgRUpCSmFyIGphciA9IGphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgICAgCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RFSkIxMUphckFkZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBFQVJGaWxlIF9lYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9UZXN0RUFSRUpCQWRkLmVhciIpOwotICAgICAgICBDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0gICAgICAgIEVKQkphckZpbGUgamFyID0gKEVKQkphckZpbGUpIGZhY3Rvcnkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiZWpiX2NvbXBhdF9lbnRpdHljbXAuamFyIik7Ci0gICAgICAgIGphci5zZXRVUkkoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiZWpiX2NvbXBhdF9lbnRpdHljbXAuamFyIik7Ci0gICAgICAgIF9lYXJGaWxlLmFkZENvcHkoamFyKTsKLSAgICAgICAgX2VhckZpbGUuc2F2ZSgpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RUpCU2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXN0U20gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJUZXN0U2NoZW1hIjsKLSAgICAgICAgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeSA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotICAgICAgICBFSkJKYXJGaWxlIGphckZpbGUgPSAoRUpCSmFyRmlsZSkgZmFjdG9yeS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJjbXBzYW1wbGUuamFyIik7Ci0gICAgICAgIEVKQkphciBqYXIgPSBqYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0gICAgICAgIExpc3QgbHN0ID0gamFyLmdldENvbnRhaW5lck1hbmFnZWRCZWFucygpOwotCi0gICAgICAgIC8vSSBrbm93IHRoaXMgd2lsbCBiZSBhIENNUCwgc28sIGxldHMgdHJ5IHNldC9nZXQgb24gaXQuLgotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBsc3QuZ2V0KDApOwotCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJTZXR0aW5nIFNjaGVtYSBuYW1lIHRvOiAiICsgdGVzdFNtKTsKLSAgICAgICAgY21wLnNldEFic3RyYWN0U2NoZW1hTmFtZSh0ZXN0U20pOwotICAgICAgICAvL1JldHJpZXZlIGl0IGFuZCBzZWUgaWYgaXQgbWF0Y2hlcwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiR2V0dGluZyBzY2hlbWEgbmFtZTogIiArIGNtcC5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY21wLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpLmVxdWFscyh0ZXN0U20pKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGhpcyBleGNlcmNpc2VzIHRoZSBpbmRleCBhZGFwdGVyIG9uIENvbnRhaW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBcmNoaXZlIGFuQXJjaGl2ZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiZm9vLmphciIpOwotICAgICAgICBTdHJpbmcgdXJpID0gImNvbS9pYm0vZXRvb2xzL2FyY2hpdmUvdGVzdC9TaW1wbGVUZXN0cy5qYXZhIjsKLQotICAgICAgICBMaXN0IGZpbGVzID0gYW5BcmNoaXZlLmdldEZpbGVzKCk7Ci0KLSAgICAgICAgRmlsZSBhRmlsZSA9IGFuQXJjaGl2ZS5nZXRGaWxlKHVyaSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkFkYXB0ZXIgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIGFGaWxlIiwgIWlzRW1wdHkoYUZpbGUuZUFkYXB0ZXJzKCkpKTsKLQotICAgICAgICBmaWxlcy5yZW1vdmUoYUZpbGUpOwotCi0gICAgICAgIGFzc2VydFRydWUoIkFkYXB0ZXIgc2hvdWxkIG5vdCBiZSBhdHRhY2hlZCB0byBhRmlsZSIsIGlzRW1wdHkoYUZpbGUuZUFkYXB0ZXJzKCkpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBzaG91bGQgcmV0dXJuIGZhbHNlIiwgIWFuQXJjaGl2ZS5jb250YWluc0ZpbGUodXJpKSk7Ci0KLSAgICAgICAgRmlsZSBjb3B5ID0gYW5BcmNoaXZlLmFkZENvcHkoYUZpbGUpOwotCi0gICAgICAgIGFzc2VydFRydWUoIkNvbnRhaW5zIHNob3VsZCByZXR1cm4gdHJ1ZSIsIGFuQXJjaGl2ZS5jb250YWluc0ZpbGUodXJpKSk7Ci0KLSAgICAgICAgU3RyaW5nIHJlbmFtZWRVUkkgPSAiY29tL2libS9nb29ibGVkeWdvb2siOwotICAgICAgICBjb3B5LnNldFVSSShyZW5hbWVkVVJJKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBvbGQgdXJpIiwgIWFuQXJjaGl2ZS5jb250YWluc0ZpbGUodXJpKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29udGFpbnMgc2hvdWxkIHJldHVybiB0cnVlIGZvciBuZXcgdXJpIiwgYW5BcmNoaXZlLmNvbnRhaW5zRmlsZShyZW5hbWVkVVJJKSk7Ci0KLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGhpcyBleGNlcmNpc2VzIHRoZSBpbmRleCBhZGFwdGVyIG9uIENvbnRhaW5lcgotICAgICAqIFRlc3RzIG5vdGlmaWNhdGlvbnMgd2l0aCBhZGQvcmVtb3ZlIG9mIGxpc3RzLCBhbmQgdGhhdCBhZGFwdGVycyBhcmUgc2V0IHBvc3QgY29weQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleGluZ1dpdGhDb2xsZWN0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBcmNoaXZlIGFuQXJjaGl2ZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiYmFua2VqYnMuamFyIik7Ci0gICAgICAgIEVBUkZpbGUgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImJhci5lYXIiKTsKLSAgICAgICAgZWFyRmlsZS5hZGRDb3B5KGFuQXJjaGl2ZSk7Ci0gICAgICAgIGFuQXJjaGl2ZSA9IChBcmNoaXZlKSBlYXJGaWxlLmdldEZpbGUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiYmFua2VqYnMuamFyIik7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5kZXggb3V0IG9mIHN5bmMiLCAhYW5BcmNoaXZlLmdldEZpbGVzKCkuaXNFbXB0eSgpICYmIGFuQXJjaGl2ZS5pc0luZGV4ZWQoKSk7Ci0gICAgICAgIExpc3QgZmlsZXMgPSBhbkFyY2hpdmUuZ2V0RmlsZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlcy5nZXQoaSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmRleCBvdXQgb2Ygd2hhY2s7IGNvbnRhaW5tZW50IHNob3VsZCBiZSB0cnVlIiwgYW5BcmNoaXZlLmNvbnRhaW5zRmlsZShhRmlsZS5nZXRVUkkoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQWRhcHRlciBzaG91bGQgYmUgYXR0YWNoZWQgdG8gYUZpbGUiLCAhaXNFbXB0eShhRmlsZS5lQWRhcHRlcnMoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBmaWxlc1RvQWRkID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuUmVhZE9ubHlEaXJlY3RvcnkoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiV2FyVGVzdENsYXNzZXMiKS5nZXRGaWxlc1JlY3Vyc2l2ZSgpOwotICAgICAgICBMaXN0IGFkZGVkRmlsZXMgPSBhbkFyY2hpdmUuYWRkQ29weUZpbGVzKGZpbGVzVG9BZGQpOwotCi0gICAgICAgIGFzc2VydFRydWUoIkZpbGVzIGFkZGVkIGluY29ycmVjdGx5IiwgIWZpbGVzVG9BZGQuaXNFbXB0eSgpICYmIGZpbGVzVG9BZGQuc2l6ZSgpID09IGFkZGVkRmlsZXMuc2l6ZSgpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZGVkRmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgYUZpbGUgPSAoRmlsZSkgYWRkZWRGaWxlcy5nZXQoaSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBzaG91bGQgYmUgdHJ1ZSIsIGFuQXJjaGl2ZS5jb250YWluc0ZpbGUoYUZpbGUuZ2V0VVJJKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBiZSBzYW1lIGluc3RhbmNlIiwgYW5BcmNoaXZlLmdldEZpbGUoYUZpbGUuZ2V0VVJJKCkpID09IGFGaWxlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkFkYXB0ZXIgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIGFGaWxlIiwgIWlzRW1wdHkoYUZpbGUuZUFkYXB0ZXJzKCkpKTsKLSAgICAgICAgfQotICAgICAgICBhbkFyY2hpdmUuZ2V0RmlsZXMoKS5yZW1vdmVBbGwoYWRkZWRGaWxlcyk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRlZEZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlIGFGaWxlID0gKEZpbGUpIGFkZGVkRmlsZXMuZ2V0KGkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQWRhcHRlciBzaG91bGQgbm90IGJlIGF0dGFjaGVkIHRvIGFGaWxlIiwgaXNFbXB0eShhRmlsZS5lQWRhcHRlcnMoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29udGFpbnMgc2hvdWxkIHJldHVybiBmYWxzZSIsICFhbkFyY2hpdmUuY29udGFpbnNGaWxlKGFGaWxlLmdldFVSSSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jbG9zZU9wZW5BcmNoaXZlcygpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBWZXJ5IGJhc2ljIG1ldGhvZCB0byBvcGVuIGFuIGFyY2hpdmUgYW5kIHNhdmUgaXQgYXMgYSBkaXJlY3RvcnkgdG8gYSBuZXcgZGVzdGluYXRpb24uICBSZXF1aXJlcyB2aXN1YWwgaW5zcGVjdGlvbgotICAgICAqIGZvciB2ZXJpZmljYXRpb24uICBOZXN0ZWQgamFycyB3aWxsIG5vdCBiZSBleHBsb2RlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQW5kRXh0cmFjdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIjsKLSAgICAgICAgRUFSRmlsZSBlYXJGaWxlID0gKEVBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRUFSIHNwZWMgdmVyc2lvbiAiICsgZWFyRmlsZS5nZXRTcGVjVmVyc2lvbigpICsgIiBkZXRlY3RlZC4iKTsKLQotICAgICAgICBTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9TaW1wbGVUZXN0cy9zYW1wbGUtZXhwYW5kZWQtb3V0MS5lYXIiOwotICAgICAgICBlYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX05PTkUpOwotICAgICAgICBlYXJGaWxlLmNsb3NlKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFZlcnkgYmFzaWMgbWV0aG9kIHRvIG9wZW4gYW4gYXJjaGl2ZSBhbmQgc2F2ZSBpdCBhcyBhIGRpcmVjdG9yeSB0byBhIG5ldyBkZXN0aW5hdGlvbi4gIFJlcXVpcmVzIHZpc3VhbCBpbnNwZWN0aW9uCi0gICAgICogZm9yIHZlcmlmaWNhdGlvbi4gIE5lc3RlZCB3YXJzIHdpbGwgYmUgZXhwbG9kZWQgYnV0IG90aGVyIG5lc3RlZCBqYXJzIHdpbGwgbm90LiAgVGhpcyBtZXRob2QgZW11bGF0ZXMgdGhlIHdlYnNwaGVyZSBpbnN0YWxsLgotICAgICAqIHRoZSBhcmNoaXZlIGlzIG9wZW5lZCBhcyByZWFkIG9ubHk7IHRlc3QgdGhhdCBubyB0ZW1wIGZpbGVzIGFyZSBjcmVhdGVkIGJ5IHB1dHRpbmcgYSBicmVha3BvaW50IGluIEFyY2hpdmVVdGlsI2NyZWF0ZVRlbXBGaWxlKFN0cmluZywgRmlsZSkKLSAgICAgKiBBbHNvIHRoZSBhcmNoaXZlIGlzIG9wZW5lZCB3aXRoIGphdmEgcmVmbGVjdGlvbiBkaXNhYmxlZC4gIFZlcmlmeSBubyByZWZsZWN0aW9uIG9jY3VycyBieSBwdXR0aW5nIGEgYnJlYWtwb2ludHMgaW4gdGhlIGNvbnN0cnVjdG9ycwotICAgICAqIG9mIEphdmFKREtBZGFwdGVyRmFjdG9yeSwgYW5kIHRoZSBtZXRob2QgcmVmbGVjdFZhbHVlcygpIGluIGVhY2ggb2YgdGhlIHN1YmNsYXNzZXMgb2YgSmRrQWRhcHRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFuZEV4dHJhY3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0gICAgICAgIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRJc1JlYWRPbmx5KHRydWUpOwotICAgICAgICBvcHRpb25zLnNldFVzZUphdmFSZWZsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgRUFSRmlsZSBlYXJGaWxlID0gKEVBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUob3B0aW9ucywgaW4pOwotICAgICAgICAvL1RoZSBmb2xsb3dpbmcgY29kZSBmb3JjZXMgdGhlIGxvYWQgb2YgYWxsIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLCBqdXN0IHRvIG1ha2Ugc3VyZSBqYXZhIHJlZmxlY3Rpb24gZG9lc24ndCBoYXBwZW4KLSAgICAgICAgTGlzdCBtb2R1bGVSZWZzID0gZWFyRmlsZS5nZXRNb2R1bGVSZWZzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlUmVmcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgTW9kdWxlUmVmIG0gPSAoTW9kdWxlUmVmKSBtb2R1bGVSZWZzLmdldChpKTsKLSAgICAgICAgICAgIG0uZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG91dCA9ICJ0ZXN0T3V0cHV0L1NpbXBsZVRlc3RzL3NhbXBsZS1leHBhbmRlZC1vdXQyLmVhciI7Ci0gICAgICAgIGVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfV0FSX0ZJTEVTKTsKLSAgICAgICAgZWFyRmlsZS5jbG9zZSgpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBWZXJ5IGJhc2ljIG1ldGhvZCB0byBvcGVuIGFuIGFyY2hpdmUgYW5kIHNhdmUgaXQgYXMgYSBkaXJlY3RvcnkgdG8gYSBuZXcgZGVzdGluYXRpb24uICBSZXF1aXJlcyB2aXN1YWwgaW5zcGVjdGlvbgotICAgICAqIGZvciB2ZXJpZmljYXRpb24uICBOZXN0ZWQgd2FycyBhbmQgZWpiIGphcnMgd2lsbCBiZSBleHBsb2RlZCBidXQgb3RoZXIgbmVzdGVkIGphcnMgd2lsbCBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFuZEV4dHJhY3QzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0gICAgICAgIEVBUkZpbGUgZWFyRmlsZSA9IChFQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLSAgICAgICAgU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvU2ltcGxlVGVzdHMvc2FtcGxlLWV4cGFuZGVkLW91dDMuZWFyIjsKLSAgICAgICAgZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9XQVJfRklMRVMgfCBBcmNoaXZlLkVYUEFORF9FSkJKQVJfRklMRVMpOwotICAgICAgICBlYXJGaWxlLmNsb3NlKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIE9wZW5zIGFuIGVhciBmaWxlLCBhbmQgZm9yIGVhY2ggbW9kdWxlLCB3cml0ZXMgaXQncyBkZCBjb21wb25lbnRzIHRvIHRoZSBjb25zb2xlLiAgUmVxdWlyZXMgdmlzdWFsIGluc3BlY3Rpb24KLSAgICAgKiBmb3IgdmVyaWZpY2F0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbmRSZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0gICAgICAgIEVBUkZpbGUgZWFyRmlsZSA9IChFQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLQotICAgICAgICBBcHBsaWNhdGlvbiBhcHBsID0gZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotICAgICAgICBwcmludEFwcGxUb0NvbnNvbGUoYXBwbCk7Ci0KLSAgICAgICAgTGlzdCBtb2R1bGVSZWZzID0gZWFyRmlsZS5nZXRNb2R1bGVSZWZzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVSZWZzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBNb2R1bGVSZWYgYU1vZHVsZVJlZiA9IChNb2R1bGVSZWYpIG1vZHVsZVJlZnMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGFNb2R1bGVSZWYuaXNXZWIoKSkgewotICAgICAgICAgICAgICAgIFdlYk1vZHVsZVJlZiB3UmVmID0gKFdlYk1vZHVsZVJlZikgYU1vZHVsZVJlZjsKLSAgICAgICAgICAgICAgICBwcmludFdlYkFwcFRvQ29uc29sZSh3UmVmLmdldFdlYkFwcCgpKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGFNb2R1bGVSZWYuaXNFSkIoKSkgewotICAgICAgICAgICAgICAgIEVKQk1vZHVsZVJlZiBlUmVmID0gKEVKQk1vZHVsZVJlZikgYU1vZHVsZVJlZjsKLSAgICAgICAgICAgICAgICBwcmludEVKQkphclRvQ29uc29sZShlUmVmLmdldEVKQkphcigpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBWZXJ5IGJhc2ljIG1ldGhvZCB0byBvcGVuIGFuIGFyY2hpdmUgYW5kIHNhdmUgaXQgYXMgYSBqYXIgZmlsZSB0byBhIG5ldyBkZXN0aW5hdGlvbi4gIFJlcXVpcmVzIHZpc3VhbCBpbnNwZWN0aW9uCi0gICAgICogZm9yIHZlcmlmaWNhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQW5kU2F2ZUFzSmFyRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotICAgICAgICBFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0gICAgICAgIFN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1NpbXBsZVRlc3RzL3NhbXBsZS1jb3B5LmVhciI7Ci0gICAgICAgIGVhckZpbGUuc2F2ZUFzTm9SZW9wZW4ob3V0KTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGVzdCBjYXNlIGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgYSBkZWZlY3QgcmVwb3J0IHRoYXQgY3VycmVudGx5IGNhbm5vdCBiZSByZXByb2R1Y2VkOyBvcGVuIGFuIGV4cGFuZGVkIGVhciBmaWxlIGFuZCBzYXZlIGl0IG91dAotICAgICAqIGFzIGEgamFyIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkRpcmVjdG9yeUFuZFNhdmVBc0phckZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGVfZXhwYW5kZWQuZWFyIjsKLSAgICAgICAgaW4gPSBuZXcgamF2YS5pby5GaWxlKGluKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oaW4pOwotICAgICAgICBFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0gICAgICAgIC8vQWRkZWQgdGhpcyBsaW5lIHRvIHNlZSBpZiBsb2FkaW5nIHRoZSBkZCB3b3VsZCBtYWtlIGEgZGlmZmVyZW5jZQotICAgICAgICBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0gICAgICAgIFN0cmluZyBvdXQgPSAidGVzdE91dHB1dC9TaW1wbGVUZXN0cy9zYW1wbGUtamFycmVkLmVhciI7Ci0gICAgICAgIG91dCA9IG5ldyBqYXZhLmlvLkZpbGUob3V0KS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4ob3V0KTsKLSAgICAgICAgZWFyRmlsZS5zYXZlQXNOb1Jlb3BlbihvdXQpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAc2VlIEFyY2hpdmUjY2FuQ2xvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTYWZlQ2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIjsKLSAgICAgICAgRUFSRmlsZSBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShpbik7Ci0gICAgICAgIExpc3QgbW9kdWxlcyA9IGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCk7Ci0gICAgICAgIEVKQkphckZpbGUgZWpiSmFyRmlsZSA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBNb2R1bGUgYU1vZHVsZSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGFNb2R1bGUuaXNFamJNb2R1bGUoKSkgewotICAgICAgICAgICAgICAgIGVqYkphckZpbGUgPSAoRUpCSmFyRmlsZSkgZWFyRmlsZS5nZXRGaWxlKGFNb2R1bGUuZ2V0VXJpKCkpOwotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJFSkJKYXIgc3BlYyB2ZXJzaW9uICIgKyBlamJKYXJGaWxlLmdldFNwZWNWZXJzaW9uKCkgKyAiIGRldGVjdGVkLiIpOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCJFSkJKYXJGaWxlIHNob3VsZCBub3QgYmUgbnVsbCIsIGVqYkphckZpbGUgIT0gbnVsbCk7Ci0KLSAgICAgICAgRUFSRmlsZSBuZXdFYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoInRlc3RPdXRwdXQvU2ltcGxlVGVzdHMvc2FmZUNsb3NlMS5lYXIiKTsKLSAgICAgICAgbmV3RWFyRmlsZS5hZGRDb3B5KGVqYkphckZpbGUpOwotICAgICAgICBhc3NlcnRUcnVlKCFlYXJGaWxlLmdldERlcGVuZGVudE9wZW5BcmNoaXZlcygpLmlzRW1wdHkoKSAmJiAhZWpiSmFyRmlsZS5nZXREZXBlbmRlbnRPcGVuQXJjaGl2ZXMoKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIG5ld0VhckZpbGUuc2F2ZSgpOwotICAgICAgICBhc3NlcnRUcnVlKGVhckZpbGUuZ2V0RGVwZW5kZW50T3BlbkFyY2hpdmVzKCkuaXNFbXB0eSgpICYmIGVqYkphckZpbGUuZ2V0RGVwZW5kZW50T3BlbkFyY2hpdmVzKCkuaXNFbXB0eSgpKTsKLSAgICAgICAgZWFyRmlsZS5jbG9zZSgpOwotICAgICAgICBuZXdFYXJGaWxlLmNsb3NlKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENNVkMgZGVmZWN0IDk5NTQ0IC0gSWYgYSBzYXZlIGZhaWxzIGFuZCB0aGUgZmlsZSBkaWRuJ3QgZXhpc3QsIG9uZSBzaG91bGQgbm90Ci0gICAgICogYmUgY3JlYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlRmFpbHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotICAgICAgICBTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9TaW1wbGVUZXN0cy9zYXZlRmFpbHVyZS5lYXIiOwotICAgICAgICBFQVJGaWxlIGVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKGluKTsKLSAgICAgICAgTGlzdCBtb2R1bGVzID0gZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKTsKLSAgICAgICAgRUpCSmFyRmlsZSBlamJKYXJGaWxlID0gbnVsbDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE1vZHVsZSBhTW9kdWxlID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoYU1vZHVsZS5pc0VqYk1vZHVsZSgpKSB7Ci0gICAgICAgICAgICAgICAgZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBlYXJGaWxlLmdldEZpbGUoYU1vZHVsZS5nZXRVcmkoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCJFSkJKYXJGaWxlIHNob3VsZCBub3QgYmUgbnVsbCIsIGVqYkphckZpbGUgIT0gbnVsbCk7Ci0KLSAgICAgICAgRUFSRmlsZSBuZXdFYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQob3V0KTsKLSAgICAgICAgbmV3RWFyRmlsZS5hZGRDb3B5KGVqYkphckZpbGUpOwotICAgICAgICBlamJKYXJGaWxlLmNsb3NlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXdFYXJGaWxlLnNhdmUoKTsKLSAgICAgICAgfSBjYXRjaCAoU2F2ZUZhaWx1cmVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0ZWQgc2F2ZSBmYWlsdXJlIG9jY3VycmVkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHNob3VsZCBub3QgZXhpc3QiLCAhKG5ldyBqYXZhLmlvLkZpbGUob3V0KS5leGlzdHMoKSkpOwotICAgICAgICAgICAgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jbG9zZU9wZW5BcmNoaXZlcygpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoIlNhdmUgc2hvdWxkIGhhdmUgZmFpbGVkIiwgZmFsc2UpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhbiBlYXIgZmlsZSwgbWFrZXMgYSBmZXcgY2hhbmdlcyB0byBlbnN1cmUgdGhlIHhtbCBpcyBub3QgdmFsaWQsIGFuZCB2YWxpZGF0ZXMgdGhlIHhtbCBpbiBhbGwgdGhlIGRkczsgdmVyaWZpZXMgdGhhdAotICAgICAqIHNheCBleGNlcHRpb25zIGFyZSBjb2xsZWN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotICAgICAgICBFQVJGaWxlIGVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKGluKTsKLQotICAgICAgICBBcHBsaWNhdGlvbiBhcHBsID0gZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotICAgICAgICBhcHBsLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZVNlY3VyaXR5Um9sZSgpKTsKLQotICAgICAgICBMaXN0IG1vZHVsZUZpbGVzID0gZWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlRmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUgPSAoTW9kdWxlRmlsZSkgbW9kdWxlRmlsZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGFNb2R1bGVGaWxlLmlzV0FSRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgV0FSRmlsZSBhV2FyRmlsZSA9IChXQVJGaWxlKSBhTW9kdWxlRmlsZTsKLSAgICAgICAgICAgICAgICBhV2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFNlcnZsZXRzKCkuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCkuY3JlYXRlU2VydmxldCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYU1vZHVsZUZpbGUuaXNFSkJKYXJGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICBFSkJKYXJGaWxlIGFuRWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBhTW9kdWxlRmlsZTsKLSAgICAgICAgICAgICAgICBhbkVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVudGl0eSgpKTsKLSAgICAgICAgICAgICAgICBhbkVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKS5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVTZWN1cml0eVJvbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ29tbWFuZCBjbWQgPSBuZXcgVmFsaWRhdGVYbWxDb21tYW5kKGVhckZpbGUpOwotICAgICAgICBjbWQuZXhlY3V0ZSgpOwotICAgICAgICBMaXN0IGVycm9ycyA9IChMaXN0KSBjbWQuZ2V0UmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRvdGFsIHZhbGlkYXRpb24gZXJyb3JzIHNob3VsZCBiZSAzLCBpbnN0ZWFkIG9mICIrZXJyb3JzLnNpemUoKSwgZXJyb3JzLnNpemUoKSA9PSAzKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIFhtbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0ID0gKFhtbFZhbGlkYXRpb25SZXN1bHQpIGVycm9ycy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoaSA9PSAxKQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBlamIgbW9kdWxlIHNob3VsZCBoYXZlIDIgZXJyb3JzIGluc3RlYWQgb2YgIisgcmVzdWx0LmdldENhdWdodEV4Y2VwdGlvbnMoKS5zaXplKCksIHJlc3VsdC5nZXRDYXVnaHRFeGNlcHRpb25zKCkuc2l6ZSgpID09IDIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSB3ZWIgbW9kdWxlIHNob3VsZCBoYXZlIDEgZXJyb3IgaW5zdGVhZCBvZiAiKyByZXN1bHQuZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpLnNpemUoKSwgcmVzdWx0LmdldENhdWdodEV4Y2VwdGlvbnMoKS5zaXplKCkgPT0gMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWFyRmlsZS5jbG9zZSgpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBBcmNoaXZlSW5pdC5pbml0KCk7Ci0gICAgfQotICAgIAotICAgCXB1YmxpYyB2b2lkIHRlc3RSZWFkRW1wdHlUYWdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAJCVN0cmluZyB1cmkgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJDSEtKMjgwWC5qYXIiOwotICAgCQlFSkJKYXJGaWxlIGphcmZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FSkJKYXJGaWxlKHVyaSk7Ci0gICAJCUVKQkphciBqYXIgPSBqYXJmaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0gICAJCVNlc3Npb24gc2VzcyA9IChTZXNzaW9uKSBqYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuZ2V0KDApOwotICAgCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgamFyLmdldEVudGVycHJpc2VCZWFucygpLmdldCgxKTsKLSAgIAkJYXNzZXJ0RmFsc2UoIlZhbHVlIHNob3VsZCBiZSB1bnNldCIsIGVudGl0eS5pc1NldFJlZW50cmFudCgpKTsKLQkJYXNzZXJ0RmFsc2UoIlZhbHVlIHNob3VsZCBiZSB1bnNldCIsIHNlc3MuaXNTZXRTZXNzaW9uVHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoIlZhbHVlIHNob3VsZCBiZSB1bnNldCIsIHNlc3MuaXNTZXRUcmFuc2FjdGlvblR5cGUoKSk7IAotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1Rlc3RJbnZhbGlkWG1sTXVsdGlwbGljaXR5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvVGVzdEludmFsaWRYbWxNdWx0aXBsaWNpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4ZGNlZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvVGVzdEludmFsaWRYbWxNdWx0aXBsaWNpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAyLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5JV3JhcHBlZEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3RJbnZhbGlkWG1sTXVsdGlwbGljaXR5IGV4dGVuZHMgQWJzdHJhY3RBcmNoaXZlVGVzdCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBUZXN0SW52YWxpZFhtbE11bHRpcGxpY2l0eShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotCSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuVGVzdEludmFsaWRYbWxNdWx0aXBsaWNpdHkiLCAiLW5vbG9hZGluZyIgfTsKLQkJVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RJbnZhbGlkWG1sTXVsdGlwbGljaXR5LmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHVyaSA9ICBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJCYWRKc3BDb25maWcud2FyIjsKLQkJcnVuVGVzdCh1cmkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MigpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdXJpID0gIEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIkJhZExvZ2luQ29uZmlnLndhciI7Ci0JCXJ1blRlc3QodXJpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHVyaSA9ICBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJCYWRTZXNzaW9uQ29uZmlnLndhciI7Ci0JCXJ1blRlc3QodXJpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuVGVzdChTdHJpbmcgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVdyYXBwZWRFeGNlcHRpb24gZXggPSBudWxsOwotCQlXQVJGaWxlIHdhciA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbldBUkZpbGUodXJpKTsKLQkJdHJ5IHsKLQkJCXdhci5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQl9IGNhdGNoIChEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gZGRleCkgewotCQkJZXggPSBkZGV4OwotCQl9Ci0JCWFzc2VydE5vdE51bGwoIkV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIGNhdWdodCIsIGV4KTsKLQkJRXhjZXB0aW9uIGlubmVyID0gZXguZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCQotCQl3aGlsZSAoZXggIT0gbnVsbCkgewotCQkJaWYgKGlubmVyIGluc3RhbmNlb2YgSVdyYXBwZWRFeGNlcHRpb24pIHsKLQkJCQlleCA9IChJV3JhcHBlZEV4Y2VwdGlvbilpbm5lcjsKLQkJCQlpZiAoZXguZ2V0TmVzdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQkJaW5uZXIgPSBleC5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJCX0gZWxzZSAKLQkJCQlleCA9IG51bGw7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoIlRoZSBleGNlcHRpb24gc2hvdWxkIGJlIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsIGlubmVyIGluc3RhbmNlb2YgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKTsKLQkJd2FyLmNsb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1Rlc3RNb2R1bGVDbGFzc0xvYWRpbmcuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9UZXN0TW9kdWxlQ2xhc3NMb2FkaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNWU4NzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1Rlc3RNb2R1bGVDbGFzc0xvYWRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RNb2R1bGVDbGFzc0xvYWRpbmcgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgc3RhdGljIFN0cmluZyB0ZXN0Q2xhc3MgPSAiY2xpZW50LlN1YnRyYWN0IjsKLSAgICAKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdE1vZHVsZUNsYXNzTG9hZGluZygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdE1vZHVsZUNsYXNzTG9hZGluZyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQl9Ci0JLyoqCi0JICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nW10gY2xhc3NOYW1lID0geyJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuVGVzdE1vZHVsZUNsYXNzTG9hZGluZyIsICItbm9sb2FkaW5nIn07Ci0JCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotCX0KLQlwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0TW9kdWxlQ2xhc3NMb2FkaW5nLmNsYXNzKTsKLQl9Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RBZGRNb2R1bGVDbGFzc0xvYWRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gZmlsZXMgPSB7ICJQUk9UTy5lYXIiLCJTRUlpbkFub3RoZXJKYXIuZWFyIiwgIlNFSWluV0VCLUlORl9saWJfamFyLmVhciIgfTsKLQotICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGFyZ3Mgc3BlY2lmeSBmdWxsIHBhdGggdG8gZWFyIGZpbGVzLiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgIC8vIGNvbS5pYm0ud2Vic3BoZXJlLm1vZGVscy5jb25maWcuaW5pdC5Db25maWdJbml0LmluaXQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZmlsZXNbaV07ICAgCi0JCQlDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmdldEFjdGl2ZUZhY3RvcnkoKTsKLQotCQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyBmaWxlc1tpXTsKLSAgICAgICAgICAgIHRyeSB7Ci0JCQkJRUFSRmlsZSBlYXJGaWxlID0gZmFjdG9yeS5vcGVuRUFSRmlsZSAoaW4pOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoInVyaTogIiArIGVhckZpbGUuZ2V0VVJJKCkpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGVzdGluZyAiICsgZWFyRmlsZS5nZXRVUkkoKSk7Ci0gICAgICAgICAgICAgICAgZG9Nb2R1bGVzKGVhckZpbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZG9Nb2R1bGVzKEVBUkZpbGUgZWFyRmlsZSkgewotCQlMaXN0IG1vZHVsZXMgPSBlYXJGaWxlLmdldE1vZHVsZUZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJQXJjaGl2ZSBtb2R1bGUgPSAoQXJjaGl2ZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCJcdExvb2tpbmcgZm9yIGNsYXNzICIgKyB0ZXN0Q2xhc3MgKyAiIGluIG1vZHVsZSAiICsgbW9kdWxlLmdldFVSSSgpKTsKLQkJCWRvTG9hZChtb2R1bGUsIHRlc3RDbGFzcyk7Ci0JCX0KLQl9IC8vIHZhbGlkYXRlTW9kdWxlcwotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb0xvYWQoQXJjaGl2ZSBtb2R1bGUsIFN0cmluZyB0ZXN0Q2xhc3MpIHsKLQkJdHJ5IHsKLQkJCUphdmFDbGFzcyBqYXZhQ2xhc3MgPQotCQkJCShKYXZhQ2xhc3MpIEphdmFDbGFzc0ltcGwucmVmbGVjdCh0ZXN0Q2xhc3MsIG1vZHVsZS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCWlmICghKGphdmFDbGFzcykuaXNFeGlzdGluZ1R5cGUoKSkgewotCQkJCS8vIFRoaXMgaXMgd2hhdCBoYXBwZW5zIGlmIHRoZSBjbGFzcyBjYW4ndCBiZSBsb2FkZWQuCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItIE5PVCBGT1VORCAtIGlzRXhpc3RpbmdUeXBlIHJldHVybnMgZmFsc2UuIik7Ci0JCQl9IGVsc2UgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIC0gZm91bmQ6IGlzRXhpc3RpbmdUeXBlIHJldHVybnMgdHJ1ZS4iKTsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1dBUkZpbGVUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1dBUkZpbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2MxMjZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9XQVJGaWxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotIC8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUmVhZE9ubHlEaXJlY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8xNS8wMCAyOjI2OjA0IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgV0FSRmlsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMS4iOy8vJE5PTi1OTFMtMSQKLS8qKgotICogV0FSRmlsZVRlc3RzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBXQVJGaWxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci19Ci0vKioKLSAqIFN0YXJ0cyB0aGUgYXBwbGljYXRpb24uCi0gKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JU3RyaW5nW10gY2xhc3NOYW1lID0geyJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuV0FSRmlsZVRlc3RzIiwgIi1ub2xvYWRpbmcifTsKLQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIG5ldyBUZXN0U3VpdGUoV0FSRmlsZVRlc3RzLmNsYXNzKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RBZGRDb3B5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCVdBUkZpbGUgYVdhckZpbGUgPSAoV0FSRmlsZSlnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsiZXhhbXBsZTIud2FyIik7Ci0KLQlSZWFkT25seURpcmVjdG9yeSBzYW1wbGVEaXJlY3RvcnkgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5SZWFkT25seURpcmVjdG9yeShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArIldhclRlc3RDbGFzc2VzIik7Ci0KLQlpbnQgaW5pdGlhbFNpemUgPSBhV2FyRmlsZS5nZXRDbGFzc2VzKCkuc2l6ZSgpOwotCi0JRmlsZSBhRmlsZSA9IHNhbXBsZURpcmVjdG9yeS5nZXRGaWxlSW5TZWxmT3JTdWJkaXJlY3RvcnkoImNvbS9pYm0vZXRvb2xzL2FyY2hpdmUvdGVzdC9XQVJGaWxlVGVzdHMuY2xhc3MiKTsKLQotCWFXYXJGaWxlLmFkZENvcHlDbGFzcyhhRmlsZSk7Ci0JYXNzZXJ0VHJ1ZShhV2FyRmlsZS5nZXRDbGFzc2VzKCkuc2l6ZSgpID09IGluaXRpYWxTaXplKzEpOwotCi0JU3RyaW5nIGNsYXNzVVJJID0gQXJjaGl2ZVV0aWwuY29uY2F0VXJpKEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJLCBhRmlsZS5nZXRVUkkoKSwgJy8nKTsKLQlhc3NlcnRUcnVlKGFXYXJGaWxlLmNvbnRhaW5zRmlsZShjbGFzc1VSSSkpOwotCS8vU3lzdGVtLm91dC5wcmludGxuKGFXYXJGaWxlLmdldFVSSSgpKyIgY29udGFpbnMgY2xhc3MgIitjbGFzc1VSSSk7Ci0KLQlhV2FyRmlsZS5zYXZlQXNOb1Jlb3BlbihBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvV2FyVGVzdHMvYWRkQ29weUNsYXNzLndhciIpOwotCi19Ci0JCi1wdWJsaWMgdm9pZCB0ZXN0QWRkQ29weUxpYigpIHRocm93cyBFeGNlcHRpb24gewotCi0JV0FSRmlsZSBhV2FyRmlsZSA9IChXQVJGaWxlKWdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiZXhhbXBsZTIud2FyIik7Ci0KLQlBcmNoaXZlIGxpYiA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiZm9vLmphciIpOwotCi0JaW50IGluaXRpYWxTaXplID0gYVdhckZpbGUuZ2V0TGlicygpLnNpemUoKTsKLQotCWFXYXJGaWxlLmFkZENvcHlMaWIobGliKTsKLQlhc3NlcnRUcnVlKGFXYXJGaWxlLmdldExpYnMoKS5zaXplKCkgPT0gaW5pdGlhbFNpemUrMSk7Ci0KLQlTdHJpbmcgbGliVVJJID0gQXJjaGl2ZVV0aWwuY29uY2F0VXJpKEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0xJQl9VUkksIGxpYi5nZXRVUkkoKSwgJy8nKTsKLQlhc3NlcnRUcnVlKGFXYXJGaWxlLmNvbnRhaW5zRmlsZShsaWJVUkkpKTsKLQkvL1N5c3RlbS5vdXQucHJpbnRsbihhV2FyRmlsZS5nZXRVUkkoKSsiIGNvbnRhaW5zIGxpYiAiK2xpYlVSSSk7Ci0KLQlhV2FyRmlsZS5zYXZlQXNOb1Jlb3BlbigidGVzdE91dHB1dC9XYXJUZXN0cy9hZGRDb3B5TGliLndhciIpOwotCi19Ci0JCi1wdWJsaWMgdm9pZCB0ZXN0TGlzdENsYXNzZXNBbmRMaWJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQlXQVJGaWxlIGFXYXJGaWxlID0gKFdBUkZpbGUpZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJleGFtcGxlMi53YXIiKTsKLQotCUxpc3QgbGlicyA9IGFXYXJGaWxlLmdldExpYnMoKTsKLQlMaXN0IGNsYXNzZXMgPSBhV2FyRmlsZS5nZXRDbGFzc2VzKCk7Ci0JTGlzdCByZXNvdXJjZXMgPSBhV2FyRmlsZS5nZXRSZXNvdXJjZXMoKTsKLS8vCVN5c3RlbS5vdXQucHJpbnRsbigiV0FSIHNwZWMgdmVyc2lvbiAiK2FXYXJGaWxlLmdldFNwZWNWZXJzaW9uKCkrIiBkZXRlY3RlZC4iKTsKLS8vCVN5c3RlbS5vdXQucHJpbnRsbigiZXhhbXBsZTIud2FyIGNvbnRhaW5zICIrY2xhc3Nlcy5zaXplKCkrICIgZmlsZXMgaW4gY2xhc3NlcyIpOwotLy8JU3lzdGVtLm91dC5wcmludGxuKCJleGFtcGxlMi53YXIgY29udGFpbnMgIitsaWJzLnNpemUoKSsgIiBsaWJzIik7Ci0vLwlTeXN0ZW0ub3V0LnByaW50bG4oImV4YW1wbGUyLndhciBjb250YWlucyAiK3Jlc291cmNlcy5zaXplKCkrICIgcmVzb3VyY2VzIik7Ci0KLX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9FQXR0cmlidXRlRGVzY3JpcHRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL0VBdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NTAwNzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL0VBdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIGFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRUF0dHJpYnV0ZURlc2NyaXB0b3IgewotCQotCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCUVDbGFzcyBtZXRhQ2xhc3M7Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGVEZXNjcmlwdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFQ2xhc3MgbWV0YUNsYXNzKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMubWV0YUNsYXNzID0gbWV0YUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGFDbGFzcygpIHsKLQkJcmV0dXJuIG1ldGFDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2xhc3MxCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0YUNsYXNzKEVDbGFzcyBjbGFzczEpIHsKLQkJbWV0YUNsYXNzID0gY2xhc3MxOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlFQXR0cmlidXRlRGVzY3JpcHRvciBvID0gKEVBdHRyaWJ1dGVEZXNjcmlwdG9yKW9iamVjdDsKLQkJcmV0dXJuIG8uZ2V0RmVhdHVyZSgpID09IGdldEZlYXR1cmUoKSAmJiBvLmdldE1ldGFDbGFzcygpID09IGdldE1ldGFDbGFzcygpOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmZWF0dXJlLmhhc2hDb2RlKCkgXiBtZXRhQ2xhc3MuaGFzaENvZGUoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKEVBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGF0dHJpYnV0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3R1dGlsaXRpZXMvRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGFkNWZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotcHVibGljIGNsYXNzIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGF2Q2xhc3NbXTsKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBjb3VudCA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBSYW5kb20gcmFuZG9tR2VuZXJhdG9yID0gbmV3IFJhbmRvbSgpOwotCXByb3RlY3RlZCBzdGF0aWMgaW50IG1heE51bWJlck9mUHJvamVjdHNDcmVhdGVkID0gMTAwMDsKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBlbnVtTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBwYXJhbUNvdW50OwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nW10gbGFuZ0FycmF5ID0gbmV3IFN0cmluZ1tdIHsgIkVOIiwiRlIiLCJERSIsIkpQIiwiQ04iLCJCUiIsIlNQIn07Ci0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgbGFuZ0NvdW50ID0gMDsgIAotCXByb3RlY3RlZCBzdGF0aWMgTWFwIGJvb2xlYW5NYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByb3RlY3RlZCBzdGF0aWMgTWFwIGF0dEluZGV4ID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gc3BlY2lhbE51bWJlckdlbiA9IGZhbHNlOwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGh0dHBBcnJheVtdID0gbnVsbDsKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBodHRwQXJyYXlJbmRleCA9IDA7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgdmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIGludCBtb2R1bGVUeXBlOwotCS8vc3RhdGljIHZlcnNpb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzIgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8zID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfNCA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBJQ0FUSU9OID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBfQ0xJRU5UID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUT1IgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVKQiA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCID0gNDsKLQkKLSAgICBwdWJsaWMgRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcigpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0Q291bnQoKSB7Ci0gICAgCWNvdW50ID0gMDsKLSAgICAJcmV0dXJuOwotICAgIH0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBhdHQsIEVPYmplY3Qgb2JqKXsKLQkJcmV0dXJuIGNyZWF0ZUF0dHJpYnV0ZShuZXcgRUF0dHJpYnV0ZURlc2NyaXB0b3IoYXR0LG9iai5lQ2xhc3MoKSkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBhdHQsIEVDbGFzcyBlQ2xhc3MpewotCQlyZXR1cm4gY3JlYXRlQXR0cmlidXRlKG5ldyBFQXR0cmlidXRlRGVzY3JpcHRvcihhdHQsZUNsYXNzKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUF0dHJpYnV0ZShFQXR0cmlidXRlIGF0dCwgRU9iamVjdCBvYmosIGJvb2xlYW4gc3BlY2lhbCl7Ci0JCXNwZWNpYWxOdW1iZXJHZW4gPSBzcGVjaWFsOwotCQlyZXR1cm4gY3JlYXRlQXR0cmlidXRlKG5ldyBFQXR0cmlidXRlRGVzY3JpcHRvcihhdHQsb2JqLmVDbGFzcygpKSk7Ci0JfQotCQkJCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlQXR0cmlidXRlKEVBdHRyaWJ1dGUgYXR0LCBFT2JqZWN0IG9iaiwgIGJvb2xlYW4gc3BlY2lhbCwgaW50IHZlciwgaW50IG1vZFR5cGUpIHsKLQkgICBzcGVjaWFsTnVtYmVyR2VuID0gc3BlY2lhbDsKLQkgICB2ZXJzaW9uID0gdmVyOwotCSAgIG1vZHVsZVR5cGUgPSBtb2RUeXBlOwotCSAgIHJldHVybiBjcmVhdGVBdHRyaWJ1dGUobmV3IEVBdHRyaWJ1dGVEZXNjcmlwdG9yKGF0dCxvYmouZUNsYXNzKCkpKTsKLSAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGNyZWF0ZUF0dHJpYnV0ZShFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkJRUNsYXNzaWZpZXIgbWV0YSA9IGF0dC5nZXRGZWF0dXJlKCkuZ2V0RVR5cGUoKTsKLQkJaWYgKG1ldGEgaW5zdGFuY2VvZiBFRW51bSAmJiBhdHQuZ2V0RmVhdHVyZSgpLmlzTWFueSgpKXsKLQkJCUxpc3QgY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWNvbGxlY3Rpb24uYWRkKGNyZWF0ZUVudW0oYXR0KSk7Ci0JCQlyZXR1cm4gY29sbGVjdGlvbjsKLQkJfQotCQllbHNlIGlmIChtZXRhIGluc3RhbmNlb2YgRUVudW0pCi0JCQlyZXR1cm4gY3JlYXRlRW51bShhdHQpOwotCQllbHNlIGlmICgodmVyc2lvbiA9PSBWRVJTSU9OXzFfMyB8fCB2ZXJzaW9uID09IFZFUlNJT05fMV8yKSAmJiBhdHQuZ2V0RmVhdHVyZSgpLmVxdWFscyhXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEhUVFBNZXRob2RUeXBlX0h0dHBNZXRob2QoKSkpCi0JCQlyZXR1cm4gY3JlYXRlU3BlY2lhbEh0dHBNZXRob2RzRm9yMTMoKTsKLQkJZWxzZSBpZiAodmVyc2lvbiA9PSBWRVJTSU9OXzFfMyAmJiBhdHQuZ2V0RmVhdHVyZSgpLmVxdWFscyhDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJMb2NhbFJlZl9Mb2NhbCgpKSkKLQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhuZXcgRUF0dHJpYnV0ZURlc2NyaXB0b3IoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiUmVmX1JlbW90ZSgpLCBhdHQuZ2V0TWV0YUNsYXNzKCkpKTsKLQkJZWxzZSBpZiAodmVyc2lvbiA9PSBWRVJTSU9OXzFfMyAmJiBhdHQuZ2V0RmVhdHVyZSgpLmVxdWFscyhDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFSkJMb2NhbFJlZl9Mb2NhbEhvbWUoKSkpCi0JCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21BdHRyaWJ1dGVTdHJpbmcobmV3IEVBdHRyaWJ1dGVEZXNjcmlwdG9yKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYlJlZl9Ib21lKCksYXR0LmdldE1ldGFDbGFzcygpKSk7Ci0JCWVsc2UgaWYgKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygicGFybXMiKSkKLQkJCXJldHVybiBjcmVhdGVQYXJhbXMoYXR0KTsKLQkJZWxzZSBpZiAoYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkuc3RhcnRzV2l0aCgibG9jYXRpb24iKSAmJiB2ZXJzaW9uID09IFZFUlNJT05fMV80KQotCQkJcmV0dXJuIGNyZWF0ZUxvY2F0aW9uKGF0dCk7Ci0JCWVsc2UgaWYgKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImxvY2FsZSIpICYmIHZlcnNpb24gPT0gVkVSU0lPTl8xXzQpCi0JCQlyZXR1cm4gY3JlYXRlTG9jYWxlKCk7Ci0JCWVsc2UgaWYgKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygibGFuZyIpKQotCQkJcmV0dXJuIGNyZWF0ZUxhbmcoYXR0KTsKLQkJZWxzZSBpZiAoYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKCJ2ZXJzaW9uIikpCi0JCQlpZiAoYXR0LmdldEZlYXR1cmUoKSA9PSBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb250YWluZXJNYW5hZ2VkRW50aXR5X1ZlcnNpb24oKSkgCi0JCQkJcmV0dXJuICIyLngiOwotCQkJZWxzZQotCQkJCXJldHVybiBjcmVhdGVWZXJzaW9uKGF0dCk7Ci0JCWVsc2UgaWYgKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygibWltZVR5cGUiKSAmJiB2ZXJzaW9uID09IFZFUlNJT05fMV80KQotCQkJcmV0dXJuICJ0ZXh0L3BsYWluIjsKLQkJZWxzZSBpZiAoYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKCJlcnJvckNvZGUiKSAmJiB2ZXJzaW9uID09IFZFUlNJT05fMV80KQotCQkJcmV0dXJuICI0MDQiOwotCQllbHNlIGlmIChhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoImZvcm1Mb2dpblBhZ2UiKSAmJiB2ZXJzaW9uID09IFZFUlNJT05fMV80KQotCQkJcmV0dXJuICIvdGVzdEZvcm1Mb2dpblBhZ2UiOwotCQllbHNlIGlmIChhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoImZvcm1FcnJvclBhZ2UiKSAmJiB2ZXJzaW9uID09IFZFUlNJT05fMV80KQotCQkJcmV0dXJuICIvdGVzdEZvcm1FcnJvcnBhZ2UiOwotCQllbHNlIGlmKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygibGluayIpICYmIHZlcnNpb24gPT0gVkVSU0lPTl8xXzQpCi0JCQlyZXR1cm4gInJvbGVOYW1lXzAiOwotCQllbHNlIGlmKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygic3BlY1ZlcnNpb24iKSAmJiB2ZXJzaW9uID09IFZFUlNJT05fMV80KQotCQkJcmV0dXJuICIxLjUiOwotCQllbHNlIGlmIChhdHQuZ2V0RmVhdHVyZSgpLmlzTWFueSgpKQotCQkJcmV0dXJuIGNyZWF0ZUNvbGxlY3Rpb24oYXR0KTsKLQkJZWxzZSBpZiAobWV0YS5nZXRJbnN0YW5jZUNsYXNzTmFtZSgpLmVxdWFscygiamF2YS5sYW5nLlN0cmluZyIpKQotCQkJcmV0dXJuICBnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhhdHQpOwotCQllbHNlIGlmIChtZXRhLmdldEluc3RhbmNlQ2xhc3NOYW1lKCkuZXF1YWxzKCJib29sZWFuIikpCi0JCQlyZXR1cm4gIGdlbmVyYXRlUmFuZG9tQm9vbGVhbihhdHQpOwotCQllbHNlIGlmIChtZXRhLmdldEluc3RhbmNlQ2xhc3NOYW1lKCkuZXF1YWxzKCJqYXZhLnV0aWwuTGlzdCIpKQotCQkJcmV0dXJuICBjcmVhdGVDb2xsZWN0aW9uKGF0dCk7Ci0JCWVsc2UgaWYobWV0YS5nZXROYW1lKCkuZXF1YWxzKCJRTmFtZSIpKXsKLQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbVFOYW1lKGF0dCk7Ci0JCX0KLQkJc3dpdGNoIChtZXRhLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FU1RSSU5HOgotCQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhhdHQpOwotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJPT0xFQU5fT0JKRUNUOgotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUJPT0xFQU46Ci0JCQkJcmV0dXJuIGdlbmVyYXRlUmFuZG9tQm9vbGVhbihhdHQpOwotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUlOVEVHRVJfT0JKRUNUOgotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUlOVDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21JbnRlZ2VyKGF0dCk7Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FRkxPQVRfT0JKRUNUOgotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUZMT0FUOgotCQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbUZsb2F0KGF0dCk7Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FQ0hBUkFDVEVSX09CSkVDVDoKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVDSEFSOgotCQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbUNoYXIoYXR0KTsKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVMT05HX09CSkVDVDoKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVMT05HOgotCQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbUxvbmcoKTsKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVCWVRFX09CSkVDVDoKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVCWVRFOgotCQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbUJ5dGUoKTsKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVET1VCTEVfT0JKRUNUOgotCQkJY2FzZSBFY29yZVBhY2thZ2UuRURPVUJMRToKLQkJCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21Eb3VibGUoKTsKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVTSE9SVF9PQkpFQ1Q6Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FU0hPUlQ6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlUmFuZG9tU2hvcnQoYXR0KTsKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVKQVZBX09CSkVDVDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21PYmplY3QoYXR0KTsKLQkJCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotCi0JLyoqCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBjcmVhdGVMb2NhbGUoKSB7Ci0gICAgICAgIHJldHVybiAiZW5fVVMiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBhdHQKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGNyZWF0ZUxvY2F0aW9uKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotICAgICAgICBTdHJpbmcgdGVtcCA9IGdlbmVyYXRlUmFuZG9tQXR0cmlidXRlU3RyaW5nKGF0dCk7Ci0gICAgICAgIHJldHVybiAiLy4iICsgdGVtcDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVPYmplY3QgY3JlYXRlSmF2YUNsYXNzUHJveHkoRVN0cnVjdHVyYWxGZWF0dXJlIHJlZiwgRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChhdkNsYXNzID09IG51bGwpIHsKLQkJCWF2Q2xhc3MgPSBuZXcgU3RyaW5nW10geyAiamF2YS51dGlsLkhhc2hUYWJsZSIsICJqYXZhLnV0aWwuTGlzdCIsICJqYXZhLnNxbC5EYXRhIiwgImphdmEubGFuZy5JbnRlZ2VyIiwgImphdmEubGFuZy5TdHJpbmciIH07Ci0JCX0KLQkJRUF0dHJpYnV0ZURlc2NyaXB0b3IgZmVhdHVyZSA9IG5ldyBFQXR0cmlidXRlRGVzY3JpcHRvcihyZWYsZU9iamVjdC5lQ2xhc3MoKSk7Ci0JCWlmICghYXR0SW5kZXguY29udGFpbnNLZXkoZmVhdHVyZSkpCi0JCQlhdHRJbmRleC5wdXQoZmVhdHVyZSwgbmV3IEludGVnZXIoMCkpOwotCQlpbnQgY2xhc3NJbmRleCA9ICgoSW50ZWdlcilhdHRJbmRleC5nZXQoZmVhdHVyZSkpLmludFZhbHVlKCk7Ci0JCVN0cmluZyBuYW1lID0gYXZDbGFzc1tjbGFzc0luZGV4XTsKLQkJY2xhc3NJbmRleCsrOwotCQlpZiAoY2xhc3NJbmRleCA9PSA1KQotCQkJY2xhc3NJbmRleCA9IDA7Ci0JCWF0dEluZGV4LnB1dChmZWF0dXJlLG5ldyBJbnRlZ2VyKGNsYXNzSW5kZXgpKTsKLQkJcmV0dXJuIEphdmFDbGFzc0ltcGwuY3JlYXRlQ2xhc3NSZWYobmFtZSk7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBjcmVhdGVTcGVjaWFsSHR0cE1ldGhvZHNGb3IxMygpIHsKLQkJaWYgKGh0dHBBcnJheSA9PSBudWxsKQotCQkJaHR0cEFycmF5ID0gbmV3IFN0cmluZ1tdIHsKLQkJCQkiR0VUIiwKLQkJCQkiUE9TVCIsCi0JCQkJIlBVVCIsCi0JCQkJIkRFTEVURSIsCi0JCQkJIkhFQUQiLAotCQkJCSJPUFRJT05TIiwKLQkJCQkiVFJBQ0UiCi0JCQl9OwotCQlpZiAoaHR0cEFycmF5SW5kZXggPj0gaHR0cEFycmF5Lmxlbmd0aCkKLQkJCWh0dHBBcnJheUluZGV4ID0gMDsKLQkJT2JqZWN0IGhvbGRlciA9IGh0dHBBcnJheVtodHRwQXJyYXlJbmRleF07IAkKLQkJaHR0cEFycmF5SW5kZXgrKzsKLQkJcmV0dXJuIGhvbGRlcjsKLQl9Ci0KLQkvKioKLSAgICAgKiBAcGFyYW0gYXR0Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNyZWF0ZVZlcnNpb24oRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0JCVN0cmluZyB2ZXJzaW9uSG9sZGVyID0gIiI7Ci0JCXN3aXRjaCAobW9kdWxlVHlwZSkgewotCQljYXNlIEFQUElDQVRJT04gOgotCQkJaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMikgewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMS4yIjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMyl7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIxLjMiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZih2ZXJzaW9uID09IFZFUlNJT05fMV80KXsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuNCI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjUuMCI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgQVBQX0NMSUVOVCA6Ci0JCQlpZih2ZXJzaW9uID09IFZFUlNJT05fMV8yKSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIxLjIiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZih2ZXJzaW9uID09IFZFUlNJT05fMV8zKSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIxLjMiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZih2ZXJzaW9uID09IFZFUlNJT05fMV80KSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIxLjQiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICI1LjAiOwotCQkJCWJyZWFrOwotCQkJfQotCQljYXNlIEVKQiA6Ci0JCQlpZih2ZXJzaW9uID09IFZFUlNJT05fMV8yKSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIxLjEiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZih2ZXJzaW9uID09IFZFUlNJT05fMV8zKSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIyLjAiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZih2ZXJzaW9uID09IFZFUlNJT05fMV80KSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIyLjEiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIzLjAiOwotCQkJCWJyZWFrOwotCQkJfQotCQljYXNlIENPTk5FQ1RPUiA6Ci0JCQlpZih2ZXJzaW9uID09IFZFUlNJT05fMV8yKSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIxLjAiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZih2ZXJzaW9uID09IFZFUlNJT05fMV8zKSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIxLjAiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7IAotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMS41IjsKLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSBXRUIgOgotCQkJaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMikgewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMi4yIjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMykgewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMi4zIjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfNCkgewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMi40IjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgeyAKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjIuNSI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB2ZXJzaW9uSG9sZGVyOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGNyZWF0ZVBhcmFtcyhFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkJaWYgKHBhcmFtQ291bnQgPT0gMCl7Ci0JCQlwYXJhbUNvdW50Kys7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQllbHNlIGlmIChwYXJhbUNvdW50ID09IDEpewotCQkJcGFyYW1Db3VudCsrOwotCQkJcmV0dXJuICIiOwotCQl9Ci0JCVN0cmluZyByID0gIiI7Ci0JCWZvciAoaW50IGkgPSAxIDsgaSA8IHBhcmFtQ291bnQgO2krKyl7Ci0JCQlyICs9IGdlbmVyYXRlUmFuZG9tQXR0cmlidXRlU3RyaW5nKGF0dCkgKyAiICI7Ci0JCX0KLQkJcGFyYW1Db3VudCsrOwotCQlpZiAocGFyYW1Db3VudCA9PSA1KQotCQkJcGFyYW1Db3VudCA9IDA7Ci0JCXJldHVybiByOwotCQkKLQl9Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGNyZWF0ZUxhbmcoRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0JCVN0cmluZyBuYW1lID0gbGFuZ0FycmF5W2xhbmdDb3VudF07Ci0JCWxhbmdDb3VudCsrOwotCQlpZiAobGFuZ0NvdW50ID09IDcpCi0JCQlsYW5nQ291bnQgPSAwOwotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBjcmVhdGVDb2xsZWN0aW9uKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJbGlzdC5hZGQoZ2VuZXJhdGVSYW5kb21BdHRyaWJ1dGVTdHJpbmcoYXR0KSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZ2VuZXJhdGVSYW5kb21PYmplY3QoRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0JICAgIHJldHVybiBnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhhdHQpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGNyZWF0ZUVudW0oRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0JCUVFbnVtIGFuRW51bSA9IChFRW51bSkgYXR0LmdldEZlYXR1cmUoKS5nZXRFVHlwZSgpOwotCQlpZiAoIWVudW1NYXAuY29udGFpbnNLZXkoYXR0KSl7Ci0JCQlpZiAoYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKCJhdXRoTWV0aG9kIikpCi0JCQkJZW51bU1hcC5wdXQoYXR0LG5ldyBJbnRlZ2VyKDEpKTsKLQkJCWVsc2UgCi0JCQkJZW51bU1hcC5wdXQoYXR0LG5ldyBJbnRlZ2VyKDApKTsKLQkJfQotCQlpbnQgcG9zID0gKChJbnRlZ2VyKWVudW1NYXAuZ2V0KGF0dCkpLmludFZhbHVlKCk7Ci0JCUVMaXN0IGxpdGVyYWxzID0gYW5FbnVtLmdldEVMaXRlcmFscygpOwotCQlpbnQgc2l6ZSA9IGxpdGVyYWxzLnNpemUoKTsKLQkJaWYgKHBvcyA9PSBzaXplKQotCQkJcG9zID0gMDsKLQkJT2JqZWN0IGhvbGRlciA9IGFuRW51bS5nZXRFRW51bUxpdGVyYWwocG9zKS5nZXRJbnN0YW5jZSgpOwotCQlwb3MrKzsKLQkJZW51bU1hcC5wdXQoYXR0LG5ldyBJbnRlZ2VyKHBvcykpOwotCQlyZXR1cm4gaG9sZGVyOwotCSAgICAKLQl9Ci0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2VuZXJhdGVSYW5kb21DbGFzc25hbWUoRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0JCXJldHVybiAiY29tLmZvby4iICsgZ2VuZXJhdGVSYW5kb21BdHRyaWJ1dGVTdHJpbmcoYXR0KTsKLQl9Ci0KLQkvL1JFVklTSVQKLSAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBnZW5lcmF0ZVJhbmRvbVNob3J0KEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotICAgICAgICByZXR1cm4gbmV3IFNob3J0KFNob3J0LnBhcnNlU2hvcnQoU3RyaW5nLnZhbHVlT2YoZ2VuZXJhdGVOdW1iZXIoYXR0KSkpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBnZW5lcmF0ZVJhbmRvbURvdWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUocmFuZG9tR2VuZXJhdG9yLm5leHREb3VibGUoKSk7Ci0gICAgfQotCS8vUkVWSVNJVAotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlUmFuZG9tQnl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCeXRlKCJieXRlIik7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZ2VuZXJhdGVSYW5kb21Mb25nKCkgewotICAgICAgICByZXR1cm4gbmV3IExvbmcocmFuZG9tR2VuZXJhdG9yLm5leHRMb25nKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlUmFuZG9tQ2hhcihFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDaGFyYWN0ZXIoZ2VuZXJhdGVSYW5kb21BdHRyaWJ1dGVTdHJpbmcoYXR0KS5jaGFyQXQoMCkpOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZ2VuZXJhdGVSYW5kb21GbG9hdChFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChyYW5kb21HZW5lcmF0b3IubmV4dEZsb2F0KCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlUmFuZG9tSW50ZWdlcihFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLSAgICAJcmV0dXJuIG5ldyBJbnRlZ2VyKGdlbmVyYXRlTnVtYmVyKGF0dCkpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgc3RhdGljIGNoYXIgW10gaW50VG9DaGFyTWFwcGluZyA9IG5ldyBjaGFyIFtdIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onIH07Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBjaGFyIFtdIGNoYXJUb0ludE1hcHBpbmcgPSBuZXcgY2hhciBbXSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JyB9OwotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlUmFuZG9tUU5hbWUoRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0gICAgCWNoYXIgW10gY2hhckFycmF5ID0gSW50ZWdlci50b1N0cmluZyhnZW5lcmF0ZU51bWJlcihhdHQpKS50b0NoYXJBcnJheSgpOwotICAgIAlmb3IoaW50IGk9MDtpPGNoYXJBcnJheS5sZW5ndGg7aSsrKXsKLSAgICAJCWZvcihpbnQgaj0wO2o8Y2hhclRvSW50TWFwcGluZy5sZW5ndGg7IGorKyl7Ci0gICAgCQkJaWYgKGNoYXJBcnJheVtpXSA9PSBjaGFyVG9JbnRNYXBwaW5nW2pdKXsKLSAgICAJCQkJY2hhckFycmF5W2ldID0gaW50VG9DaGFyTWFwcGluZ1tqXTsKLSAgICAJCQkJYnJlYWs7Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9Ci0gICAgCXJldHVybiBuZXcgU3RyaW5nKGNoYXJBcnJheSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlUmFuZG9tQm9vbGVhbihFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkJaWYgKCFib29sZWFuTWFwLmNvbnRhaW5zS2V5KGF0dCkpewotCQkJYm9vbGVhbk1hcC5wdXQoYXR0LG5ldyBCb29sZWFuKHRydWUpKTsKLQkJfQotCQlCb29sZWFuIGhvbGRlciA9IChCb29sZWFuKWJvb2xlYW5NYXAuZ2V0KGF0dCk7Ci0JCWJvb2xlYW5NYXAucHV0KGF0dCwgbmV3IEJvb2xlYW4oIWhvbGRlci5ib29sZWFuVmFsdWUoKSkpOwotCQlyZXR1cm4gaG9sZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRlUmFuZG9tQXR0cmlidXRlU3RyaW5nKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotCQlyZXR1cm4gYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkgKyAiXyIgKyBnZW5lcmF0ZU51bWJlcihhdHQpOwotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIGludCBnZW5lcmF0ZU51bWJlcihFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkJaWYoIXNwZWNpYWxOdW1iZXJHZW4pCi0JCQlyZXR1cm4gY291bnQgKys7Ci0JCWVsc2V7Ci0JCQlpZighYXR0SW5kZXguY29udGFpbnNLZXkoYXR0KSkKLQkJCQlhdHRJbmRleC5wdXQoYXR0LCBuZXcgSW50ZWdlcigwKSk7Ci0JCQlpbnQgaG9sZGVyID0gKChJbnRlZ2VyKSBhdHRJbmRleC5nZXQoYXR0KSkuaW50VmFsdWUoKTsKLQkJCWF0dEluZGV4LnB1dChhdHQsIG5ldyBJbnRlZ2VyKGhvbGRlcisxKSk7Ci0JCQlyZXR1cm4gaG9sZGVyOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCl7Ci0JCWNvdW50ID0gMDsKLQkJZW51bU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWh0dHBBcnJheUluZGV4ID0gMDsKLQkJcGFyYW1Db3VudCA9IDA7Ci0JCWxhbmdDb3VudCA9IDA7ICAKLQkJYm9vbGVhbk1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWF0dEluZGV4ID0gbmV3IEhhc2hNYXAoKTsKLQkJc3BlY2lhbE51bWJlckdlbiA9IGZhbHNlOwotCQlUZXN0VXRpbGl0aWVzLnJlc2V0KCk7Ci0JCUoyRUVWZXJzaW9uQ2hlY2suY3VyX1RhZ3MgPSBudWxsOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL0oyRUVWZXJzaW9uQ2hlY2suamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9KMkVFVmVyc2lvbkNoZWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTA4OWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL0oyRUVWZXJzaW9uQ2hlY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxNCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotcHVibGljIGNsYXNzIEoyRUVWZXJzaW9uQ2hlY2sgewotCXB1YmxpYyBpbnQgdmVyc2lvbjsKLQkvL3N0YXRpYyB2ZXJzaW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8yID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfMyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzQgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fNV8wID0gMzsKLQkKLQkvL21vZHVsZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBJQ0FUSU9OID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBfQ0xJRU5UID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUT1IgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVKQiA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCID0gNDsKLQotCXB1YmxpYyBzdGF0aWMgTGlzdCBjdXJfVGFnczsKLQlwcml2YXRlIHN0YXRpYyBDb21tb25QYWNrYWdlIENPTSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCi0gICAgcHVibGljIEoyRUVWZXJzaW9uQ2hlY2soKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjaGVja0F0dHJpYnV0ZVZlcnNpb24oRUF0dHJpYnV0ZSBhdHQsIGludCB2ZXJzaW9uLCBpbnQgdHlwZSl7Ci0JCS8vVE9ETzogQWRkIHZlcnNpb24gMS4yIGV4Y2x1ZGVzCi0JCWlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzMgfHwgdmVyc2lvbiA9PSBWRVJTSU9OXzFfMil7Ci0JCQlpZihjdXJfVGFncyA9PSBudWxsKXsKLQkJCQljdXJfVGFncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlwb3B1bGF0ZV8xXzNMaXN0KHR5cGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfNCB8fCB2ZXJzaW9uID09IFZFUlNJT05fNV8wKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZihjdXJfVGFncy5jb250YWlucyhhdHQpIHx8IGN1cl9UYWdzLmNvbnRhaW5zKGF0dC5nZXRFVHlwZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotICAgIAotICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tSZWZlcmVuY2VWZXJzaW9uKEVTdHJ1Y3R1cmFsRmVhdHVyZSByZWYsIGludCB2ZXJzaW9uLCBpbnQgdHlwZSl7Ci0JCS8vVE9ETzogQWRkIHZlcnNpb24gMS4yIGV4Y2x1ZGVzCi0JCWlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzMgfHwgdmVyc2lvbiA9PSBWRVJTSU9OXzFfMil7Ci0JCQlpZihjdXJfVGFncyA9PSBudWxsKXsKLQkJCQljdXJfVGFncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlwb3B1bGF0ZV8xXzNMaXN0KHR5cGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfNCB8fCB2ZXJzaW9uID09IFZFUlNJT05fNV8wKXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZihjdXJfVGFncy5jb250YWlucyhyZWYpIHx8IGN1cl9UYWdzLmNvbnRhaW5zKHJlZi5nZXRFVHlwZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0gICAgfQotICAgICAgIAotCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVfMV8yTGlzdChpbnQgdHlwZSkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgQVBQSUNBVElPTiA6Ci0JCQkJcG9wdWxhdGVfMV8yQXBwbGljYXRpb24oKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQVBQX0NMSUVOVCA6Ci0JCQkJcG9wdWxhdGVfMV8yQXBwQ2xpZW50KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVKQiA6Ci0JCQkJcG9wdWxhdGVfMV8yRUpCKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTk5FQ1RPUiA6Ci0JCQkJcG9wdWxhdGVfMV8yRUpCKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdFQiA6Ci0JCQkJcG9wdWxhdGVfMV8yV2ViKCk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfM0xpc3QoaW50IHR5cGUpIHsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIEFQUElDQVRJT04gOgotCQkJCXBvcHVsYXRlXzFfM0FwcGxpY2F0aW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFQUF9DTElFTlQgOgotCQkJCXBvcHVsYXRlXzFfM0FwcENsaWVudCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFSkIgOgotCQkJCXBvcHVsYXRlXzFfM0VKQigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT05ORUNUT1IgOgotCQkJCXBvcHVsYXRlXzFfM0VKQigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXRUIgOgotCQkJCXBvcHVsYXRlXzFfM1dlYigpOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfMkFwcGxpY2F0aW9uKCl7Ci0JCXBvcHVsYXRlXzFfM0FwcGxpY2F0aW9uKCk7Ci0gICAgfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZV8xXzJBcHBDbGllbnQoKXsKLQkJcG9wdWxhdGVfMV8zQXBwQ2xpZW50KCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVfMV8yRUpCKCl7Ci0JCXBvcHVsYXRlXzFfM0VKQigpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfMkNvbm5lY3RvcigpewotCQlwb3B1bGF0ZV8xXzNDb25uZWN0b3IoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZV8xXzJXZWIoKXsKLQkJcG9wdWxhdGVfMV8zV2ViKCk7Ci0JfQotCi0JLy8xLjMKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfM0FwcGxpY2F0aW9uKCl7Ci0JCUNvbW1vblBhY2thZ2UgQ09NID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0SWNvblR5cGUoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXRTZWN1cml0eUlkZW50aXR5X0Rlc2NyaXB0aW9ucygpKTsKLQkJY3VyX1RhZ3MuYWRkKEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25fVmVyc2lvbigpKTsJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVfMV8zQXBwQ2xpZW50KCl7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0SWNvblR5cGUoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJY3VyX1RhZ3MuYWRkKENsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X1ZlcnNpb24oKSk7Ci0JCWN1cl9UYWdzLmFkZChDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9TZXJ2aWNlUmVmcygpKTsKLQkJY3VyX1RhZ3MuYWRkKENsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSk7Ci0JCWN1cl9UYWdzLmFkZChDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25zKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldE1lc3NhZ2VEZXN0aW5hdGlvbigpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXRNZXNzYWdlRGVzdGluYXRpb25SZWYoKSk7Ci0JCS8vY3VyX1RhZ3MuYWRkKENsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uQ2xpZW50X1NlcnZpY2VSZWZzKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfM0Nvbm5lY3RvcigpewotCQljdXJfVGFncy5hZGQoQ09NLmdldEljb25UeXBlKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERpc3BsYXlOYW1lKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERlc2NyaXB0aW9uKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWN1cl9UYWdzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRPdXRib3VuZFJlc291cmNlQWRhcHRlcigpKTsKLQkJY3VyX1RhZ3MuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKSk7Ci0JCWN1cl9UYWdzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRBZG1pbk9iamVjdCgpKTsKLQkJY3VyX1RhZ3MuYWRkKEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9WZXJzaW9uKCkpOwotCX0KLQkKLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfM0VKQigpIHsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXRJY29uVHlwZSgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREaXNwbGF5TmFtZSgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREZXNjcmlwdGlvbigpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREZXNjcmlwdGlvbkdyb3VwKCkpOwotCQljdXJfVGFncy5hZGQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUpCSmFyX1ZlcnNpb24oKSk7Ci0JCWN1cl9UYWdzLmFkZChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRTZXNzaW9uX1NlcnZpY2VFbmRwb2ludCgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXRKTkRJRW52UmVmc0dyb3VwX01lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0Sk5ESUVudlJlZnNHcm91cF9TZXJ2aWNlUmVmcygpKTsKLQkJY3VyX1RhZ3MuYWRkKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnaW5nVHlwZSgpKTsKLQkJY3VyX1RhZ3MuYWRkKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5fTWVzc2FnZURlc3RpbmF0aW9uKCkpOwotCQljdXJfVGFncy5hZGQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbl9MaW5rKCkpOwotCQljdXJfVGFncy5hZGQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWVzc2FnZURyaXZlbl9BY3RpdmF0aW9uQ29uZmlnKCkpOwkKLSAgICB9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfM1dlYigpewotCQljdXJfVGFncy5hZGQoQ09NLmdldEljb25UeXBlKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERpc3BsYXlOYW1lKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERlc2NyaXB0aW9uKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWN1cl9UYWdzLmFkZChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9WZXJzaW9uKCkpOwotCQljdXJfVGFncy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfSnNwQ29uZmlnKCkpOwotCQljdXJfVGFncy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfTWVzc2FnZURlc3RpbmF0aW9ucygpKTsKLQkJY3VyX1RhZ3MuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0xvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9UZXN0VXRpbGl0aWVzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3R1dGlsaXRpZXMvVGVzdFV0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjc3OGVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9UZXN0VXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDMsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLQotLyoqCi0gKiBAYXV0aG9yIGFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgIGNsYXNzIFRlc3RVdGlsaXRpZXMgZXh0ZW5kcyBFY29yZVV0aWwgewotCXByaXZhdGUgc3RhdGljIE1hcCBvYmplY3RNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgc3RhdGljIE1hcCBzdWJzZXRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCi0JLyoqCi0JCSAqIFJldHVybnMgdGhlIGZpcnN0IGNvbGxlY3Rpb24gbWVtYmVyIHRoYXQge0BsaW5rIEVDbGFzc2lmaWVyI2lzSW5zdGFuY2UgaXMgYW4gaW5zdGFuY2V9IG9mIHRoZSB0eXBlLgotCQkgKiBAcGFyYW0gb2JqZWN0cyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyB0byBjaGVjay4KLQkJICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgb2Ygb2JqZWN0IHRvIGZpbmQuCi0JCSAqIEByZXR1cm4gdGhlIGZpcnN0IG9iamVjdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRPYmplY3RCeVR5cGUoUmVzb3VyY2UgcmVzLCBFQ2xhc3NpZmllciB0eXBlLCBib29sZWFuIGlzTWFueSkgewotCQkJaWYgKGlzTWFueSkKLQkJCQlyZXR1cm4gZ2V0Q29udGFpbmVkQ29sbGVjdGlvbkJ5VHlwZShyZXMuZ2V0Q29udGVudHMoKSwgdHlwZSk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGdldENvbnRhaW5lZE9iamVjdEJ5VHlwZShyZXMuZ2V0Q29udGVudHMoKSwgdHlwZSk7Ci0JCX0KLQotCQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRDb250YWluZWRPYmplY3RCeVR5cGUoTGlzdCBsaXN0LCBFQ2xhc3NpZmllciB0eXBlKSB7Ci0JCQlPYmplY3QgZm91bmQ7Ci0JCQlmb3VuZCA9IGdldE9iamVjdHNCeVR5cGUobGlzdCwgdHlwZSk7Ci0JCQlpZiAoZm91bmQgIT0gbnVsbCAmJiAhKChDb2xsZWN0aW9uKWZvdW5kKS5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIGV4dHJhY3RPYmplY3QoKExpc3QpIGZvdW5kLHR5cGUpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlFT2JqZWN0IG9iaiA9IChFT2JqZWN0KSBsaXN0LmdldChpKTsKLQkJCQlmb3VuZCA9IGdldENvbnRhaW5lZE9iamVjdEJ5VHlwZShvYmouZUNvbnRlbnRzKCksIHR5cGUpOwotCQkJCWlmIChmb3VuZCAhPSBudWxsKQotCQkJCQlyZXR1cm4gZm91bmQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0Q29udGFpbmVkQ29sbGVjdGlvbkJ5VHlwZShMaXN0IGxpc3QsIEVDbGFzc2lmaWVyIHR5cGUpIHsKLQkJCUxpc3QgZm91bmQ7Ci0JCQlmb3VuZCA9IChMaXN0KWdldE9iamVjdHNCeVR5cGUobGlzdCwgdHlwZSk7Ci0JCQlpZiAoZm91bmQgIT0gbnVsbCAmJiAhZm91bmQuaXNFbXB0eSgpKQotCQkJCXJldHVybiBleHRyYWN0U3Vic2V0KGZvdW5kLCB0eXBlKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCQkJZm91bmQgPSAoTGlzdCkgZ2V0Q29udGFpbmVkQ29sbGVjdGlvbkJ5VHlwZShvYmouZUNvbnRlbnRzKCksIHR5cGUpOwotCQkJCWlmIChmb3VuZCAhPSBudWxsKQotCQkJCQlyZXR1cm4gZm91bmQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBudWxsOwotCQkKLQkJCi0JCQotCQl9Ci0JCi0JCXB1YmxpYyBzdGF0aWMgTGlzdCBleHRyYWN0U3Vic2V0KExpc3QgZm91bmQsIEVDbGFzc2lmaWVyIHR5cGUpIHsKLQkJCWlmICghc3Vic2V0TWFwLmNvbnRhaW5zS2V5KHR5cGUpKXsKLQkJCQlzdWJzZXRNYXAucHV0KHR5cGUsbmV3IEludGVnZXIoMSkpOwotCQkJfQotCQkJaW50IHBvcyA9ICgoSW50ZWdlcilzdWJzZXRNYXAuZ2V0KHR5cGUpKS5pbnRWYWx1ZSgpOwotCQkKLQkJCWlmIChwb3MgPT0gZm91bmQuc2l6ZSgpKQotCQkJCXBvcyA9IDE7Ci0JCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zOyBpKyspCi0JCQkJcmVzdWx0LmFkZChmb3VuZC5nZXQoaSkpOwotCQkJcG9zKys7Ci0JCQlzdWJzZXRNYXAucHV0KHR5cGUsbmV3IEludGVnZXIocG9zKSk7CQotCQkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkKLQkJcHVibGljIHN0YXRpYyBPYmplY3QgZXh0cmFjdE9iamVjdChMaXN0IGZvdW5kLCBFQ2xhc3NpZmllciB0eXBlKSB7Ci0JCQlpZiAoIW9iamVjdE1hcC5jb250YWluc0tleSh0eXBlKSl7Ci0JCQkJb2JqZWN0TWFwLnB1dCh0eXBlLG5ldyBJbnRlZ2VyKDApKTsKLQkJCX0KLQkJCWludCBwb3MgPSAoKEludGVnZXIpb2JqZWN0TWFwLmdldCh0eXBlKSkuaW50VmFsdWUoKTsKLQkJCi0JCQlpZiAocG9zID09IGZvdW5kLnNpemUoKSkKLQkJCQlwb3MgPSAwOwotCQkJT2JqZWN0IGhvbGRlciA9IGZvdW5kLmdldChwb3MpOwotCQkJcG9zKys7Ci0JCQlvYmplY3RNYXAucHV0KHR5cGUsbmV3IEludGVnZXIocG9zKSk7CQotCQkKLQkJCXJldHVybiBob2xkZXI7Ci0JCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpewotCQlzdWJzZXRNYXAuY2xlYXIoKTsKLQkJb2JqZWN0TWFwLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9idnQvQXV0b21hdGVkQlZULmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwNjg5YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuQWxsVGVzdHM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvbWF0ZWRCVlQgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZURpcmVjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgImNvbW1vbkFyY2hpdmVSZXNvdXJjZXMiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMiKTsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKTsgCi0gICAgICAgIAlBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKS5nZXRGaWxlKCkgKyAiY29tbW9uQXJjaGl2ZVJlc291cmNlcyIrIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNpbmcgd29ya2luZyBkaXJlY3Rvcnkgc2luY2UgYSB3b3Jrc3BhY2UgVVJMIGNvdWxkIG5vdCBiZSBsb2NhdGVkLiIpOwotCQl9IAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IHVuaW1wbGVtZW50ZWRNZXRob2RzOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICB1bmltcGxlbWVudGVkTWV0aG9kcyA9IDA7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgICAgICBpZiAodW5pbXBsZW1lbnRlZE1ldGhvZHMgPiAwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ2FsbHMgdG8gd2FyblVuaW1wbDogIiArIHVuaW1wbGVtZW50ZWRNZXRob2RzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBdXRvbWF0ZWRCVlQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIEF1dG9tYXRlZEJWVC5zdWl0ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1aXRlLnRlc3RDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIGFkZFRlc3Qoc3VpdGUudGVzdEF0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3Igb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5idnQiKTsKLSAgICAgICAgLy8kSlVuaXQtQkVHSU4kCi0gICAgICAgIC8vVE9ETzogTWFrZSB0aGUgQXJjaGl2ZSBUZXN0IFdvcmsKLSAgICAgICAvLyBzdWl0ZS5hZGRUZXN0KEFsbEFyY2hpdmVUZXN0c0phdmEuc3VpdGUoKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QoQWxsVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIC8vc3VpdGUuYWRkVGVzdChBbGxKYXZhVGVzdHNKYXZhLnN1aXRlKCkpOwotICAgICAgICAvLyRKVW5pdC1FTkQkCi0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlRFY2xpcHNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlRFY2xpcHNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YjAwN2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9idnQvQXV0b21hdGVkQlZURWNsaXBzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEF1dG9tYXRlZEJWVEVjbGlwc2UgZXh0ZW5kcyBBdXRvbWF0ZWRCVlQgewotCQotCXB1YmxpYyBBdXRvbWF0ZWRCVlRFY2xpcHNlKCl7Ci0JCXN1cGVyKCk7Ci0JCUlQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMiKTsKLSAgICAgICAgVVJMIHVybCA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpOwotICAgICAgICB0cnkgewotICAgICAgICAJQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCkuZ2V0RmlsZSgpICsgImNvbW1vbkFyY2hpdmVSZXNvdXJjZXMiKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VtZmxvYWQvTG9hZEpheFJQQ01hcE91dHNpZGVXb3Jrc3BhY2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VtZmxvYWQvTG9hZEpheFJQQ01hcE91dHNpZGVXb3Jrc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlZjRmYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lbWZsb2FkL0xvYWRKYXhSUENNYXBPdXRzaWRlV29ya3NwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZW1mbG9hZDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5EaWFnbm9zdGljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5VUklDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlVSSUNvbnZlcnRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLmludGVybmFsLmltcGwuSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVJbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFJlc291cmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXJGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBMb2FkSmF4UlBDTWFwT3V0c2lkZVdvcmtzcGFjZSBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQkvL3B1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VEaXJlY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAidGVzdERhdGEiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAid2Vic2VydmljZXMiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAiTUVUQS1JTkYiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0gICAKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIExvYWQgYWxsIHRoZSBhcmd1bWVudCBmaWxlIHBhdGhzIG9yIFVSSXMgYXMgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gYXJncyB0aGUgZmlsZSBwYXRocyBvciBVUklzLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TG9hZEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUlQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMiKTsKLSAgICAgICAgVVJMIHVybCA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpOyAKLSAgICAgICAgU3RyaW5nIGJhc2VEaXJlY3RvcnkgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCkuZ2V0RmlsZSgpICsgInRlc3REYXRhIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgIndlYnNlcnZpY2VzIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgIk1FVEEtSU5GIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotCQkKLQkvLyBDYWxsIEoyRUUgSW5pdCgpOwotCQkKLQlKMkVFSW5pdC5pbml0KCk7Ci0JLy8gQ3JlYXRlIGEgcmVzb3VyY2Ugc2V0IHRvIGhvbGQgdGhlIHJlc291cmNlcy4KLQkvLwotCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCUoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IG5ldyBKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKTsKLQlyZXNvdXJjZVNldC5zZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeShyZWdpc3RyeSk7Ci0JVVJJQ29udmVydGVyIGNvbnYgPSBuZXcgVVJJQ29udmVydGVySW1wbCgpOwotCXJlc291cmNlU2V0LnNldFVSSUNvbnZlcnRlcihjb252KTsKLQlFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQotCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGJhc2VEaXJlY3RvcnkgKyAiQW5udWl0eVNlcnZpY2VzX21hcHBpbmcueG1sIik7Ci0JCQlyZWdpc3RyeS5yZWdpc3Rlckxhc3RGaWxlU2VnbWVudCh1cmkubGFzdFNlZ21lbnQoKSwgbmV3IEpheHJwY21hcFJlc291cmNlRmFjdG9yeShFTUYyRE9NUmVuZGVyZXJGYWN0b3J5LklOU1RBTkNFKSk7Ci0KLQkJCXRyeSB7Ci0JCQkJLy8gRGVtYW5kIGxvYWQgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4KLQkJCQkvLwotCQkJCUpheHJwY21hcFJlc291cmNlIGpheHJwY21hcFJlcyA9IChKYXhycGNtYXBSZXNvdXJjZSlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZSh1cmksIHRydWUpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGVkICIgKyB1cmkpOwotCQkJCWpheHJwY21hcFJlcy5nZXRDb250ZW50cygpOwotCi0JCQl9Ci0JCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0gbG9hZGluZyAiICsgdXJpKTsKLQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFByaW50cyBkaWFnbm9zdGljcyB3aXRoIGluZGVudGF0aW9uLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAcGFyYW0gZGlhZ25vc3RpYyB0aGUgZGlhZ25vc3RpYyB0byBwcmludC4KLSAqIEBwYXJhbSBpbmRlbnQgdGhlIGluZGVudGF0aW9uIGZvciBwcmludGluZy4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHByaW50RGlhZ25vc3RpYyhEaWFnbm9zdGljIGRpYWdub3N0aWMsIFN0cmluZyBpbmRlbnQpIHsKLQlTeXN0ZW0ub3V0LnByaW50KGluZGVudCk7Ci0JU3lzdGVtLm91dC5wcmludGxuKGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpKTsKLQlmb3IgKEl0ZXJhdG9yIGkgPSBkaWFnbm9zdGljLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQlwcmludERpYWdub3N0aWMoKERpYWdub3N0aWMpaS5uZXh0KCksIGluZGVudCArICIgICIpOwotCX0KLX0KLQl9Ci0KLQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lbWZsb2FkL0xvYWRXZWJTZXJ2aWNlc091dHNpZGVXb3Jrc3BhY2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VtZmxvYWQvTG9hZFdlYlNlcnZpY2VzT3V0c2lkZVdvcmtzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTE4YTY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VtZmxvYWQvTG9hZFdlYlNlcnZpY2VzT3V0c2lkZVdvcmtzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVtZmxvYWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5EaWFnbm9zdGljaWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFSW5pdDsKLQotCi1wdWJsaWMgY2xhc3MgTG9hZFdlYlNlcnZpY2VzT3V0c2lkZVdvcmtzcGFjZSBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlRGlyZWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgInRlc3REYXRhIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgIndlYnNlcnZpY2VzIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgIk1FVEEtSU5GIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotICAgCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBMb2FkIGFsbCB0aGUgYXJndW1lbnQgZmlsZSBwYXRocyBvciBVUklzIGFzIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIGFyZ3MgdGhlIGZpbGUgcGF0aHMgb3IgVVJJcy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdGVzdExvYWRGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCS8vIENhbGwgSjJFRSBJbml0KCk7Ci0JCQotCUoyRUVJbml0LmluaXQoKTsKLQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQgdG8gaG9sZCB0aGUgcmVzb3VyY2VzLgotCS8vCi0JUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JcmVzb3VyY2VTZXQuc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkobmV3IEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpKTsKLQlVUklDb252ZXJ0ZXIgY29udiA9IG5ldyBVUklDb252ZXJ0ZXJJbXBsKCk7Ci0JcmVzb3VyY2VTZXQuc2V0VVJJQ29udmVydGVyKGNvbnYpOwotCQotCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGJhc2VEaXJlY3RvcnkgKyAid2Vic2VydmljZXMueG1sIik7Ci0KLQkJCXRyeSB7Ci0JCQkJLy8gRGVtYW5kIGxvYWQgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4KLQkJCQkvLwotCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRlZCAiICsgdXJpKTsKLQotCQkJCS8vIFZhbGlkYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgbG9hZGVkIHJlc291cmNlLgotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBqID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKSB7Ci0JCQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KWoubmV4dCgpOwotCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKGVPYmplY3QpOwotCQkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKLQkJCQkJCXByaW50RGlhZ25vc3RpYyhkaWFnbm9zdGljLCAiIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0gbG9hZGluZyAiICsgdXJpKTsKLQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFByaW50cyBkaWFnbm9zdGljcyB3aXRoIGluZGVudGF0aW9uLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAcGFyYW0gZGlhZ25vc3RpYyB0aGUgZGlhZ25vc3RpYyB0byBwcmludC4KLSAqIEBwYXJhbSBpbmRlbnQgdGhlIGluZGVudGF0aW9uIGZvciBwcmludGluZy4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHByaW50RGlhZ25vc3RpYyhEaWFnbm9zdGljIGRpYWdub3N0aWMsIFN0cmluZyBpbmRlbnQpIHsKLQlTeXN0ZW0ub3V0LnByaW50KGluZGVudCk7Ci0JU3lzdGVtLm91dC5wcmludGxuKGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpKTsKLQlmb3IgKEl0ZXJhdG9yIGkgPSBkaWFnbm9zdGljLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQlwcmludERpYWdub3N0aWMoKERpYWdub3N0aWMpaS5uZXh0KCksIGluZGVudCArICIgICIpOwotCX0KLX0KLQl9Ci0KLQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi90ZXN0L0FwcGxpY2F0aW9uRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL3Rlc3QvQXBwbGljYXRpb25GYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWJhODZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL3Rlc3QvQXBwbGljYXRpb25GYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi50ZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Db25uZWN0b3JNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uRWpiTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkphdmFDbGllbnRNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLQotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCl7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEFwcGxpY2F0aW9uRmFjdG9yeVRlc3QuY2xhc3MpOwotICAgIH0KLQkgIAotICAgIHB1YmxpYyBBcHBsaWNhdGlvbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVBcHBsaWNhdGlvbigpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkZhY3Rvcnkgb2JqQXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXBwbGljYXRpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1vZHVsZSgpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkZhY3Rvcnkgb2JqQXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTW9kdWxlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlTW9kdWxlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlV2ViTW9kdWxlKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBXZWJNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVXZWJNb2R1bGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVKYXZhQ2xpZW50TW9kdWxlKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhQ2xpZW50TW9kdWxlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlSmF2YUNsaWVudE1vZHVsZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVqYk1vZHVsZSgpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkZhY3Rvcnkgb2JqQXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRWpiTW9kdWxlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlRWpiTW9kdWxlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQ29ubmVjdG9yTW9kdWxlKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDb25uZWN0b3JNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVDb25uZWN0b3JNb2R1bGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi90ZXN0L0FwcGxpY2F0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vdGVzdC9BcHBsaWNhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyOGNiNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi90ZXN0L0FwcGxpY2F0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi50ZXN0OwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FYXJFTUZUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25UZXN0IGV4dGVuZHMgRWFyRU1GVGVzdCB7Ci0KLQkgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tbW9uRmFjdG9yeSBDT01NT05GQUNUT1JZID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotCSBwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkZhY3RvcnkoKTsKLSAgICB9Ci0gICAgLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotICAgICAgICBjcmVhdGVFQVIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zU2VjdXJpdHlSb2xlKCkgewotCQkKLSAgICAgICAgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0icm9sZTEiIDsKLSAgICAgICAgU3RyaW5nIG5hbWUyID0icm9sZTIiIDsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmNvbnRhaW5zU2VjdXJpdHlSb2xlKG5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIGZhbHNlKSA7Ci0gICAgICAgIFNlY3VyaXR5Um9sZSByb2xlID0gQ09NTU9ORkFDVE9SWS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLQkJcm9sZS5zZXRSb2xlTmFtZShuYW1lKTsKLSAgICAgICAgb2JqQXBwbGljYXRpb24uZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChyb2xlKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5jb250YWluc1NlY3VyaXR5Um9sZShuYW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCB0cnVlKSA7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uY29udGFpbnNTZWN1cml0eVJvbGUobmFtZTIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIGZhbHNlKSA7Ci0gICAgICAgCi0gICAgfQotCi0gIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9kdWxlKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICBTdHJpbmcgdXJpID0gIiI7Ci0gICAgICAgIE1vZHVsZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uZ2V0TW9kdWxlKHVyaSk7Ci0gICAgfSovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1vZHVsZV8yKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICBNb2R1bGUgbW9kdWxlID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVNb2R1bGUoKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9ICJ1cmkxIjsKLSAgICAgICAgU3RyaW5nIGFsdEREID0gImFsdEREMSI7Ci0gICAgICAgIG1vZHVsZS5zZXRVcmkodXJpKTsKLSAgICAgICAgbW9kdWxlLnNldEFsdEREKGFsdEREKTsKLSAgICAgICAgb2JqQXBwbGljYXRpb24uZ2V0TW9kdWxlcygpLmFkZChtb2R1bGUpOwotICAgICAgICBNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmdldE1vZHVsZSh1cmksIGFsdEREKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZHVsZSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRGaXJzdE1vZHVsZSgpIHsKLQotICAgIAkgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgICBNb2R1bGUgbW9kdWxlID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVNb2R1bGUoKTsKLSAgICAgICAgIE1vZHVsZSBtb2R1bGUyID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVNb2R1bGUoKTsKLSAgICAgICAgIE1vZHVsZSBtb2R1bGUzID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVNb2R1bGUoKTsKLSAgICAgICAgIFN0cmluZyB1cmkgPSAidXJpMSI7Ci0gICAgICAgICBTdHJpbmcgdXJpMiA9ICJ1cmkyIiA7Ci0gICAgICAgICBTdHJpbmcgYWx0REQgPSAiYWx0REQxIjsKLSAgICAgICAgIFN0cmluZyBhbHRERDIgPSAiYWx0REQyIiA7Ci0gICAgICAgICAKLSAgICAgICAgIG1vZHVsZS5zZXRVcmkodXJpKTsKLSAgICAgICAgIG1vZHVsZS5zZXRBbHRERChhbHRERCk7Ci0gICAgICAgICAKLSAgICAgICAgIG1vZHVsZTIuc2V0VXJpKHVyaTIpOwotICAgICAgICAgbW9kdWxlMi5zZXRBbHRERChhbHRERDIpOwotICAgICAgICAgCi0gICAgICAgICBtb2R1bGUzLnNldFVyaSh1cmkyKTsKLSAgICAgICAgIG1vZHVsZTMuc2V0QWx0REQoYWx0REQpOwotICAgICAgICAgCi0gICAgICAgICBvYmpBcHBsaWNhdGlvbi5nZXRNb2R1bGVzKCkuYWRkKG1vZHVsZSk7Ci0gICAgICAgICBvYmpBcHBsaWNhdGlvbi5nZXRNb2R1bGVzKCkuYWRkKG1vZHVsZTIpOwotICAgICAgICAgb2JqQXBwbGljYXRpb24uZ2V0TW9kdWxlcygpLmFkZChtb2R1bGUzKTsKLSAgICAgICAgIE1vZHVsZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmdldEZpcnN0TW9kdWxlKHVyaTIpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZHVsZTIscmV0VmFsdWUpOwotICAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNb2R1bGVIYXZpbmdBbHRERCgpIHsKLQotICAgIAkgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgICBNb2R1bGUgbW9kdWxlID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVNb2R1bGUoKTsKLSAgICAgICAgIFN0cmluZyB1cmkgPSAidXJpMSI7Ci0gICAgICAgICBTdHJpbmcgYWx0REQgPSAiYWx0REQxIjsKLSAgICAgICAgIG1vZHVsZS5zZXRVcmkodXJpKTsKLSAgICAgICAgIG1vZHVsZS5zZXRBbHRERChhbHRERCk7Ci0gICAgICAgICBvYmpBcHBsaWNhdGlvbi5nZXRNb2R1bGVzKCkuYWRkKG1vZHVsZSk7Ci0gICAgICAgICBNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5nZXRNb2R1bGVIYXZpbmdBbHRERChhbHRERCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMobW9kdWxlLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlY3VyaXR5Um9sZU5hbWVkKCkgewotCi0gICAgCSBBcHBsaWNhdGlvbiBvYmpBcHBsaWNhdGlvbiA9IGdldEluc3RhbmNlKCkuY3JlYXRlQXBwbGljYXRpb24oKTsKLSAgICAgICAgIFN0cmluZyBuYW1lID0icm9sZTEiIDsKLSAgICAgICAgIFN0cmluZyBuYW1lMiA9InJvbGUyIiA7Ci0gICAgICAgICBTZWN1cml0eVJvbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5nZXRTZWN1cml0eVJvbGVOYW1lZChuYW1lKTsKLSAgICAgICAgIGFzc2VydE51bGwocmV0VmFsdWUpOwotICAgICAgICAgU2VjdXJpdHlSb2xlIHJvbGUgPSBDT01NT05GQUNUT1JZLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotIAkJIHJvbGUuc2V0Um9sZU5hbWUobmFtZSk7Ci0gICAgICAgICBvYmpBcHBsaWNhdGlvbi5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKHJvbGUpOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5nZXRTZWN1cml0eVJvbGVOYW1lZChuYW1lKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgcm9sZSkgOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5nZXRTZWN1cml0eVJvbGVOYW1lZChuYW1lMik7Ci0gICAgICAgICBhc3NlcnROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgCi0gICAgfQotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2lzVmVyc2lvbjFfMkRlc2NyaXB0b3IoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5pc1ZlcnNpb24xXzJEZXNjcmlwdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1ZlcnNpb24xXzNEZXNjcmlwdG9yKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uaXNWZXJzaW9uMV8zRGVzY3JpcHRvcigpOwotICAgIH0qLwotCi0gLyogICBwdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnNpb24oKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmdldFZlcnNpb24oKTsKLSAgICB9Ki8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVyc2lvbklEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGluaXQoKTsKLSAgICAJQXBwbGljYXRpb25SZXNvdXJjZSBERCA9IChBcHBsaWNhdGlvblJlc291cmNlKSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCXNldE1vZHVsZVR5cGUoQVBQTElDQVRJT04pOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgaW50IHJldFZhbHVlID0gMDsKLSAgICAgICAgcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbigpLmdldFZlcnNpb25JRCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzQpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbigpLmdldFZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzMpOwotCSAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8yKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbigpLmdldFZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzIpOyAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0KLSAgICAJaW5pdCgpOwotICAgICAJQXBwbGljYXRpb25SZXNvdXJjZSBERCA9IChBcHBsaWNhdGlvblJlc291cmNlKSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLSAJCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotIAkJc2V0TW9kdWxlVHlwZShBUFBMSUNBVElPTik7Ci0gCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgaW50IHJldFZhbHVlID0gMDsKLSAgICAgICAgcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbigpLmdldEoyRUVWZXJzaW9uSUQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV80KTsKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLSAJCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotIAkJcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbigpLmdldEoyRUVWZXJzaW9uSUQoKTsKLSAJICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMyk7Ci0gCSAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpOwotIAkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMik7Ci0gCQlyZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uKCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotIAkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yKTsgIAotIAkgICAgCi0gICAgICAgIAotICAgIH0KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9zZXRWZXJzaW9uKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICBTdHJpbmcgbmV3VmVyc2lvbiA9ICIiOwotICAgICAgICBvYmpBcHBsaWNhdGlvbi5zZXRWZXJzaW9uKG5ld1ZlcnNpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VjdXJpdHlSb2xlcygpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbiBvYmpBcHBsaWNhdGlvbiA9IGdldEluc3RhbmNlKCkuY3JlYXRlQXBwbGljYXRpb24oKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmdldFNlY3VyaXR5Um9sZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1vZHVsZXMoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5nZXRNb2R1bGVzKCk7Ci0gICAgfSovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBcHBsaWNhdGlvblRlc3QoInRlc3RfZ2V0VmVyc2lvbklEIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBcHBsaWNhdGlvblRlc3QoInRlc3RfZ2V0SjJFRVZlcnNpb25JRCIpKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uVGVzdCgidGVzdF9nZXRTZWN1cml0eVJvbGVOYW1lZCIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXBwbGljYXRpb25UZXN0KCJ0ZXN0X2dldE1vZHVsZUhhdmluZ0FsdEREIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBcHBsaWNhdGlvblRlc3QoInRlc3RfY29udGFpbnNTZWN1cml0eVJvbGUiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uVGVzdCgidGVzdF9nZXRNb2R1bGVfMiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXBwbGljYXRpb25UZXN0KCJ0ZXN0X2dldEZpcnN0TW9kdWxlIikpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvdGVzdC9BcHBsaWNhdGlvbkNsaWVudFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC90ZXN0L0FwcGxpY2F0aW9uQ2xpZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmUzNDE2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC90ZXN0L0FwcGxpY2F0aW9uQ2xpZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LnRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkFwcENsaWVudEVNRlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uQ2xpZW50VGVzdCBleHRlbmRzIEFwcENsaWVudEVNRlRlc3QgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQXBwbGljYXRpb25DbGllbnRUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQkKLQl9Ci0JcHJpdmF0ZSB2b2lkIGluaXQoKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLSAgICAgICAgY3JlYXRlRUFSKCk7Ci0gICAgICAgIGNyZWF0ZUFwcENsaWVudCgpOwotCX0KLQlwcml2YXRlIEFwcGxpY2F0aW9uQ2xpZW50IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q2xpZW50RmFjdG9yeSgpLmNyZWF0ZUFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0JfQotICAKLSAgCi0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBcHBsaWNhdGlvbkNsaWVudFRlc3QoInRlc3RfZ2V0VmVyc2lvbklEIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBcHBsaWNhdGlvbkNsaWVudFRlc3QoInRlc3RfZ2V0SjJFRVZlcnNpb25JRCIpKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uQ2xpZW50VGVzdCgidGVzdF9nZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uQ2xpZW50VGVzdCgidGVzdF9zZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUiKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lKCkgewotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBjYWxsQmFja0hhbmRsZXJOYW1lID0gIlRlc3RDYWxsQmFja0hhbmRsZXJOYW1lIiA7Ci0gICAgICAgIG9iakFwcGxpY2F0aW9uQ2xpZW50LnNldENhbGxiYWNrSGFuZGxlckNsYXNzTmFtZShjYWxsQmFja0hhbmRsZXJOYW1lKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uQ2xpZW50LmdldENhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoY2FsbEJhY2tIYW5kbGVyTmFtZSwgcmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lKCkgewotCi0gICAgCUFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIGNhbGxCYWNrSGFuZGxlck5hbWUgPSAiVGVzdENhbGxCYWNrSGFuZGxlck5hbWUiIDsKLSAgICAgICAgb2JqQXBwbGljYXRpb25DbGllbnQuc2V0Q2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lKGNhbGxCYWNrSGFuZGxlck5hbWUpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25DbGllbnQuZ2V0Q2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsQmFja0hhbmRsZXJOYW1lLCByZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRWZXJzaW9uSUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJaW5pdCgpOwotICAgIAlBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UpIGFwcENsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJc2V0TW9kdWxlVHlwZShBUFBfQ0xJRU5UKTsKLQkJcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0gICAgICAgIGludCByZXRWYWx1ZSA9IDA7Ci0gICAgICAgIHJldFZhbHVlID0gREQuZ2V0QXBwbGljYXRpb25DbGllbnQoKS5nZXRWZXJzaW9uSUQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV80KTsKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXJldFZhbHVlID0gREQuZ2V0QXBwbGljYXRpb25DbGllbnQoKS5nZXRWZXJzaW9uSUQoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zKTsKLQkgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMik7Ci0JCXJldFZhbHVlID0gREQuZ2V0QXBwbGljYXRpb25DbGllbnQoKS5nZXRWZXJzaW9uSUQoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCWluaXQoKTsKLSAgICAJQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSBERCA9IChBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlKSBhcHBDbGllbnRGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCXNldE1vZHVsZVR5cGUoQVBQX0NMSUVOVCk7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBpbnQgcmV0VmFsdWUgPSAwOwotICAgICAgICByZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uQ2xpZW50KCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzQpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbkNsaWVudCgpLmdldEoyRUVWZXJzaW9uSUQoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zKTsKLQkgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMik7Ci0JCXJldFZhbHVlID0gREQuZ2V0QXBwbGljYXRpb25DbGllbnQoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfMik7Ci0gICAgfQotCi0gLyogICBwdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnNpb24oKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkNsaWVudC5nZXRWZXJzaW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRWZXJzaW9uKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld1ZlcnNpb24gPSAiIjsKLSAgICAgICAgb2JqQXBwbGljYXRpb25DbGllbnQuc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKLSAgICB9Ki8KLQotICAgIC8qcHVibGljIHZvaWQgdGVzdF9nZXRSZXNvdXJjZVJlZnMoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25DbGllbnQuZ2V0UmVzb3VyY2VSZWZzKCk7Ci0gICAgfQotKi8KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RW52aXJvbm1lbnRQcm9wcygpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkNsaWVudC5nZXRFbnZpcm9ubWVudFByb3BzKCk7Ci0gICAgfSovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RWpiUmVmZXJlbmNlcygpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkNsaWVudC5nZXRFamJSZWZlcmVuY2VzKCk7Ci0gICAgfSovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVzb3VyY2VFbnZSZWZzKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uQ2xpZW50LmdldFJlc291cmNlRW52UmVmcygpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldENhbGxiYWNrSGFuZGxlcigpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEphdmFDbGFzcyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25DbGllbnQuZ2V0Q2FsbGJhY2tIYW5kbGVyKCk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Q2FsbGJhY2tIYW5kbGVyKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSmF2YUNsYXNzIG5ld0NhbGxiYWNrSGFuZGxlciA9IG51bGw7Ci0gICAgICAgIG9iakFwcGxpY2F0aW9uQ2xpZW50LnNldENhbGxiYWNrSGFuZGxlcihuZXdDYWxsYmFja0hhbmRsZXIpOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlcnZpY2VSZWZzKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uQ2xpZW50LmdldFNlcnZpY2VSZWZzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlRGVzdGluYXRpb25SZWZzKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uQ2xpZW50LmdldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25DbGllbnQuZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpOwotICAgIH0qLwotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvdGVzdC9DbGllbnRGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L3Rlc3QvQ2xpZW50RmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI1NDFkMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvdGVzdC9DbGllbnRGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgQ2xpZW50RmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIENsaWVudEZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRDbGllbnRGYWN0b3J5KCk7Ci0JfQotICAgIHB1YmxpYyB2b2lkIHRlc3RfQ2xpZW50RmFjdG9yeSgpIHsKLSAgICAgICAgQ2xpZW50RmFjdG9yeSB0bXBDbGllbnRGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0bXBDbGllbnRGYWN0b3J5KTsKLSAgICB9Ci0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQXBwbGljYXRpb25DbGllbnQoKSB7Ci0KLSAgICAgICAgQ2xpZW50RmFjdG9yeSBvYmpDbGllbnRGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNsaWVudEZhY3RvcnkuY3JlYXRlQXBwbGljYXRpb25DbGllbnQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ2xpZW50RmFjdG9yeVRlc3QuY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvQ29tbW9uRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L0NvbW1vbkZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5Mjg2OWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvQ29tbW9uRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRW52RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkljb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLk1lc3NhZ2VEZXN0aW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5QYXJhbVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VFbnZSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SdW5Bc1NwZWNpZmllZElkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eUlkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uVXNlQ2FsbGVySWRlbnRpdHk7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25GYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgQ29tbW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgdGVzdF9Db21tb25GYWN0b3J5KCkgewotCi0gICAgICAgIENvbW1vbkZhY3RvcnkgdG1wQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgIAotICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFamJSZWYoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBFamJSZWYgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlRWpiUmVmKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRW52RW50cnkoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBFbnZFbnRyeSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVFbnZFbnRyeSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVJlc291cmNlUmVmKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUmVzb3VyY2VSZWYgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlUmVzb3VyY2VSZWYoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTZWN1cml0eVJvbGVSZWYoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBTZWN1cml0eVJvbGVSZWYgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlU2VjdXJpdHlSb2xlUmVmKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2VjdXJpdHlSb2xlKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VjdXJpdHlSb2xlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVJlc291cmNlRW52UmVmKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUmVzb3VyY2VFbnZSZWYgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlUmVzb3VyY2VFbnZSZWYoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFSkJMb2NhbFJlZigpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQkxvY2FsUmVmIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZUVKQkxvY2FsUmVmKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUlkZW50aXR5KCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSWRlbnRpdHkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlSWRlbnRpdHkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVJY29uVHlwZSgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIEljb25UeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZUljb25UeXBlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRGlzcGxheU5hbWUoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBEaXNwbGF5TmFtZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVEaXNwbGF5TmFtZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZigpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1lc3NhZ2VEZXN0aW5hdGlvblJlZiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWYoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNZXNzYWdlRGVzdGluYXRpb24oKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXNzYWdlRGVzdGluYXRpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUGFyYW1WYWx1ZSgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIFBhcmFtVmFsdWUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlUGFyYW1WYWx1ZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZURlc2NyaXB0aW9uR3JvdXAoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBEZXNjcmlwdGlvbkdyb3VwIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZURlc2NyaXB0aW9uR3JvdXAoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTZWN1cml0eUlkZW50aXR5KCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VjdXJpdHlJZGVudGl0eSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVTZWN1cml0eUlkZW50aXR5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlVXNlQ2FsbGVySWRlbnRpdHkoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBVc2VDYWxsZXJJZGVudGl0eSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVVc2VDYWxsZXJJZGVudGl0eSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZURlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRGVzY3JpcHRpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlRGVzY3JpcHRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVRTmFtZSgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIFFOYW1lIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZVFOYW1lKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBMaXN0ZW5lciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVMaXN0ZW5lcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotIAotICAgIAotICAgIC8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKENvbW1vbkZhY3RvcnlUZXN0LmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmQ3NmY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLQotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpOwotCX0KLQkKLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U21hbGxJY29uKCkgewotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmdldFNtYWxsSWNvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U21hbGxJY29uKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdTbWFsbEljb24gPSAiIjsKLSAgICAgICAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuc2V0U21hbGxJY29uKG5ld1NtYWxsSWNvbik7Ci0gICAgfSAqLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X3NldFNtYWxsSWNvbkdlbigpIHsKLQotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA9ICBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3U21hbGxJY29uID0gIiI7Ci0gICAgICAgIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLnNldFNtYWxsSWNvbkdlbihuZXdTbWFsbEljb24pOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldExhcmdlSWNvbigpIHsKLQotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA9ICBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5nZXRMYXJnZUljb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldExhcmdlSWNvbigpIHsKLQotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA9ICBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3TGFyZ2VJY29uID0gIiI7Ci0gICAgICAgIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLnNldExhcmdlSWNvbihuZXdMYXJnZUljb24pOwotICAgIH0gKi8KLQotICAgLypwdWJsaWMgdm9pZCB0ZXN0X3NldExhcmdlSWNvbkdlbigpIHsKLQotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA9ICBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3TGFyZ2VJY29uID0gIiI7Ci0gICAgICAgIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLnNldExhcmdlSWNvbkdlbihuZXdMYXJnZUljb24pOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA9ICBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3RGVzY3JpcHRpb24gPSAiIjsKLSAgICAgICAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuc2V0RGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24pOwotICAgIH0KLSovCi0gICAKLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVzY3JpcHRpb25HZW4oKSB7Ci0KLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSAgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0Rlc2NyaXB0aW9uID0gIiI7Ci0gICAgICAgIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLnNldERlc2NyaXB0aW9uR2VuKG5ld0Rlc2NyaXB0aW9uKTsKLSAgICB9Ki8KLQotICAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGlzcGxheU5hbWUoKSB7Ci0KLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSAgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuZ2V0RGlzcGxheU5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERpc3BsYXlOYW1lKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEaXNwbGF5TmFtZSA9ICIiOwotICAgICAgICBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5zZXREaXNwbGF5TmFtZShuZXdEaXNwbGF5TmFtZSk7Ci0gICAgfSovCi0KLSAgIC8qcHVibGljIHZvaWQgdGVzdF9zZXREaXNwbGF5TmFtZUdlbigpIHsKLQotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA9ICBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3RGlzcGxheU5hbWUgPSAiIjsKLSAgICAgICAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuc2V0RGlzcGxheU5hbWVHZW4obmV3RGlzcGxheU5hbWUpOwotICAgIH0qLwotCi0gICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L0VqYlJlZlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L0VqYlJlZlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExMGFkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9FamJSZWZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLQotcHVibGljIGNsYXNzIEVqYlJlZlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFamJGYWN0b3J5IEVKQkZBQ1RPUlkgPSBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tbW9uRmFjdG9yeSBDT01NT05GQUNUT1JZID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotCQotCXByaXZhdGUgRWpiUmVmIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gQ09NTU9ORkFDVE9SWS5jcmVhdGVFamJSZWYoKTsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgdGVzdF9FamJSZWYoKSB7Ci0gICAgICAgIEVqYlJlZiB0bXBFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcEVqYlJlZik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRMaW5rZWRFamIoKSB7Ci0gICAgCQotICAgIAlFSkJKYXIgb2JqRUpCSmFyID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJKYXIoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBFSkJGQUNUT1JZLmNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvcigpOwotICAgICAgICBvYmpFSkJKYXIuc2V0QXNzZW1ibHlEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICAgCi0gICAgCUVqYlJlZiBlamJSZWYgPSBDT01NT05GQUNUT1JZLmNyZWF0ZUVqYlJlZigpOwotICAgIAlTZXNzaW9uIHNlc3Npb24xID0gRUpCRkFDVE9SWS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMSA9ICJOYW1lMSI7Ci0gICAgCXNlc3Npb24xLnNldE5hbWUobmFtZTEpOwotICAgIAkKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMiA9IEVKQkZBQ1RPUlkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTIgPSAiTmFtZTIiOwotICAgIAlzZXNzaW9uMi5zZXROYW1lKG5hbWUyKTsKLSAgICAJCi0gICAgCWVqYlJlZi5zZXRMaW5rKG5hbWUyKTsKLSAgICAJZWpiUmVmLnNldE5hbWUoIkVqYlJlZl8iICsgbmFtZTIpOwotICAgIAkKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMSk7Ci0gICAgCW9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbjIpOwotICAgICAgICBFbnRlcnByaXNlQmVhbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gZWpiUmVmLmdldExpbmtlZEVqYihvYmpFSkJKYXIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2Vzc2lvbjIscmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNFcXVpdmFsZW50KCkgewotCi0gICAgCUVKQkphciBvYmpFSkJKYXIgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQkphcigpOwotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IEVKQkZBQ1RPUlkuY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRBc3NlbWJseURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgICAKLSAgICAJRWpiUmVmIGVqYlJlZjEgPSBDT01NT05GQUNUT1JZLmNyZWF0ZUVqYlJlZigpOwotICAgIAlFamJSZWYgZWpiUmVmMiA9IENPTU1PTkZBQ1RPUlkuY3JlYXRlRWpiUmVmKCk7Ci0gICAgCVNlc3Npb24gc2Vzc2lvbjEgPSBFSkJGQUNUT1JZLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAJU3RyaW5nIG5hbWUxID0gIk5hbWUxIjsKLSAgICAJc2Vzc2lvbjEuc2V0TmFtZShuYW1lMSk7Ci0gICAgCQotICAgIAlTZXNzaW9uIHNlc3Npb24yID0gRUpCRkFDVE9SWS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMiA9ICJOYW1lMiI7Ci0gICAgCXNlc3Npb24yLnNldE5hbWUobmFtZTIpOwotICAgIAkKLSAgICAJZWpiUmVmMS5zZXRMaW5rKG5hbWUyKTsKLSAgICAJZWpiUmVmMS5zZXROYW1lKCJFamJSZWZfIiArIG5hbWUyKTsKLSAgICAJCi0gICAgCWVqYlJlZjIuc2V0TGluayhuYW1lMik7Ci0gICAgCWVqYlJlZjIuc2V0TmFtZSgiRWpiUmVmXyIgKyBuYW1lMik7Ci0gICAgCQotICAgIAlTdHJpbmcgaG9tZTEgPSAiaG9tZTEiOwotICAgIAlTdHJpbmcgaG9tZTIgPSAiaG9tZTIiIDsKLSAgICAJU3RyaW5nIHJlbW90ZTEgPSAicmVtb3RlMSIgOwotICAgIAlTdHJpbmcgcmVtb3RlMiA9ICJyZW1vdGUyIjsKLSAgICAJCi0gICAgCWVqYlJlZjEuc2V0SG9tZShob21lMSk7Ci0gICAgCWVqYlJlZjIuc2V0SG9tZShob21lMSk7Ci0gICAgCQotICAgIAllamJSZWYxLnNldFJlbW90ZShyZW1vdGUxKTsKLSAgICAJZWpiUmVmMi5zZXRSZW1vdGUocmVtb3RlMSk7Ci0gICAgCQotICAgIAlvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24xKTsKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMik7Ci0gICAgCQotICAgIAlib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gZWpiUmVmMS5pc0VxdWl2YWxlbnQoZWpiUmVmMik7CQotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBlamJSZWYyLnNldFJlbW90ZShyZW1vdGUyKTsKLSAgICAgICAgcmV0VmFsdWUgPSBlamJSZWYxLmlzRXF1aXZhbGVudChlamJSZWYyKTsJCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBlamJSZWYyLnNldFJlbW90ZShyZW1vdGUxKTsKLSAgICAgICAgZWpiUmVmMi5zZXRIb21lKGhvbWUyKTsKLSAgICAgICAgcmV0VmFsdWUgPSBlamJSZWYxLmlzRXF1aXZhbGVudChlamJSZWYyKTsJCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBlamJSZWYyLnNldEhvbWUoaG9tZTEpOwotICAgICAgICBlamJSZWYyLnNldExpbmsobmFtZTEpOwotICAgICAgICByZXRWYWx1ZSA9IGVqYlJlZjEuaXNFcXVpdmFsZW50KGVqYlJlZjIpOwkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIGVqYlJlZjIuc2V0TGluayhuYW1lMik7Ci0gICAgICAgIGVqYlJlZjIuc2V0TmFtZSgiRWpiUmVmXyIgKyBuYW1lMSk7Ci0gICAgICAgIHJldFZhbHVlID0gZWpiUmVmMS5pc0VxdWl2YWxlbnQoZWpiUmVmMik7CQotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTGlua2VkKCkgewotCi0gICAgCVNlc3Npb24gc2Vzc2lvbjEgPSBFSkJGQUNUT1JZLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAJU3RyaW5nIG5hbWUxID0gIk5hbWUxIjsKLSAgICAJc2Vzc2lvbjEuc2V0TmFtZShuYW1lMSk7Ci0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgIAotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiUmVmLmlzTGlua2VkKHNlc3Npb24xKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCBmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBvYmpFamJSZWYuc2V0TGluayhuYW1lMSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiUmVmLmlzTGlua2VkKHNlc3Npb24xKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNMb2NhbCgpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYlJlZi5pc0xvY2FsKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIEVKQkxvY2FsUmVmIG9iakxvY2FsUmVmID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZUVKQkxvY2FsUmVmKCk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTG9jYWxSZWYuaXNMb2NhbCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgfQotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYlJlZi5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXROYW1lKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3TmFtZSA9ICIiOwotICAgICAgICBvYmpFamJSZWYuc2V0TmFtZShuZXdOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFR5cGUoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVqYlJlZlR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYlJlZi5nZXRUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRUeXBlKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFamJSZWZUeXBlIG5ld1R5cGUgPSBudWxsOwotICAgICAgICBvYmpFamJSZWYuc2V0VHlwZShuZXdUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3Vuc2V0VHlwZSgpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqRWpiUmVmLnVuc2V0VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNTZXRUeXBlKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiUmVmLmlzU2V0VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SG9tZSgpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiUmVmLmdldEhvbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEhvbWUoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdIb21lID0gIiI7Ci0gICAgICAgIG9iakVqYlJlZi5zZXRIb21lKG5ld0hvbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVtb3RlKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuZ2V0UmVtb3RlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRSZW1vdGUoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdSZW1vdGUgPSAiIjsKLSAgICAgICAgb2JqRWpiUmVmLnNldFJlbW90ZShuZXdSZW1vdGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TGluaygpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiUmVmLmdldExpbmsoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldExpbmsoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMaW5rID0gIiI7Ci0gICAgICAgIG9iakVqYlJlZi5zZXRMaW5rKG5ld0xpbmspOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpFamJSZWYuc2V0RGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYlJlZi5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25zKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiUmVmLmdldERlc2NyaXB0aW9ucygpOwotICAgIH0qLwotICAgIAotICAgIC8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEVqYlJlZlRlc3QuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L0xpc3RlbmVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvTGlzdGVuZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MDg1ZWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvTGlzdGVuZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBMaXN0ZW5lclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIExpc3RlbmVyIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTGlzdGVuZXIoKTsKLQl9Ci0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldExpc3RlbmVyQ2xhc3MoKSB7Ci0gICAgICAgIExpc3RlbmVyIG9iakxpc3RlbmVyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSmF2YUNsYXNzIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpMaXN0ZW5lci5nZXRMaXN0ZW5lckNsYXNzKCk7Ci0gICAgfSAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TGlzdGVuZXJDbGFzcygpIHsKLQotICAgICAgICBMaXN0ZW5lciBvYmpMaXN0ZW5lciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEphdmFDbGFzcyBuZXdMaXN0ZW5lckNsYXNzID0gbnVsbDsKLSAgICAgICAgb2JqTGlzdGVuZXIuc2V0TGlzdGVuZXJDbGFzcyhuZXdMaXN0ZW5lckNsYXNzKTsKLSAgICB9Ki8KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRMaXN0ZW5lckNsYXNzTmFtZSgpIHsKLQotICAgICAgICBMaXN0ZW5lciBvYmpMaXN0ZW5lciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBsaXN0ZW5lckNsYXNzTmFtZSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXIxIiA7Ci0gICAgICAgIG9iakxpc3RlbmVyLnNldExpc3RlbmVyQ2xhc3NOYW1lKGxpc3RlbmVyQ2xhc3NOYW1lKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTGlzdGVuZXIuZ2V0TGlzdGVuZXJDbGFzc05hbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RlbmVyQ2xhc3NOYW1lLCByZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRMaXN0ZW5lckNsYXNzTmFtZSgpIHsKLQotICAgICAgICBMaXN0ZW5lciBvYmpMaXN0ZW5lciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBsaXN0ZW5lckNsYXNzTmFtZSA9ICJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTGlzdGVuZXIxIjsKLSAgICAgICAgb2JqTGlzdGVuZXIuc2V0TGlzdGVuZXJDbGFzc05hbWUobGlzdGVuZXJDbGFzc05hbWUpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpMaXN0ZW5lci5nZXRMaXN0ZW5lckNsYXNzTmFtZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdGVuZXJDbGFzc05hbWUsIHJldFZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoTGlzdGVuZXJUZXN0LmNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L1FOYW1lVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvUU5hbWVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNWJmODAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvUU5hbWVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBRTmFtZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBRTmFtZSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVFOYW1lKCk7Ci0JfQotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWVzcGFjZVVSSSgpIHsKLQotICAgICAgICBRTmFtZSBvYmpRTmFtZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9ialFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXROYW1lc3BhY2VVUkkoKSB7Ci0KLSAgICAgICAgUU5hbWUgb2JqUU5hbWUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3TmFtZXNwYWNlVVJJID0gIiI7Ci0gICAgICAgIG9ialFOYW1lLnNldE5hbWVzcGFjZVVSSShuZXdOYW1lc3BhY2VVUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9jYWxQYXJ0KCkgewotCi0gICAgICAgIFFOYW1lIG9ialFOYW1lID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqUU5hbWUuZ2V0TG9jYWxQYXJ0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRMb2NhbFBhcnQoKSB7Ci0KLSAgICAgICAgUU5hbWUgb2JqUU5hbWUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3TG9jYWxQYXJ0ID0gIiI7Ci0gICAgICAgIG9ialFOYW1lLnNldExvY2FsUGFydChuZXdMb2NhbFBhcnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29tYmluZWRRTmFtZSgpIHsKLQotICAgICAgICBRTmFtZSBvYmpRTmFtZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9ialFOYW1lLmdldENvbWJpbmVkUU5hbWUoKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29tYmluZWRRTmFtZSgpIHsKLQotICAgICAgICBRTmFtZSBvYmpRTmFtZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdDb21iaW5lZFFOYW1lID0gIiI7Ci0gICAgICAgIG9ialFOYW1lLnNldENvbWJpbmVkUU5hbWUobmV3Q29tYmluZWRRTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKSB7Ci0KLSAgICAgICAgUU5hbWUgb2JqUU5hbWUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRTmFtZS5nZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKTsKLSAgICB9Ci0KLSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCkgewotCi0gICAgICAgIFFOYW1lIG9ialFOYW1lID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0ludGVybmFsUHJlZml4T3JOc1VSSSA9ICIiOwotICAgICAgICBvYmpRTmFtZS5zZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkobmV3SW50ZXJuYWxQcmVmaXhPck5zVVJJKTsKLSAgICB9Ki8KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRWYWx1ZXMoKSB7Ci0KLSAgICAgICAgUU5hbWUgb2JqUU5hbWUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcHJlZml4ID0gInByZWZpeDEiOwotICAgICAgICBTdHJpbmcgbnNVUkkgPSAibnNVUkkxIjsKLSAgICAgICAgU3RyaW5nIGxvY2FsUGFydCA9ICJsb2NhbFBhcnQxIjsKLSAgICAgICAgb2JqUU5hbWUuc2V0VmFsdWVzKHByZWZpeCwgbnNVUkksIGxvY2FsUGFydCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwcmVmaXgsb2JqUU5hbWUuZ2V0SW50ZXJuYWxQcmVmaXhPck5zVVJJKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobnNVUkksb2JqUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMobG9jYWxQYXJ0LG9ialFOYW1lLmdldExvY2FsUGFydCgpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoUU5hbWVUZXN0LmNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Db21tb25FeGFtcGxlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvQ29tbW9uRXhhbXBsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzkzMGM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Db21tb25FeGFtcGxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21tb25FeGFtcGxlLmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkRpYWdub3N0aWNpYW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pLmltcGwuWE1JUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgc2FtcGxlIHV0aWxpdHkgZm9yIHRoZSAnPGVtPjxiPmNvbW1vbjwvYj48L2VtPicgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uRXhhbXBsZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBMb2FkIGFsbCB0aGUgYXJndW1lbnQgZmlsZSBwYXRocyBvciBVUklzIGFzIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIGFyZ3MgdGhlIGZpbGUgcGF0aHMgb3IgVVJJcy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQgdG8gaG9sZCB0aGUgcmVzb3VyY2VzLgotCQkvLwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IG5ldyBSZXNvdXJjZVNldEltcGwoKTsKLQkJCi0JCS8vIFJlZ2lzdGVyIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZSBmYWN0b3J5IHRvIGhhbmRsZSBhbGwgZmlsZSBleHRlbnRpb25zLgotCQkvLwotCQlyZXNvdXJjZVNldC5nZXRSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dAotCQkJKFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuREVGQVVMVF9FWFRFTlNJT04sIAotCQkJIG5ldyBYTUlSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCi0JCS8vIFJlZ2lzdGVyIHRoZSBwYWNrYWdlIHRvIGVuc3VyZSBpdCBpcyBhdmFpbGFibGUgZHVyaW5nIGxvYWRpbmcuCi0JCS8vCi0JCXJlc291cmNlU2V0LmdldFBhY2thZ2VSZWdpc3RyeSgpLnB1dAotCQkJKENvbW1vblBhY2thZ2UuZU5TX1VSSSwgCi0JCQkgQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpOwotICAgICAgICAKLQkJLy8gSWYgdGhlcmUgYXJlIG5vIGFyZ3VtZW50cywgZW1pdCBhbiBhcHByb3ByaWF0ZSB1c2FnZSBtZXNzYWdlLgotCQkvLwotCQlpZiAoYXJncy5sZW5ndGggPT0gMCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFbnRlciBhIGxpc3Qgb2YgZmlsZSBwYXRocyBvciBVUklzIHRoYXQgaGF2ZSBjb250ZW50IGxpa2UgdGhpczoiKTsKLQkJCXRyeSB7Ci0JCQkJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCJodHRwOi8vL015LmNvbW1vbiIpKTsKLQkJCQlFamJSZWYgcm9vdCA9IENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVqYlJlZigpOwotCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKHJvb3QpOwotCQkJCXJlc291cmNlLnNhdmUoU3lzdGVtLm91dCwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgYXJndW1lbnRzLgotCQkJLy8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkgewotCQkJCS8vIENvbnN0cnVjdCB0aGUgVVJJIGZvciB0aGUgaW5zdGFuY2UgZmlsZS4KLQkJCQkvLyBUaGUgYXJndW1lbnQgaXMgdHJlYXRlZCBhcyBhIGZpbGUgcGF0aCBvbmx5IGlmIGl0IGRlbm90ZXMgYW4gZXhpc3RpbmcgZmlsZS4KLQkJCQkvLyBPdGhlcndpc2UsIGl0J3MgZGlyZWN0bHkgdHJlYXRlZCBhcyBhIFVSTC4KLQkJCQkvLwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGFyZ3NbMF0pOwotCQkJCVVSSSB1cmkgPSBmaWxlLmlzRmlsZSgpID8gVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk6IFVSSS5jcmVhdGVVUkkoYXJnc1swXSk7Ci0KLQkJCQl0cnkgewotCQkJCQkvLyBEZW1hbmQgbG9hZCByZXNvdXJjZSBmb3IgdGhpcyBmaWxlLgotCQkJCQkvLwotCQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGVkICIgKyB1cmkpOwotCi0JCQkJCS8vIFZhbGlkYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgbG9hZGVkIHJlc291cmNlLgotCQkJCQkvLwotCQkJCQlmb3IgKEl0ZXJhdG9yIGogPSByZXNvdXJjZS5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApIHsKLQkJCQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KWoubmV4dCgpOwotCQkJCQkJRGlhZ25vc3RpYyBkaWFnbm9zdGljID0gRGlhZ25vc3RpY2lhbi5JTlNUQU5DRS52YWxpZGF0ZShlT2JqZWN0KTsKLQkJCQkJCWlmIChkaWFnbm9zdGljLmdldFNldmVyaXR5KCkgIT0gRGlhZ25vc3RpYy5PSykgewotCQkJCQkJCXByaW50RGlhZ25vc3RpYyhkaWFnbm9zdGljLCAiIik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSBsb2FkaW5nICIgKyB1cmkpOwotCQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogUHJpbnRzIGRpYWdub3N0aWNzIHdpdGggaW5kZW50YXRpb24uCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIGRpYWdub3N0aWMgdGhlIGRpYWdub3N0aWMgdG8gcHJpbnQuCi0JICogQHBhcmFtIGluZGVudCB0aGUgaW5kZW50YXRpb24gZm9yIHByaW50aW5nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcHJpbnREaWFnbm9zdGljKERpYWdub3N0aWMgZGlhZ25vc3RpYywgU3RyaW5nIGluZGVudCkgewotCQlTeXN0ZW0ub3V0LnByaW50KGluZGVudCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihkaWFnbm9zdGljLmdldE1lc3NhZ2UoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCQlwcmludERpYWdub3N0aWMoKERpYWdub3N0aWMpaS5uZXh0KCksIGluZGVudCArICIgICIpOwotCQl9Ci0JfQotCi19IC8vQ29tbW9uRXhhbXBsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0NvbW1vblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvQ29tbW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxZTkzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvQ29tbW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogQ29tbW9uVGVzdHMuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3Qgc3VpdGUgZm9yIHRoZSAnPGVtPjxiPmNvbW1vbjwvYj48L2VtPicgcGFja2FnZS4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgQ29tbW9uVGVzdHMoImNvbW1vbiBUZXN0cyIpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbW1vblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotfSAvL0NvbW1vblRlc3RzCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNGFkMjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q29tcGF0aWJpbGl0eSBEZXNjcmlwdGlvbiBHcm91cDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdCBleHRlbmRzIERlc2NyaXB0aW9uR3JvdXBUZXN0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBDb21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBDb21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiAoQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXApZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9EZXNjcmlwdGlvbkdyb3VwVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0Rlc2NyaXB0aW9uR3JvdXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZjAyNzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0Rlc2NyaXB0aW9uR3JvdXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlc2NyaXB0aW9uR3JvdXBUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRpb24gR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvbkdyb3VwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBEZXNjcmlwdGlvbiBHcm91cCB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0aW9uR3JvdXAgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKERlc2NyaXB0aW9uR3JvdXBUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IERlc2NyaXB0aW9uIEdyb3VwIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdGlvbkdyb3VwVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIERlc2NyaXB0aW9uIEdyb3VwIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKERlc2NyaXB0aW9uR3JvdXAgZml4dHVyZSkgewotCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRGVzY3JpcHRpb24gR3JvdXAgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGVzY3JpcHRpb25Hcm91cCBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbkdyb3VwKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL0Rlc2NyaXB0aW9uR3JvdXBUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRGVzY3JpcHRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRGVzY3JpcHRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYTNkOGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0Rlc2NyaXB0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBEZXNjcmlwdGlvblRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgRGVzY3JpcHRpb24gdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEZXNjcmlwdGlvbiBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oRGVzY3JpcHRpb25UZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IERlc2NyaXB0aW9uIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEZXNjcmlwdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEZXNjcmlwdGlvbiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShEZXNjcmlwdGlvbiBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEZXNjcmlwdGlvbiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEZXNjcmlwdGlvbiBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9EZXNjcmlwdGlvblRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9EaXNwbGF5TmFtZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9EaXNwbGF5TmFtZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI4MDM5MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRGlzcGxheU5hbWVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERpc3BsYXlOYW1lVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EaXNwbGF5TmFtZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EaXNwbGF5IE5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNwbGF5TmFtZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgRGlzcGxheSBOYW1lIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGlzcGxheU5hbWUgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKERpc3BsYXlOYW1lVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBEaXNwbGF5IE5hbWUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERpc3BsYXlOYW1lVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIERpc3BsYXkgTmFtZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShEaXNwbGF5TmFtZSBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEaXNwbGF5IE5hbWUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRGlzcGxheU5hbWUgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRGlzcGxheU5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vRGlzcGxheU5hbWVUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRUpCTG9jYWxSZWZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRUpCTG9jYWxSZWZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNDNkNGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0VKQkxvY2FsUmVmVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFSkJMb2NhbFJlZlRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RUpCIExvY2FsIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVKQkxvY2FsUmVmVGVzdCBleHRlbmRzIEVqYlJlZlRlc3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oRUpCTG9jYWxSZWZUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEVKQiBMb2NhbCBSZWYgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVKQkxvY2FsUmVmVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEVKQiBMb2NhbCBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUpCTG9jYWxSZWYgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIChFSkJMb2NhbFJlZilmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVKQkxvY2FsUmVmKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL0VKQkxvY2FsUmVmVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0VqYlJlZlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9FamJSZWZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTg3ZTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0VqYlJlZlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRWpiUmVmVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWpiIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVqYlJlZlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgRWpiIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVqYlJlZiBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oRWpiUmVmVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBFamIgUmVmIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFamJSZWZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRWpiIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShFamJSZWYgZml4dHVyZSkgewotCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRWpiIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFamJSZWYgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWpiUmVmKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL0VqYlJlZlRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9FbnZFbnRyeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9FbnZFbnRyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyYzBiZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRW52RW50cnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVudkVudHJ5VGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnYgRW50cnk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnZFbnRyeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgRW52IEVudHJ5IHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRW52RW50cnkgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKEVudkVudHJ5VGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBFbnYgRW50cnkgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudkVudHJ5VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIEVudiBFbnRyeSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShFbnZFbnRyeSBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBFbnYgRW50cnkgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRW52RW50cnkgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRW52RW50cnkoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vRW52RW50cnlUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvSWNvblR5cGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvSWNvblR5cGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYmJmZTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0ljb25UeXBlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBJY29uVHlwZVRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SWNvbiBUeXBlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSWNvblR5cGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIEljb24gVHlwZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEljb25UeXBlIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihJY29uVHlwZVRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgSWNvbiBUeXBlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJY29uVHlwZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBJY29uIFR5cGUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoSWNvblR5cGUgZml4dHVyZSkgewotCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgSWNvbiBUeXBlIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEljb25UeXBlIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUljb25UeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL0ljb25UeXBlVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0lkZW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0lkZW50aXR5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODgwZGZmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9JZGVudGl0eVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogSWRlbnRpdHlUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLklkZW50aXR5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPklkZW50aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSWRlbnRpdHlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIElkZW50aXR5IHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSWRlbnRpdHkgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKElkZW50aXR5VGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBJZGVudGl0eSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgSWRlbnRpdHkgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoSWRlbnRpdHkgZml4dHVyZSkgewotCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgSWRlbnRpdHkgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSWRlbnRpdHkgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWRlbnRpdHkoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vSWRlbnRpdHlUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvSk5ESUVudlJlZnNHcm91cFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9KTkRJRW52UmVmc0dyb3VwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDQxYzAyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9KTkRJRW52UmVmc0dyb3VwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBKTkRJRW52UmVmc0dyb3VwVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSk5ESUVudlJlZnNHcm91cDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5KTkRJIEVudiBSZWZzIEdyb3VwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSk5ESUVudlJlZnNHcm91cFRlc3QgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QgewotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgSk5ESSBFbnYgUmVmcyBHcm91cCB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSk5ESUVudlJlZnNHcm91cFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBKTkRJIEVudiBSZWZzIEdyb3VwIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEpORElFbnZSZWZzR3JvdXAgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIChKTkRJRW52UmVmc0dyb3VwKWZpeHR1cmU7Ci0JfQotCi19IC8vSk5ESUVudlJlZnNHcm91cFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9MaXN0ZW5lclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9MaXN0ZW5lclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBjYmE1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvTGlzdGVuZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IExpc3RlbmVyVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5MaXN0ZW5lcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIExpc3RlbmVyVGVzdCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihMaXN0ZW5lclRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgTGlzdGVuZXIgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExpc3RlbmVyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIExpc3RlbmVyIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExpc3RlbmVyIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiAoTGlzdGVuZXIpZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaXN0ZW5lcigpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9MaXN0ZW5lclRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9NZXNzYWdlRGVzdGluYXRpb25SZWZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvTWVzc2FnZURlc3RpbmF0aW9uUmVmVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTRhNjgyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9NZXNzYWdlRGVzdGluYXRpb25SZWZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1lc3NhZ2VEZXN0aW5hdGlvblJlZlRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uUmVmOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb24gUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZURlc3RpbmF0aW9uUmVmVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBNZXNzYWdlIERlc3RpbmF0aW9uIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oTWVzc2FnZURlc3RpbmF0aW9uUmVmVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBNZXNzYWdlIERlc3RpbmF0aW9uIFJlZiB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uUmVmVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIE1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBNZXNzYWdlIERlc3RpbmF0aW9uIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlRGVzdGluYXRpb25SZWYgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL01lc3NhZ2VEZXN0aW5hdGlvblJlZlRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9NZXNzYWdlRGVzdGluYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvTWVzc2FnZURlc3RpbmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGJlZjQwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9NZXNzYWdlRGVzdGluYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IE1lc3NhZ2VEZXN0aW5hdGlvblRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1lc3NhZ2UgRGVzdGluYXRpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRGVzdGluYXRpb25UZXN0IGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKE1lc3NhZ2VEZXN0aW5hdGlvblRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgTWVzc2FnZSBEZXN0aW5hdGlvbiB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWVzc2FnZURlc3RpbmF0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIE1lc3NhZ2UgRGVzdGluYXRpb24gdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTWVzc2FnZURlc3RpbmF0aW9uIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiAoTWVzc2FnZURlc3RpbmF0aW9uKWZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL01lc3NhZ2VEZXN0aW5hdGlvblRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9QYXJhbVZhbHVlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1BhcmFtVmFsdWVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNjgzMjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1BhcmFtVmFsdWVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFBhcmFtVmFsdWVUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UGFyYW0gVmFsdWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJhbVZhbHVlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBQYXJhbSBWYWx1ZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFBhcmFtVmFsdWUgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKFBhcmFtVmFsdWVUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IFBhcmFtIFZhbHVlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQYXJhbVZhbHVlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFBhcmFtIFZhbHVlIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFBhcmFtVmFsdWUgZml4dHVyZSkgewotCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUGFyYW0gVmFsdWUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUGFyYW1WYWx1ZSBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJhbVZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL1BhcmFtVmFsdWVUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUU5hbWVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUU5hbWVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwODhiMWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1FOYW1lVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBRTmFtZVRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUU5hbWU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UU5hbWU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBRTmFtZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgUU5hbWUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBRTmFtZSBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oUU5hbWVUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IFFOYW1lIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBRTmFtZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBRTmFtZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShRTmFtZSBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBRTmFtZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBRTmFtZSBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9RTmFtZVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9SZXNvdXJjZUVudlJlZlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9SZXNvdXJjZUVudlJlZlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViYzQ3MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUmVzb3VyY2VFbnZSZWZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlc291cmNlRW52UmVmVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBFbnYgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VFbnZSZWZUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFJlc291cmNlIEVudiBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZUVudlJlZiBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oUmVzb3VyY2VFbnZSZWZUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IFJlc291cmNlIEVudiBSZWYgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlRW52UmVmVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFJlc291cmNlIEVudiBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoUmVzb3VyY2VFbnZSZWYgZml4dHVyZSkgewotCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUmVzb3VyY2UgRW52IFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBSZXNvdXJjZUVudlJlZiBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXNvdXJjZUVudlJlZigpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9SZXNvdXJjZUVudlJlZlRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9SZXNvdXJjZVJlZlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9SZXNvdXJjZVJlZlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiNjAxZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUmVzb3VyY2VSZWZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJlc291cmNlUmVmVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5SZXNvdXJjZSBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZVJlZlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgUmVzb3VyY2UgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUmVzb3VyY2VSZWYgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKFJlc291cmNlUmVmVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBSZXNvdXJjZSBSZWYgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJlc291cmNlUmVmVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFJlc291cmNlIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShSZXNvdXJjZVJlZiBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBSZXNvdXJjZSBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgUmVzb3VyY2VSZWYgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUmVzb3VyY2VSZWYoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vUmVzb3VyY2VSZWZUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUnVuQXNTcGVjaWZpZWRJZGVudGl0eVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9SdW5Bc1NwZWNpZmllZElkZW50aXR5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTMzOTA2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9SdW5Bc1NwZWNpZmllZElkZW50aXR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBSdW5Bc1NwZWNpZmllZElkZW50aXR5VGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SdW5Bc1NwZWNpZmllZElkZW50aXR5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJ1biBBcyBTcGVjaWZpZWQgSWRlbnRpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSdW5Bc1NwZWNpZmllZElkZW50aXR5VGVzdCBleHRlbmRzIFNlY3VyaXR5SWRlbnRpdHlUZXN0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IFJ1biBBcyBTcGVjaWZpZWQgSWRlbnRpdHkgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUnVuIEFzIFNwZWNpZmllZCBJZGVudGl0eSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBSdW5Bc1NwZWNpZmllZElkZW50aXR5IGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiAoUnVuQXNTcGVjaWZpZWRJZGVudGl0eSlmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vUnVuQXNTcGVjaWZpZWRJZGVudGl0eVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9TZWN1cml0eUlkZW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1NlY3VyaXR5SWRlbnRpdHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OTY0NTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1NlY3VyaXR5SWRlbnRpdHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFNlY3VyaXR5SWRlbnRpdHlUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2VjdXJpdHkgSWRlbnRpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eUlkZW50aXR5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBTZWN1cml0eSBJZGVudGl0eSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3VyaXR5SWRlbnRpdHkgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKFNlY3VyaXR5SWRlbnRpdHlUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IFNlY3VyaXR5IElkZW50aXR5IHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTZWN1cml0eUlkZW50aXR5VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNlY3VyaXR5IElkZW50aXR5IHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFNlY3VyaXR5SWRlbnRpdHkgZml4dHVyZSkgewotCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU2VjdXJpdHkgSWRlbnRpdHkgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2VjdXJpdHlJZGVudGl0eSBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN1cml0eUlkZW50aXR5KCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL1NlY3VyaXR5SWRlbnRpdHlUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvU2VjdXJpdHlSb2xlUmVmVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1NlY3VyaXR5Um9sZVJlZlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0YjYzMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvU2VjdXJpdHlSb2xlUmVmVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTZWN1cml0eVJvbGVSZWZUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZVJlZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZWN1cml0eSBSb2xlIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5Um9sZVJlZlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgU2VjdXJpdHkgUm9sZSBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZWN1cml0eVJvbGVSZWYgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKFNlY3VyaXR5Um9sZVJlZlRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgU2VjdXJpdHkgUm9sZSBSZWYgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3VyaXR5Um9sZVJlZlRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTZWN1cml0eSBSb2xlIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShTZWN1cml0eVJvbGVSZWYgZml4dHVyZSkgewotCQl0aGlzLmZpeHR1cmUgPSBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU2VjdXJpdHkgUm9sZSBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2VjdXJpdHlSb2xlUmVmIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3VyaXR5Um9sZVJlZigpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9TZWN1cml0eVJvbGVSZWZUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvU2VjdXJpdHlSb2xlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1NlY3VyaXR5Um9sZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExNGEzZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvU2VjdXJpdHlSb2xlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBTZWN1cml0eVJvbGVUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZWN1cml0eSBSb2xlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlSb2xlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBTZWN1cml0eSBSb2xlIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlSb2xlIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihTZWN1cml0eVJvbGVUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IFNlY3VyaXR5IFJvbGUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3VyaXR5Um9sZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTZWN1cml0eSBSb2xlIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFNlY3VyaXR5Um9sZSBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTZWN1cml0eSBSb2xlIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFNlY3VyaXR5Um9sZSBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZWN1cml0eVJvbGUoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vU2VjdXJpdHlSb2xlVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1VzZUNhbGxlcklkZW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1VzZUNhbGxlcklkZW50aXR5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2NiM2E4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Vc2VDYWxsZXJJZGVudGl0eVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogVXNlQ2FsbGVySWRlbnRpdHlUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlVzZUNhbGxlcklkZW50aXR5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlVzZSBDYWxsZXIgSWRlbnRpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VDYWxsZXJJZGVudGl0eVRlc3QgZXh0ZW5kcyBTZWN1cml0eUlkZW50aXR5VGVzdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihVc2VDYWxsZXJJZGVudGl0eVRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgVXNlIENhbGxlciBJZGVudGl0eSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVXNlQ2FsbGVySWRlbnRpdHlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgVXNlIENhbGxlciBJZGVudGl0eSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBVc2VDYWxsZXJJZGVudGl0eSBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gKFVzZUNhbGxlcklkZW50aXR5KWZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlVXNlQ2FsbGVySWRlbnRpdHkoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vVXNlQ2FsbGVySWRlbnRpdHlUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2FwaS90ZXN0L0FsbENvcmVBUElUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9hcGkvdGVzdC9BbGxDb3JlQVBJVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkMDEzMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2FwaS90ZXN0L0FsbENvcmVBUElUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuYXBpLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5hcGkuQWxsQVBJVGVzdDsKLQotLyoqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQWxsQ29yZUFQSVRlc3RzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3IgSjJFRSBDb3JlIEFwaSBUZXN0Iik7Ci0gICAgICAgIC8vJEpVbml0LUJFR0lOJAotCQlzdWl0ZS5hZGRUZXN0KEFsbEFQSVRlc3Quc3VpdGUoKSk7Ci0KLQkJLy8kSlVuaXQtRU5EJAotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCWp1bml0LnRleHR1aS5UZXN0UnVubmVyLm1haW4obmV3IFN0cmluZ1tdIHsgQWxsQ29yZUFQSVRlc3RzLmNsYXNzLmdldE5hbWUoKSB9KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvYXBpL3Rlc3QvQXV0b21hdGVkQVBJQlZULmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2FwaS90ZXN0L0F1dG9tYXRlZEFQSUJWVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTI0YWZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvYXBpL3Rlc3QvQXV0b21hdGVkQVBJQlZULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5hcGkudGVzdDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkQVBJQlZUIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VEaXJlY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJjb21tb25BcmNoaXZlUmVzb3VyY2VzIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotICAgIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzIik7Ci0gICAgICAgICAgICBVUkwgdXJsID0gcGx1Z2luRGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCk7IAotICAgICAgICAJQXV0b21hdGVkQVBJQlZULmJhc2VEaXJlY3RvcnkgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCkuZ2V0RmlsZSgpICsgImNvbW1vbkFyY2hpdmVSZXNvdXJjZXMiKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgCi0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVzaW5nIHdvcmtpbmcgZGlyZWN0b3J5IHNpbmNlIGEgd29ya3NwYWNlIFVSTCBjb3VsZCBub3QgYmUgbG9jYXRlZC4iKTsKLQkJfSAKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCB1bmltcGxlbWVudGVkTWV0aG9kczsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdW5pbXBsZW1lbnRlZE1ldGhvZHMgPSAwOwotICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgICAgICAgaWYgKHVuaW1wbGVtZW50ZWRNZXRob2RzID4gMCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkNhbGxzIHRvIHdhcm5VbmltcGw6ICIgKyB1bmltcGxlbWVudGVkTWV0aG9kcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQXV0b21hdGVkQVBJQlZUKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSAoVGVzdFN1aXRlKSBBdXRvbWF0ZWRBUElCVlQuc3VpdGUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWl0ZS50ZXN0Q291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBhZGRUZXN0KHN1aXRlLnRlc3RBdChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuYXBpLmJ2dCIpOwotICAgICAgICAvLyRKVW5pdC1CRUdJTiQKLSAgICAgICAgc3VpdGUuYWRkVGVzdChBbGxDb3JlQVBJVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIC8vJEpVbml0LUVORCQKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvYXBpL0FsbEFQSVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvYXBpL0FsbEFQSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFhMThjMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL2FwaS9BbGxBUElUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTgsIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYXBpOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLnRlc3QuQXBwbGljYXRpb25GYWN0b3J5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi50ZXN0LkFwcGxpY2F0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQudGVzdC5BcHBsaWNhdGlvbkNsaWVudFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LnRlc3QuQ2xpZW50RmFjdG9yeVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3QuQ29tbW9uRmFjdG9yeVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3QuRWpiUmVmVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdC5MaXN0ZW5lclRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3QuUU5hbWVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0LkFzc2VtYmx5RGVzY3JpcHRvclRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuQ01QQXR0cmlidXRlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5DTVJGaWVsZFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuQ29udGFpbmVyTWFuYWdlZEVudGl0eVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuRUpCUmVsYXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0LkVKQlJlbGF0aW9uc2hpcFJvbGVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0LkVqYkZhY3RvcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0LkVudGl0eVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuTWV0aG9kRWxlbWVudFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuTWV0aG9kUGVybWlzc2lvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuUXVlcnlNZXRob2RUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0LlF1ZXJ5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5TZXNzaW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudGVzdC5Db25uZWN0b3JUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS50ZXN0LkpjYUZhY3RvcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC50ZXN0LkpzcEZhY3RvcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLnRlc3QuV2ViYXBwbGljYXRpb25GYWN0b3J5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLnRlc3QuV3Njb21tb25GYWN0b3J5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQudGVzdC5Xc2RkRmFjdG9yeVRlc3Q7Ci0KLQotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxBUElUZXN0ICBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQkgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCl7Ci0gICAgICAgIHJldHVybiBuZXcgQWxsQVBJVGVzdCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQWxsQVBJVGVzdCgpewotICAgICAgICBzdXBlcigiSjJFRSBDb3JlIEFQSSBUZXN0cyIpOwotICAgICAgICBhZGRUZXN0KEFwcGxpY2F0aW9uRmFjdG9yeVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoQXBwbGljYXRpb25UZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEFwcGxpY2F0aW9uQ2xpZW50VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChDbGllbnRGYWN0b3J5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChDb21tb25GYWN0b3J5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChFamJSZWZUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KExpc3RlbmVyVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChRTmFtZVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoQXNzZW1ibHlEZXNjcmlwdG9yVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChDTVBBdHRyaWJ1dGVUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KENNUkZpZWxkVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChDb250YWluZXJNYW5hZ2VkRW50aXR5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChFamJGYWN0b3J5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChFSkJSZWxhdGlvbnNoaXBSb2xlVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChFSkJSZWxhdGlvblRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoRW50aXR5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChNZXRob2RFbGVtZW50VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChNZXRob2RQZXJtaXNzaW9uVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChRdWVyeU1ldGhvZFRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoUXVlcnlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KFNlc3Npb25UZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KENvbm5lY3RvclRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoSmNhRmFjdG9yeVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoSnNwRmFjdG9yeVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoV2ViYXBwbGljYXRpb25GYWN0b3J5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChXc2NvbW1vbkZhY3RvcnlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KFdzZGRGYWN0b3J5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgCi0gICAgfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvQXNzZW1ibHlEZXNjcmlwdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvQXNzZW1ibHlEZXNjcmlwdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODc2ZTQyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0Fzc2VtYmx5RGVzY3JpcHRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Bc3NlbWJseURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRlcnByaXNlQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBBc3NlbWJseURlc2NyaXB0b3JUZXN0IGV4dGVuZHMgRWpiRU1GVGVzdEJhc2UgewotCi0gICAgLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQXNzZW1ibHlEZXNjcmlwdG9yVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCQotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kUGVybWlzc2lvbk1ldGhvZEVsZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWluaXQoKTsKLQkJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gREQuZ2V0RUpCSmFyKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoYXNzZW1ibHlEZXNjcmlwdG9yKTsKLQkJTGlzdCBlbnRlcnByaXNlQmVhbnMgPSBERC5nZXRFSkJKYXIoKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJRW50ZXJwcmlzZUJlYW4gZWIxID0gKEVudGVycHJpc2VCZWFuKWVudGVycHJpc2VCZWFucy5nZXQoMCk7Ci0JCUxpc3QgbWV0aG9kUGVybWlzc2lvbkxpc3QgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kUGVybWlzc2lvbk1ldGhvZEVsZW1lbnRzKGViMSk7Ci0JCQotCQkKLQkJTGlzdCBhbGxNZXRob2RFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBwZXJtaXNzaW9ucyA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RQZXJtaXNzaW9ucygpOwotCQlNZXRob2RQZXJtaXNzaW9uIHBlcm1pc3Npb247Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGVybWlzc2lvbnMuc2l6ZSgpOyBpKyspewotCQkJcGVybWlzc2lvbiA9IChNZXRob2RQZXJtaXNzaW9uKSBwZXJtaXNzaW9ucy5nZXQoaSk7Ci0JCQlhbGxNZXRob2RFbGVtZW50cy5hZGRBbGwocGVybWlzc2lvbi5nZXRNZXRob2RFbGVtZW50cyhlYjEpKTsgCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZFBlcm1pc3Npb25MaXN0LGFsbE1ldGhvZEVsZW1lbnRzKTsKLQkJCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBleHBlY3RlZAotCSAqIEBwYXJhbSBhY3R1YWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKExpc3QgZXhwZWN0ZWQsIExpc3QgYWN0dWFsKSB7Ci0JCWFzc2VydEVxdWFscyhhY3R1YWwuc2l6ZSgpLCBleHBlY3RlZC5zaXplKCkpOwotCQlmb3IgKGludCB4PTA7IHg8IGV4cGVjdGVkLnNpemUoKTsgKyt4KSB7Ci0JCQlPYmplY3QgbyA9IGV4cGVjdGVkLmdldCh4KTsKLQkJCWFzc2VydEVxdWFscyhhY3R1YWwuY29udGFpbnMobyksIHRydWUpOwotCQl9Ci0KLQl9Ci0JCi0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBc3NlbWJseURlc2NyaXB0b3JUZXN0KCJ0ZXN0X2dldE1ldGhvZFBlcm1pc3Npb25NZXRob2RFbGVtZW50cyIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXNzZW1ibHlEZXNjcmlwdG9yVGVzdCgidGVzdF9nZXRNZXRob2RUcmFuc2FjdGlvbk1ldGhvZEVsZW1lbnRzIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBc3NlbWJseURlc2NyaXB0b3JUZXN0KCJ0ZXN0X2dldFNlY3VyaXR5Um9sZU5hbWVkIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBc3NlbWJseURlc2NyaXB0b3JUZXN0KCJ0ZXN0X3JlbmFtZVNlY3VyaXR5Um9sZSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXNzZW1ibHlEZXNjcmlwdG9yVGVzdCgidGVzdF9yZW1vdmVEYXRhIikpOwotCQkKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQkKLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kUGVybWlzc2lvbigpIHsKLQotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3Igb2JqQXNzZW1ibHlEZXNjcmlwdG9yID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTGlzdCBzZWN1cml0eVJvbGVzTGlzdCA9IG51bGw7Ci0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFzc2VtYmx5RGVzY3JpcHRvcgotICAgICAgICAgICAgICAgIC5nZXRNZXRob2RQZXJtaXNzaW9uKHNlY3VyaXR5Um9sZXNMaXN0KTsKLSAgICB9ICovCi0KLSAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kVHJhbnNhY3Rpb25NZXRob2RFbGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlpbml0KCk7Ci0gICAgCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IERELmdldEVKQkphcigpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQlhc3NlcnROb3ROdWxsKGFzc2VtYmx5RGVzY3JpcHRvcik7Ci0JCUxpc3QgZW50ZXJwcmlzZUJlYW5zID0gREQuZ2V0RUpCSmFyKCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCUVudGVycHJpc2VCZWFuIGViMSA9IChFbnRlcnByaXNlQmVhbillbnRlcnByaXNlQmVhbnMuZ2V0KDApOwotCQlMaXN0IG1ldGhvZFRyYW5zYWN0aW9uTGlzdCA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RUcmFuc2FjdGlvbk1ldGhvZEVsZW1lbnRzKGViMSk7Ci0JCQotCQkKLQkJTGlzdCBhbGxNZXRob2RFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB0cmFuc2FjdGlvbnMgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCk7Ci0JCU1ldGhvZFRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRyYW5zYWN0aW9ucy5zaXplKCk7IGkrKyl7Ci0JCQl0cmFuc2FjdGlvbiA9IChNZXRob2RUcmFuc2FjdGlvbikgdHJhbnNhY3Rpb25zLmdldChpKTsKLQkJCWFsbE1ldGhvZEVsZW1lbnRzLmFkZEFsbCh0cmFuc2FjdGlvbi5nZXRNZXRob2RFbGVtZW50cyhlYjEpKTsgCi0JCX0KLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZFRyYW5zYWN0aW9uTGlzdCxhbGxNZXRob2RFbGVtZW50cyk7Ci0gICAgfQotCi0KLQotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VjdXJpdHlSb2xlTmFtZWQoKXRocm93cyBFeGNlcHRpb24gewotCQlpbml0KCk7Ci0JCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IERELmdldEVKQkphcigpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQlhc3NlcnROb3ROdWxsKGFzc2VtYmx5RGVzY3JpcHRvcik7Ci0JCVNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGU9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLQkJU3RyaW5nIHNlY3VyaXR5Um9sZU5hbWUgPSAidGVzdFJvbGUiOwotCQlzZWN1cml0eVJvbGUuc2V0Um9sZU5hbWUoc2VjdXJpdHlSb2xlTmFtZSk7Ci0JCWFzc2VtYmx5RGVzY3JpcHRvci5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZSk7Ci0JCVNlY3VyaXR5Um9sZSByZXRWYWx1ZSA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRTZWN1cml0eVJvbGVOYW1lZChzZWN1cml0eVJvbGVOYW1lKSA7Ci0JCWFzc2VydEVxdWFscyhyZXRWYWx1ZSxzZWN1cml0eVJvbGUpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVuYW1lU2VjdXJpdHlSb2xlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCWluaXQoKTsKLSAgICAJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gREQuZ2V0RUpCSmFyKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoYXNzZW1ibHlEZXNjcmlwdG9yKTsKLQkJU3RyaW5nIHNlY3VyaXR5Um9sZU5hbWUgPSAidGVzdFJvbGUiOwotCQkKLQkJU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCQkKLQkJc2VjdXJpdHlSb2xlLnNldFJvbGVOYW1lKHNlY3VyaXR5Um9sZU5hbWUpOwotCQlhc3NlbWJseURlc2NyaXB0b3IuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChzZWN1cml0eVJvbGUpOwotCQlTdHJpbmcgbmV3U2VjdXJpdHlSb2xlTmFtZSA9ICJuZXdUZXN0Um9sZSIgOwotCQlTZWN1cml0eVJvbGUgcmV0VmFsdWUgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0U2VjdXJpdHlSb2xlTmFtZWQobmV3U2VjdXJpdHlSb2xlTmFtZSkgOwotCQlhc3NlcnROdWxsKHJldFZhbHVlKTsKLQkJYXNzZW1ibHlEZXNjcmlwdG9yLnJlbmFtZVNlY3VyaXR5Um9sZShzZWN1cml0eVJvbGVOYW1lLAotCQkJCQluZXdTZWN1cml0eVJvbGVOYW1lKTsKLQkJcmV0VmFsdWUgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0U2VjdXJpdHlSb2xlTmFtZWQobmV3U2VjdXJpdHlSb2xlTmFtZSkgOwotCQlhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLQkJCi0gICAgfQotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldE1ldGhvZFBlcm1pc3Npb25zKCkgewotCi0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBvYmpBc3NlbWJseURlc2NyaXB0b3IgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFBlcm1pc3Npb25zKCk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCkgewotCi0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBvYmpBc3NlbWJseURlc2NyaXB0b3IgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFRyYW5zYWN0aW9ucygpOwotICAgIH0gKi8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRFamJKYXIoKSB7Ci0KLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG9iakFzc2VtYmx5RGVzY3JpcHRvciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQkphciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXNzZW1ibHlEZXNjcmlwdG9yLmdldEVqYkphcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RWpiSmFyKCkgewotCi0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBvYmpBc3NlbWJseURlc2NyaXB0b3IgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFSkJKYXIgbmV3RWpiSmFyID0gbnVsbDsKLSAgICAgICAgb2JqQXNzZW1ibHlEZXNjcmlwdG9yLnNldEVqYkphcihuZXdFamJKYXIpOwotICAgIH0gKi8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRTZWN1cml0eVJvbGVzKCkgewotCi0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBvYmpBc3NlbWJseURlc2NyaXB0b3IgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXNzZW1ibHlEZXNjcmlwdG9yLmdldFNlY3VyaXR5Um9sZXMoKTsKLSAgICB9Ki8KLQotIC8qICAgcHVibGljIHZvaWQgdGVzdF9nZXRFeGNsdWRlTGlzdCgpIHsKLQotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3Igb2JqQXNzZW1ibHlEZXNjcmlwdG9yID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRXhjbHVkZUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFzc2VtYmx5RGVzY3JpcHRvci5nZXRFeGNsdWRlTGlzdCgpOwotICAgIH0gKi8KLQotICAgCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RXhjbHVkZUxpc3QoKSB7Ci0KLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG9iakFzc2VtYmx5RGVzY3JpcHRvciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEV4Y2x1ZGVMaXN0IG5ld0V4Y2x1ZGVMaXN0ID0gbnVsbDsKLSAgICAgICAgb2JqQXNzZW1ibHlEZXNjcmlwdG9yLnNldEV4Y2x1ZGVMaXN0KG5ld0V4Y2x1ZGVMaXN0KTsKLSAgICB9ICovCi0KLSAvKiAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpIHsKLQotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3Igb2JqQXNzZW1ibHlEZXNjcmlwdG9yID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0gICAgfSAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCWluaXQoKTsKLSAgICAJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gREQuZ2V0RUpCSmFyKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoYXNzZW1ibHlEZXNjcmlwdG9yKTsKLQkJTGlzdCBlbnRlcnByaXNlQmVhbnMgPSBERC5nZXRFSkJKYXIoKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJRW50ZXJwcmlzZUJlYW4gZWIxID0gKEVudGVycHJpc2VCZWFuKWVudGVycHJpc2VCZWFucy5nZXQoMCk7Ci0JCUxpc3QgbWV0aG9kVHJhbnNhY3Rpb25MaXN0ID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFRyYW5zYWN0aW9uTWV0aG9kRWxlbWVudHMoZWIxKTsKLQkJTGlzdCBtZXRob2RQZXJtaXNzaW9uTGlzdCA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RQZXJtaXNzaW9uTWV0aG9kRWxlbWVudHMoZWIxKTsKLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZFRyYW5zYWN0aW9uTGlzdC5zaXplKCkgPiAwLCB0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZFBlcm1pc3Npb25MaXN0LnNpemUoKSA+IDAsIHRydWUpOyAKLQkJCi0JCWFzc2VtYmx5RGVzY3JpcHRvci5yZW1vdmVEYXRhKGViMSk7Ci0JCQotCQltZXRob2RUcmFuc2FjdGlvbkxpc3QgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kVHJhbnNhY3Rpb25NZXRob2RFbGVtZW50cyhlYjEpOwotCQltZXRob2RQZXJtaXNzaW9uTGlzdCA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RQZXJtaXNzaW9uTWV0aG9kRWxlbWVudHMoZWIxKTsKLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZFRyYW5zYWN0aW9uTGlzdC5zaXplKCkgPT0gMCwgdHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhtZXRob2RQZXJtaXNzaW9uTGlzdC5zaXplKCkgPT0gMCwgdHJ1ZSk7IAotICAgICAgICAKLSAgICAJCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9DTVBBdHRyaWJ1dGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9DTVBBdHRyaWJ1dGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYWZjMGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvQ01QQXR0cmlidXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgQ01QQXR0cmlidXRlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgRWpiRmFjdG9yeSBFSkJGQUNUT1JZID0gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpOwotCQotCXB1YmxpYyBDTVBBdHRyaWJ1dGVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIENNUEF0dHJpYnV0ZSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLQkKLQl9ICAKLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RmllbGQoKSB7Ci0KLSAgICAgICAgQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEZpZWxkIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDTVBBdHRyaWJ1dGUuZ2V0RmllbGQoKTsKLSAgICB9ICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEdldHRlck5hbWUoKSB7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSBvYmpDTVBBdHRyaWJ1dGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9ICJhdHRyTmFtZSIgOwotICAgICAgICBTdHJpbmcgZ2V0dGVyTmFtZSA9ICJnZXQiICsgbmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIChuYW1lLmxlbmd0aCgpID4gMSA/IG5hbWUuc3Vic3RyaW5nKDEpIDogIiIpOwotICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmdldEdldHRlck5hbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGdldHRlck5hbWUscmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0T3JpZ2luYXRpbmdUeXBlKCkgewotICAgICAgICBDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSmF2YUhlbHBlcnMgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5nZXRPcmlnaW5hdGluZ1R5cGUoKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgIEphdmFIZWxwZXJzIG5ld1ZhbHVlID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXRPcmlnaW5hdGluZ1R5cGUobmV3VmFsdWUpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5nZXRPcmlnaW5hdGluZ1R5cGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNldHRlck5hbWUoKSB7Ci0gICAgCSAgQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUgPSAiYXR0ck5hbWUiIDsKLSAgICAgICAgICBTdHJpbmcgc2V0dGVyTmFtZSA9ICJzZXQiICsgbmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIChuYW1lLmxlbmd0aCgpID4gMSA/IG5hbWUuc3Vic3RyaW5nKDEpIDogIiIpOwotICAgICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXROYW1lKG5hbWUpOwotICAgICAgICAgIFN0cmluZyByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5nZXRTZXR0ZXJOYW1lKCk7Ci0gICAgICAgICAgYXNzZXJ0RXF1YWxzKHNldHRlck5hbWUscmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nIG5hbWUgPSAiYXR0ck5hbWUiIDsKLSAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldE5hbWUobmFtZSk7Ci0gICAgICAgSmF2YUhlbHBlcnMgbmV3VmFsdWUgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldEVUeXBlKG5ld1ZhbHVlKTsKLSAgICAgICAgSmF2YUhlbHBlcnMgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5nZXRUeXBlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXdWYWx1ZSxyZXRWYWx1ZSk7Ci0gICAgICAgIAotCQkKLSAgICB9Ci0KLSAgCi0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNDTVJGaWVsZCgpIHsKLSAgICAJQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgCWJvb2xlYW4gcmV0VmFsdWUgPSBvYmpDTVBBdHRyaWJ1dGUuaXNDTVJGaWVsZCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICBvYmpDTVBBdHRyaWJ1dGUgPSBFSkJGQUNUT1JZLmNyZWF0ZUNNUkZpZWxkKCk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmlzQ01SRmllbGQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzS2V5KCkgewotICAgIAlFSkJKYXIgamFyID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJKYXIoKTsKLSAgICAJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkgPSBFSkJGQUNUT1JZLmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLSAgICAJZW50aXR5LnNldE5hbWUoIkZvbyIpOwotICAgIAlqYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKGVudGl0eSk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSBvYmpDTVBBdHRyaWJ1dGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0TmFtZSgiZm9vQXR0ciIpOwotICAgICAgICBlbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKS5hZGQob2JqQ01QQXR0cmlidXRlKTsKLSAgICAgICAgSmF2YUhlbHBlcnMgbmV3VmFsdWUgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldEVUeXBlKG5ld1ZhbHVlKTsKLSAgICAgICAgKChDb250YWluZXJNYW5hZ2VkRW50aXR5KWphci5nZXRFbnRlcnByaXNlQmVhbk5hbWVkKGVudGl0eS5nZXROYW1lKCkpKS5nZXRDTVBBdHRyaWJ1dGUoKS5hZGQob2JqQ01QQXR0cmlidXRlKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIHJldEF0dHJpYnV0ZSA9IChDTVBBdHRyaWJ1dGUpZW50aXR5LmdldENNUEF0dHJpYnV0ZSgpLmdldCgwKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IHJldEF0dHJpYnV0ZS5pc0tleSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICBMaXN0IGxpc3QgPSBlbnRpdHkuZ2V0S2V5QXR0cmlidXRlcygpOwotICAgICAgICBsaXN0LmFkZChvYmpDTVBBdHRyaWJ1dGUpOwotICAgICAgICByZXRWYWx1ZSA9IHJldEF0dHJpYnV0ZS5pc0tleSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1ByaW1LZXlGaWVsZCgpIHsKLSAgICAJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkgPSBFSkJGQUNUT1JZLmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3QgbGlzdCA9IGVudGl0eS5nZXRDTVBBdHRyaWJ1dGUoKTsKLSAgICAgICAgZW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCkuYWRkKG9iakNNUEF0dHJpYnV0ZSk7Ci0gICAgICAgIGxpc3QuYWRkKG9iakNNUEF0dHJpYnV0ZSk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDTVBBdHRyaWJ1dGUuaXNQcmltS2V5RmllbGQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgZW50aXR5LnNldFByaW1LZXlGaWVsZChvYmpDTVBBdHRyaWJ1dGUpOwotICAgICAgICByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5pc1ByaW1LZXlGaWVsZCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRPcmlnaW5hdGluZ1R5cGUoKSB7Ci0KLSAgICAJQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEphdmFIZWxwZXJzIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDTVBBdHRyaWJ1dGUuZ2V0T3JpZ2luYXRpbmdUeXBlKCk7Ci0gICAgICAgIGFzc2VydE51bGwocmV0VmFsdWUpOwotICAgICAgICBKYXZhSGVscGVycyBuZXdWYWx1ZSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS5sYW5nLlN0cmluZyIpOwotICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0T3JpZ2luYXRpbmdUeXBlKG5ld1ZhbHVlKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDTVBBdHRyaWJ1dGUuZ2V0T3JpZ2luYXRpbmdUeXBlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxuZXdWYWx1ZSk7Ci0gICAgfQotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIENNUEF0dHJpYnV0ZSBvYmpDTVBBdHRyaWJ1dGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDTVBBdHRyaWJ1dGUuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIENNUEF0dHJpYnV0ZSBvYmpDTVBBdHRyaWJ1dGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3RGVzY3JpcHRpb24gPSAiIjsKLSAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uKTsKLSAgICB9Ki8KLQotICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRGVyaXZlZCgpIHsKLQotICAgIAkgQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICBib29sZWFuIGFCb29sZWFuID0gZmFsc2U7Ci0gICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0RGVyaXZlZChhQm9vbGVhbik7Ci0gICAgICAgICBib29sZWFuIHJldFZhbCA9IG9iakNNUEF0dHJpYnV0ZS5pc0Rlcml2ZWQoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWwsYUJvb2xlYW4pOwotICAgICAgICAgYUJvb2xlYW4gPSB0cnVlOwotICAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldERlcml2ZWQoYUJvb2xlYW4pOwotICAgICAgICAgcmV0VmFsID0gb2JqQ01QQXR0cmlidXRlLmlzRGVyaXZlZCgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbCxhQm9vbGVhbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXREZXJpdmVkKCkgewotCi0gICAgICAgIENNUEF0dHJpYnV0ZSBvYmpDTVBBdHRyaWJ1dGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIGFCb29sZWFuID0gZmFsc2U7Ci0gICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXREZXJpdmVkKGFCb29sZWFuKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWwgPSBvYmpDTVBBdHRyaWJ1dGUuaXNEZXJpdmVkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWwsYUJvb2xlYW4pOwotICAgICAgICBhQm9vbGVhbiA9IHRydWU7Ci0gICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXREZXJpdmVkKGFCb29sZWFuKTsKLSAgICAgICAgcmV0VmFsID0gb2JqQ01QQXR0cmlidXRlLmlzRGVyaXZlZCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsLGFCb29sZWFuKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKENNUEF0dHJpYnV0ZVRlc3QuY2xhc3MpOwotCX0KLQotICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9DTVJGaWVsZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0NNUkZpZWxkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGM3NGIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0NNUkZpZWxkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLQotcHVibGljIGNsYXNzIENNUkZpZWxkVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcm90ZWN0ZWQgRWpiRmFjdG9yeSBFSkJGQUNUT1JZID0gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpOwotCi0JcHJpdmF0ZSBDTVJGaWVsZCBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEVKQkZBQ1RPUlkuY3JlYXRlQ01SRmllbGQoKTsKLQl9Ci0JCi0gICBwdWJsaWMgdm9pZCB0ZXN0X2dldENvbGxlY3Rpb25UeXBlTmFtZSgpIHsKLQkgICAJQ01SRmllbGQgb2JqQ01SRmllbGQgPSBnZXRJbnN0YW5jZSgpOwotCSAgICBTdHJpbmcgdHlwZU5hbWUgPSAidGVzdE5hbWUiOwotCSAgICBvYmpDTVJGaWVsZC5zZXRDb2xsZWN0aW9uVHlwZU5hbWUodHlwZU5hbWUpOwotCSAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLQkgICAgcmV0VmFsdWUgPSBvYmpDTVJGaWVsZC5nZXRDb2xsZWN0aW9uVHlwZU5hbWUoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHR5cGVOYW1lLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldENvbGxlY3Rpb25UeXBlTmFtZSgpIHsKLQotICAgICAgICBDTVJGaWVsZCBvYmpDTVJGaWVsZCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9ICJ0ZXN0TmFtZSI7Ci0gICAgICAgIG9iakNNUkZpZWxkLnNldENvbGxlY3Rpb25UeXBlTmFtZSh0eXBlTmFtZSk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUkZpZWxkLmdldENvbGxlY3Rpb25UeXBlTmFtZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHModHlwZU5hbWUscmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Um9sZSgpIHsKLSAgICAJIENNUkZpZWxkIG9iakNNUkZpZWxkID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgbmV3Um9sZSA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgICAgICAgbmV3Um9sZS5zZXROYW1lKCJSb2xlMSIpOwotICAgICAgICAgb2JqQ01SRmllbGQuc2V0Um9sZShuZXdSb2xlKTsKLSAgICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgcmV0VmFsdWUgPSBvYmpDTVJGaWVsZC5nZXRSb2xlKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMobmV3Um9sZSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRSb2xlKCkgewotICAgICAgICBDTVJGaWVsZCBvYmpDTVJGaWVsZCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgbmV3Um9sZSA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgICAgICBuZXdSb2xlLnNldE5hbWUoIlJvbGUxIik7Ci0gICAgICAgIG9iakNNUkZpZWxkLnNldFJvbGUobmV3Um9sZSk7Ci0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgcmV0VmFsdWUgPSBvYmpDTVJGaWVsZC5nZXRSb2xlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXdSb2xlLHJldFZhbHVlKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRDb2xsZWN0aW9uVHlwZSgpIHsKLQotICAgIAkgQ01SRmllbGQgb2JqQ01SRmllbGQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgSmF2YUNsYXNzIG5ld0NvbGxlY3Rpb25UeXBlID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFDbGFzcygpOwotICAgICAgICAgb2JqQ01SRmllbGQuc2V0Q29sbGVjdGlvblR5cGUobmV3Q29sbGVjdGlvblR5cGUpOwotICAgICAgICAgSmF2YUNsYXNzIHJldFZhbCA9IG9iakNNUkZpZWxkLmdldENvbGxlY3Rpb25UeXBlKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMobmV3Q29sbGVjdGlvblR5cGUscmV0VmFsKTsKLSAgICB9Ci0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29sbGVjdGlvblR5cGUoKSB7Ci0KLSAgICAgICAgQ01SRmllbGQgb2JqQ01SRmllbGQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhQ2xhc3MgbmV3Q29sbGVjdGlvblR5cGUgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YUNsYXNzKCk7Ci0gICAgICAgIG9iakNNUkZpZWxkLnNldENvbGxlY3Rpb25UeXBlKG5ld0NvbGxlY3Rpb25UeXBlKTsKLSAgICAgICAgSmF2YUNsYXNzIHJldFZhbCA9IG9iakNNUkZpZWxkLmdldENvbGxlY3Rpb25UeXBlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXdDb2xsZWN0aW9uVHlwZSxyZXRWYWwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKENNUkZpZWxkVGVzdC5jbGFzcyk7Ci0JfQotCi0KLSAgIAotICAgIAotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9Db250YWluZXJNYW5hZ2VkRW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvQ29udGFpbmVyTWFuYWdlZEVudGl0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0ZGY1Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9Db250YWluZXJNYW5hZ2VkRW50aXR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgQ29udGFpbmVyTWFuYWdlZEVudGl0eVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRWpiRmFjdG9yeSBFSkJGQUNUT1JZID0gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpOwotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShDb250YWluZXJNYW5hZ2VkRW50aXR5VGVzdC5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEVKQkZBQ1RPUlkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotCX0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZEtleUF0dHJpYnV0ZU5hbWUoKSB7Ci0gICAgCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUgPSBFSkJGQUNUT1JZLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgICBMaXN0IHBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotICAgICAgICBwZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoY21wQXR0cmlidXRlKTsKLSAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gImF0dHIxIiA7Ci0gICAgICAgIGNtcEF0dHJpYnV0ZS5zZXROYW1lKGF0dHJOYW1lKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5hZGRLZXlBdHRyaWJ1dGVOYW1lKGF0dHJOYW1lKTsKLSAgICAgICAgTGlzdCBrZXlzID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRLZXlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBrZXlzLmNvbnRhaW5zKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9hZGRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBGaWVsZCBhRmllbGQgPSBKYXZhUmVmRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLmNyZWF0ZUZpZWxkKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0iYXR0cjEiIDsKLSAgICAgICAgYUZpZWxkLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5hZGRQZXJzaXN0ZW50QXR0cmlidXRlKGFGaWVsZCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShuYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9hZGRQZXJzaXN0ZW50QXR0cmlidXRlTmFtZSgpIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9ImF0dHIxIiA7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5hZGRQZXJzaXN0ZW50QXR0cmlidXRlTmFtZShuYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKG5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0S2V5QXR0cmlidXRlKCkgewotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlID0gRUpCRkFDVE9SWS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLSAgICAgICAgTGlzdCBwZXJzaXN0ZW50QXR0cmlidXRlcyA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgcGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZSA9ICJhdHRyMSIgOwotICAgICAgICBjbXBBdHRyaWJ1dGUuc2V0TmFtZShhdHRyTmFtZSk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuYWRkS2V5QXR0cmlidXRlTmFtZShhdHRyTmFtZSk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0S2V5QXR0cmlidXRlKGF0dHJOYW1lKTsKLSAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIAotICAgIH0KLQotICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByaW1hcnlLZXlBdHRyaWJ1dGUoKSB7Ci0KLQkgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICBDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlID0gRUpCRkFDVE9SWS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLSAgICAgIExpc3QgcGVyc2lzdGVudEF0dHJpYnV0ZXMgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0gICAgICBwZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoY21wQXR0cmlidXRlKTsKLSAgICAgIFN0cmluZyBhdHRyTmFtZSA9ICJhdHRyMSIgOwotICAgICAgY21wQXR0cmlidXRlLnNldE5hbWUoYXR0ck5hbWUpOwotICAgICAgQ01QQXR0cmlidXRlIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQcmltYXJ5S2V5QXR0cmlidXRlKCk7Ci0gICAgICBhc3NlcnROb3RTYW1lKHJldFZhbHVlLGNtcEF0dHJpYnV0ZSk7Ci0gICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFByaW1LZXlGaWVsZChjbXBBdHRyaWJ1dGUpOwotICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFByaW1hcnlLZXlBdHRyaWJ1dGUoKTsKLSAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxjbXBBdHRyaWJ1dGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0tleUF0dHJpYnV0ZSgpIHsKLQotICAgIAlDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlID0gRUpCRkFDVE9SWS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLSAgICAgICAgTGlzdCBwZXJzaXN0ZW50QXR0cmlidXRlcyA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgcGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZSA9ICJhdHRyMSIgOwotICAgICAgICBjbXBBdHRyaWJ1dGUuc2V0TmFtZShhdHRyTmFtZSk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzS2V5QXR0cmlidXRlKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuYWRkS2V5QXR0cmlidXRlTmFtZShhdHRyTmFtZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5pc0tleUF0dHJpYnV0ZShjbXBBdHRyaWJ1dGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGVfMigpIHsKLSAgICAJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIGNtcEF0dHJpYnV0ZSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0gICAgICAgIExpc3QgcGVyc2lzdGVudEF0dHJpYnV0ZXMgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChjbXBBdHRyaWJ1dGUpOwotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSAiYXR0cjEiIDsKLSAgICAgICAgY21wQXR0cmlidXRlLnNldE5hbWUoYXR0ck5hbWUpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoYXR0ck5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnJlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGUoYXR0ck5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoYXR0ck5hbWUpOwotICAgICAgICBhc3NlcnROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCi0gICAgCSBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgRmllbGQgYUZpZWxkID0gSmF2YVJlZkZhY3RvcnlJbXBsLmdldEFjdGl2ZUZhY3RvcnkoKS5jcmVhdGVGaWVsZCgpOwotICAgICAgICAgU3RyaW5nIG5hbWUgPSJhdHRyMSIgOwotICAgICAgICAgYUZpZWxkLnNldE5hbWUobmFtZSk7Ci0gICAgICAgICBDTVBBdHRyaWJ1dGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmFkZFBlcnNpc3RlbnRBdHRyaWJ1dGUoYUZpZWxkKTsKLSAgICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgICAgICAgCi0gICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShuYW1lKTsKLSAgICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgICAgICAgCi0gICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkucmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZShhRmllbGQpOwotICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgICAKLSAgICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKG5hbWUpOwotICAgICAgICAgYXNzZXJ0TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJpbUtleUZpZWxkKCkgewotCi0gIAkgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUgPSBFSkJGQUNUT1JZLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgICBMaXN0IHBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotICAgICAgICBwZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoY21wQXR0cmlidXRlKTsKLSAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gImF0dHIxIiA7Ci0gICAgICAgIGNtcEF0dHJpYnV0ZS5zZXROYW1lKGF0dHJOYW1lKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQcmltS2V5RmllbGQoKTsKLSAgICAgICAgYXNzZXJ0Tm90U2FtZShyZXRWYWx1ZSxjbXBBdHRyaWJ1dGUpOwotICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFByaW1LZXlGaWVsZChjbXBBdHRyaWJ1dGUpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UHJpbUtleUZpZWxkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxjbXBBdHRyaWJ1dGUpOwotICB9Ci0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNWZXJzaW9uMV9YKCkgewotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFZlcnNpb24oQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzFfWCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzVmVyc2lvbjFfWCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0VmVyc2lvbihDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMl9YKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzVmVyc2lvbjFfWCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNWZXJzaW9uMl9YKCkgewotCi0gICAgCSBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8yX1gpOwotICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzVmVyc2lvbjJfWCgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8xX1gpOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzVmVyc2lvbjJfWCgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9saXN0UGVyc2lzdGVudEZpZWxkTmFtZXMoKSB7Ci0KLSAgICAJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIGNtcEF0dHJpYnV0ZTEgPSBFSkJGQUNUT1JZLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgICBTdHJpbmcgYXR0ck5hbWUxID0gImF0dHIxIiA7Ci0gICAgICAgIGNtcEF0dHJpYnV0ZTEuc2V0TmFtZShhdHRyTmFtZTEpOwotICAgICAgICAKLSAgICAgICAgQ01QQXR0cmlidXRlIGNtcEF0dHJpYnV0ZTIgPSBFSkJGQUNUT1JZLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgICBTdHJpbmcgYXR0ck5hbWUyID0gImF0dHIyIiA7Ci0gICAgICAgIGNtcEF0dHJpYnV0ZTIuc2V0TmFtZShhdHRyTmFtZTIpOwotICAgICAgICAKLSAgICAgICAgTGlzdCBwZXJzaXN0ZW50QXR0cmlidXRlcyA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgcGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKGNtcEF0dHJpYnV0ZTEpOwotICAgICAgICBwZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoY21wQXR0cmlidXRlMik7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5saXN0UGVyc2lzdGVudEZpZWxkTmFtZXMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5sZW5ndGggPT0gMiwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygocmV0VmFsdWVbMF09PWF0dHJOYW1lMSB8fCByZXRWYWx1ZVsxXT09YXR0ck5hbWUxKSAsIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoKHJldFZhbHVlWzBdPT1hdHRyTmFtZTIgfHwgcmV0VmFsdWVbMV09PWF0dHJOYW1lMikgLCB0cnVlKTsKLSAgICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNVbmtub3duUHJpbWFyeUtleSgpIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFByaW1hcnlLZXlOYW1lKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5pc1Vua25vd25QcmltYXJ5S2V5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFByaW1hcnlLZXlOYW1lKCJqYXZhLmxhbmcuT2JqZWN0Iik7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5pc1Vua25vd25QcmltYXJ5S2V5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgIH0KLSAgCi0gICAgLy8gVE9ETwotICAgLyogcHVibGljIHZvaWQgdGVzdF9tYWtlUHJpbUtleUZpZWxkUHJveHkoKSB7Ci0KLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5tYWtlUHJpbUtleUZpZWxkUHJveHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFsbEF2YWlsYWJsZVF1ZXJ5TWV0aG9kcygpIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldEFsbEF2YWlsYWJsZVF1ZXJ5TWV0aG9kcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QXZhaWxhYmxlU2VsZWN0UXVlcnlNZXRob2RzKCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkKLSAgICAgICAgICAgICAgICAuZ2V0QXZhaWxhYmxlU2VsZWN0UXVlcnlNZXRob2RzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRBdmFpbGFibGVGaW5kUXVlcnlNZXRob2RzKCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0QXZhaWxhYmxlRmluZFF1ZXJ5TWV0aG9kcygpOwotICAgIH0gKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q01QVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8xX1gpOwotICAgICAgICBpbnQgcmV0VmFsdWUgPSAwOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0Q01QVmVyc2lvbklEKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lELCByZXRWYWx1ZSk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0VmVyc2lvbihDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMl9YKTsKLSAgICAgICAgCi0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRDTVBWZXJzaW9uSUQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQsIHJldFZhbHVlKTsKLSAgICAgICAgCi0gICAgfQotICAKLSAgIAotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldENNUkZpZWxkcygpIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldENNUkZpZWxkcygpOwotICAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRSb2xlcygpIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFJvbGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRSb2xlKCkgewotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAgICAgU3RyaW5nIHJvbGVOYW1lID0gInJvbGUxIjsKLSAgICAgICAgcm9sZS5zZXROYW1lKHJvbGVOYW1lKTsKLSAgICAgICAgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRSb2xlKHJvbGVOYW1lKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0Um9sZXMoKS5hZGQocm9sZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRSb2xlKHJvbGVOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsdGVyZWRGZWF0dXJlcygpIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFSkJFeHRlbnNpb25GaWx0ZXIgYUZpbHRlciA9IG51bGw7Ci0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0RmlsdGVyZWRGZWF0dXJlcyhhRmlsdGVyKTsKLSAgICB9ICovCi0KLSAgICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZyBhTmFtZSA9ICIiOwotICAgIENNUEF0dHJpYnV0ZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoYU5hbWUpOwotfSovCi0KLSAgICAKLSAgICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnNpb24oKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRWZXJzaW9uKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmVyc2lvbigpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nIG5ld1ZlcnNpb24gPSAiIjsKLSAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFZlcnNpb24obmV3VmVyc2lvbik7Ci19Ki8KLQotLyogcHVibGljIHZvaWQgdGVzdF9nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZyBuZXdBYnN0cmFjdFNjaGVtYU5hbWUgPSAiIjsKLSAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5Ci0gICAgICAgICAgICAuc2V0QWJzdHJhY3RTY2hlbWFOYW1lKG5ld0Fic3RyYWN0U2NoZW1hTmFtZSk7Ci19Ki8KLQotLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLX0qLwotCi0vKnB1YmxpYyB2b2lkIHRlc3RfZ2V0S2V5QXR0cmlidXRlcygpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRLZXlBdHRyaWJ1dGVzKCk7Ci19Ki8KLQotLyogcHVibGljIHZvaWQgdGVzdF9nZXRRdWVyaWVzKCkgewotCi0gICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFF1ZXJpZXMoKTsKLX0qLwotCi0vKiAgcHVibGljIHZvaWQgdGVzdF9nZXRDTVBBdHRyaWJ1dGUoKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0Q01QQXR0cmlidXRlKCk7Ci19Ki8KLQotLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJpbUtleUZpZWxkKCkgewotCi0gICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICBDTVBBdHRyaWJ1dGUgcmV0VmFsdWUgPSBudWxsOwotICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQcmltS2V5RmllbGQoKTsKLX0qLwotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FSkJKYXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FSkJKYXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGYyOTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRUpCSmFyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEVKQkphclRlc3QgZXh0ZW5kcyAgRWpiRU1GVGVzdEJhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tbW9uRmFjdG9yeSBDT01NT05GQUNUT1JZID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotCXB1YmxpYyBFSkJKYXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQlwcml2YXRlIEVKQkphciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGdldEVqYkZhY3RvcnkoKS5jcmVhdGVFSkJKYXIoKTsKLQl9Ci0gICAgcHVibGljIHZvaWQgdGVzdF9FSkJKYXIoKSB7Ci0gICAgICAgIEVKQkphciB0bXBFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcEVKQkphcik7Ci0gICAgfQotICAgIAotICAgCi0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zQ29udGFpbmVyTWFuYWdlZEJlYW5zKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24pOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5jb250YWluc0NvbnRhaW5lck1hbmFnZWRCZWFucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKGVudGl0eSk7Ci0gICAgICAgIAotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5jb250YWluc0NvbnRhaW5lck1hbmFnZWRCZWFucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jb250YWluc1NlY3VyaXR5Um9sZSgpIHsKLQotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRBc3NlbWJseURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgc2VjdXJpdHlSb2xlTmFtZSA9ICJ0ZXN0Um9sZSI7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuY29udGFpbnNTZWN1cml0eVJvbGUoc2VjdXJpdHlSb2xlTmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGU9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLQkJc2VjdXJpdHlSb2xlLnNldFJvbGVOYW1lKHNlY3VyaXR5Um9sZU5hbWUpOwotCQlkZXNjcmlwdG9yLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoc2VjdXJpdHlSb2xlKTsKLQkJcmV0VmFsdWUgPSBvYmpFSkJKYXIuY29udGFpbnNTZWN1cml0eVJvbGUoc2VjdXJpdHlSb2xlTmFtZSkgOwotCQlhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRCZWFuTWFuYWdlZEJlYW5zKCkgewotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRCZWFuTWFuYWdlZEJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTAsdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBFbnRpdHkgZW50aXR5ID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVudGl0eSgpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKGVudGl0eSk7Ci0gICAgICAgIAotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRCZWFuTWFuYWdlZEJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTEsdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5nZXQoMCksZW50aXR5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRhaW5lck1hbmFnZWRCZWFucygpIHsKLSAgICAJCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24pOwotICAgICAgICAKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldENvbnRhaW5lck1hbmFnZWRCZWFucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0wLHRydWUpOwotICAgICAgICAKLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKGVudGl0eSk7Ci0gICAgICAgIAotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRDb250YWluZXJNYW5hZ2VkQmVhbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MSx0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmdldCgwKSxlbnRpdHkpOwotICAgIH0KLSAgICAKLSAgIAotICAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFSkIxMUNvbnRhaW5lck1hbmFnZWRCZWFucygpIHsKLQotICAgIAkgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgICAgb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uKTsKLSAgICAgICAgICAKLSAgICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFSkIxMUNvbnRhaW5lck1hbmFnZWRCZWFucygpOwotICAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTAsdHJ1ZSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkxID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLSAgICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKGVudGl0eTEpOwotICAgICAgICAgIGVudGl0eTEuc2V0VmVyc2lvbihDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMV9YKTsKLSAgICAgICAgICAKLSAgICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eTIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoZW50aXR5Mik7Ci0gICAgICAgICAgZW50aXR5Mi5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8yX1gpOwotICAgICAgICAgIAotICAgICAgICAgIAotICAgICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVKQjExQ29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0gICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MSx0cnVlKTsKLSAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuZ2V0KDApLGVudGl0eTEpOwotICAgIH0KLSAgICAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVKQjIwQ29udGFpbmVyTWFuYWdlZEJlYW5zKCkgewotCi0gIAkgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbik7Ci0gICAgICAKLSAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RUpCMjBDb250YWluZXJNYW5hZ2VkQmVhbnMoKTsKLSAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTAsdHJ1ZSk7Ci0gICAgICAKLSAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5MSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKGVudGl0eTEpOwotICAgICAgZW50aXR5MS5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8xX1gpOwotICAgICAgCi0gICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eTIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChlbnRpdHkyKTsKLSAgICAgIGVudGl0eTIuc2V0VmVyc2lvbihDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMl9YKTsKLSAgICAgIAotICAgICAgCi0gICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFSkIyMENvbnRhaW5lck1hbmFnZWRCZWFucygpOwotICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MSx0cnVlKTsKLSAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5nZXQoMCksZW50aXR5Mik7Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlRHJpdmVuQmVhbnMoKSB7Ci0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24pOwotICAgICAgICAKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldE1lc3NhZ2VEcml2ZW5CZWFucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0wLHRydWUpOwotICAgICAgICAKLSAgICAgICAgTWVzc2FnZURyaXZlbiBtZXNzYWdlRHJpdmVuID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZU1lc3NhZ2VEcml2ZW4oKTsKLSAgICAgICAgb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChtZXNzYWdlRHJpdmVuKTsKLSAgICAgICAgCi0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldE1lc3NhZ2VEcml2ZW5CZWFucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0xLHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuZ2V0KDApLG1lc3NhZ2VEcml2ZW4pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RWpiUmVsYXRpb25zKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSZWxhdGlvbnNoaXBzIHJlbGF0aW9uc2hpcHMgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlUmVsYXRpb25zaGlwcygpOwotICAgICAgICBvYmpFSkJKYXIuc2V0UmVsYXRpb25zaGlwTGlzdChyZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgcmVsYXRpb25zaGlwcy5zZXRFamJKYXIob2JqRUpCSmFyKTsKLSAgICAgICAgRUxpc3QgZWpiUmVsYXRpb25zID0gcmVsYXRpb25zaGlwcy5nZXRFamJSZWxhdGlvbnMoKTsKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVqYlJlbGF0aW9ucygpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVqYlJlbGF0aW9ucyxyZXRWYWx1ZSk7Ci0gICAgfQotICAgIAotCi0gICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYoKSB7Ci0gICAgCQotICAgIAlFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRBc3NlbWJseURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgICAKLSAgICAJRWpiUmVmIGVqYlJlZiA9IENPTU1PTkZBQ1RPUlkuY3JlYXRlRWpiUmVmKCk7Ci0gICAgCVNlc3Npb24gc2Vzc2lvbjEgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTEgPSAiTmFtZTEiOwotICAgIAlzZXNzaW9uMS5zZXROYW1lKG5hbWUxKTsKLSAgICAJCi0gICAgCVNlc3Npb24gc2Vzc2lvbjIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTIgPSAiTmFtZTIiOwotICAgIAlzZXNzaW9uMi5zZXROYW1lKG5hbWUyKTsKLSAgICAJCi0gICAgCWVqYlJlZi5zZXRMaW5rKG5hbWUyKTsKLSAgICAJZWpiUmVmLnNldE5hbWUoIkVqYlJlZl8iICsgbmFtZTIpOwotICAgIAkKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMSk7Ci0gICAgCW9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbjIpOwotICAgIAkKLSAgICAgICAgRW50ZXJwcmlzZUJlYW4gcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYoZWpiUmVmKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNlc3Npb24yLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVudGVycHJpc2VCZWFuTmFtZWQoKSB7Ci0KLSAgICAJRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvcigpOwotICAgICAgICBvYmpFSkJKYXIuc2V0QXNzZW1ibHlEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICAgCi0gICAgCVNlc3Npb24gc2Vzc2lvbjEgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTEgPSAiTmFtZTEiOwotICAgIAlzZXNzaW9uMS5zZXROYW1lKG5hbWUxKTsKLSAgICAJCi0gICAgCVNlc3Npb24gc2Vzc2lvbjIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTIgPSAiTmFtZTIiOwotICAgIAlzZXNzaW9uMi5zZXROYW1lKG5hbWUyKTsKLSAgICAJCi0gICAgICAgIAkKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMSk7Ci0gICAgCW9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbjIpOwotICAgIAkKLSAgICAgICAgRW50ZXJwcmlzZUJlYW4gcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5OYW1lZChuYW1lMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZXNzaW9uMixyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFbnRlcnByaXNlQmVhbnNXaXRoUmVmZXJlbmNlKCkgewotCi0gICAgCUVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKTsKLSAgICAgICAgb2JqRUpCSmFyLnNldEFzc2VtYmx5RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgIAotICAgIAlTZXNzaW9uIHNlc3Npb24xID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAJU3RyaW5nIG5hbWUxID0gIk5hbWUxIjsKLSAgICAJc2Vzc2lvbjEuc2V0TmFtZShuYW1lMSk7Ci0gICAgCQotICAgIAlTZXNzaW9uIHNlc3Npb24yID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAJU3RyaW5nIG5hbWUyID0gIk5hbWUyIjsKLSAgICAJc2Vzc2lvbjIuc2V0TmFtZShuYW1lMik7Ci0gICAgCQotICAgICAgICAJCi0gICAgCW9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbjEpOwotICAgIAlvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24yKTsKLSAgICAJCi0gICAgCUphdmFDbGFzcyBqYXZhQ2xhc3MxID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLmxhbmcuU3RyaW5nIikgOwotICAgIAlKYXZhQ2xhc3MgamF2YUNsYXNzMiA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS51dGlsLkxpc3QiKSA7Ci0gICAgCQotICAgIAlzZXNzaW9uMS5zZXRFamJDbGFzcyhqYXZhQ2xhc3MxKTsKLSAgICAJc2Vzc2lvbjIuc2V0RWpiQ2xhc3MoamF2YUNsYXNzMik7Ci0gICAgCQotICAgICAgICAgamF2YS51dGlsLkxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zV2l0aFJlZmVyZW5jZShqYXZhQ2xhc3MxKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTEsIHRydWUpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmNvbnRhaW5zKHNlc3Npb24xKSwgdHJ1ZSk7Ci0gICAgICAgICAKLSAgICAgICAgIHNlc3Npb24yLnNldEhvbWVJbnRlcmZhY2UoamF2YUNsYXNzMSk7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnNXaXRoUmVmZXJlbmNlKGphdmFDbGFzczEpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MiwgdHJ1ZSk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuY29udGFpbnMoc2Vzc2lvbjEpLCB0cnVlKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5jb250YWlucyhzZXNzaW9uMiksIHRydWUpOwotICAgICAgICAgCi0gICAgfQotICAgIAotICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RW50ZXJwcmlzZUJlYW5XaXRoUmVmZXJlbmNlKCkgewotICAgIAkKLSAgICAJRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvcigpOwotICAgICAgICBvYmpFSkJKYXIuc2V0QXNzZW1ibHlEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICAgCi0gICAgCVNlc3Npb24gc2Vzc2lvbjEgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTEgPSAiTmFtZTEiOwotICAgIAlzZXNzaW9uMS5zZXROYW1lKG5hbWUxKTsKLSAgICAJCi0gICAgCVNlc3Npb24gc2Vzc2lvbjIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTIgPSAiTmFtZTIiOwotICAgIAlzZXNzaW9uMi5zZXROYW1lKG5hbWUyKTsKLSAgICAJCi0gICAgICAgIAkKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMSk7Ci0gICAgCW9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbjIpOwotICAgIAkKLSAgICAJSmF2YUNsYXNzIGphdmFDbGFzczEgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEubGFuZy5TdHJpbmciKSA7Ci0gICAgCQotICAgIAlzZXNzaW9uMS5zZXRFamJDbGFzcyhqYXZhQ2xhc3MxKTsKLSAgICAJc2Vzc2lvbjIuc2V0RWpiQ2xhc3MoamF2YUNsYXNzMSk7Ci0gICAgCQotICAgIAlFbnRlcnByaXNlQmVhbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFuV2l0aFJlZmVyZW5jZShqYXZhQ2xhc3MxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCBzZXNzaW9uMSk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2Vzc2lvbkJlYW5zKCkgeyAgICAgCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXNzYWdlRHJpdmVuIG1lc3NhZ2VEcml2ZW4gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlTWVzc2FnZURyaXZlbigpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKG1lc3NhZ2VEcml2ZW4pOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRTZXNzaW9uQmVhbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MCx0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbik7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0U2Vzc2lvbkJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTEsdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5jb250YWlucyhzZXNzaW9uKSwgdHJ1ZSk7Ci0gICAgICAgIAotICAgIH0KLQotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X3JlbmFtZVNlY3VyaXR5Um9sZSgpIHsKLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgZXhpc3RpbmdSb2xlTmFtZSA9ICIiOwotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5ld1JvbGVOYW1lID0gIiI7Ci0gICAgICAgIG9iakVKQkphci5yZW5hbWVTZWN1cml0eVJvbGUoZXhpc3RpbmdSb2xlTmFtZSwgbmV3Um9sZU5hbWUpOwotICAgIH0gKi8KLQotICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldEVqYkNsaWVudEphcigpIHsKLQotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVqYkNsaWVudEphcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RWpiQ2xpZW50SmFyKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3RWpiQ2xpZW50SmFyID0gIiI7Ci0gICAgICAgIG9iakVKQkphci5zZXRFamJDbGllbnRKYXIobmV3RWpiQ2xpZW50SmFyKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRWZXJzaW9uKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0VmVyc2lvbigpOwotICAgIH0qLwotICAgIAotICAgCi0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnNpb25JRCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgCWluaXQoKTsKLSAgICAJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJc2V0TW9kdWxlVHlwZShFSkIpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgaW50IHJldFZhbHVlID0gMDsKLSAgICAgICAgcmV0VmFsdWUgPSBERC5nZXRFSkJKYXIoKS5nZXRWZXJzaW9uSUQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQpOwotICAgICAgICAKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXJldFZhbHVlID0gREQuZ2V0RUpCSmFyKCkuZ2V0VmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKTsKLQkgICAgCi0JICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzIpOwotCQlyZXRWYWx1ZSA9IERELmdldEVKQkphcigpLmdldFZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRCk7CSAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEoyRUVWZXJzaW9uSUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgIAlpbml0KCk7Ci0gICAgCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCXNldE1vZHVsZVR5cGUoRUpCKTsKLQkJcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0gICAgICAgIGludCByZXRWYWx1ZSA9IDA7Ci0gICAgICAgIHJldFZhbHVlID0gREQuZ2V0RUpCSmFyKCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotICAgICAgICAKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXJldFZhbHVlID0gREQuZ2V0RUpCSmFyKCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCSAgICAKLQkgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMik7Ci0JCXJldFZhbHVlID0gREQuZ2V0RUpCSmFyKCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpOwotICAgIH0KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9zZXRWZXJzaW9uKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3VmVyc2lvbiA9ICIiOwotICAgICAgICBvYmpFSkJKYXIuc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRBc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotICAgIH0KLQotIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRBc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBuZXdBc3NlbWJseURlc2NyaXB0b3IgPSBudWxsOwotICAgICAgICBvYmpFSkJKYXIuc2V0QXNzZW1ibHlEZXNjcmlwdG9yKG5ld0Fzc2VtYmx5RGVzY3JpcHRvcik7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RW50ZXJwcmlzZUJlYW5zKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFJlbGF0aW9uc2hpcExpc3QoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlbGF0aW9uc2hpcHMgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRSZWxhdGlvbnNoaXBMaXN0KCk7Ci0gICAgfQotCi0gCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFJlbGF0aW9uc2hpcExpc3QoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlbGF0aW9uc2hpcHMgbmV3UmVsYXRpb25zaGlwTGlzdCA9IG51bGw7Ci0gICAgICAgIG9iakVKQkphci5zZXRSZWxhdGlvbnNoaXBMaXN0KG5ld1JlbGF0aW9uc2hpcExpc3QpOwotICAgIH0KLSovCi0gICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RUpCUmVsYXRpb24oKSB7Ci0gICAgCSBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgIFJlbGF0aW9uc2hpcHMgcmVsYXRpb25zaGlwcyA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVSZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgICBvYmpFSkJKYXIuc2V0UmVsYXRpb25zaGlwTGlzdChyZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgIHJlbGF0aW9uc2hpcHMuc2V0RWpiSmFyKG9iakVKQkphcik7Ci0gICAgICAgCi0gICAgICAgICBFSkJSZWxhdGlvbiByZWxhdGlvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVFSkJSZWxhdGlvbigpOwotICAgICAgICAgU3RyaW5nIGFSZWxhdGlvbk5hbWUgPSAiUmVsYXRpb24xIjsKLSAgICAgICAgIHJlbGF0aW9uLnNldE5hbWUoYVJlbGF0aW9uTmFtZSk7Ci0gICAgICAgICAKLSAgICAgICAgIHJlbGF0aW9uc2hpcHMuZ2V0RWpiUmVsYXRpb25zKCkuYWRkKHJlbGF0aW9uKTsKLSAgICAgICAgIEVKQlJlbGF0aW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVKQlJlbGF0aW9uKGFSZWxhdGlvbk5hbWUpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCByZWxhdGlvbik7Ci0gICAgfQotICAgIAotICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVKQlJlbGF0aW9uc0ZvclNvdXJjZSgpIHsKLSAgICAJCi0gICAgCUVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSZWxhdGlvbnNoaXBzIHJlbGF0aW9uc2hpcHMgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlUmVsYXRpb25zaGlwcygpOwotICAgICAgICBvYmpFSkJKYXIuc2V0UmVsYXRpb25zaGlwTGlzdChyZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgcmVsYXRpb25zaGlwcy5zZXRFamJKYXIob2JqRUpCSmFyKTsKLSAgICAgIAotICAgICAgICBFSkJSZWxhdGlvbiByZWxhdGlvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVFSkJSZWxhdGlvbigpOwotICAgICAgICBTdHJpbmcgYVJlbGF0aW9uTmFtZSA9ICJSZWxhdGlvbjEiOwotICAgICAgICByZWxhdGlvbi5zZXROYW1lKGFSZWxhdGlvbk5hbWUpOwotICAgICAgICAKLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgICAgIAotICAgIAlMaXN0IHJvbGVMaXN0ID0gcmVsYXRpb24uZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUxKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUyKTsKLSAgICAgICAgCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5ID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSB0YXJnZXRFbnRpdHkgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICAKLQkgICAgUm9sZVNvdXJjZSByb2xlU291cmNlID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVJvbGVTb3VyY2UoKTsKLQkgICAgcm9sZVNvdXJjZS5zZXRFbnRpdHlCZWFuKGVudGl0eSk7Ci0JICAgIHJvbGVTb3VyY2Uuc2V0Um9sZShyb2xlMSk7Ci0JICAgIHJvbGUxLnNldFNvdXJjZShyb2xlU291cmNlKTsKLQkgICAgCi0JICAgIFJvbGVTb3VyY2UgdGFyZ2V0Um9sZVNvdXJjZSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVSb2xlU291cmNlKCk7Ci0JICAgIHRhcmdldFJvbGVTb3VyY2Uuc2V0RW50aXR5QmVhbih0YXJnZXRFbnRpdHkpOwotCSAgICB0YXJnZXRSb2xlU291cmNlLnNldFJvbGUocm9sZTIpOwotCSAgICByb2xlMi5zZXRTb3VyY2UodGFyZ2V0Um9sZVNvdXJjZSk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RUpCUmVsYXRpb25zRm9yU291cmNlKGVudGl0eSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKSwxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmNvbnRhaW5zKHJlbGF0aW9uKSx0cnVlKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFSkJSZWxhdGlvbnNoaXBSb2xlc0ZvclR5cGUoKSB7Ci0KLSAgICAJRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlbGF0aW9uc2hpcHMgcmVsYXRpb25zaGlwcyA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVSZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRSZWxhdGlvbnNoaXBMaXN0KHJlbGF0aW9uc2hpcHMpOwotICAgICAgICByZWxhdGlvbnNoaXBzLnNldEVqYkphcihvYmpFSkJKYXIpOwotICAgICAgCi0gICAgICAgIEVKQlJlbGF0aW9uIHJlbGF0aW9uID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVKQlJlbGF0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBhUmVsYXRpb25OYW1lID0gIlJlbGF0aW9uMSI7Ci0gICAgICAgIHJlbGF0aW9uLnNldE5hbWUoYVJlbGF0aW9uTmFtZSk7Ci0gICAgICAgIAotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUxID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgICAgCi0gICAgCUxpc3Qgcm9sZUxpc3QgPSByZWxhdGlvbi5nZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTEpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTIpOwotICAgICAgICAKLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IHRhcmdldEVudGl0eSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgIAotCSAgICBSb2xlU291cmNlIHJvbGVTb3VyY2UgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlUm9sZVNvdXJjZSgpOwotCSAgICByb2xlU291cmNlLnNldEVudGl0eUJlYW4oZW50aXR5KTsKLQkgICAgcm9sZVNvdXJjZS5zZXRSb2xlKHJvbGUxKTsKLQkgICAgcm9sZTEuc2V0U291cmNlKHJvbGVTb3VyY2UpOwotCSAgICAKLQkgICAgUm9sZVNvdXJjZSB0YXJnZXRSb2xlU291cmNlID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVJvbGVTb3VyY2UoKTsKLQkgICAgdGFyZ2V0Um9sZVNvdXJjZS5zZXRFbnRpdHlCZWFuKHRhcmdldEVudGl0eSk7Ci0JICAgIHRhcmdldFJvbGVTb3VyY2Uuc2V0Um9sZShyb2xlMik7Ci0JICAgIHJvbGUyLnNldFNvdXJjZSh0YXJnZXRSb2xlU291cmNlKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlc0ZvclR5cGUodGFyZ2V0RW50aXR5KTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpLDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuY29udGFpbnMocmVsYXRpb24pLHRydWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfRUpCSmFyIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2NvbnRhaW5zQ29udGFpbmVyTWFuYWdlZEJlYW5zIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2NvbnRhaW5zU2VjdXJpdHlSb2xlIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEJlYW5NYW5hZ2VkQmVhbnMiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0Q29udGFpbmVyTWFuYWdlZEJlYW5zIikpOwotCQkKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRFSkIxMUNvbnRhaW5lck1hbmFnZWRCZWFucyIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRFSkIyMENvbnRhaW5lck1hbmFnZWRCZWFucyIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRNZXNzYWdlRHJpdmVuQmVhbnMiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0RWpiUmVsYXRpb25zIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEVudGVycGlzZUJlYW5Gcm9tUmVmIikpOwotCQkKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRFbnRlcnByaXNlQmVhbk5hbWVkIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEVudGVycHJpc2VCZWFuc1dpdGhSZWZlcmVuY2UiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0RW50ZXJwcmlzZUJlYW5XaXRoUmVmZXJlbmNlIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldFNlc3Npb25CZWFucyIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRWZXJzaW9uSUQiKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEoyRUVWZXJzaW9uSUQiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0RUpCUmVsYXRpb24iKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0RUpCUmVsYXRpb25zRm9yU291cmNlIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEVKQlJlbGF0aW9uc2hpcFJvbGVzRm9yVHlwZSIpKTsKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VKQlJlbGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRUpCUmVsYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Y2NlYzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRUpCUmVsYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBFSkJSZWxhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIEVqYkZhY3RvcnkgRUpCRkFDVE9SWSA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLQlwcml2YXRlIEVKQlJlbGF0aW9uIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUpCUmVsYXRpb24oKTsKLQl9Ci0JIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRUpCUmVsYXRpb25UZXN0LmNsYXNzKTsKLQl9Ci0JIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfRUpCUmVsYXRpb24oKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb24gdG1wRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcEVKQlJlbGF0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zUmVsYXRpb25zaGlwUm9sZSgpIHsKLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMSA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUyID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uIG9iakVKQlJlbGF0aW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmNvbnRhaW5zUmVsYXRpb25zaGlwUm9sZShyb2xlMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSxyZXRWYWx1ZSk7Ci0gICAgICAgIExpc3Qgcm9sZUxpc3QgPSBvYmpFSkJSZWxhdGlvbi5nZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTEpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTIpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmNvbnRhaW5zUmVsYXRpb25zaGlwUm9sZShyb2xlMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLHJldFZhbHVlKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Rmlyc3RSb2xlKCkgewotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUxID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTIgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMaXN0IHJvbGVMaXN0ID0gb2JqRUpCUmVsYXRpb24uZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUxKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUyKTsKLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb24uZ2V0Rmlyc3RSb2xlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyb2xlMSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRPcHBvc2l0ZVJvbGUoKSB7Ci0gICAgCQotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUxID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTIgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9wcFJvbGUgPSBvYmpFSkJSZWxhdGlvbi5nZXRPcHBvc2l0ZVJvbGUocm9sZTEpOwotICAgICAgICBhc3NlcnROdWxsKG9wcFJvbGUpOwotICAgICAgICAKLSAgICAgICAgTGlzdCByb2xlTGlzdCA9IG9iakVKQlJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMSk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMik7Ci0gICAgICAgIAotICAgICAgICBvcHBSb2xlID0gb2JqRUpCUmVsYXRpb24uZ2V0T3Bwb3NpdGVSb2xlKHJvbGUxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJvbGUyLG9wcFJvbGUpOwotICAgICAgICAKLSAgICAgICAgb3BwUm9sZSA9IG9iakVKQlJlbGF0aW9uLmdldE9wcG9zaXRlUm9sZShyb2xlMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyb2xlMSxvcHBSb2xlKTsKLSAgICB9Ci0KLSAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRTZWNvbmRSb2xlKCkgewotCi0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTEgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMiA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3Qgcm9sZUxpc3QgPSBvYmpFSkJSZWxhdGlvbi5nZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTEpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTIpOwotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbi5nZXRTZWNvbmRSb2xlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyb2xlMixyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRGb3dhcmQoKSB7Ci0KLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMSA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUyID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uIG9iakVKQlJlbGF0aW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTGlzdCByb2xlTGlzdCA9IG9iakVKQlJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMSk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMik7Ci0gICAgICAgIAotICAgICAgICBvYmpFSkJSZWxhdGlvbi5zZXRGb3dhcmQocm9sZTIpOwotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbi5nZXRGaXJzdFJvbGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJvbGUyLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbi5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3RGVzY3JpcHRpb24gPSAiIjsKLSAgICAgICAgb2JqRUpCUmVsYXRpb24uc2V0RGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24pOwotICAgIH0qLwotCi0gIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE5hbWUoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3TmFtZSA9ICIiOwotICAgICAgICBvYmpFSkJSZWxhdGlvbi5zZXROYW1lKG5ld05hbWUpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFJlbGF0aW9uc2hpcExpc3QoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSZWxhdGlvbnNoaXBzIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbi5nZXRSZWxhdGlvbnNoaXBMaXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRSZWxhdGlvbnNoaXBMaXN0KCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uIG9iakVKQlJlbGF0aW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUmVsYXRpb25zaGlwcyBuZXdSZWxhdGlvbnNoaXBMaXN0ID0gbnVsbDsKLSAgICAgICAgb2JqRUpCUmVsYXRpb24uc2V0UmVsYXRpb25zaGlwTGlzdChuZXdSZWxhdGlvbnNoaXBMaXN0KTsKLSAgICB9Ci0KLSAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9ucygpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbi5nZXREZXNjcmlwdGlvbnMoKTsKLSAgICB9Ki8KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VKQlJlbGF0aW9uc2hpcFJvbGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FSkJSZWxhdGlvbnNoaXBSb2xlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzJjMDU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VKQlJlbGF0aW9uc2hpcFJvbGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NdWx0aXBsaWNpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlOwotCi1wdWJsaWMgY2xhc3MgRUpCUmVsYXRpb25zaGlwUm9sZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIEVqYkZhY3RvcnkgRUpCRkFDVE9SWSA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLQlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUxID0gbnVsbCwgcm9sZTIgPSBudWxsOwotCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5ID0gbnVsbDsKLQlFSkJSZWxhdGlvbiBlamJSZWxhdGlvbiA9IG51bGwgOwotCQotCSBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEVKQlJlbGF0aW9uc2hpcFJvbGVUZXN0LmNsYXNzKTsKLQl9Ci0JIAotCXByaXZhdGUgRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X0VKQlJlbGF0aW9uc2hpcFJvbGUoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSB0bXBFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0bXBFSkJSZWxhdGlvbnNoaXBSb2xlKTsKLSAgICB9Ci0KLSAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9naWNhbE5hbWUoKSB7Ci0KLSAgICAgICAvKiBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmdldExvZ2ljYWxOYW1lKCk7Ki8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAicm9sZTEiOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0TmFtZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmFtZSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRPcHBvc2l0ZSgpIHsKLSAgICAJaW5pdCgpOwotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSByb2xlMS5nZXRPcHBvc2l0ZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUscm9sZTIpOwotICAgICAgICByZXRWYWx1ZSA9IHJvbGUyLmdldE9wcG9zaXRlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxyb2xlMSk7Ci0gICAgfQotCi0gICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNvdXJjZUVudGl0eSgpIHsKLQkgICAgaW5pdCgpOwotCSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IHJldFZhbHVlID0gcm9sZTEuZ2V0U291cmNlRW50aXR5KCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxlbnRpdHkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNGb3J3YXJkKCkgewotICAgICAgIAlpbml0KCk7Ci0JICAgIGJvb2xlYW4gcmV0VmFsdWUgPSByb2xlMi5pc0ZvcndhcmQoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLQkgICAgcm9sZTIuc2V0Rm93YXJkKCk7Ci0JICAgIHJldFZhbHVlID0gcm9sZTIuaXNGb3J3YXJkKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLQkgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0tleSgpIHsKLSAgICAJaW5pdCgpOwotCSAgICBib29sZWFuIHJldFZhbHVlID0gcm9sZTIuaXNLZXkoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLQkgICAgcm9sZTIuc2V0S2V5KHRydWUpOwotCSAgICByZXRWYWx1ZSA9IHJvbGUyLmlzS2V5KCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEtleSgpIHsKLQotICAgIAlpbml0KCk7Ci0JICAgIGJvb2xlYW4gcmV0VmFsdWUgPSByb2xlMi5pc0tleSgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotCSAgICByb2xlMi5zZXRLZXkodHJ1ZSk7Ci0JICAgIHJldFZhbHVlID0gcm9sZTIuaXNLZXkoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAJcm9sZTEgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLQkJcm9sZTIgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLQkgICAgZWpiUmVsYXRpb24gPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uKCk7Ci0JICAgIGVudGl0eSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotCSAgICBSb2xlU291cmNlIHJvbGVTb3VyY2UgPSBFSkJGQUNUT1JZLmNyZWF0ZVJvbGVTb3VyY2UoKTsKLQkgICAgcm9sZVNvdXJjZS5zZXRFbnRpdHlCZWFuKGVudGl0eSk7Ci0JICAgIHJvbGVTb3VyY2Uuc2V0Um9sZShyb2xlMSk7Ci0JICAgIHJvbGUxLnNldFNvdXJjZShyb2xlU291cmNlKTsKLQkgICAgTGlzdCByb2xlTGlzdCA9IGVqYlJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0JICAgIHJvbGVMaXN0LmFkZChyb2xlMSk7Ci0JICAgIHJvbGVMaXN0LmFkZChyb2xlMik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc01hbnkoKSB7Ci0gICAgCWluaXQoKTsKLQkgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotCSAgICByZXRWYWx1ZSA9IHJvbGUxLmlzTWFueSgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpIDsKLQkgICAgcm9sZTIuc2V0TXVsdGlwbGljaXR5KE11bHRpcGxpY2l0eUtpbmQuTUFOWV9MSVRFUkFMKTsKLQkgICAgcmV0VmFsdWUgPSByb2xlMS5pc01hbnkoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpIDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTmF2aWdhYmxlKCkgewotICAgIAlpbml0KCk7Ci0gICAgCWJvb2xlYW4gcmV0VmFsdWUgPSByb2xlMS5pc05hdmlnYWJsZSgpOwotICAgIAlhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgIAlDTVJGaWVsZCBjbXJGaWVsZCA9IEVKQkZBQ1RPUlkuY3JlYXRlQ01SRmllbGQoKTsKLSAgICAJcm9sZTEuc2V0Q21yRmllbGQoY21yRmllbGQpOwotICAgIAlyZXRWYWx1ZSA9IHJvbGUxLmlzTmF2aWdhYmxlKCk7Ci0gICAgCWFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRGb3dhcmQoKSB7Ci0gICAgCWluaXQoKTsKLQkgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHJvbGUyLmlzRm9yd2FyZCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotCSAgICByb2xlMi5zZXRGb3dhcmQoKTsKLQkgICAgcmV0VmFsdWUgPSByb2xlMi5pc0ZvcndhcmQoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TmFtZSgpIHsKLQotICAgIAkgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgIFN0cmluZyBuYW1lID0gInJvbGUxIjsKLSAgICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmdldE5hbWUoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgLyogcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3RGVzY3JpcHRpb24gPSAiIjsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbik7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Um9sZU5hbWUoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5nZXRSb2xlTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Um9sZU5hbWUoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld1JvbGVOYW1lID0gIiI7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuc2V0Um9sZU5hbWUobmV3Um9sZU5hbWUpOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldE11bHRpcGxpY2l0eSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNdWx0aXBsaWNpdHlLaW5kIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmdldE11bHRpcGxpY2l0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TXVsdGlwbGljaXR5KCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE11bHRpcGxpY2l0eUtpbmQgbmV3TXVsdGlwbGljaXR5ID0gbnVsbDsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXRNdWx0aXBsaWNpdHkobmV3TXVsdGlwbGljaXR5KTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF91bnNldE11bHRpcGxpY2l0eSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnVuc2V0TXVsdGlwbGljaXR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1NldE11bHRpcGxpY2l0eSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5pc1NldE11bHRpcGxpY2l0eSgpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2lzQ2FzY2FkZURlbGV0ZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5pc0Nhc2NhZGVEZWxldGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldENhc2NhZGVEZWxldGUoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiBuZXdDYXNjYWRlRGVsZXRlID0gZmFsc2U7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuc2V0Q2FzY2FkZURlbGV0ZShuZXdDYXNjYWRlRGVsZXRlKTsKLSAgICB9Ki8KLQotIC8qICAgcHVibGljIHZvaWQgdGVzdF91bnNldENhc2NhZGVEZWxldGUoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS51bnNldENhc2NhZGVEZWxldGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzU2V0Q2FzY2FkZURlbGV0ZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5pc1NldENhc2NhZGVEZWxldGUoKTsKLSAgICB9Ki8KLQotICAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVsYXRpb25zaGlwKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmdldFJlbGF0aW9uc2hpcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVsYXRpb25zaGlwKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uIG5ld0NvbnRhaW5lciA9IG51bGw7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuc2V0UmVsYXRpb25zaGlwKG5ld0NvbnRhaW5lcik7Ci0gICAgfSovCi0KLSAgIC8qcHVibGljIHZvaWQgdGVzdF9nZXRTb3VyY2UoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUm9sZVNvdXJjZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5nZXRTb3VyY2UoKTsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNvdXJjZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSb2xlU291cmNlIG5ld1NvdXJjZSA9IG51bGw7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuc2V0U291cmNlKG5ld1NvdXJjZSk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q21yRmllbGQoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ01SRmllbGQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0Q21yRmllbGQoKTsKLSAgICB9Ci0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Q21yRmllbGQoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ01SRmllbGQgbmV3Q21yRmllbGQgPSBudWxsOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnNldENtckZpZWxkKG5ld0NtckZpZWxkKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbnMoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0RGVzY3JpcHRpb25zKCk7Ci0gICAgfSovCi0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVxdWlyZWQoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQm9vbGVhbiBpc1JlcXVpcmVkID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXRSZXF1aXJlZChpc1JlcXVpcmVkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuaXNSZXF1aXJlZCgpKTsKLSAgICAgICAgaXNSZXF1aXJlZCA9IEJvb2xlYW4uVFJVRTsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXRSZXF1aXJlZChpc1JlcXVpcmVkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5pc1JlcXVpcmVkKCkpOwotICAgIH0KLSAgICAKLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfcmVjb25jaWxlQXR0cmlidXRlcygpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnJlY29uY2lsZUF0dHJpYnV0ZXMoKTsKLSAgICB9ICovCi0KLQotICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FamJFTUZUZXN0QmFzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRWpiRU1GVGVzdEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0NjA5Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FamJFTUZUZXN0QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDE0LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuRWpiRU1GVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEVqYkVNRlRlc3RCYXNlIGV4dGVuZHMgRWpiRU1GVGVzdCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBFamJFTUZUZXN0QmFzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb257Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJY3JlYXRlRUFSKCk7Ci0JCWNyZWF0ZUVKQigpOwotCi0JCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJc2V0TW9kdWxlVHlwZShFSkIpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVKQkphclBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZG9udCB0ZXN0IHRoZSBiYXNlIGZ1bmN0aW9ucwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MTRFSkJKYXJQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vCQkgZG9udCB0ZXN0IHRoZSBiYXNlIGZ1bmN0aW9ucwotCX0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FamJGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRWpiRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiYzFhYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FamJGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5NZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhUmVmRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFjdGl2YXRpb25Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk1ldGhvZENhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb25zaGlwUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FeGNsdWRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5TWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZWxhdGlvbnNoaXBzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotCi1wdWJsaWMgY2xhc3MgRWpiRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIEVqYkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShFamJGYWN0b3J5VGVzdC5jbGFzcyk7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIHRlc3RfRWpiRmFjdG9yeSgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IHRtcEVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWV0aG9kRWxlbWVudCgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgYVNpZ25hdHVyZSA9ICIiOwotICAgICAgICBNZXRob2RFbGVtZW50IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZU1ldGhvZEVsZW1lbnQoYVNpZ25hdHVyZSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWV0aG9kRWxlbWVudEZyb20oKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kIGFNZXRob2QgPSAgSmF2YVJlZkZhY3RvcnlJbXBsLmdldEFjdGl2ZUZhY3RvcnkoKS5jcmVhdGVNZXRob2QoKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBuYW1lID0gInNldFR3b1BhcmFtTWV0aG9kIjsKLSAgICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyMSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci0gICAgICAgIEphdmFIZWxwZXJzIHR5cGUxID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgICAgIGphdmFQYXJhbWV0ZXIxLnNldEVUeXBlKHR5cGUxKTsKLSAgICAgICAgCi0gICAgICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlcjIgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YVBhcmFtZXRlcigpOwotICAgICAgICBKYXZhSGVscGVycyB0eXBlMiA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS51dGlsLkxpc3QiKTsKLSAgICAgICAgamF2YVBhcmFtZXRlcjIuc2V0RVR5cGUodHlwZTIpOwotICAgICAgICAKLSAgICAgICAgYU1ldGhvZC5zZXROYW1lKG5hbWUpOwotICAgICAgICBhTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQoamF2YVBhcmFtZXRlcjEpOwotICAgICAgICBhTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQoamF2YVBhcmFtZXRlcjIpOwotICAgICAgICAKLSAgICAgICAgTWV0aG9kRWxlbWVudCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVNZXRob2RFbGVtZW50RnJvbShhTWV0aG9kKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNZXRob2RFbGVtZW50RnJvbV8yKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBtZXRob2QgPSBudWxsOwotICAgICAgICBNZXRob2RFbGVtZW50IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZU1ldGhvZEVsZW1lbnRGcm9tKG1ldGhvZCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1ldGhvZFBlcm1pc3Npb24oKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVNZXRob2RQZXJtaXNzaW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVudGl0eSgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFbnRpdHkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlRW50aXR5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUNNUEF0dHJpYnV0ZSgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQ01SRmllbGQoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ01SRmllbGQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlQ01SRmllbGQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRUpCUmVsYXRpb24oKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCUmVsYXRpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlRUpCUmVsYXRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVJlbGF0aW9uc2hpcHMoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUmVsYXRpb25zaGlwcyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVSZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRUpCSmFyKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQkphciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVFSkJKYXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVSb2xlU291cmNlKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJvbGVTb3VyY2UgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlUm9sZVNvdXJjZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVF1ZXJ5KCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFF1ZXJ5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUXVlcnlNZXRob2QoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUXVlcnlNZXRob2QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlUXVlcnlNZXRob2QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZUFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUFjdGl2YXRpb25Db25maWcoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQWN0aXZhdGlvbkNvbmZpZyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVBY3RpdmF0aW9uQ29uZmlnKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWV0aG9kRWxlbWVudF8yKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlTWV0aG9kRWxlbWVudCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUV4Y2x1ZGVMaXN0KCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEV4Y2x1ZGVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZUV4Y2x1ZGVMaXN0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2Vzc2lvbigpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXNzaW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNZXNzYWdlRHJpdmVuKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1lc3NhZ2VEcml2ZW4gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlTWVzc2FnZURyaXZlbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbigpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRUpCTWV0aG9kQ2F0ZWdvcnkoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCTWV0aG9kQ2F0ZWdvcnkgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlRUpCTWV0aG9kQ2F0ZWdvcnkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FbnRpdHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYTU0OGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRW50aXR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLQotcHVibGljIGNsYXNzIEVudGl0eVRlc3QgZXh0ZW5kcyBFamJFTUZUZXN0QmFzZXsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEVudGl0eVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgRW50aXR5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRW50aXR5KCk7Ci0JfQotICAgIHB1YmxpYyB2b2lkIHRlc3RfRW50aXR5KCkgewotICAgICAgICBFbnRpdHkgdG1wRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0bXBFbnRpdHkpOwotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByaW1hcnlLZXlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAJaW5pdCgpOwotICAgIAlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgCQotICAgIAlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gREQuZ2V0RUpCSmFyKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCUxpc3QgZW50ZXJwcmlzZUJlYW5zID0gREQuZ2V0RUpCSmFyKCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5QmVhbiA9IG51bGw7Ci0JCUVudGVycHJpc2VCZWFuIGJlYW4gPSBudWxsOwotCQlmb3IgKGludCB4PTA7IHg8IGVudGVycHJpc2VCZWFucy5zaXplKCk7ICsreCkgewotCQkJYmVhbiA9IChFbnRlcnByaXNlQmVhbikgZW50ZXJwcmlzZUJlYW5zLmdldCh4KTsKLQkJCWlmIChiZWFuLmlzRW50aXR5KCkgJiYgYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCWVudGl0eUJlYW4gPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYmVhbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoZW50aXR5QmVhbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGVudGl0eUJlYW4uZ2V0UHJpbWFyeUtleU5hbWUoKTsKLQkJCVN0cmluZyBwcmltS2V5TmFtZSA9IGVudGl0eUJlYW4uZ2V0UHJpbWFyeUtleSgpLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCWFzc2VydEVxdWFscyhuYW1lLHByaW1LZXlOYW1lKTsKLQkJCQotCQl9Ci0gICAgfQotCi0gICAgCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2lzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpIHsKLSAgICAgICAgRW50aXR5IG9iakVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFbnRpdHkuaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgfSovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFByaW1hcnlLZXlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCWluaXQoKTsKLSAgICAJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgIAkKLSAgICAJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IERELmdldEVKQkphcigpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQlMaXN0IGVudGVycHJpc2VCZWFucyA9IERELmdldEVKQkphcigpLmdldEVudGVycHJpc2VCZWFucygpOwotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eUJlYW4gPSBudWxsOwotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gbnVsbDsKLQkJZm9yIChpbnQgeD0wOyB4PCBlbnRlcnByaXNlQmVhbnMuc2l6ZSgpOyArK3gpIHsKLQkJCWJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGVudGVycHJpc2VCZWFucy5nZXQoeCk7Ci0JCQlpZiAoYmVhbi5pc0VudGl0eSgpICYmIGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQllbnRpdHlCZWFuID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVudGl0eUJlYW4gIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSBlbnRpdHlCZWFuLmdldFByaW1hcnlLZXlOYW1lKCk7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9ICJOZXdOYW1lIiA7Ci0JCQllbnRpdHlCZWFuLnNldFByaW1hcnlLZXlOYW1lKG5ld05hbWUpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld05hbWUsZW50aXR5QmVhbi5nZXRQcmltYXJ5S2V5TmFtZSgpKTsKLQkJfSAgICAKLSAgICB9Ci0KLSAgLyogcHVibGljIHZvaWQgdGVzdF9pc1JlZW50cmFudCgpIHsKLQotICAgICAgICBFbnRpdHkgb2JqRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVudGl0eS5pc1JlZW50cmFudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVlbnRyYW50KCkgewotCi0gICAgICAgIEVudGl0eSBvYmpFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIG5ld1JlZW50cmFudCA9IGZhbHNlOwotICAgICAgICBvYmpFbnRpdHkuc2V0UmVlbnRyYW50KG5ld1JlZW50cmFudCk7Ci0gICAgfSovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfdW5zZXRSZWVudHJhbnQoKSB7Ci0KLSAgICAgICAgRW50aXR5IG9iakVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iakVudGl0eS51bnNldFJlZW50cmFudCgpOwotICAgIH0gKi8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9pc1NldFJlZW50cmFudCgpIHsKLQotICAgICAgICBFbnRpdHkgb2JqRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVudGl0eS5pc1NldFJlZW50cmFudCgpOwotICAgIH0gKi8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRQcmltYXJ5S2V5KCkgewotCi0gICAgICAgIEVudGl0eSBvYmpFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhQ2xhc3MgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVudGl0eS5nZXRQcmltYXJ5S2V5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRQcmltYXJ5S2V5KCkgewotCi0gICAgICAgIEVudGl0eSBvYmpFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhQ2xhc3MgbmV3UHJpbWFyeUtleSA9IG51bGw7Ci0gICAgICAgIG9iakVudGl0eS5zZXRQcmltYXJ5S2V5KG5ld1ByaW1hcnlLZXkpOwotICAgIH0gKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVudGl0eVRlc3QoInRlc3Rfc2V0UHJpbWFyeUtleU5hbWUiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVudGl0eVRlc3QoInRlc3RfZ2V0UHJpbWFyeUtleU5hbWUiKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9NZXRob2RFbGVtZW50VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvTWV0aG9kRWxlbWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFhODFlYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9NZXRob2RFbGVtZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLQotcHVibGljIGNsYXNzIE1ldGhvZEVsZW1lbnRUZXN0IGV4dGVuZHMgRWpiRU1GVGVzdEJhc2UgewotCXByaXZhdGUgZmluYWwgaW50IFNFU1NJT04gPTA7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgRU5USVRZID0gMTsKLQlwcml2YXRlIGZpbmFsIGludCBDT05UQUlORVJfTUFOQUdFRF9FTlRJVFkgPTI7Ci0JCi0JCi0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBNZXRob2RFbGVtZW50VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJCi0JfQotCi0JcHJpdmF0ZSBNZXRob2RFbGVtZW50IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZEVsZW1lbnQoKTsKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgdGVzdF9NZXRob2RFbGVtZW50KCkgewotICAgICAgICBNZXRob2RFbGVtZW50IHRtcE1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcE1ldGhvZEVsZW1lbnQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfYWRkTWV0aG9kUGFyYW1zKCkgewotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcGFyYW0xID0gInBhcmFtMSI7Ci0gICAgICAgIFN0cmluZyBwYXJhbTI9ICJwYXJhbTIiOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMik7Ci0gICAgICAgIExpc3QgbGlzdCA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0TWV0aG9kUGFyYW1zKCk7Ci0gICAgICAgIHJldFZhbHVlID0gbGlzdC5jb250YWlucyhwYXJhbTEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9hcHBseVplcm9QYXJhbXMoKSB7Ci0gICAgCU1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBwYXJhbTEgPSAicGFyYW0xIjsKLSAgICAgICAgU3RyaW5nIHBhcmFtMj0gInBhcmFtMiI7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0xKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0yKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gb2JqTWV0aG9kRWxlbWVudC5nZXRNZXRob2RQYXJhbXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpPT0yLCB0cnVlKSA7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYXBwbHlaZXJvUGFyYW1zKCk7Ci0gICAgICAgIGxpc3QgPSBvYmpNZXRob2RFbGVtZW50LmdldE1ldGhvZFBhcmFtcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdC5zaXplKCk9PTAsIHRydWUpIDsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9lcXVhbFNpZ25hdHVyZSgpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQxID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50MiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudDMgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDEuc2V0TmFtZSgibmFtZSIpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50Mi5zZXROYW1lKCJuYW1lIik7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQzLnNldE5hbWUoIm5hbWUiKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwYXJhbTEgPSAicGFyYW0xIjsKLSAgICAgICAgU3RyaW5nIHBhcmFtMj0gInBhcmFtMiI7Ci0gICAgICAgIFN0cmluZyBwYXJhbTMgPSAicGFyYW0zIjsKLSAgICAgICAgU3RyaW5nIHBhcmFtND0gInBhcmFtNCI7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50MS5hZGRNZXRob2RQYXJhbXMocGFyYW0xKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDEuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMik7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50Mi5hZGRNZXRob2RQYXJhbXMocGFyYW0xKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDIuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMik7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50My5hZGRNZXRob2RQYXJhbXMocGFyYW0xKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDMuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMik7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50MS5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0xJVEVSQUwpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50Mi5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0xJVEVSQUwpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50My5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0xJVEVSQUwpOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQxLmVxdWFsU2lnbmF0dXJlKG9iak1ldGhvZEVsZW1lbnQyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQyLmVxdWFsU2lnbmF0dXJlKG9iak1ldGhvZEVsZW1lbnQzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDMuc2V0TmFtZSgibmFtZURpZmYiKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50Mi5lcXVhbFNpZ25hdHVyZShvYmpNZXRob2RFbGVtZW50Myk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50Mi5hZGRNZXRob2RQYXJhbXMocGFyYW0zKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50MS5lcXVhbFNpZ25hdHVyZShvYmpNZXRob2RFbGVtZW50Mik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50My5zZXROYW1lKCJuYW1lIik7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudDEuZXF1YWxTaWduYXR1cmUob2JqTWV0aG9kRWxlbWVudDMpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50My5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkhPTUVfTElURVJBTCk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudDEuZXF1YWxTaWduYXR1cmUob2JqTWV0aG9kRWxlbWVudDMpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kUGFyYW1zKCkgewotCi0gICAgCU1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBwYXJhbTEgPSAicGFyYW0xIjsKLSAgICAgICAgU3RyaW5nIHBhcmFtMj0gInBhcmFtMiI7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0xKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0yKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gb2JqTWV0aG9kRWxlbWVudC5nZXRNZXRob2RQYXJhbXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpPT0yLCB0cnVlKSA7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0LmNvbnRhaW5zKHBhcmFtMSksdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0LmNvbnRhaW5zKHBhcmFtMiksdHJ1ZSk7Ci0gICAgfQotCi0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNpZ25hdHVyZSgpIHsKLQotICAgIAlNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgIAlTdHJpbmcgbmFtZSA9ICJ0ZXN0IjsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXROYW1lKG5hbWUpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHBhcmFtMSA9ICJwYXJhbTEiOwotICAgICAgICBTdHJpbmcgcGFyYW0yPSAicGFyYW0yIjsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMik7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgc2lnbmF0dXJlID0gbmFtZSArICIoIiArIHBhcmFtMSArICIsIiArIHBhcmFtMiArICIpIjsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXRTaWduYXR1cmUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNpZ25hdHVyZSxyZXRWYWx1ZSk7Ci0gICAgICAgIAotICAgICAgCi0gICAgfQotICAgIAotICAgIAotICAgIAotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRUeXBlSmF2YUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCWluaXQoKTsKLSAgICAJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgIAlMaXN0IGVudGVycHJpc2VCZWFucyA9IERELmdldEVKQkphcigpLmdldEVudGVycHJpc2VCZWFucygpOwotICAgIAlFbnRlcnByaXNlQmVhbiBlYiA9IChFbnRlcnByaXNlQmVhbillbnRlcnByaXNlQmVhbnMuZ2V0KDApOwotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldEVudGVycHJpc2VCZWFuKGViKTsKLSAgICAgICAgSmF2YUNsYXNzIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgaWYgKGViLmhhc1JlbW90ZUNsaWVudCgpKSB7Ci0gICAgICAgIAlvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuSE9NRV9MSVRFUkFMKTsKLSAgICAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXRUeXBlSmF2YUNsYXNzKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZWIuZ2V0SG9tZUludGVyZmFjZSgpKTsKLSAgICAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5SRU1PVEVfTElURVJBTCk7Ci0gICAgICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0VHlwZUphdmFDbGFzcygpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGViLmdldFJlbW90ZUludGVyZmFjZSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IAotICAgICAgICBpZiAoZWIuaGFzTG9jYWxDbGllbnQoKSl7Ci0gICAgICAgIAlvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfSE9NRV9MSVRFUkFMKTsKLSAgICAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXRUeXBlSmF2YUNsYXNzKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZWIuZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkpOwotICAgICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0xJVEVSQUwpOwotICAgICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldFR5cGVKYXZhQ2xhc3MoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxlYi5nZXRMb2NhbEludGVyZmFjZSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICB9IAotICAgICAgICBpZiAoZWIuaXNNZXNzYWdlRHJpdmVuKCkpIHsKLSAgICAgICAgCW9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRF9MSVRFUkFMKTsKLSAgICAgICAgCXJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXRUeXBlSmF2YUNsYXNzKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZWIuZ2V0RWpiQ2xhc3MoKSk7Ci0gICAgICAgIH0KLSAgCi0gICAgfQotICAgIAotICAgCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kcygpIHsKLSAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1vc3RTcGVjaWZpYygpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2RFbGVtZW50IGFNZXRob2RFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgSmF2YUNsYXNzIGFDbGFzcyA9IG51bGw7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0TW9zdFNwZWNpZmljKGFNZXRob2RFbGVtZW50LCBhQ2xhc3MpOwotICAgIH0qLwotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfaGFzTWV0aG9kUGFyYW1zKCkgewotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5oYXNNZXRob2RQYXJhbXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgU3RyaW5nIHBhcmFtMSA9ICJwYXJhbTEiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaGFzTWV0aG9kUGFyYW1zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgU3RyaW5nIHBhcmFtMiA9ICJwYXJhbTIiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTIpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaGFzTWV0aG9kUGFyYW1zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2luaXRpYWxpemVGcm9tU2lnbmF0dXJlKCkgewotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgc2lnbmF0dXJlID0gInNldFR3b1BhcmFtTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsamF2YS51dGlsLkxpc3QpIjsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5pbml0aWFsaXplRnJvbVNpZ25hdHVyZShzaWduYXR1cmUpOwotICAgICAgICBMaXN0IGxpc3QgPSBvYmpNZXRob2RFbGVtZW50LmdldE1ldGhvZFBhcmFtcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdC5zaXplKCk9PTIsIHRydWUpIDsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAic2V0VHdvUGFyYW1NZXRob2QiOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdC5jb250YWlucygiamF2YS5sYW5nLlN0cmluZyIpLHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdC5jb250YWlucygiamF2YS51dGlsLkxpc3QiKSx0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9iak1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpLCAic2V0VHdvUGFyYW1NZXRob2QiKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0RlZmF1bHQoKSB7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0TmFtZSgidGVzdCIpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc0RlZmF1bHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXROYW1lKEphdmFDbGFzcy5ERUZBVUxUX01FVEhPRF9OQU1FKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzRGVmYXVsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNFcXVpdmFsZW50KCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudDEgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgCi0gICAgICAgIFNlc3Npb24gc2Vzc2lvbjEgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBTZXNzaW9uIHNlc3Npb24yID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDEuc2V0RW50ZXJwcmlzZUJlYW4oc2Vzc2lvbjEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50Mi5zZXRFbnRlcnByaXNlQmVhbihzZXNzaW9uMSk7Ci0gICAgICAgIFN0cmluZyBzaWduYXR1cmUxID0gInNldFR3b1BhcmFtTWV0aG9kKGphdmEubGFuZy5TdHJpbmcsamF2YS51dGlsLkxpc3QpIjsKLSAgICAgICAgU3RyaW5nIHNpZ25hdHVyZTIgPSAic2V0VHdvUGFyYW1NZXRob2QyKGphdmEubGFuZy5TdHJpbmcsamF2YS51dGlsLkxpc3QpIjsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDEuaW5pdGlhbGl6ZUZyb21TaWduYXR1cmUoc2lnbmF0dXJlMSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLmluaXRpYWxpemVGcm9tU2lnbmF0dXJlKHNpZ25hdHVyZTEpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudDEuaXNFcXVpdmFsZW50KG9iak1ldGhvZEVsZW1lbnQyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50Mi5pbml0aWFsaXplRnJvbVNpZ25hdHVyZShzaWduYXR1cmUyKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50MS5pc0VxdWl2YWxlbnQob2JqTWV0aG9kRWxlbWVudDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDIuaW5pdGlhbGl6ZUZyb21TaWduYXR1cmUoc2lnbmF0dXJlMSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLnNldEVudGVycHJpc2VCZWFuKHNlc3Npb24yKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50MS5pc0VxdWl2YWxlbnQob2JqTWV0aG9kRWxlbWVudDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNIb21lKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5IT01FX0xJVEVSQUwpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc0hvbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfSE9NRV9MSVRFUkFMKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzSG9tZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzUmVtb3RlKCkgewotICAgIAkgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5SRU1PVEVfTElURVJBTCk7Ci0gICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNSZW1vdGUoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FX0xJVEVSQUwpOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzUmVtb3RlKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNVbnNwZWNpZmllZCgpIHsKLSAgICAJIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRURfTElURVJBTCk7Ci0gICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNVbnNwZWNpZmllZCgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0hPTUVfTElURVJBTCk7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNVbnNwZWNpZmllZCgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0xvY2FsSG9tZSgpIHsKLQotICAgIAkgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FX0xJVEVSQUwgKTsKLSAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc0xvY2FsSG9tZSgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzTG9jYWxIb21lKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNMb2NhbCgpIHsKLSAgICAJIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCApOwotICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzTG9jYWwoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRF9MSVRFUkFMKTsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc0xvY2FsKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNWYWxpZCgpIHsKLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNWYWxpZCgpOwotICAgIH0KLQotICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X25hbWVBbmRQYXJhbXNFcXVhbHMoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kIGFNZXRob2QgPSAgSmF2YVJlZkZhY3RvcnlJbXBsLmdldEFjdGl2ZUZhY3RvcnkoKS5jcmVhdGVNZXRob2QoKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAic2V0VHdvUGFyYW1NZXRob2QiOwotICAgICAgICBTdHJpbmcgcGFyYW0xID0gImphdmEubGFuZy5TdHJpbmciOwotICAgICAgICBTdHJpbmcgcGFyYW0yID0gImphdmEudXRpbC5MaXN0IjsKLSAgICAgICAgCi0gICAgICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlcjEgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YVBhcmFtZXRlcigpOwotICAgICAgICBKYXZhSGVscGVycyB0eXBlMSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS5sYW5nLlN0cmluZyIpOwotICAgICAgICBqYXZhUGFyYW1ldGVyMS5zZXRFVHlwZSh0eXBlMSk7Ci0gICAgICAgIAotICAgICAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIyID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFQYXJhbWV0ZXIoKTsKLSAgICAgICAgSmF2YUhlbHBlcnMgdHlwZTIgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEudXRpbC5MaXN0Iik7Ci0gICAgICAgIGphdmFQYXJhbWV0ZXIyLnNldEVUeXBlKHR5cGUyKTsKLSAgICAgICAgCi0gICAgICAgIGFNZXRob2Quc2V0TmFtZShuYW1lKTsKLSAgICAgICAgYU1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuYWRkKGphdmFQYXJhbWV0ZXIxKTsKLSAgICAgICAgYU1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuYWRkKGphdmFQYXJhbWV0ZXIyKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0xKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0yKTsKLSAgICAgICAKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQubmFtZUFuZFBhcmFtc0VxdWFscyhhTWV0aG9kKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWUyID0gInNldFR3b1BhcmFtTWV0aG9kMiI7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0TmFtZShuYW1lMik7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5uYW1lQW5kUGFyYW1zRXF1YWxzKGFNZXRob2QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXROYW1lKG5hbWUpOwotICAgICAgICBTdHJpbmcgcGFyYW0zID0gImphdmEudXRpbC5MaXN0IjsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0zKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50Lm5hbWVBbmRQYXJhbXNFcXVhbHMoYU1ldGhvZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfcmVtb3ZlTWV0aG9kUGFyYW1zKCkgewotCi0gICAgCSBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgU3RyaW5nIHBhcmFtMSA9ICJwYXJhbTEiOwotICAgICAgICAgU3RyaW5nIHBhcmFtMj0gInBhcmFtMiI7Ci0gICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0yKTsKLSAgICAgICAgIExpc3QgbGlzdCA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0TWV0aG9kUGFyYW1zKCk7Ci0gICAgICAgICByZXRWYWx1ZSA9IGxpc3QuY29udGFpbnMocGFyYW0xKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQucmVtb3ZlTWV0aG9kUGFyYW1zKHBhcmFtMSk7Ci0gICAgICAgICBsaXN0ID0gb2JqTWV0aG9kRWxlbWVudC5nZXRNZXRob2RQYXJhbXMoKTsKLSAgICAgICAgIHJldFZhbHVlID0gbGlzdC5jb250YWlucyhwYXJhbTEpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICB9Ci0KLSAvKiAgIHB1YmxpYyB2b2lkIHRlc3RfcmVwcmVzZW50cygpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2QgYU1ldGhvZCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LnJlcHJlc2VudHMoYU1ldGhvZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRJZFRvUmVhZGFibGVTdHJpbmcoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRJZFRvUmVhZGFibGVTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3VuaXF1ZWx5SWRlbnRpZmllcygpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2QgYU1ldGhvZCA9IG51bGw7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LnVuaXF1ZWx5SWRlbnRpZmllcyhhTWV0aG9kKTsKLSAgICB9ICovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldE5hbWUoKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9zZXROYW1lKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdOYW1lID0gIiI7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0TmFtZShuZXdOYW1lKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRQYXJtcygpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldFBhcm1zKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRQYXJtcygpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3UGFybXMgPSAiIjsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRQYXJtcyhuZXdQYXJtcyk7Ci0gICAgfSovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VHlwZSgpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2RFbGVtZW50S2luZCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXRUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRUeXBlKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnRLaW5kIG5ld1R5cGUgPSBudWxsOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUobmV3VHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF91bnNldFR5cGUoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC51bnNldFR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzU2V0VHlwZSgpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc1NldFR5cGUoKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3RGVzY3JpcHRpb24gPSAiIjsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbik7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RW50ZXJwcmlzZUJlYW4oKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRW50ZXJwcmlzZUJlYW4gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0RW50ZXJwcmlzZUJlYW4oKTsKLSAgICB9Ci0KLSAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRFbnRlcnByaXNlQmVhbigpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFbnRlcnByaXNlQmVhbiBuZXdFbnRlcnByaXNlQmVhbiA9IG51bGw7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0RW50ZXJwcmlzZUJlYW4obmV3RW50ZXJwcmlzZUJlYW4pOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9ucygpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXREZXNjcmlwdGlvbnMoKTsKLSAgICB9Ki8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKE1ldGhvZEVsZW1lbnRUZXN0LmNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L01ldGhvZFBlcm1pc3Npb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9NZXRob2RQZXJtaXNzaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDM0NTcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L01ldGhvZFBlcm1pc3Npb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLQotcHVibGljIGNsYXNzIE1ldGhvZFBlcm1pc3Npb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRWpiRmFjdG9yeSBFSkJGQUNUT1JZID0gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbW1vbkZhY3RvcnkgQ09NTU9ORkFDVE9SWSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLQlwcml2YXRlIE1ldGhvZFBlcm1pc3Npb24gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBFSkJGQUNUT1JZLmNyZWF0ZU1ldGhvZFBlcm1pc3Npb24oKTsKLQl9Ci0JCi0JCi0gICAgcHVibGljIHZvaWQgdGVzdF9NZXRob2RQZXJtaXNzaW9uKCkgewotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIHRtcE1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcE1ldGhvZFBlcm1pc3Npb24pOwotICAgIH0KLQotICAgLypwdWJsaWMgdm9pZCB0ZXN0X2dldE1ldGhvZEVsZW1lbnRzKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVudGVycHJpc2VCZWFuIGFuRUpCID0gbnVsbDsKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbi5nZXRNZXRob2RFbGVtZW50cyhhbkVKQik7Ci0gICAgfSovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlY3VyaXR5Um9sZSgpIHsKLQotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlPSBDT01NT05GQUNUT1JZLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCQlTdHJpbmcgc2VjdXJpdHlSb2xlTmFtZSA9ICJ0ZXN0Um9sZSI7Ci0JCXNlY3VyaXR5Um9sZS5zZXRSb2xlTmFtZShzZWN1cml0eVJvbGVOYW1lKTsKLQkJb2JqTWV0aG9kUGVybWlzc2lvbi5nZXRSb2xlcygpLmFkZChzZWN1cml0eVJvbGUpOwotCQkKLSAgICAgICAgU2VjdXJpdHlSb2xlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmdldFNlY3VyaXR5Um9sZShzZWN1cml0eVJvbGVOYW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNlY3VyaXR5Um9sZSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9oYXNTZWN1cml0eVJvbGUoKSB7Ci0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGU9IENPTU1PTkZBQ1RPUlkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JCVN0cmluZyBzZWN1cml0eVJvbGVOYW1lID0gInRlc3RSb2xlIjsKLQkJc2VjdXJpdHlSb2xlLnNldFJvbGVOYW1lKHNlY3VyaXR5Um9sZU5hbWUpOwotCQlvYmpNZXRob2RQZXJtaXNzaW9uLmdldFJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZSk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmhhc1NlY3VyaXR5Um9sZShzZWN1cml0eVJvbGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIHRydWUpOwotICAgICAgICBTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlMj0gQ09NTU9ORkFDVE9SWS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmhhc1NlY3VyaXR5Um9sZShzZWN1cml0eVJvbGUyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9oYXNTZWN1cml0eVJvbGVfMigpIHsKLQotICAgIAlNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlPSBDT01NT05GQUNUT1JZLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCQlTdHJpbmcgc2VjdXJpdHlSb2xlTmFtZSA9ICJ0ZXN0Um9sZSI7Ci0JCXNlY3VyaXR5Um9sZS5zZXRSb2xlTmFtZShzZWN1cml0eVJvbGVOYW1lKTsKLQkJb2JqTWV0aG9kUGVybWlzc2lvbi5nZXRSb2xlcygpLmFkZChzZWN1cml0eVJvbGUpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbi5oYXNTZWN1cml0eVJvbGUoc2VjdXJpdHlSb2xlTmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIFN0cmluZyBzZWN1cml0eVJvbGVOYW1lRG9lc05vdEV4aXN0ID0gInRlc3RSb2xlRG9lc05vdEV4aXN0IjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmhhc1NlY3VyaXR5Um9sZShzZWN1cml0eVJvbGVOYW1lRG9lc05vdEV4aXN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0VxdWl2YWxlbnQoKSB7Ci0KLSAgICAJTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uMSA9IGdldEluc3RhbmNlKCk7Ci0gICAgCU1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbjIgPSBnZXRJbnN0YW5jZSgpOwotICAgIAkKLSAgICAgICAgU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZTE9IENPTU1PTkZBQ1RPUlkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0gICAgICAgIHNlY3VyaXR5Um9sZTEuc2V0Um9sZU5hbWUoInRlc3RSb2xlMSIpOwotICAgICAgICBTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlMj0gQ09NTU9ORkFDVE9SWS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLSAgICAgICAgc2VjdXJpdHlSb2xlMi5zZXRSb2xlTmFtZSgidGVzdFJvbGUyIik7Ci0gICAgICAgIFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGUzPSBDT01NT05GQUNUT1JZLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotICAgICAgICBzZWN1cml0eVJvbGUzLnNldFJvbGVOYW1lKCJ0ZXN0Um9sZTMiKTsKLSAgICAgICAgCi0JCQotICAgICAgICBvYmpNZXRob2RQZXJtaXNzaW9uMS5nZXRSb2xlcygpLmFkZChzZWN1cml0eVJvbGUxKTsKLSAgICAgICAgb2JqTWV0aG9kUGVybWlzc2lvbjEuZ2V0Um9sZXMoKS5hZGQoc2VjdXJpdHlSb2xlMik7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RQZXJtaXNzaW9uMi5nZXRSb2xlcygpLmFkZChzZWN1cml0eVJvbGUxKTsKLSAgICAgICAgb2JqTWV0aG9kUGVybWlzc2lvbjIuZ2V0Um9sZXMoKS5hZGQoc2VjdXJpdHlSb2xlMik7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24xLmlzRXF1aXZhbGVudChvYmpNZXRob2RQZXJtaXNzaW9uMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RQZXJtaXNzaW9uMS5nZXRSb2xlcygpLmFkZChzZWN1cml0eVJvbGUzKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uMS5pc0VxdWl2YWxlbnQob2JqTWV0aG9kUGVybWlzc2lvbjIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgIH0KLQotIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpNZXRob2RQZXJtaXNzaW9uLnNldERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uKTsKLSAgICB9Ki8KLQotICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2lzVW5jaGVja2VkKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmlzVW5jaGVja2VkKCk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3Rfc2V0VW5jaGVja2VkKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gbmV3VW5jaGVja2VkID0gZmFsc2U7Ci0gICAgICAgIG9iak1ldGhvZFBlcm1pc3Npb24uc2V0VW5jaGVja2VkKG5ld1VuY2hlY2tlZCk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfdW5zZXRVbmNoZWNrZWQoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqTWV0aG9kUGVybWlzc2lvbi51bnNldFVuY2hlY2tlZCgpOwotICAgIH0qLwotCi0gICAgLypwdWJsaWMgdm9pZCB0ZXN0X2lzU2V0VW5jaGVja2VkKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmlzU2V0VW5jaGVja2VkKCk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbi5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEFzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3IgbmV3QXNzZW1ibHlEZXNjcmlwdG9yID0gbnVsbDsKLSAgICAgICAgb2JqTWV0aG9kUGVybWlzc2lvbi5zZXRBc3NlbWJseURlc2NyaXB0b3IobmV3QXNzZW1ibHlEZXNjcmlwdG9yKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRSb2xlcygpIHsKLQotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbi5nZXRSb2xlcygpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldE1ldGhvZEVsZW1lbnRzXzIoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uZ2V0TWV0aG9kRWxlbWVudHMoKTsKLSAgICB9Ki8KLQotICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9ucygpIHsKLQotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbi5nZXREZXNjcmlwdGlvbnMoKTsKLSAgICB9Ki8gICAKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKE1ldGhvZFBlcm1pc3Npb25UZXN0LmNsYXNzKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvTWV0aG9kVHJhbnNhY3Rpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9NZXRob2RUcmFuc2FjdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkZDk4ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9NZXRob2RUcmFuc2FjdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlOwotCi1wdWJsaWMgY2xhc3MgTWV0aG9kVHJhbnNhY3Rpb25UZXN0IGV4dGVuZHMgRWpiRU1GVGVzdEJhc2UgewotCi0gICAgLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgTWV0aG9kVHJhbnNhY3Rpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RfTWV0aG9kVHJhbnNhY3Rpb24oKSB7Ci0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIHRtcE1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0bXBNZXRob2RUcmFuc2FjdGlvbik7Ci0gICAgfSAgIAotICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uewotICAgIAlpbml0KCk7Ci0gICAgCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IERELmdldEVKQkphcigpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQlhc3NlcnROb3ROdWxsKGFzc2VtYmx5RGVzY3JpcHRvcik7Ci0JCUxpc3QgZW50ZXJwcmlzZUJlYW5zID0gREQuZ2V0RUpCSmFyKCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCUVudGVycHJpc2VCZWFuIGViMSA9IChFbnRlcnByaXNlQmVhbillbnRlcnByaXNlQmVhbnMuZ2V0KDApOwotCQkvLyBjcmVhdGUgYSBtZXRob2QgdHJhbnNhY3Rpb24KLQkJTWV0aG9kVHJhbnNhY3Rpb24gbWV0aG9kVHJhbnNhY3Rpb24gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLQkJTGlzdCBtZXRob2RUcmFuc2FjdGlvbnMgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCk7Ci0JCW1ldGhvZFRyYW5zYWN0aW9ucy5hZGQobWV0aG9kVHJhbnNhY3Rpb24pOwotCQkvLyBjcmVhdGUgYSBtZXRob2QgZWxlbWVudAotCQlNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlTWV0aG9kRWxlbWVudCgpOwotCQltZXRob2RFbGVtZW50LnNldEVudGVycHJpc2VCZWFuKGViMSk7Ci0JCW1ldGhvZFRyYW5zYWN0aW9uLmdldE1ldGhvZEVsZW1lbnRzKCkuYWRkKG1ldGhvZEVsZW1lbnQpOwotCQkvLyBnZXQgdGhlIG1ldGhvZCBlbGVtZW50IGZvciB0aGUgZW50ZXJwcmlzZSBiZWFuCi0JCUxpc3QgbWV0aG9kRWxlbWVudHMgPSBtZXRob2RUcmFuc2FjdGlvbi5nZXRNZXRob2RFbGVtZW50cyhlYjEpOwotCQlhc3NlcnRFcXVhbHMobWV0aG9kRWxlbWVudHMuY29udGFpbnMobWV0aG9kRWxlbWVudCksIHRydWUpOwotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiAgCi0gICAgICogW2lzc3VlIDogU0EgLSBnZXRNb3N0U3BlY2lmaWNNZXRob2RFbGVtZW50KCkgLSBkb2VzIGl0IG5lZWQgdG8gYmUgYW4gQVBJIGFzIGl0IGNhbGxzCi0gICAgICogIHRvIHRoZSBzdGF0aWMgbWVtYmVyIG9mIE1ldGhvZEVsZW1lbnRJbXBsIF0KLSAgICAgKgotICAgICAqLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1vc3RTcGVjaWZpY01ldGhvZEVsZW1lbnQoKSB7Ci0KLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gb2JqTWV0aG9kVHJhbnNhY3Rpb24gPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBNZXRob2QgYU1ldGhvZCA9IG51bGw7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFRyYW5zYWN0aW9uCi0gICAgICAgICAgICAgICAgLmdldE1vc3RTcGVjaWZpY01ldGhvZEVsZW1lbnQoYU1ldGhvZCk7Ci0gICAgfSAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0VxdWl2YWxlbnQoKSB7Ci0KLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gb2JqTWV0aG9kVHJhbnNhY3Rpb24xID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uMiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotCi0gICAgICAgIG9iak1ldGhvZFRyYW5zYWN0aW9uMS5zZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZShUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuU1VQUE9SVFNfTElURVJBTCk7Ci0gICAgICAgIG9iak1ldGhvZFRyYW5zYWN0aW9uMi5zZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZShUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuU1VQUE9SVFNfTElURVJBTCk7Ci0gICAgIAotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gb2JqTWV0aG9kVHJhbnNhY3Rpb24xLmlzRXF1aXZhbGVudChvYmpNZXRob2RUcmFuc2FjdGlvbjIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIG9iak1ldGhvZFRyYW5zYWN0aW9uMi5zZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZShUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUuUkVRVUlSRURfTElURVJBTCk7Ci0gICAgICAgIAotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFRyYW5zYWN0aW9uMS5pc0VxdWl2YWxlbnQob2JqTWV0aG9kVHJhbnNhY3Rpb24yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICB9Ci0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKSB7Ci0KLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gb2JqTWV0aG9kVHJhbnNhY3Rpb24gPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBUcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFRyYW5zYWN0aW9uLmdldFRyYW5zYWN0aW9uQXR0cmlidXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSBuZXdUcmFuc2FjdGlvbkF0dHJpYnV0ZSA9IG51bGw7Ci0gICAgICAgIG9iak1ldGhvZFRyYW5zYWN0aW9uCi0gICAgICAgICAgICAgICAgLnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKG5ld1RyYW5zYWN0aW9uQXR0cmlidXRlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3Vuc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKSB7Ci0KLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gb2JqTWV0aG9kVHJhbnNhY3Rpb24gPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBvYmpNZXRob2RUcmFuc2FjdGlvbi51bnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKCk7Ci0gICAgfSAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNTZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RUcmFuc2FjdGlvbi5pc1NldFRyYW5zYWN0aW9uQXR0cmlidXRlKCk7Ci0gICAgfQotKi8KLSAvKiAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gb2JqTWV0aG9kVHJhbnNhY3Rpb24gPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RUcmFuc2FjdGlvbi5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gb2JqTWV0aG9kVHJhbnNhY3Rpb24gPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBTdHJpbmcgbmV3RGVzY3JpcHRpb24gPSAiIjsKLSAgICAgICAgb2JqTWV0aG9kVHJhbnNhY3Rpb24uc2V0RGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24pOwotICAgIH0qLwotCi0gLyogICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kVHJhbnNhY3Rpb24uZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRBc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0KLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gb2JqTWV0aG9kVHJhbnNhY3Rpb24gPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3IgbmV3QXNzZW1ibHlEZXNjcmlwdG9yID0gbnVsbDsKLSAgICAgICAgb2JqTWV0aG9kVHJhbnNhY3Rpb24uc2V0QXNzZW1ibHlEZXNjcmlwdG9yKG5ld0Fzc2VtYmx5RGVzY3JpcHRvcik7Ci0gICAgfSAqLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1ldGhvZEVsZW1lbnRzXzIoKSB7Ci0KLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gb2JqTWV0aG9kVHJhbnNhY3Rpb24gPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kVHJhbnNhY3Rpb24uZ2V0TWV0aG9kRWxlbWVudHMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9ucygpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RUcmFuc2FjdGlvbi5nZXREZXNjcmlwdGlvbnMoKTsKLSAgICB9ICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBNZXRob2RUcmFuc2FjdGlvblRlc3QoInRlc3RfaXNFcXVpdmFsZW50IikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBNZXRob2RUcmFuc2FjdGlvblRlc3QoInRlc3RfZ2V0TWV0aG9kRWxlbWVudHMiKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0gICAKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvUXVlcnlNZXRob2RUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9RdWVyeU1ldGhvZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhNmZmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9RdWVyeU1ldGhvZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeU1ldGhvZDsKLQotcHVibGljIGNsYXNzIFF1ZXJ5TWV0aG9kVGVzdCBleHRlbmRzIEVqYkVNRlRlc3RCYXNlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFF1ZXJ5TWV0aG9kVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0gICAKLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UXVlcnkoKSB7Ci0KLSAgICAgICAgUXVlcnlNZXRob2Qgb2JqUXVlcnlNZXRob2QgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeU1ldGhvZCgpOwotICAgICAgICBRdWVyeSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqUXVlcnlNZXRob2QuZ2V0UXVlcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFF1ZXJ5KCkgewotCi0gICAgICAgIFF1ZXJ5TWV0aG9kIG9ialF1ZXJ5TWV0aG9kID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnlNZXRob2QoKTsKLSAgICAgICAgUXVlcnkgbmV3UXVlcnkgPSBudWxsOwotICAgICAgICBvYmpRdWVyeU1ldGhvZC5zZXRRdWVyeShuZXdRdWVyeSk7Ci0gICAgfSAqLwotICAgIAotCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRDbGllbnRUeXBlSmF2YUNsYXNzZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5pdCgpOwotCQlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCQotCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gREQuZ2V0RUpCSmFyKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCUxpc3QgZW50ZXJwcmlzZUJlYW5zID0gREQuZ2V0RUpCSmFyKCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0JCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5QmVhbiA9IG51bGw7Ci0JCUVudGVycHJpc2VCZWFuIGJlYW4gPSBudWxsOwotCQlmb3IgKGludCB4PTA7IHg8IGVudGVycHJpc2VCZWFucy5zaXplKCk7ICsreCkgewotCQkJYmVhbiA9IChFbnRlcnByaXNlQmVhbikgZW50ZXJwcmlzZUJlYW5zLmdldCh4KTsKLQkJCWlmIChiZWFuLmlzRW50aXR5KCkgJiYgYmVhbi5pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSkgewotCQkJCWVudGl0eUJlYW4gPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgYmVhbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlhc3NlcnROb3ROdWxsKGVudGl0eUJlYW4pOwotCQlRdWVyeU1ldGhvZCBvYmpRdWVyeU1ldGhvZCA9Z2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVF1ZXJ5TWV0aG9kKCk7Ci0JCW9ialF1ZXJ5TWV0aG9kLnNldE5hbWUoUXVlcnlNZXRob2QuU0VMRUNUX1BSRUZJWCsiVGVzdCIpOwotCQlvYmpRdWVyeU1ldGhvZC5zZXRFbnRlcnByaXNlQmVhbihlbnRpdHlCZWFuKTsKLQkJSmF2YUNsYXNzW10gcmV0VmFsdWUgPSBvYmpRdWVyeU1ldGhvZC5nZXRDbGllbnRUeXBlSmF2YUNsYXNzZXMoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhyZXRWYWx1ZS5sZW5ndGg9PTEsdHJ1ZSApOwotCQlhc3NlcnRFcXVhbHMocmV0VmFsdWVbMF0sZW50aXR5QmVhbi5nZXRFamJDbGFzcygpKTsKLQkJCi0JCW9ialF1ZXJ5TWV0aG9kLnNldE5hbWUoUXVlcnlNZXRob2QuRklORF9QUkVGSVgrIlRlc3QiKTsKLQkJCi0JCWlmIChlbnRpdHlCZWFuLmhhc0xvY2FsQ2xpZW50KCkgJiYgIWVudGl0eUJlYW4uaGFzUmVtb3RlQ2xpZW50KCkpIHsKLQkJCXJldFZhbHVlID0gb2JqUXVlcnlNZXRob2QuZ2V0Q2xpZW50VHlwZUphdmFDbGFzc2VzKCk7Ci0JCQlhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLQkJCWFzc2VydEVxdWFscyhyZXRWYWx1ZS5sZW5ndGg9PTEsdHJ1ZSApOwotCQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlWzBdLGVudGl0eUJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkpOwotCQl9CQotCQlpZiAoZW50aXR5QmVhbi5oYXNSZW1vdGVDbGllbnQoKSAmJiAhZW50aXR5QmVhbi5oYXNMb2NhbENsaWVudCgpKSB7Ci0JCQlyZXRWYWx1ZSA9IG9ialF1ZXJ5TWV0aG9kLmdldENsaWVudFR5cGVKYXZhQ2xhc3NlcygpOwotCQkJYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0JCQlhc3NlcnRFcXVhbHMocmV0VmFsdWUubGVuZ3RoPT0xLHRydWUgKTsKLQkJCWFzc2VydEVxdWFscyhyZXRWYWx1ZVswXSxlbnRpdHlCZWFuLmdldEhvbWVJbnRlcmZhY2UoKSk7Ci0JCX0KLQkJaWYgKGVudGl0eUJlYW4uaGFzUmVtb3RlQ2xpZW50KCkgJiYgZW50aXR5QmVhbi5oYXNMb2NhbENsaWVudCgpKSB7Ci0JCQlyZXRWYWx1ZSA9IG9ialF1ZXJ5TWV0aG9kLmdldENsaWVudFR5cGVKYXZhQ2xhc3NlcygpOwotCQkJYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0JCQlhc3NlcnRFcXVhbHMocmV0VmFsdWUubGVuZ3RoPT0yLHRydWUgKTsKLQkJCWFzc2VydEVxdWFscyhyZXRWYWx1ZVswXSxlbnRpdHlCZWFuLmdldExvY2FsSG9tZUludGVyZmFjZSgpKTsKLQkJCWFzc2VydEVxdWFscyhyZXRWYWx1ZVsxXSxlbnRpdHlCZWFuLmdldEhvbWVJbnRlcmZhY2UoKSk7Ci0JCX0gIAotCX0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFF1ZXJ5TWV0aG9kVGVzdCgidGVzdF9nZXRDbGllbnRUeXBlSmF2YUNsYXNzZXMiKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9CQkKLQkJCi0JCi0JCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L1F1ZXJ5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvUXVlcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MmQ2NDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvUXVlcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5SZXR1cm5UeXBlTWFwcGluZzsKLQotcHVibGljIGNsYXNzIFF1ZXJ5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfUXVlcnkoKSB7Ci0gICAgICAgIFF1ZXJ5IHRtcFF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0bXBRdWVyeSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoUXVlcnlUZXN0LmNsYXNzKTsKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTG9jYWxSZXN1bHRNYXBwaW5nKCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgb2JqUXVlcnkuc2V0UmV0dXJuVHlwZU1hcHBpbmcoUmV0dXJuVHlwZU1hcHBpbmcuTE9DQUxfTElURVJBTCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvYmpRdWVyeS5pc0xvY2FsUmVzdWx0TWFwcGluZygpLHRydWUpOwotICAgICAgICBvYmpRdWVyeS5zZXRSZXR1cm5UeXBlTWFwcGluZyhSZXR1cm5UeXBlTWFwcGluZy5SRU1PVEVfTElURVJBTCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhvYmpRdWVyeS5pc0xvY2FsUmVzdWx0TWFwcGluZygpLGZhbHNlKTsKLSAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzUmVtb3RlUmVzdWx0TWFwcGluZygpIHsKLQotICAgIAkgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICAgb2JqUXVlcnkuc2V0UmV0dXJuVHlwZU1hcHBpbmcoUmV0dXJuVHlwZU1hcHBpbmcuUkVNT1RFX0xJVEVSQUwpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKG9ialF1ZXJ5LmlzTG9jYWxSZXN1bHRNYXBwaW5nKCksZmFsc2UpOwotICAgICAgICAgb2JqUXVlcnkuc2V0UmV0dXJuVHlwZU1hcHBpbmcoUmV0dXJuVHlwZU1hcHBpbmcuTE9DQUxfTElURVJBTCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMob2JqUXVlcnkuaXNMb2NhbFJlc3VsdE1hcHBpbmcoKSx0cnVlKTsKLSAgICAgCi0gICAgfQotCi0gLyogICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqUXVlcnkuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgU3RyaW5nIG5ld0Rlc2NyaXB0aW9uID0gIiI7Ci0gICAgICAgIG9ialF1ZXJ5LnNldERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVqYlFMKCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqUXVlcnkuZ2V0RWpiUUwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEVqYlFMKCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgU3RyaW5nIG5ld0VqYlFMID0gIiI7Ci0gICAgICAgIG9ialF1ZXJ5LnNldEVqYlFMKG5ld0VqYlFMKTsKLSAgICB9ICovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmV0dXJuVHlwZU1hcHBpbmcoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBSZXR1cm5UeXBlTWFwcGluZyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqUXVlcnkuZ2V0UmV0dXJuVHlwZU1hcHBpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFJldHVyblR5cGVNYXBwaW5nKCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgUmV0dXJuVHlwZU1hcHBpbmcgbmV3UmV0dXJuVHlwZU1hcHBpbmcgPSBudWxsOwotICAgICAgICBvYmpRdWVyeS5zZXRSZXR1cm5UeXBlTWFwcGluZyhuZXdSZXR1cm5UeXBlTWFwcGluZyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF91bnNldFJldHVyblR5cGVNYXBwaW5nKCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgb2JqUXVlcnkudW5zZXRSZXR1cm5UeXBlTWFwcGluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNTZXRSZXR1cm5UeXBlTWFwcGluZygpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRdWVyeS5pc1NldFJldHVyblR5cGVNYXBwaW5nKCk7Ci0gICAgfSovCi0KLSAvKiAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UXVlcnlNZXRob2QoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBRdWVyeU1ldGhvZCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqUXVlcnkuZ2V0UXVlcnlNZXRob2QoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFF1ZXJ5TWV0aG9kKCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgUXVlcnlNZXRob2QgbmV3UXVlcnlNZXRob2QgPSBudWxsOwotICAgICAgICBvYmpRdWVyeS5zZXRRdWVyeU1ldGhvZChuZXdRdWVyeU1ldGhvZCk7Ci0gICAgfSovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RW50aXR5KCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqUXVlcnkuZ2V0RW50aXR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRFbnRpdHkoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG5ld0VudGl0eSA9IG51bGw7Ci0gICAgICAgIG9ialF1ZXJ5LnNldEVudGl0eShuZXdFbnRpdHkpOwotICAgIH0qLwotCi0gICAgLypwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9ucygpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRdWVyeS5nZXREZXNjcmlwdGlvbnMoKTsKLSAgICB9Ki8KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L1Nlc3Npb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9TZXNzaW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDc3ZmQwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L1Nlc3Npb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlNlc3Npb247Ci0KLXB1YmxpYyBjbGFzcyBTZXNzaW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCSAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShTZXNzaW9uVGVzdC5jbGFzcyk7Ci0JfQotIAotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0KLSAgICAgICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgVHJhbnNhY3Rpb25UeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpTZXNzaW9uLmdldFRyYW5zYWN0aW9uVHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0VHJhbnNhY3Rpb25UeXBlKCkgewotCi0gICAgICAgIFNlc3Npb24gb2JqU2Vzc2lvbiA9ICBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIFRyYW5zYWN0aW9uVHlwZSBuZXdUcmFuc2FjdGlvblR5cGUgPSBudWxsOwotICAgICAgICBvYmpTZXNzaW9uLnNldFRyYW5zYWN0aW9uVHlwZShuZXdUcmFuc2FjdGlvblR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5zZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0KLSAgICAgICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgb2JqU2Vzc2lvbi51bnNldFRyYW5zYWN0aW9uVHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNTZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0KLSAgICAgICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9ialNlc3Npb24uaXNTZXRUcmFuc2FjdGlvblR5cGUoKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRTZXNzaW9uVHlwZSgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBTZXNzaW9uVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqU2Vzc2lvbi5nZXRTZXNzaW9uVHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U2Vzc2lvblR5cGUoKSB7Ci0KLSAgICAgICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgU2Vzc2lvblR5cGUgbmV3U2Vzc2lvblR5cGUgPSBudWxsOwotICAgICAgICBvYmpTZXNzaW9uLnNldFNlc3Npb25UeXBlKG5ld1Nlc3Npb25UeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3Vuc2V0U2Vzc2lvblR5cGUoKSB7Ci0KLSAgICAgICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgb2JqU2Vzc2lvbi51bnNldFNlc3Npb25UeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1NldFNlc3Npb25UeXBlKCkgewotCi0gICAgICAgIFNlc3Npb24gb2JqU2Vzc2lvbiA9ICBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpTZXNzaW9uLmlzU2V0U2Vzc2lvblR5cGUoKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRTZXJ2aWNlRW5kcG9pbnQoKSB7Ci0KLSAgICAgICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgSmF2YUNsYXNzIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpTZXNzaW9uLmdldFNlcnZpY2VFbmRwb2ludCgpOwotICAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRTZXJ2aWNlRW5kcG9pbnQoKSB7Ci0KLSAgICAgICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgSmF2YUNsYXNzIG5ld1NlcnZpY2VFbmRwb2ludCA9IG51bGw7Ci0gICAgICAgIG9ialNlc3Npb24uc2V0U2VydmljZUVuZHBvaW50KG5ld1NlcnZpY2VFbmRwb2ludCk7Ci0gICAgfSovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRTZXJ2aWNlRW5kcG9pbnROYW1lKCkgewotCi0gICAgICAgIFNlc3Npb24gb2JqU2Vzc2lvbiA9ICBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBTdHJpbmcgc2VydmljZUVuZHBvaW50TmFtZSA9ICJTZXNzaW9uRW5kUG9pbnQxIjsKLSAgICAgICAgb2JqU2Vzc2lvbi5zZXRTZXJ2aWNlRW5kcG9pbnROYW1lKHNlcnZpY2VFbmRwb2ludE5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2VydmljZUVuZHBvaW50TmFtZSxvYmpTZXNzaW9uLmdldFNlcnZpY2VFbmRwb2ludE5hbWUoKSk7Ci0gICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9oYXNTZXJ2aWNlRW5kcG9pbnQoKSB7Ci0KLSAgICAgICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9ialNlc3Npb24uaGFzU2VydmljZUVuZHBvaW50KCksZmFsc2UpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlRW5kcG9pbnROYW1lID0gIlNlc3Npb25FbmRQb2ludDEiOwotICAgICAgICBvYmpTZXNzaW9uLnNldFNlcnZpY2VFbmRwb2ludE5hbWUoc2VydmljZUVuZHBvaW50TmFtZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqU2Vzc2lvbi5oYXNTZXJ2aWNlRW5kcG9pbnQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9ialNlc3Npb24uaGFzU2VydmljZUVuZHBvaW50KCksdHJ1ZSk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VydmljZUVuZHBvaW50TmFtZSgpIHsKLQotCSAgIFNlc3Npb24gb2JqU2Vzc2lvbiA9ICBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgIFN0cmluZyBzZXJ2aWNlRW5kcG9pbnROYW1lID0gIlNlc3Npb25FbmRQb2ludDEiOwotICAgICAgIG9ialNlc3Npb24uc2V0U2VydmljZUVuZHBvaW50TmFtZShzZXJ2aWNlRW5kcG9pbnROYW1lKTsKLSAgICAgICBhc3NlcnRFcXVhbHMoc2VydmljZUVuZHBvaW50TmFtZSxvYmpTZXNzaW9uLmdldFNlcnZpY2VFbmRwb2ludE5hbWUoKSk7Ci0gICAgIAotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Rlc3QvQ29ubmVjdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Rlc3QvQ29ubmVjdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTdjOGQ1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS90ZXN0L0Nvbm5lY3RvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5SYXJFTUZUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yVGVzdCBleHRlbmRzIFJhckVNRlRlc3QgewotCi0gICAgLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgQ29ubmVjdG9yVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdG9yIGdldEluc3RhbmNlKCkgewotICAgIAlyZXR1cm4gSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmNhRmFjdG9yeSgpLmNyZWF0ZUNvbm5lY3RvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVyc2lvbklEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJY3JlYXRlRUFSKCk7Ci0JCWNyZWF0ZVJBUigpOwotCi0JCUNvbm5lY3RvclJlc291cmNlIEREID0gKENvbm5lY3RvclJlc291cmNlKSByYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCWludCB2ZXJzaW9uSUQgPSBERC5nZXRDb25uZWN0b3IoKS5nZXRWZXJzaW9uSUQoKTsKLQkJYXNzZXJ0RXF1YWxzKHZlcnNpb25JRCxKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lEKTsKLQkJCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQ29ubmVjdG9yVGVzdCgidGVzdF9nZXRWZXJzaW9uSUQiKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Rlc3QvSmNhRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pjYS90ZXN0L0pjYUZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OTA1OTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Rlc3QvSmNhRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWN0aXZhdGlvblNwZWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkFkbWluT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BdXRoZW50aWNhdGlvbk1lY2hhbmlzbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3Rpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkluYm91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkxpY2Vuc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5NZXNzYWdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk91dGJvdW5kUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuUmVzb3VyY2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5TZWN1cml0eVBlcm1pc3Npb247Ci0KLXB1YmxpYyBjbGFzcyBKY2FGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgSmNhRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldEpjYUZhY3RvcnkoKTsKLQl9Ci0gICAgcHVibGljIHZvaWQgdGVzdF9KY2FGYWN0b3J5KCkgewotCi0gICAgICAgIEpjYUZhY3RvcnkgdG1wSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoSmNhRmFjdG9yeVRlc3QuY2xhc3MpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQ29ubmVjdG9yKCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENvbm5lY3RvciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVDb25uZWN0b3IoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVMaWNlbnNlKCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpY2Vuc2UgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlTGljZW5zZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSW5ib3VuZFJlc291cmNlQWRhcHRlciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNZXNzYWdlQWRhcHRlcigpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXNzYWdlQWRhcHRlciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVNZXNzYWdlQWRhcHRlcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uKCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENvbm5lY3Rpb25EZWZpbml0aW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZUNvbm5lY3Rpb25EZWZpbml0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQWRtaW5PYmplY3QoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQWRtaW5PYmplY3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlQWRtaW5PYmplY3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNZXNzYWdlTGlzdGVuZXIoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWVzc2FnZUxpc3RlbmVyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZU1lc3NhZ2VMaXN0ZW5lcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUFjdGl2YXRpb25TcGVjKCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFjdGl2YXRpb25TcGVjIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZUFjdGl2YXRpb25TcGVjKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDb25maWdQcm9wZXJ0eVR5cGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVSZXNvdXJjZUFkYXB0ZXIoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUmVzb3VyY2VBZGFwdGVyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZVJlc291cmNlQWRhcHRlcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlY3VyaXR5UGVybWlzc2lvbigpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZWN1cml0eVBlcm1pc3Npb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc20oKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXV0aGVudGljYXRpb25NZWNoYW5pc20gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlQXV0aGVudGljYXRpb25NZWNoYW5pc20oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVDb25maWdQcm9wZXJ0eSgpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDb25maWdQcm9wZXJ0eSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVDb25maWdQcm9wZXJ0eSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEpjYVBhY2thZ2UoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSmNhUGFja2FnZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5nZXRKY2FQYWNrYWdlKCk7Ci0gICAgICAgCi0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL3Rlc3QvSnNwRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2pzcC90ZXN0L0pzcEZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMWY5ODcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL3Rlc3QvSnNwRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS50ZXN0LkpjYUZhY3RvcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpzcC5KU1BDb25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUFByb3BlcnR5R3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpzcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLlRhZ0xpYlJlZlR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBKc3BGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoSmNhRmFjdG9yeVRlc3QuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIEpzcEZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBKc3BQYWNrYWdlLmVJTlNUQU5DRS5nZXRKc3BGYWN0b3J5KCk7Ci0JfQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlSlNQQ29uZmlnKCkgewotCi0gICAgICAgIEpzcEZhY3Rvcnkgb2JqSnNwRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEpTUENvbmZpZyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSnNwRmFjdG9yeS5jcmVhdGVKU1BDb25maWcoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVKU1BQcm9wZXJ0eUdyb3VwKCkgewotCi0gICAgICAgIEpzcEZhY3Rvcnkgb2JqSnNwRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEpTUFByb3BlcnR5R3JvdXAgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpzcEZhY3RvcnkuY3JlYXRlSlNQUHJvcGVydHlHcm91cCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVRhZ0xpYlJlZlR5cGUoKSB7Ci0KLSAgICAgICAgSnNwRmFjdG9yeSBvYmpKc3BGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgVGFnTGliUmVmVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSnNwRmFjdG9yeS5jcmVhdGVUYWdMaWJSZWZUeXBlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SnNwUGFja2FnZSgpIHsKLQotICAgICAgICBKc3BGYWN0b3J5IG9iakpzcEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKc3BQYWNrYWdlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKc3BGYWN0b3J5LmdldEpzcFBhY2thZ2UoKTsKLSAgICAgICAgLy8gVE9ETyBnZXRXc2RkUGFja2FnZSBtZXRob2QgYWx3YXlzIHJldHVybiBudWxsCi0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2ViYXBwbGljYXRpb24vdGVzdC9XZWJhcHBsaWNhdGlvbkZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi90ZXN0L1dlYmFwcGxpY2F0aW9uRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNkMGExZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi90ZXN0L1dlYmFwcGxpY2F0aW9uRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkF1dGhDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkNvbnRleHRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvckNvZGVFcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXJyb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkV4Y2VwdGlvblR5cGVFcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlck1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRm9ybUxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkhUVFBNZXRob2RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkluaXRQYXJhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5KU1BUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Mb2dpbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5NaW1lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Sb2xlTmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VjdXJpdHlDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2Vzc2lvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5UYWdMaWJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVVJMUGF0dGVyblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uVXNlckRhdGFDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJSZXNvdXJjZUNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWxjb21lRmlsZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBXZWJhcHBsaWNhdGlvbkZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShXZWJhcHBsaWNhdGlvbkZhY3RvcnlUZXN0LmNsYXNzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYmFwcGxpY2F0aW9uRmFjdG9yeSgpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVdlYkFwcCgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgV2ViQXBwIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlV2ViQXBwKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQ29udGV4dFBhcmFtKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDb250ZXh0UGFyYW0gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVDb250ZXh0UGFyYW0oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFcnJvclBhZ2UoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVycm9yUGFnZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUVycm9yUGFnZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVRhZ0xpYlJlZigpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgVGFnTGliUmVmIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlVGFnTGliUmVmKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRXhjZXB0aW9uVHlwZUVycm9yUGFnZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUV4Y2VwdGlvblR5cGVFcnJvclBhZ2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFcnJvckNvZGVFcnJvclBhZ2UoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVycm9yQ29kZUVycm9yUGFnZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUVycm9yQ29kZUVycm9yUGFnZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVdlbGNvbWVGaWxlTGlzdCgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgV2VsY29tZUZpbGVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlV2VsY29tZUZpbGVMaXN0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlV2VsY29tZUZpbGUoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFdlbGNvbWVGaWxlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlV2VsY29tZUZpbGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTZWN1cml0eUNvbnN0cmFpbnQoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlY3VyaXR5Q29uc3RyYWludCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVNlY3VyaXR5Q29uc3RyYWludCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVdlYlJlc291cmNlQ29sbGVjdGlvbigpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgV2ViUmVzb3VyY2VDb2xsZWN0aW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlVVJMUGF0dGVyblR5cGUoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFVSTFBhdHRlcm5UeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlVVJMUGF0dGVyblR5cGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVBdXRoQ29uc3RyYWludCgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXV0aENvbnN0cmFpbnQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVBdXRoQ29uc3RyYWludCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVVzZXJEYXRhQ29uc3RyYWludCgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgVXNlckRhdGFDb25zdHJhaW50IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlVXNlckRhdGFDb25zdHJhaW50KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTG9naW5Db25maWcoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExvZ2luQ29uZmlnIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlTG9naW5Db25maWcoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVGb3JtTG9naW5Db25maWcoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEZvcm1Mb2dpbkNvbmZpZyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUZvcm1Mb2dpbkNvbmZpZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1pbWVNYXBwaW5nKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNaW1lTWFwcGluZyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZU1pbWVNYXBwaW5nKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2Vzc2lvbkNvbmZpZygpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2Vzc2lvbkNvbmZpZyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVNlc3Npb25Db25maWcoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTZXJ2bGV0TWFwcGluZygpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VydmxldE1hcHBpbmcgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2bGV0TWFwcGluZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlcnZsZXQoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlcnZsZXQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2bGV0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2VydmxldFR5cGUoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlcnZsZXRUeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlU2VydmxldFR5cGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVKU1BUeXBlKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKU1BUeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlSlNQVHlwZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUluaXRQYXJhbSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSW5pdFBhcmFtIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlSW5pdFBhcmFtKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRmlsdGVyKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBGaWx0ZXIgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVGaWx0ZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVGaWx0ZXJNYXBwaW5nKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBGaWx0ZXJNYXBwaW5nIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlRmlsdGVyTWFwcGluZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUxvY2FsRW5jb2RpbmdNYXBwaW5nTGlzdCgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmcoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExvY2FsRW5jb2RpbmdNYXBwaW5nIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmcoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVIVFRQTWV0aG9kVHlwZSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSFRUUE1ldGhvZFR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVIVFRQTWV0aG9kVHlwZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVJvbGVOYW1lVHlwZSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUm9sZU5hbWVUeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlUm9sZU5hbWVUeXBlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0V2ViYXBwbGljYXRpb25QYWNrYWdlKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBXZWJhcHBsaWNhdGlvblBhY2thZ2UgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5nZXRXZWJhcHBsaWNhdGlvblBhY2thZ2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL3Rlc3QvV3Njb21tb25GYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2NvbW1vbi90ZXN0L1dzY29tbW9uRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE3NjRmZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL3Rlc3QvV3Njb21tb25GYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGVzY3JpcHRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uRGlzcGxheU5hbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uUG9ydE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQSGVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24uU09BUFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Xc2NvbW1vblBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBXc2NvbW1vbkZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShXc2NvbW1vbkZhY3RvcnlUZXN0LmNsYXNzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBXc2NvbW1vbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBXc2NvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFdzY29tbW9uRmFjdG9yeSgpOwotCX0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUluaXRQYXJhbSgpIHsKLQotICAgICAgICBXc2NvbW1vbkZhY3Rvcnkgb2JqV3Njb21tb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSW5pdFBhcmFtIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2NvbW1vbkZhY3RvcnkuY3JlYXRlSW5pdFBhcmFtKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU09BUEhlYWRlcigpIHsKLQotICAgICAgICBXc2NvbW1vbkZhY3Rvcnkgb2JqV3Njb21tb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUEhlYWRlciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3Njb21tb25GYWN0b3J5LmNyZWF0ZVNPQVBIZWFkZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTT0FQUm9sZSgpIHsKLQotICAgICAgICBXc2NvbW1vbkZhY3Rvcnkgb2JqV3Njb21tb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU09BUFJvbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzY29tbW9uRmFjdG9yeS5jcmVhdGVTT0FQUm9sZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVBvcnROYW1lKCkgewotCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBvYmpXc2NvbW1vbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBQb3J0TmFtZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3Njb21tb25GYWN0b3J5LmNyZWF0ZVBvcnROYW1lKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRGVzY3JpcHRpb25UeXBlKCkgewotCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBvYmpXc2NvbW1vbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBEZXNjcmlwdGlvblR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzY29tbW9uRmFjdG9yeS5jcmVhdGVEZXNjcmlwdGlvblR5cGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVEaXNwbGF5TmFtZVR5cGUoKSB7Ci0KLSAgICAgICAgV3Njb21tb25GYWN0b3J5IG9ialdzY29tbW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIERpc3BsYXlOYW1lVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3Njb21tb25GYWN0b3J5LmNyZWF0ZURpc3BsYXlOYW1lVHlwZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFdzY29tbW9uUGFja2FnZSgpIHsKLQotICAgICAgICBXc2NvbW1vbkZhY3Rvcnkgb2JqV3Njb21tb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgV3Njb21tb25QYWNrYWdlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2NvbW1vbkZhY3RvcnkuZ2V0V3Njb21tb25QYWNrYWdlKCk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3NkZC90ZXN0L1dzZGRGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL3Rlc3QvV3NkZEZhY3RvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMTBhYjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL3Rlc3QvV3NkZEZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkJlYW5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5FSkJMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Qb3J0Q29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5TZXJ2aWNlSW1wbEJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZsZXRMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XU0RMUG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV2ViU2VydmljZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRQYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgV3NkZEZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShXc2RkRmFjdG9yeVRlc3QuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIFdzZGRGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gV3NkZFBhY2thZ2UuZUlOU1RBTkNFLmdldFdzZGRGYWN0b3J5KCk7Ci0JfQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlV2ViU2VydmljZXMoKSB7Ci0KLSAgICAgICAgV3NkZEZhY3Rvcnkgb2JqV3NkZEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBXZWJTZXJ2aWNlcyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3NkZEZhY3RvcnkuY3JlYXRlV2ViU2VydmljZXMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVXZWJTZXJ2aWNlRGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgV3NkZEZhY3Rvcnkgb2JqV3NkZEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBXZWJTZXJ2aWNlRGVzY3JpcHRpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzZGRGYWN0b3J5LmNyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVBvcnRDb21wb25lbnQoKSB7Ci0KLSAgICAgICAgV3NkZEZhY3Rvcnkgb2JqV3NkZEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBQb3J0Q29tcG9uZW50IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2RkRmFjdG9yeS5jcmVhdGVQb3J0Q29tcG9uZW50KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlV1NETFBvcnQoKSB7Ci0KLSAgICAgICAgV3NkZEZhY3Rvcnkgb2JqV3NkZEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBXU0RMUG9ydCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3NkZEZhY3RvcnkuY3JlYXRlV1NETFBvcnQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTZXJ2aWNlSW1wbEJlYW4oKSB7Ci0KLSAgICAgICAgV3NkZEZhY3Rvcnkgb2JqV3NkZEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXJ2aWNlSW1wbEJlYW4gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzZGRGYWN0b3J5LmNyZWF0ZVNlcnZpY2VJbXBsQmVhbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlcnZsZXRMaW5rKCkgewotCi0gICAgICAgIFdzZGRGYWN0b3J5IG9ialdzZGRGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VydmxldExpbmsgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzZGRGYWN0b3J5LmNyZWF0ZVNlcnZsZXRMaW5rKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRUpCTGluaygpIHsKLQotICAgICAgICBXc2RkRmFjdG9yeSBvYmpXc2RkRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQkxpbmsgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzZGRGYWN0b3J5LmNyZWF0ZUVKQkxpbmsoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVIYW5kbGVyKCkgewotCi0gICAgICAgIFdzZGRGYWN0b3J5IG9ialdzZGRGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSGFuZGxlciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3NkZEZhY3RvcnkuY3JlYXRlSGFuZGxlcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUJlYW5MaW5rKCkgewotCi0gICAgICAgIFdzZGRGYWN0b3J5IG9ialdzZGRGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQmVhbkxpbmsgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzZGRGYWN0b3J5LmNyZWF0ZUJlYW5MaW5rKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL291dC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL291dC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDMwYzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9vdXQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+DQotPG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkphdmFDbGFzcyB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhPSJqYXZhLnhtaSIgbmFtZT0iQSIga2luZD0iQ0xBU1MiIHB1YmxpYz0idHJ1ZSI+DQotICA8ZVN1cGVyVHlwZXMgaHJlZj0iamF2YTovamF2YS5sYW5nI09iamVjdCIvPg0KLSAgPGltcGxlbWVudHNJbnRlcmZhY2VzIGhyZWY9ImphdmE6L2NvbS5pYm0uZXRvb2xzLmphdmEuc3RyZXNzU2FtcGxlI0lBIi8+DQotICA8ZmllbGRzIG5hbWU9ImFuQSIgZVR5cGU9Ii8iLz4NCi0gIDxmaWVsZHMgbmFtZT0iYUIiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkphdmFDbGFzcyIgaHJlZj0iamF2YTovY29tLmlibS5ldG9vbHMuamF2YS5zdHJlc3NTYW1wbGUjQiIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9ImJlZXMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovY29tLmlibS5ldG9vbHMuamF2YS5zdHJlc3NTYW1wbGUjQltdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0iYmVlc19hbmRfYmVlcyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi9jb20uaWJtLmV0b29scy5qYXZhLnN0cmVzc1NhbXBsZSNCW11bXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9ImludHMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2ludFtdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0iaW50czIiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2ludFtdW10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJpbnRzMyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jaW50W11bXVtdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0iY2hhcnMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2NoYXJbXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9ImZsb2F0cyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jZmxvYXRbXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9ImNvb2xzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNib29sZWFuW10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJkb3VibGVzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNkb3VibGVbXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9ImxvbmdzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNsb25nW10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJzaG9ydHMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI3Nob3J0W10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJieXRlcyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jYnl0ZVtdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0idGVzdFN0cmluZyIgZmluYWw9InRydWUiIHN0YXRpYz0idHJ1ZSI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6SmF2YUNsYXNzIiBocmVmPSJqYXZhOi9qYXZhLmxhbmcjU3RyaW5nIi8+DQotICAgIDxpbml0aWFsaXplciBzb3VyY2U9IiZxdW90O3Rlc3RpbmcmcXVvdDsiIG5hbWU9InRlc3RTdHJpbmdfYmxvY2siLz4NCi0gIDwvZmllbGRzPg0KLSAgPG1ldGhvZHMgbmFtZT0iZG9BbGxQcmltaXRpdmVzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpKYXZhRGF0YVR5cGUiIGhyZWY9ImphdmE6LyN2b2lkIi8+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzAiPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jaW50W10iLz4NCi0gICAgPC9wYXJhbWV0ZXJzPg0KLSAgICA8cGFyYW1ldGVycyBuYW1lPSJhcmcxIj4NCi0gICAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2ludFtdW10iLz4NCi0gICAgPC9wYXJhbWV0ZXJzPg0KLSAgICA8cGFyYW1ldGVycyBuYW1lPSJhcmcyIj4NCi0gICAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2ludFtdW11bXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzMiPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jY2hhcltdIi8+DQotICAgIDwvcGFyYW1ldGVycz4NCi0gICAgPHBhcmFtZXRlcnMgbmFtZT0iYXJnNCI+DQotICAgICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNmbG9hdFtdIi8+DQotICAgIDwvcGFyYW1ldGVycz4NCi0gICAgPHBhcmFtZXRlcnMgbmFtZT0iYXJnNSI+DQotICAgICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNib29sZWFuW10iLz4NCi0gICAgPC9wYXJhbWV0ZXJzPg0KLSAgICA8cGFyYW1ldGVycyBuYW1lPSJhcmc2Ij4NCi0gICAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2RvdWJsZVtdIi8+DQotICAgIDwvcGFyYW1ldGVycz4NCi0gICAgPHBhcmFtZXRlcnMgbmFtZT0iYXJnNyI+DQotICAgICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNsb25nW10iLz4NCi0gICAgPC9wYXJhbWV0ZXJzPg0KLSAgICA8cGFyYW1ldGVycyBuYW1lPSJhcmc4Ij4NCi0gICAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI3Nob3J0W10iLz4NCi0gICAgPC9wYXJhbWV0ZXJzPg0KLSAgICA8cGFyYW1ldGVycyBuYW1lPSJhcmc5Ij4NCi0gICAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2J5dGVbXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICA8L21ldGhvZHM+DQotICA8bWV0aG9kcyBuYW1lPSJkb1NvbWV0aGluZyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6SmF2YUNsYXNzIiBocmVmPSJqYXZhOi9jb20uaWJtLmV0b29scy5qYXZhLnN0cmVzc1NhbXBsZSNDIi8+DQotICA8L21ldGhvZHM+DQotICA8bWV0aG9kcyBuYW1lPSJnZXRCeXRlcyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jYnl0ZVtdIi8+DQotICA8L21ldGhvZHM+DQotICA8bWV0aG9kcyBuYW1lPSJnZXRDaGFyIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNjaGFyW10iLz4NCi0gIDwvbWV0aG9kcz4NCi0gIDxtZXRob2RzIG5hbWU9ImdldEZsb2F0cyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jZmxvYXRbXSIvPg0KLSAgPC9tZXRob2RzPg0KLSAgPG1ldGhvZHMgbmFtZT0iZ2V0SW50cyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jaW50W10iLz4NCi0gIDwvbWV0aG9kcz4NCi0gIDxtZXRob2RzIG5hbWU9ImdldExvbmdzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNsb25nW10iLz4NCi0gIDwvbWV0aG9kcz4NCi0gIDxtZXRob2RzIG5hbWU9ImdldFNob3J0cyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jc2hvcnRbXSIvPg0KLSAgPC9tZXRob2RzPg0KLSAgPG1ldGhvZHMgbmFtZT0icmV0dXJuQXMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovY29tLmlibS5ldG9vbHMuamF2YS5zdHJlc3NTYW1wbGUjQVtdIi8+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzAiPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi9jb20uaWJtLmV0b29scy5qYXZhLnN0cmVzc1NhbXBsZSNDW10iLz4NCi0gICAgPC9wYXJhbWV0ZXJzPg0KLSAgPC9tZXRob2RzPg0KLSAgPG1ldGhvZHMgbmFtZT0iQSIgY29uc3RydWN0b3I9InRydWUiLz4NCi08L29yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkphdmFDbGFzcz4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyNDVhZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBwcm9wZXJ0aWVzIGZpbGUgZm9yIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMKLUJ1bmRsZS1OYW1lLjAgPSBKMkVFIENvcmUgVGVzdHMgQ29tcG9uZW50Ci1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWYyYjIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotIDwhLS0gPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4gLS0+Ci0JPGVjaG8gbWVzc2FnZT0iYmFzZWRpciAke2Jhc2VkaXJ9IiAvPgotCTxlY2hvIG1lc3NhZ2U9ImVjbGlwc2UgcGxhY2UgJHtlY2xpcHNlLWhvbWV9IiAvPgotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgcGx1Z2luLW5hbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLVhteDcwME0iLz4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0ic3VpdGUiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJqc3QtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2pzdF9mb2xkZXIiLz4KLSAgICA8ZGVsZXRlIGRpcj0iJHtqc3QtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7anN0LWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUIiAvPgotICAgCSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLSAgIAkgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+Ci0gICAgPC9hbnQ+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2pzdC1mb2xkZXJ9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuYXBpLnRlc3QuQXV0b21hdGVkQVBJQlZUIiAvPgotICAgCSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLSAgIAkgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0MTY1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjUuNCAKLUNyZWF0ZWQtQnk6IDEuMy4wIChJQk0gQ29ycG9yYXRpb24pCi1NYWluLUNsYXNzOiBudWxsCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL1RhYmxlLmRkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL1RhYmxlLmRkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4MDg2MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9UYWJsZS5kZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0NCi0NCi0tLSBHZW5lcmF0ZWQgYnkgUmVsYXRpb25hbCBTY2hlbWEgQ2VudGVyIG9uIEZyaSBNYXIgMTIgMTQ6MzI6MTQgQ1NUIDIwMDQNCi0NCi0NCi1DUkVBVEUgVEFCTEUgQUNDT1VOVA0KLSAgKEFDQ09VTlRJRCBWQVJDSEFSKDI1MCkgTk9UIE5VTEwsDQotICAgVFlQRTEgSU5URUdFUiBOT1QgTlVMTCwNCi0gICBCQUxBTkNFIERPVUJMRSBQUkVDSVNJT04gTk9UIE5VTEwsDQotICAgQVBSIERPVUJMRSBQUkVDSVNJT04gTk9UIE5VTEwpOw0KLQ0KLUFMVEVSIFRBQkxFIEFDQ09VTlQNCi0gIEFERCBDT05TVFJBSU5UIFBLX0FDQ09VTlQgUFJJTUFSWSBLRVkgKEFDQ09VTlRJRCk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9NYXAubWFweG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9NYXAubWFweG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTlhOThlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvTWFwLm1hcHhtaQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGVqYnJkYm1hcHBpbmc6RWpiUmRiRG9jdW1lbnRSb290IHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6UkRCU2NoZW1hPSJSREJTY2hlbWEueG1pIiB4bWxuczplamI9ImVqYi54bWkiIHhtbG5zOmVqYnJkYm1hcHBpbmc9ImVqYnJkYm1hcHBpbmcueG1pIiB4bWxuczpNYXBwaW5nPSJNYXBwaW5nLnhtaSIgeG1pOmlkPSJFamJSZGJEb2N1bWVudFJvb3RfMTA3OTEyMzUxNjkwNyIgdG9wVG9Cb3R0b209InRydWUiIGNvbW1hbmRTdGFjaz0iJmx0O2NvbGxlY3Rpb24+Jmx0O2NvbW1hbmQtY3JlYXRpb24tcmVjb3JkPiZsdDtjbGFzcyBuYW1lPSZxdW90O2NvbS5pYm0uZXRvb2xzLmVqYnJkYm1hcHBpbmcuY29tbWFuZC5Ub3BEb3duRWpiSmFyQ29tbWFuZCZxdW90Oy8+Jmx0O2NvbW1hbmQtcGFyYW1ldGVyPiZsdDtyZWYtb2JqZWN0IGhyZWY9JnF1b3Q7cGxhdGZvcm06L3Jlc291cmNlL2I2Mzc0OGJhL2VqYk1vZHVsZS9NRVRBLUlORi9lamItamFyLnhtbCNlamItamFyX0lEJnF1b3Q7Lz4mbHQ7bnVsbC8+Jmx0O2NvbGxlY3Rpb24+Jmx0O3N0cmluZyB2YWx1ZT0mcXVvdDtUb3BEb3duREImcXVvdDsvPiZsdDtudWxsLz4mbHQ7aW50IHZhbHVlPSZxdW90OzE4JnF1b3Q7Lz4mbHQ7aGFzaHRhYmxlPiZsdDsvaGFzaHRhYmxlPiZsdDtoYXNodGFibGU+Jmx0Oy9oYXNodGFibGU+Jmx0O2Jvb2xlYW4gdmFsdWU9JnF1b3Q7ZmFsc2UmcXVvdDsvPiZsdDtib29sZWFuIHZhbHVlPSZxdW90O2ZhbHNlJnF1b3Q7Lz4mbHQ7L2NvbGxlY3Rpb24+Jmx0O251bGwvPiZsdDtpbnQgdmFsdWU9JnF1b3Q7LTEmcXVvdDsvPiZsdDsvY29tbWFuZC1wYXJhbWV0ZXI+Jmx0Oy9jb21tYW5kLWNyZWF0aW9uLXJlY29yZD4mbHQ7L2NvbGxlY3Rpb24+Ij4NCi0gIDxoZWxwZXIgeG1pOnR5cGU9ImVqYnJkYm1hcHBpbmc6UmRiU2NoZW1hUHJvcGVyaWVzIiB4bWk6aWQ9IlJkYlNjaGVtYVByb3Blcmllc18xMDc5MTIzNTE2OTA3IiBwcmltaXRpdmVzRG9jdW1lbnQ9IkNMT1VEU0NBUEVfVjUwIi8+DQotICA8bmVzdGVkIHhtaTp0eXBlPSJlamJyZGJtYXBwaW5nOlJEQkVqYk1hcHBlciIgeG1pOmlkPSJSREJFamJNYXBwZXJfMTA3OTEyMzUxNjkwNyI+DQotICAgIDxoZWxwZXIgeG1pOnR5cGU9ImVqYnJkYm1hcHBpbmc6UHJpbWFyeVRhYmxlU3RyYXRlZ3kiIHhtaTppZD0iUHJpbWFyeVRhYmxlU3RyYXRlZ3lfMTA3OTEyMzUxNjkwNyI+DQotICAgICAgPHRhYmxlIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRF9BQ0NPVU5ULnRibHhtaSNBQ0NPVU5UIi8+DQotICAgIDwvaGVscGVyPg0KLSAgICA8bmVzdGVkIHhtaTp0eXBlPSJlamJyZGJtYXBwaW5nOlJEQkVqYkZpZWxkTWFwcGVyIiB4bWk6aWQ9IlJEQkVqYkZpZWxkTWFwcGVyXzEwNzkxMjM1MTY5MDciPg0KLSAgICAgIDxpbnB1dHMgeG1pOnR5cGU9ImVqYjpDTVBBdHRyaWJ1dGUiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI0FjY291bnRfYWNjb3VudGlkIi8+DQotICAgICAgPG91dHB1dHMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJDb2x1bW4iIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRF9BQ0NPVU5ULnRibHhtaSNBQ0NPVU5USUQiLz4NCi0gICAgICA8dHlwZU1hcHBpbmcgaHJlZj0iSmF2YXRvQ0xPVURTQ0FQRV9WNTBUeXBlTWFwcy54bWkjU3RyaW5nLVZBUkNIQVIiLz4NCi0gICAgPC9uZXN0ZWQ+DQotICAgIDxuZXN0ZWQgeG1pOnR5cGU9ImVqYnJkYm1hcHBpbmc6UkRCRWpiRmllbGRNYXBwZXIiIHhtaTppZD0iUkRCRWpiRmllbGRNYXBwZXJfMTA3OTEyMzUxNjkwOCIgb3B0aW1pc3RpYz0idHJ1ZSI+DQotICAgICAgPGlucHV0cyB4bWk6dHlwZT0iZWpiOkNNUEF0dHJpYnV0ZSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjQWNjb3VudF90eXBlIi8+DQotICAgICAgPG91dHB1dHMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJDb2x1bW4iIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRF9BQ0NPVU5ULnRibHhtaSNUWVBFMSIvPg0KLSAgICAgIDx0eXBlTWFwcGluZyBocmVmPSJKYXZhdG9DTE9VRFNDQVBFX1Y1MFR5cGVNYXBzLnhtaSNpbnQtSU5URUdFUiIvPg0KLSAgICA8L25lc3RlZD4NCi0gICAgPG5lc3RlZCB4bWk6dHlwZT0iZWpicmRibWFwcGluZzpSREJFamJGaWVsZE1hcHBlciIgeG1pOmlkPSJSREJFamJGaWVsZE1hcHBlcl8xMDc5MTIzNTE2OTA5IiBvcHRpbWlzdGljPSJ0cnVlIj4NCi0gICAgICA8aW5wdXRzIHhtaTp0eXBlPSJlamI6Q01QQXR0cmlidXRlIiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNBY2NvdW50X2JhbGFuY2UiLz4NCi0gICAgICA8b3V0cHV0cyB4bWk6dHlwZT0iUkRCU2NoZW1hOlJEQkNvbHVtbiIgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElEX0FDQ09VTlQudGJseG1pI0JBTEFOQ0UiLz4NCi0gICAgICA8dHlwZU1hcHBpbmcgaHJlZj0iSmF2YXRvQ0xPVURTQ0FQRV9WNTBUeXBlTWFwcy54bWkjZG91YmxlLURPVUJMRSIvPg0KLSAgICA8L25lc3RlZD4NCi0gICAgPG5lc3RlZCB4bWk6dHlwZT0iZWpicmRibWFwcGluZzpSREJFamJGaWVsZE1hcHBlciIgeG1pOmlkPSJSREJFamJGaWVsZE1hcHBlcl8xMDc5MTIzNTE2OTEwIiBvcHRpbWlzdGljPSJ0cnVlIj4NCi0gICAgICA8aW5wdXRzIHhtaTp0eXBlPSJlamI6Q01QQXR0cmlidXRlIiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNBY2NvdW50X2FwciIvPg0KLSAgICAgIDxvdXRwdXRzIHhtaTp0eXBlPSJSREJTY2hlbWE6UkRCQ29sdW1uIiBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSURfQUNDT1VOVC50Ymx4bWkjQVBSIi8+DQotICAgICAgPHR5cGVNYXBwaW5nIGhyZWY9IkphdmF0b0NMT1VEU0NBUEVfVjUwVHlwZU1hcHMueG1pI2RvdWJsZS1ET1VCTEUiLz4NCi0gICAgPC9uZXN0ZWQ+DQotICAgIDxpbnB1dHMgeG1pOnR5cGU9ImVqYjpDb250YWluZXJNYW5hZ2VkRW50aXR5IiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNDb250YWluZXJNYW5hZ2VkRW50aXR5XzEiLz4NCi0gICAgPG91dHB1dHMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJUYWJsZSIgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElEX0FDQ09VTlQudGJseG1pI0FDQ09VTlQiLz4NCi0gIDwvbmVzdGVkPg0KLSAgPGlucHV0cyB4bWk6dHlwZT0iZWpiOkVKQkphciIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjZWpiLWphcl9JRCIvPg0KLSAgPG91dHB1dHMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJEYXRhYmFzZSIgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREIuZGJ4bWkjVG9wRG93bkRCIi8+DQotICA8dHlwZU1hcHBpbmcgeG1pOnR5cGU9Ik1hcHBpbmc6TWFwcGluZ1Jvb3QiIGhyZWY9IkphdmF0b0NMT1VEU0NBUEVfVjUwVHlwZU1hcHMueG1pI0phdmFfdG9fQ0xPVURTQ0FQRV9WNTBfVHlwZU1hcHMiLz4NCi08L2VqYnJkYm1hcHBpbmc6RWpiUmRiRG9jdW1lbnRSb290Pg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVGFibGUuZGRsIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9UYWJsZS5kZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ODA4NjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9UYWJsZS5kZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0NCi0NCi0tLSBHZW5lcmF0ZWQgYnkgUmVsYXRpb25hbCBTY2hlbWEgQ2VudGVyIG9uIEZyaSBNYXIgMTIgMTQ6MzI6MTQgQ1NUIDIwMDQNCi0NCi0NCi1DUkVBVEUgVEFCTEUgQUNDT1VOVA0KLSAgKEFDQ09VTlRJRCBWQVJDSEFSKDI1MCkgTk9UIE5VTEwsDQotICAgVFlQRTEgSU5URUdFUiBOT1QgTlVMTCwNCi0gICBCQUxBTkNFIERPVUJMRSBQUkVDSVNJT04gTk9UIE5VTEwsDQotICAgQVBSIERPVUJMRSBQUkVDSVNJT04gTk9UIE5VTEwpOw0KLQ0KLUFMVEVSIFRBQkxFIEFDQ09VTlQNCi0gIEFERCBDT05TVFJBSU5UIFBLX0FDQ09VTlQgUFJJTUFSWSBLRVkgKEFDQ09VTlRJRCk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREIuZGJ4bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQi5kYnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0YmRlZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQi5kYnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08UkRCU2NoZW1hOlJEQkRhdGFiYXNlIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6UkRCU2NoZW1hPSJSREJTY2hlbWEueG1pIiB4bWk6aWQ9IlRvcERvd25EQiIgbmFtZT0iVG9wRG93bkRCIj4NCi0gIDxzY2hlbWF0YSBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSUQuc2NoeG1pI05VTExJRCIvPg0KLSAgPHRhYmxlR3JvdXAgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJUYWJsZSIgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElEX0FDQ09VTlQudGJseG1pI0FDQ09VTlQiLz4NCi0gIDxkb21haW4gaHJlZj0iQ0xPVURTQ0FQRV9WNTBfRG9tYWluLnhtaSNTUUxWZW5kb3JfMSIvPg0KLTwvUkRCU2NoZW1hOlJEQkRhdGFiYXNlPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRC5zY2h4bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSUQuc2NoeG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTIwYTQwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRC5zY2h4bWkKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPFJEQlNjaGVtYTpSREJTY2hlbWEgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpSREJTY2hlbWE9IlJEQlNjaGVtYS54bWkiIHhtaTppZD0iTlVMTElEIiBuYW1lPSJOVUxMSUQiPg0KLSAgPGRhdGFiYXNlIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCLmRieG1pI1RvcERvd25EQiIvPg0KLSAgPHRhYmxlcyB4bWk6dHlwZT0iUkRCU2NoZW1hOlJEQlRhYmxlIiBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSURfQUNDT1VOVC50Ymx4bWkjQUNDT1VOVCIvPg0KLTwvUkRCU2NoZW1hOlJEQlNjaGVtYT4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSURfQUNDT1VOVC50Ymx4bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSURfQUNDT1VOVC50Ymx4bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZjFkNzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElEX0FDQ09VTlQudGJseG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08UkRCU2NoZW1hOlJEQlRhYmxlIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6UkRCU2NoZW1hPSJSREJTY2hlbWEueG1pIiB4bWk6aWQ9IkFDQ09VTlQiIG5hbWU9IkFDQ09VTlQiIHByaW1hcnlLZXk9IlBLX0FDQ09VTlQiPg0KLSAgPGRhdGFiYXNlIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCLmRieG1pI1RvcERvd25EQiIvPg0KLSAgPHNjaGVtYSBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSUQuc2NoeG1pI05VTExJRCIvPg0KLSAgPGNvbHVtbnMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJDb2x1bW4iIHhtaTppZD0iQUNDT1VOVElEIiBuYW1lPSJBQ0NPVU5USUQiPg0KLSAgICA8dHlwZSB4bWk6dHlwZT0iUkRCU2NoZW1hOlNRTENoYXJhY3RlclN0cmluZ1R5cGUiIHhtaTppZD0iU1FMQ2hhcmFjdGVyU3RyaW5nVHlwZV8xMDc5MTIzNTE2OTc3IiBsZW5ndGg9IjI1MCI+DQotICAgICAgPG9yaWdpbmF0aW5nVHlwZSB4bWk6dHlwZT0iUkRCU2NoZW1hOlNRTENoYXJhY3RlclN0cmluZ1R5cGUiIGhyZWY9IkphdmF0b0NMT1VEU0NBUEVfVjUwVHlwZU1hcHMueG1pI1NRTENoYXJhY3RlclN0cmluZ1R5cGVfMjUwIi8+DQotICAgIDwvdHlwZT4NCi0gIDwvY29sdW1ucz4NCi0gIDxjb2x1bW5zIHhtaTp0eXBlPSJSREJTY2hlbWE6UkRCQ29sdW1uIiB4bWk6aWQ9IlRZUEUxIiBuYW1lPSJUWVBFMSI+DQotICAgIDx0eXBlIHhtaTp0eXBlPSJSREJTY2hlbWE6U1FMRXhhY3ROdW1lcmljIiB4bWk6aWQ9IlNRTEV4YWN0TnVtZXJpY18xMDc5MTIzNTE2OTc3Ij4NCi0gICAgICA8b3JpZ2luYXRpbmdUeXBlIHhtaTp0eXBlPSJSREJTY2hlbWE6U1FMRXhhY3ROdW1lcmljIiBocmVmPSJDTE9VRFNDQVBFX1Y1MF9QcmltaXRpdmVzLnhtaSNTUUxFeGFjdE51bWVyaWNfMSIvPg0KLSAgICA8L3R5cGU+DQotICA8L2NvbHVtbnM+DQotICA8Y29sdW1ucyB4bWk6dHlwZT0iUkRCU2NoZW1hOlJEQkNvbHVtbiIgeG1pOmlkPSJCQUxBTkNFIiBuYW1lPSJCQUxBTkNFIj4NCi0gICAgPHR5cGUgeG1pOnR5cGU9IlJEQlNjaGVtYTpTUUxBcHByb3hpbWF0ZU51bWVyaWMiIHhtaTppZD0iU1FMQXBwcm94aW1hdGVOdW1lcmljXzEwNzkxMjM1MTY5NzciPg0KLSAgICAgIDxvcmlnaW5hdGluZ1R5cGUgeG1pOnR5cGU9IlJEQlNjaGVtYTpTUUxBcHByb3hpbWF0ZU51bWVyaWMiIGhyZWY9IkNMT1VEU0NBUEVfVjUwX1ByaW1pdGl2ZXMueG1pI1NRTEFwcHJveGltYXRlTnVtZXJpY18xIi8+DQotICAgIDwvdHlwZT4NCi0gIDwvY29sdW1ucz4NCi0gIDxjb2x1bW5zIHhtaTp0eXBlPSJSREJTY2hlbWE6UkRCQ29sdW1uIiB4bWk6aWQ9IkFQUiIgbmFtZT0iQVBSIj4NCi0gICAgPHR5cGUgeG1pOnR5cGU9IlJEQlNjaGVtYTpTUUxBcHByb3hpbWF0ZU51bWVyaWMiIHhtaTppZD0iU1FMQXBwcm94aW1hdGVOdW1lcmljXzEwNzkxMjM1MTY5NzgiPg0KLSAgICAgIDxvcmlnaW5hdGluZ1R5cGUgeG1pOnR5cGU9IlJEQlNjaGVtYTpTUUxBcHByb3hpbWF0ZU51bWVyaWMiIGhyZWY9IkNMT1VEU0NBUEVfVjUwX1ByaW1pdGl2ZXMueG1pI1NRTEFwcHJveGltYXRlTnVtZXJpY18xIi8+DQotICAgIDwvdHlwZT4NCi0gIDwvY29sdW1ucz4NCi0gIDxuYW1lZEdyb3VwIHhtaTp0eXBlPSJSREJTY2hlbWE6U1FMUmVmZXJlbmNlIiB4bWk6aWQ9IlBLX0FDQ09VTlQiIG5hbWU9IlBLX0FDQ09VTlQiIG1lbWJlcnM9IkFDQ09VTlRJRCIgY29uc3RyYWludD0iU1FMQ29uc3RyYWludF8xMDc5MTIzNTE2OTc3Ii8+DQotICA8Y29uc3RyYWludHMgeG1pOmlkPSJTUUxDb25zdHJhaW50XzEwNzkxMjM1MTY5NzciIG5hbWU9IlBLX0FDQ09VTlQiIHR5cGU9IlBSSU1BUllLRVkiIHByaW1hcnlLZXk9IlBLX0FDQ09VTlQiLz4NCi08L1JEQlNjaGVtYTpSREJUYWJsZT4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL2libV9wbWJhYi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9pYm1fcG1iYWIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmNjJkMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL2libV9wbWJhYi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0jRnJpIE1hciAxMiAxNDozMjowMSBDU1QgMjAwNAotQWNjb3VudD1jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIud2Vic3BoZXJlX2RlcGxveS5DTE9VRFNDQVBFX1Y1MF8xLkFjY291bnRCZWFuQWRhcHRvckJpbmRpbmdfMGMxODIxMzUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2VqYi1qYXIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvZWpiLWphci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOTg2MGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvZWpiLWphci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGVqYi1qYXIgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2VqYi1qYXJfMl8wLmR0ZCI+Ci0KLSAgIDxlamItamFyIGlkPSJlamItamFyX0lEIj4KLSAgICAgIDxkaXNwbGF5LW5hbWU+QXBwUHJvZmlsZVNhbXBsZUVKQk1vZHVsZTwvZGlzcGxheS1uYW1lPgotICAgICAgPGVudGVycHJpc2UtYmVhbnM+Ci0gICAgICAgICA8ZW50aXR5IGlkPSJDb250YWluZXJNYW5hZ2VkRW50aXR5XzEiPgotICAgICAgICAgICAgPGVqYi1uYW1lPkFjY291bnQ8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy5hcHBwcm9maWxlLmFjY291bnRtYW5hZ2VtZW50ZWpiLkFjY291bnRIb21lPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIuQWNjb3VudDwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy5hcHBwcm9maWxlLmFjY291bnRtYW5hZ2VtZW50ZWpiLkxvY2FsQWNjb3VudEhvbWU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy5hcHBwcm9maWxlLmFjY291bnRtYW5hZ2VtZW50ZWpiLkxvY2FsQWNjb3VudDwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5pYm0ud2Vic3BoZXJlLnNhbXBsZXMuYXBwcHJvZmlsZS5hY2NvdW50bWFuYWdlbWVudGVqYi5BY2NvdW50QmVhbjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGNtcC12ZXJzaW9uPjIueDwvY21wLXZlcnNpb24+Ci0gICAgICAgICAgICA8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+QWNjb3VudDwvYWJzdHJhY3Qtc2NoZW1hLW5hbWU+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkIGlkPSJBY2NvdW50X2FjY291bnRpZCI+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5hY2NvdW50aWQ8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQgaWQ9IkFjY291bnRfdHlwZSI+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT50eXBlPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkIGlkPSJBY2NvdW50X2JhbGFuY2UiPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+YmFsYW5jZTwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZCBpZD0iQWNjb3VudF9hcHIiPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+YXByPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8cHJpbWtleS1maWVsZD5hY2NvdW50aWQ8L3ByaW1rZXktZmllbGQ+Ci0gICAgICAgICAgICA8cXVlcnkgaWQ9IlF1ZXJ5XzEiPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZCBpZD0iUXVlcnlNZXRob2RfMSI+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+ZmluZExhcmdlQWNjb3VudHM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPmRvdWJsZTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPlNFTEVDVCBPQkpFQ1QoYSkgRlJPTSBBY2NvdW50IGEgV0hFUkUgYS5iYWxhbmNlID49ID8xPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5IGlkPSJRdWVyeV8yIj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2QgaWQ9IlF1ZXJ5TWV0aG9kXzIiPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPmZpbmRCeUFjY291bnRJZDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+amF2YS5sYW5nLlN0cmluZzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPlNFTEVDVCBPQkpFQ1QoYSkgRlJPTSBBY2NvdW50IGEgV0hFUkUgYS5hY2NvdW50aWQgID0gPzE8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnkgaWQ9IlF1ZXJ5XzMiPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZCBpZD0iUXVlcnlNZXRob2RfMyI+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+ZmluZEFsbEFjY291bnRzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT48L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPGVqYi1xbD5TRUxFQ1QgT0JKRUNUKGEpIEZST00gQWNjb3VudCBhPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8c2Vzc2lvbiBpZD0iU2Vzc2lvbl8xIj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+QWNjb3VudE1hbmFnZXI8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxlamItbmFtZT5BY2NvdW50TWFuYWdlcjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIuQWNjb3VudE1hbmFnZXJIb21lPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIuQWNjb3VudE1hbmFnZXI8L3JlbW90ZT4KLSAgICAgICAgICAgIDxlamItY2xhc3M+Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy5hcHBwcm9maWxlLmFjY291bnRtYW5hZ2VtZW50ZWpiLkFjY291bnRNYW5hZ2VyQmVhbjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHNlc3Npb24tdHlwZT5TdGF0ZWxlc3M8L3Nlc3Npb24tdHlwZT4KLSAgICAgICAgICAgIDx0cmFuc2FjdGlvbi10eXBlPkNvbnRhaW5lcjwvdHJhbnNhY3Rpb24tdHlwZT4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xIj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+ZWpiL0FwcFByb2ZpbGVTYW1wbGUtQWNjb3VudEhvbWU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIuTG9jYWxBY2NvdW50SG9tZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIuTG9jYWxBY2NvdW50PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5BY2NvdW50PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgIDwvc2Vzc2lvbj4KLSAgICAgIDwvZW50ZXJwcmlzZS1iZWFucz4KLSAgIDwvZWpiLWphcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2libS1lamItamFyLWJuZC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9pYm0tZWpiLWphci1ibmQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjkwZDQzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2libS1lamItamFyLWJuZC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxlamJibmQ6RUpCSmFyQmluZGluZyB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVqYmJuZD0iZWpiYm5kLnhtaSIgeG1sbnM6ZWpiPSJlamIueG1pIiB4bWxuczpjb21tb249ImNvbW1vbi54bWkiIHhtaTppZD0iZWpiLWphcl9JRF9CbmQiIGN1cnJlbnRCYWNrZW5kSWQ9IkNMT1VEU0NBUEVfVjUwXzEiPg0KLSAgPGVqYkphciBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNlamItamFyX0lEIi8+DQotICA8ZWpiQmluZGluZ3MgeG1pOmlkPSJDb250YWluZXJNYW5hZ2VkRW50aXR5XzFfQm5kIiBqbmRpTmFtZT0iQXBwUHJvZmlsZVNhbXBsZS1BY2NvdW50SG9tZSI+DQotICAgIDxlbnRlcnByaXNlQmVhbiB4bWk6dHlwZT0iZWpiOkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI0NvbnRhaW5lck1hbmFnZWRFbnRpdHlfMSIvPg0KLSAgPC9lamJCaW5kaW5ncz4NCi0gIDxlamJCaW5kaW5ncyB4bWk6aWQ9IkVudGVycHJpc2VCZWFuQmluZGluZ18xIiBqbmRpTmFtZT0iQXBwUHJvZmlsZVNhbXBsZS1BY2NvdW50TWFuYWdlckhvbWUiPg0KLSAgICA8ZW50ZXJwcmlzZUJlYW4geG1pOnR5cGU9ImVqYjpTZXNzaW9uIiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNTZXNzaW9uXzEiLz4NCi0gICAgPGVqYlJlZkJpbmRpbmdzIHhtaTppZD0iRWpiUmVmQmluZGluZ18xIiBqbmRpTmFtZT0iQXBwUHJvZmlsZVNhbXBsZS1BY2NvdW50SG9tZSI+DQotICAgICAgPGJpbmRpbmdFamJSZWYgeG1pOnR5cGU9ImNvbW1vbjpFSkJMb2NhbFJlZiIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjRUpCTG9jYWxSZWZfMSIvPg0KLSAgICA8L2VqYlJlZkJpbmRpbmdzPg0KLSAgPC9lamJCaW5kaW5ncz4NCi0gIDxkZWZhdWx0Q01QQ29ubmVjdGlvbkZhY3RvcnkgeG1pOmlkPSJDTVBDb25uZWN0aW9uRmFjdG9yeUJpbmRpbmdfMiIgam5kaU5hbWU9ImVpcy9qZGJjL0FwcFByb2ZpbGVTYW1wbGVEQl9DTVAiIHJlc0F1dGg9IlBlcl9Db25uZWN0aW9uX0ZhY3RvcnkiLz4NCi08L2VqYmJuZDpFSkJKYXJCaW5kaW5nPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2libS1lamItamFyLWV4dC1wbWUueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LXBtZS54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZWVjYjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LXBtZS54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwbWVleHQ6UE1FRUpCSmFyRXh0ZW5zaW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6YXBwcHJvZmlsZWVqYmV4dD0iaHR0cDovL3d3dy5pYm0uY29tL3dlYnNwaGVyZS9hcHBzZXJ2ZXIvc2NoZW1hcy81LjAvYXBwcHJvZmlsZWVqYmV4dC54bWkiIHhtbG5zOmVqYmV4dD0iZWpiZXh0LnhtaSIgeG1sbnM6ZWpiPSJlamIueG1pIiB4bWxuczpwbWVleHQ9Imh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzcGhlcmUvYXBwc2VydmVyL3NjaGVtYXMvNS4wL3BtZWV4dC54bWkiIHhtaTppZD0iUE1FRUpCSmFyRXh0ZW5zaW9uXzEiPg0KLSAgPGFwcFByb2ZpbGVFSkJKYXJFeHRlbnNpb24geG1pOmlkPSJBcHBQcm9maWxlRUpCSmFyRXh0ZW5zaW9uXzEiPg0KLSAgICA8YXBwbGljYXRpb25Qcm9maWxlcyB4bWk6aWQ9IkVKQk1vZHVsZVByb2ZpbGVfMSIgbmFtZT0iUmVhZC1vbmx5IiBkZXNjcmlwdGlvbj0iVGhpcyBwcm9maWxlIHdpbGwgYXBwbHkgYSByZWFkLW9ubHkgYWNjZXNzLWludGVudCBwb2xpY3kgdG8gdGhlIG11bHRpZmluZGVyIGZvciB0aGUgQWNjb3VudCBlbnRpdHkgYmVhbi4iPg0KLSAgICAgIDxhcHBsaWVkQWNjZXNzSW50ZW50cyB4bWk6aWQ9IkFwcGxpZWRBY2Nlc3NJbnRlbnRfMTA3MjgyODc1MzQyNCIgbmFtZT0iY29tLmlibS53ZWJzcGhlcmUuZWpicXVlcnkuRGVmYXVsdCIgZGVzY3JpcHRpb249IkFsbCBtZXRob2RzIG9mIHRoZSBBY2NvdW50IGJlYW4gYXJlIHNldCBmb3IgcmVhZCBvbmx5LiIgYWNjZXNzSW50ZW50TmFtZT0id3NQZXNzaW1pc3RpY1JlYWQiPg0KLSAgICAgICAgPG1ldGhvZEVsZW1lbnRzIHhtaTppZD0iTWV0aG9kRWxlbWVudF8xMDcyODI4NzUzNDI0IiB0eXBlPSJVbnNwZWNpZmllZCI+DQotICAgICAgICAgIDxlbnRlcnByaXNlQmVhbiB4bWk6dHlwZT0iZWpiOkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI0NvbnRhaW5lck1hbmFnZWRFbnRpdHlfMSIvPg0KLSAgICAgICAgPC9tZXRob2RFbGVtZW50cz4NCi0gICAgICA8L2FwcGxpZWRBY2Nlc3NJbnRlbnRzPg0KLSAgICAgIDx0YXNrcyB4bWk6aWQ9IlRhc2tfMTA3MTA5MzQxNTc4NCIgbmFtZT0iZ2V0TGFyZ2VBY2NvdW50cyIgZGVzY3JpcHRpb249IlRoaXMgdGFzayB3aWxsIGJlIHVzZWQgYnkgQWNjb3VudE1hbmFnZXIgc2Vzc2lvbiBiZWFuIGZvciByZWFkLW9ubHkgaW50ZW50LiIvPg0KLSAgICA8L2FwcGxpY2F0aW9uUHJvZmlsZXM+DQotICAgIDxlamJKYXJFeHRlbnNpb24gaHJlZj0iTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaSNlamItamFyX0lEX0V4dCIvPg0KLSAgICA8ZGVmaW5lZEFjY2Vzc0ludGVudFBvbGljaWVzIHhtaTppZD0iRGVmaW5lZEFjY2Vzc0ludGVudFBvbGljeV8xIiBuYW1lPSJQZXNzaW1pc3RpY1VwZGF0ZSAtIEluY3JlbWVudCAxMCIgZGVzY3JpcHRpb249IlRoaXMgaXMgYSBjdXN0b20gcG9saWN5IHRoYXQga2VlcHMgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHdzUGVzc2ltaXNpdGljVXBkYXRlIGV4Y2VwdCBmb3IgY29sbGVjdGlvbiBpbmNyZW1lbnQsIHdoaWNoIGlzIHNldCB0byAxMC4iPg0KLSAgICAgIDxhY2Nlc3NJbnRlbnRFbnRyaWVzIHhtaTp0eXBlPSJlamJleHQ6UGVzc2ltaXN0aWNVcGRhdGUiIHhtaTppZD0iUGVzc2ltaXN0aWNVcGRhdGVfMTA3MjgyNDI5MDgxNyIvPg0KLSAgICAgIDxhY2Nlc3NJbnRlbnRFbnRyaWVzIHhtaTp0eXBlPSJlamJleHQ6Q29sbGVjdGlvbkluY3JlbWVudCIgeG1pOmlkPSJDb2xsZWN0aW9uSW5jcmVtZW50XzEwNzI4MjQyOTA4MTciIGNvbGxlY3Rpb25JbmNyZW1lbnQ9IjEwIi8+DQotICAgICAgPGFjY2Vzc0ludGVudEVudHJpZXMgeG1pOnR5cGU9ImVqYmV4dDpSZXNvdXJjZU1hbmFnZXJQcmVGZXRjaEluY3JlbWVudCIgeG1pOmlkPSJSZXNvdXJjZU1hbmFnZXJQcmVGZXRjaEluY3JlbWVudF8xMDcyODI0MjkwODE3IiBwcmVGZXRjaEluY3JlbWVudD0iMCIvPg0KLSAgICAgIDxhY2Nlc3NJbnRlbnRFbnRyaWVzIHhtaTp0eXBlPSJlamJleHQ6VHJhbnNhY3Rpb25TY29wZSIgeG1pOmlkPSJUcmFuc2FjdGlvblNjb3BlXzEwNzI4MjQyOTA4MTciLz4NCi0gICAgPC9kZWZpbmVkQWNjZXNzSW50ZW50UG9saWNpZXM+DQotICAgIDxydW5Bc1Rhc2tzIHhtaTppZD0iUnVuQXNUYXNrXzIiIG5hbWU9ImdldExhcmdlQWNvdW50cyI+DQotICAgICAgPHRhc2tSdW5Bc0tpbmQgeG1pOnR5cGU9ImFwcHByb2ZpbGVlamJleHQ6UnVuQXNTcGVjaWZpZWRUYXNrIiB4bWk6aWQ9IlJ1bkFzU3BlY2lmaWVkVGFza18yIj4NCi0gICAgICAgIDx0YXNrIHhtaTppZD0iVGFza181IiBuYW1lPSJnZXRMYXJnZUFjY291bnRzIiBkZXNjcmlwdGlvbj0iZm9yIHZpZXdpbmcgYWNjb3VudCBkYXRhIG9ubHkiLz4NCi0gICAgICA8L3Rhc2tSdW5Bc0tpbmQ+DQotICAgICAgPG1ldGhvZEVsZW1lbnRzIHhtaTppZD0iTWV0aG9kRWxlbWVudF8zIiBuYW1lPSJnZXRMYXJnZUFjY291bnRzIiBwYXJtcz0iZG91YmxlICIgdHlwZT0iUmVtb3RlIj4NCi0gICAgICAgIDxlbnRlcnByaXNlQmVhbiB4bWk6dHlwZT0iZWpiOlNlc3Npb24iIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI1Nlc3Npb25fMSIvPg0KLSAgICAgIDwvbWV0aG9kRWxlbWVudHM+DQotICAgIDwvcnVuQXNUYXNrcz4NCi0gICAgPGFwcFByb2ZpbGVDb21wb25lbnRFeHRlbnNpb25zIHhtaTppZD0iQXBwUHJvZmlsZUNvbXBvbmVudEV4dGVuc2lvbl8xIj4NCi0gICAgICA8Y29tcG9uZW50RXh0ZW5zaW9uIHhtaTp0eXBlPSJlamJleHQ6U2Vzc2lvbkV4dGVuc2lvbiIgaHJlZj0iTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaSNTZXNzaW9uRXh0ZW5zaW9uXzEiLz4NCi0gICAgPC9hcHBQcm9maWxlQ29tcG9uZW50RXh0ZW5zaW9ucz4NCi0gICAgPGFwcFByb2ZpbGVDb21wb25lbnRFeHRlbnNpb25zIHhtaTppZD0iQXBwUHJvZmlsZUNvbXBvbmVudEV4dGVuc2lvbl8yIj4NCi0gICAgICA8Y29tcG9uZW50RXh0ZW5zaW9uIHhtaTp0eXBlPSJlamJleHQ6Q29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbiIgaHJlZj0iTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaSNDb250YWluZXJNYW5hZ2VkRW50aXR5XzFfRXh0Ii8+DQotICAgIDwvYXBwUHJvZmlsZUNvbXBvbmVudEV4dGVuc2lvbnM+DQotICA8L2FwcFByb2ZpbGVFSkJKYXJFeHRlbnNpb24+DQotPC9wbWVleHQ6UE1FRUpCSmFyRXh0ZW5zaW9uPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9pYm0tZWpiLWphci1leHQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzMyNjRmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxlamJleHQ6RUpCSmFyRXh0ZW5zaW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWpiZXh0PSJlamJleHQueG1pIiB4bWxuczplamI9ImVqYi54bWkiIHhtaTppZD0iZWpiLWphcl9JRF9FeHQiPg0KLSAgPGVqYkV4dGVuc2lvbnMgeG1pOnR5cGU9ImVqYmV4dDpDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uIiB4bWk6aWQ9IkNvbnRhaW5lck1hbmFnZWRFbnRpdHlfMV9FeHQiIGNvbmN1cnJlbmN5Q29udHJvbD0icGVzc2ltaXN0aWMiPg0KLSAgICA8ZW50ZXJwcmlzZUJlYW4geG1pOnR5cGU9ImVqYjpDb250YWluZXJNYW5hZ2VkRW50aXR5IiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNDb250YWluZXJNYW5hZ2VkRW50aXR5XzEiLz4NCi0gICAgPHN0cnVjdHVyZSB4bWk6aWQ9IkJlYW5TdHJ1Y3R1cmVfMSIgaW5oZXJpdGVuY2VSb290PSJmYWxzZSIvPg0KLSAgICA8YmVhbkNhY2hlIHhtaTppZD0iQmVhbkNhY2hlXzEiIGFjdGl2YXRlQXQ9IlRSQU5TQUNUSU9OIiBsb2FkQXQ9IlRSQU5TQUNUSU9OIi8+DQotICAgIDxsb2NhbFRyYW4geG1pOmlkPSJMb2NhbFRyYW5fMSIgYm91bmRhcnk9IkJFQU5fTUVUSE9EIiB1bnJlc29sdmVkQWN0aW9uPSJST0xMQkFDSyIvPg0KLSAgICA8ZGF0YUNhY2hlIHhtaTppZD0iRGF0YUNhY2hlXzEiIGxpZmV0aW1lSW5DYWNoZT0iMCIgbGlmZXRpbWVJbkNhY2hlVXNhZ2U9Ik9GRiIvPg0KLSAgPC9lamJFeHRlbnNpb25zPg0KLSAgPGVqYkV4dGVuc2lvbnMgeG1pOnR5cGU9ImVqYmV4dDpTZXNzaW9uRXh0ZW5zaW9uIiB4bWk6aWQ9IlNlc3Npb25FeHRlbnNpb25fMSIgdGltZW91dD0iNjAwIj4NCi0gICAgPGVudGVycHJpc2VCZWFuIHhtaTp0eXBlPSJlamI6U2Vzc2lvbiIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjU2Vzc2lvbl8xIi8+DQotICAgIDxzdHJ1Y3R1cmUgeG1pOmlkPSJCZWFuU3RydWN0dXJlXzIiIGluaGVyaXRlbmNlUm9vdD0iZmFsc2UiLz4NCi0gICAgPGJlYW5DYWNoZSB4bWk6aWQ9IkJlYW5DYWNoZV8yIiBhY3RpdmF0ZUF0PSJPTkNFIi8+DQotICAgIDxsb2NhbFRyYW4geG1pOmlkPSJMb2NhbFRyYW5fMiIgYm91bmRhcnk9IkJFQU5fTUVUSE9EIiB1bnJlc29sdmVkQWN0aW9uPSJST0xMQkFDSyIvPg0KLSAgPC9lamJFeHRlbnNpb25zPg0KLSAgPGVqYkphciBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNlamItamFyX0lEIi8+DQotICA8YXBwbGllZEFjY2Vzc0ludGVudHMgeG1pOmlkPSJBcHBsaWVkQWNjZXNzSW50ZW50XzEwNzEwOTM0MTU3NDQiIG5hbWU9ImNvbS5pYm0ud2Vic3BoZXJlLmVqYnF1ZXJ5LkRlZmF1bHQiIGRlc2NyaXB0aW9uPSIiIGFjY2Vzc0ludGVudE5hbWU9IlBlc3NpbWlzdGljVXBkYXRlIC0gSW5jcmVtZW50IDEwIj4NCi0gICAgPG1ldGhvZEVsZW1lbnRzIHhtaTppZD0iTWV0aG9kRWxlbWVudF8xMDcxMDkzNDE1NzQ0IiB0eXBlPSJVbnNwZWNpZmllZCI+DQotICAgICAgPGVudGVycHJpc2VCZWFuIHhtaTp0eXBlPSJlamI6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjQ29udGFpbmVyTWFuYWdlZEVudGl0eV8xIi8+DQotICAgIDwvbWV0aG9kRWxlbWVudHM+DQotICA8L2FwcGxpZWRBY2Nlc3NJbnRlbnRzPg0KLTwvZWpiZXh0OkVKQkphckV4dGVuc2lvbj4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9NRVRBLUlORi9lamItamFyLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvTUVUQS1JTkYvZWpiLWphci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTNjODYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9NRVRBLUlORi9lamItamFyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWpiLWphciBpZD0iZWpiLWphcl9JRCIgdmVyc2lvbj0iMi4xIiAKLQl4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIgPgotCTxkaXNwbGF5LW5hbWU+Ci0JVGVzdEVKQjwvZGlzcGxheS1uYW1lPgotCTxlbnRlcnByaXNlLWJlYW5zPgotCQk8c2Vzc2lvbiBpZD0iVDEiPgotCQkJPGVqYi1uYW1lPlQxPC9lamItbmFtZT4KLQkJCTxob21lPmVqYnMuVDFIb21lPC9ob21lPgotCQkJPHJlbW90ZT5lamJzLlQxPC9yZW1vdGU+Ci0JCQk8ZWpiLWNsYXNzPmVqYnMuVDFCZWFuPC9lamItY2xhc3M+Ci0JCQk8c2Vzc2lvbi10eXBlPlN0YXRlbGVzczwvc2Vzc2lvbi10eXBlPgotCQkJPHRyYW5zYWN0aW9uLXR5cGU+Q29udGFpbmVyPC90cmFuc2FjdGlvbi10eXBlPgotCQk8L3Nlc3Npb24+Ci0JPC9lbnRlcnByaXNlLWJlYW5zPgotPC9lamItamFyPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9lamJzL1QxLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9lamJzL1QxLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGE0ZTA4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvZWpicy9UMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvZWpicy9UMUJlYW4uY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL2VqYnMvVDFCZWFuLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWNiNGY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvZWpicy9UMUJlYW4uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL2VqYnMvVDFIb21lLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9lamJzL1QxSG9tZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3OTgzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL2VqYnMvVDFIb21lLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvTUVUQS1JTkYvZWpiLWphci54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL01FVEEtSU5GL2VqYi1qYXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjM3YTAzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvTUVUQS1JTkYvZWpiLWphci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVqYi1qYXIgaWQ9ImVqYi1qYXJfSUQiIHZlcnNpb249IjIuMSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2VqYi1qYXJfMl8xLnhzZCI+Ci0JPGRpc3BsYXktbmFtZT4KLQlUZXN0RUpCPC9kaXNwbGF5LW5hbWU+Ci0JPGVudGVycHJpc2UtYmVhbnM+Ci0JCTxzZXNzaW9uIGlkPSJUMSI+Ci0JCQk8ZWpiLW5hbWU+VDE8L2VqYi1uYW1lPgotCQkJPGhvbWU+ZWpicy5UMUhvbWU8L2hvbWU+Ci0JCQk8cmVtb3RlPmVqYnMuVDE8L3JlbW90ZT4KLQkJCTxlamItY2xhc3M+ZWpicy5UMUJlYW48L2VqYi1jbGFzcz4KLQkJCTxzZXNzaW9uLXR5cGU+U3RhdGVsZXNzPC9zZXNzaW9uLXR5cGU+Ci0JCQk8dHJhbnNhY3Rpb24tdHlwZT5Db250YWluZXI8L3RyYW5zYWN0aW9uLXR5cGU+Ci0JCTwvc2Vzc2lvbj4KLQk8L2VudGVycHJpc2UtYmVhbnM+Ci08L2VqYi1qYXI+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL2VqYnMvVDEuY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL2VqYnMvVDEuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYTRlMDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9lamJzL1QxLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9lamJzL1QxQmVhbi5jbGFzcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvZWpicy9UMUJlYW4uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxY2I0ZjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9lamJzL1QxQmVhbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvZWpicy9UMUhvbWUuY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL2VqYnMvVDFIb21lLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTc5ODMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvZWpicy9UMUhvbWUuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL0FubnVpdHlTZXJ2aWNlc19tYXBwaW5nLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvQW5udWl0eVNlcnZpY2VzX21hcHBpbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmZkY2JkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvQW5udWl0eVNlcnZpY2VzX21hcHBpbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08amF2YS13c2RsLW1hcHBpbmcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHZlcnNpb249IjEuMSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy94c2QvajJlZV9qYXhycGNfbWFwcGluZ18xXzEueHNkIj4KLSAgICA8cGFja2FnZS1tYXBwaW5nPgotICAgICAgICA8cGFja2FnZS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGE8L3BhY2thZ2UtdHlwZT4KLSAgICAgICAgPG5hbWVzcGFjZVVSST5odHRwOi8vZGF0YS5wbGkudGMud3NzdnQuaWJtLmNvbTwvbmFtZXNwYWNlVVJJPgotICAgIDwvcGFja2FnZS1tYXBwaW5nPgotICAgIDxwYWNrYWdlLW1hcHBpbmc+Ci0gICAgICAgIDxwYWNrYWdlLXR5cGU+Y29tLmlibS53c3N2dC5hY21lLmFubnVpdHkud3M8L3BhY2thZ2UtdHlwZT4KLSAgICAgICAgPG5hbWVzcGFjZVVSST5odHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb208L25hbWVzcGFjZVVSST4KLSAgICA8L3BhY2thZ2UtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmRvdWJsZTwvamF2YS10eXBlPgotICAgICAgICA8cm9vdC10eXBlLXFuYW1lIHhtbG5zOnJ0cT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPnJ0cTpkb3VibGU8L3Jvb3QtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPnNpbXBsZVR5cGU8L3FuYW1lLXNjb3BlPgotICAgIDwvamF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgIDxqYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxqYXZhLXR5cGU+amF2YS51dGlsLlZlY3RvcjwvamF2YS10eXBlPgotICAgICAgICA8cm9vdC10eXBlLXFuYW1lIHhtbG5zOnJ0cT0iaHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwIj5ydHE6VmVjdG9yPC9yb290LXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5zaW1wbGVUeXBlPC9xbmFtZS1zY29wZT4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2phdmEtdHlwZT4KLSAgICAgICAgPHJvb3QtdHlwZS1xbmFtZSB4bWxuczpydHE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj5ydHE6c3RyaW5nPC9yb290LXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5zaW1wbGVUeXBlPC9xbmFtZS1zY29wZT4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuV1NBbm51aXR5Q29tcG9zaXRlRGF0YTwvamF2YS10eXBlPgotICAgICAgICA8cm9vdC10eXBlLXFuYW1lIHhtbG5zOnJ0cT0iaHR0cDovL2RhdGEucGxpLnRjLndzc3Z0LmlibS5jb20iPnJ0cTpXU0FubnVpdHlDb21wb3NpdGVEYXRhPC9yb290LXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5jb21wbGV4VHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5XU0FubnVpdHkgICAgRGF0YTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+V1NBbm51aXR5ICAgIERhdGE8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPnN1YkFjY291bnRzPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5zdWJBY2NvdW50czwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgIDwvamF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgIDxqYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxqYXZhLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5XU0FubnVpdHlEYXRhPC9qYXZhLXR5cGU+Ci0gICAgICAgIDxyb290LXR5cGUtcW5hbWUgeG1sbnM6cnRxPSJodHRwOi8vZGF0YS5wbGkudGMud3NzdnQuaWJtLmNvbSI+cnRxOldTQW5udWl0eURhdGE8L3Jvb3QtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPmNvbXBsZXhUeXBlPC9xbmFtZS1zY29wZT4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPnRheFN0YXR1czwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+dGF4U3RhdHVzPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT50eXBlPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT50eXBlPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5hbW91bnQ8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmFtb3VudDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+ZW5kRGF0ZTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+ZW5kRGF0ZTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+Y3VzdE51bWJlcjwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+Y3VzdE51bWJlcjwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+Y3VzdE5hbWU8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmN1c3ROYW1lPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5jdXN0U1NOdW08L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmN1c3RTU051bTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+RU1haWw8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPkVNYWlsPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5hbm51aXR5Tm88L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmFubnVpdHlObzwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+cHJlbWl1bTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+cHJlbWl1bTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+YmVnaW5EYXRlPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5iZWdpbkRhdGU8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPnN0YXR1czwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+c3RhdHVzPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5maXhlZFBlcmlvZDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+Zml4ZWRQZXJpb2Q8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmZpeGVkQW1vdW50PC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5maXhlZEFtb3VudDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+bGlmZTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+bGlmZTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+bGlmZVdpdGhQZXJpb2Q8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmxpZmVXaXRoUGVyaW9kPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5maXhlZFBlcmNlbnQ8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmZpeGVkUGVyY2VudDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+YWN0dWFsUGVyY2VudDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+YWN0dWFsUGVyY2VudDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+YmVuZWZpdE9wdGlvbnM8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmJlbmVmaXRPcHRpb25zPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5wcmVtaXVtU2NoZWQ8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPnByZW1pdW1TY2hlZDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+aW52ZXN0Q2F0ZWdvcnk8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmludmVzdENhdGVnb3J5PC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5wYXlvdXRPcHRpb25zPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5wYXlvdXRPcHRpb25zPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5ndWFyUGF5b3V0PC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5ndWFyUGF5b3V0PC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5udW1TdWJBY2N0czwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+bnVtU3ViQWNjdHM8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmV4dHJhQ3JlZGl0czwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+ZXh0cmFDcmVkaXRzPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5jZWxsTm9kZVNlcnZlck5hbWU8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmNlbGxOb2RlU2VydmVyTmFtZTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+Y2xpZW50SWQ8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmNsaWVudElkPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5pbnQ8L2phdmEtdHlwZT4KLSAgICAgICAgPHJvb3QtdHlwZS1xbmFtZSB4bWxuczpydHE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj5ydHE6aW50PC9yb290LXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5zaW1wbGVUeXBlPC9xbmFtZS1zY29wZT4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmphdmEudXRpbC5DYWxlbmRhcjwvamF2YS10eXBlPgotICAgICAgICA8cm9vdC10eXBlLXFuYW1lIHhtbG5zOnJ0cT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPnJ0cTpkYXRlVGltZTwvcm9vdC10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+c2ltcGxlVHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLlN1YkFjY3REYXRhW108L2phdmEtdHlwZT4KLSAgICAgICAgPGFub255bW91cy10eXBlLXFuYW1lPmh0dHA6Ly9kYXRhLnBsaS50Yy53c3N2dC5pYm0uY29tOlN1YkFjY3REYXRhWzAsdW5ib3VuZGVkXTwvYW5vbnltb3VzLXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5jb21wbGV4VHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLlN1YkFjY3REYXRhPC9qYXZhLXR5cGU+Ci0gICAgICAgIDxyb290LXR5cGUtcW5hbWUgeG1sbnM6cnRxPSJodHRwOi8vZGF0YS5wbGkudGMud3NzdnQuaWJtLmNvbSI+cnRxOlN1YkFjY3REYXRhPC9yb290LXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5jb21wbGV4VHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT50eXBlPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT50eXBlPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT52YWx1ZTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+dmFsdWU8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmFubnVpdHlJZDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+YW5udWl0eUlkPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5pZDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+aWQ8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPm5hbWU8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPm5hbWU8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmNlbGxOb2RlU2VydmVyTmFtZTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+Y2VsbE5vZGVTZXJ2ZXJOYW1lPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5jbGllbnRJZDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+Y2xpZW50SWQ8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmJvb2xlYW48L2phdmEtdHlwZT4KLSAgICAgICAgPHJvb3QtdHlwZS1xbmFtZSB4bWxuczpydHE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj5ydHE6Ym9vbGVhbjwvcm9vdC10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+c2ltcGxlVHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLlN1YkFjY3REYXRhW108L2phdmEtdHlwZT4KLSAgICAgICAgPHJvb3QtdHlwZS1xbmFtZSB4bWxuczpydHE9Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+cnRxOkFycmF5T2ZfdG5zMl9uaWxsYWJsZV9TdWJBY2N0RGF0YTwvcm9vdC10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+Y29tcGxleFR5cGU8L3FuYW1lLXNjb3BlPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+c3ViQWNjdERhdGE8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPlN1YkFjY3REYXRhPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLlN1YkFjY3REYXRhW108L2phdmEtdHlwZT4KLSAgICAgICAgPGFub255bW91cy10eXBlLXFuYW1lPmh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbTpBcnJheU9mX3RuczJfbmlsbGFibGVfU3ViQWNjdERhdGEmZ3Q7U3ViQWNjdERhdGFbMCx1bmJvdW5kZWRdPC9hbm9ueW1vdXMtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPmNvbXBsZXhUeXBlPC9xbmFtZS1zY29wZT4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmphdmEubGFuZy5PYmplY3RbXTwvamF2YS10eXBlPgotICAgICAgICA8YW5vbnltb3VzLXR5cGUtcW5hbWU+aHR0cDovL3htbC5hcGFjaGUub3JnL3htbC1zb2FwOlZlY3RvciZndDtpdGVtWzAsdW5ib3VuZGVkXTwvYW5vbnltb3VzLXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5jb21wbGV4VHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2aWNlLWludGVyZmFjZT5jb20uaWJtLndzc3Z0LmFjbWUuYW5udWl0eS53cy5XU1RBbm51aXR5U2VydmljZTwvc2VydmljZS1pbnRlcmZhY2U+Ci0gICAgICAgIDx3c2RsLXNlcnZpY2UtbmFtZSB4bWxuczpzaW09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+c2ltOldTVEFubnVpdHlTZXJ2aWNlPC93c2RsLXNlcnZpY2UtbmFtZT4KLSAgICAgICAgPHBvcnQtbWFwcGluZz4KLSAgICAgICAgICAgIDxwb3J0LW5hbWU+V1NUQW5udWl0eVNlcnZpY2U8L3BvcnQtbmFtZT4KLSAgICAgICAgICAgIDxqYXZhLXBvcnQtbmFtZT5XU1RBbm51aXR5U2VydmljZTwvamF2YS1wb3J0LW5hbWU+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+Y29tLmlibS53c3N2dC5hY21lLmFubnVpdHkud3MuQW5udWl0eVNlcnZpY2U8L3NlcnZpY2UtaW50ZXJmYWNlPgotICAgICAgICA8d3NkbC1zZXJ2aWNlLW5hbWUgeG1sbnM6c2ltPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPnNpbTpBbm51aXR5U2VydmljZTwvd3NkbC1zZXJ2aWNlLW5hbWU+Ci0gICAgICAgIDxwb3J0LW1hcHBpbmc+Ci0gICAgICAgICAgICA8cG9ydC1uYW1lPkFubnVpdHlTZXJ2aWNlPC9wb3J0LW5hbWU+Ci0gICAgICAgICAgICA8amF2YS1wb3J0LW5hbWU+QW5udWl0eVNlcnZpY2U8L2phdmEtcG9ydC1uYW1lPgotICAgICAgICA8L3BvcnQtbWFwcGluZz4KLSAgICA8L3NlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmc+Ci0gICAgPHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZT5jb20uaWJtLndzc3Z0LmFjbWUuYW5udWl0eS53cy5Bbm51aXR5U2VydmljZVBvcnRUeXBlPC9zZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZT4KLSAgICAgICAgPHdzZGwtcG9ydC10eXBlIHhtbG5zOnNlaW13cHQ9Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+c2VpbXdwdDpBbm51aXR5U2VydmljZVBvcnRUeXBlPC93c2RsLXBvcnQtdHlwZT4KLSAgICAgICAgPHdzZGwtYmluZGluZyB4bWxuczpzZWltd2I9Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+c2VpbXdiOkFubnVpdHlTZXJ2aWNlQmluZGluZzwvd3NkbC1iaW5kaW5nPgotICAgICAgICA8c2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLW1ldGhvZC1uYW1lPndzTGlzdEFubnVpdHlCeUhvbGRlcjwvamF2YS1tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDx3c2RsLW9wZXJhdGlvbj53c0xpc3RBbm51aXR5QnlIb2xkZXI8L3dzZGwtb3BlcmF0aW9uPgotICAgICAgICAgICAgPHdyYXBwZWQtZWxlbWVudD48L3dyYXBwZWQtZWxlbWVudD4KLSAgICAgICAgICAgIDxtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8cGFyYW0tcG9zaXRpb24+MDwvcGFyYW0tcG9zaXRpb24+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcGFyYW0tdHlwZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6bXBwbT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5tcHBtOndzTGlzdEFubnVpdHlCeUhvbGRlclJlcXVlc3Q8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+aG9sZGVyU1NOPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8cGFyYW1ldGVyLW1vZGU+SU48L3BhcmFtZXRlci1tb2RlPgotICAgICAgICAgICAgICAgIDwvd3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8L21ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgPHdzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1yZXR1cm4tdmFsdWU+amF2YS51dGlsLlZlY3RvcjwvbWV0aG9kLXJldHVybi12YWx1ZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOndydm09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+d3J2bTp3c0xpc3RBbm51aXR5QnlIb2xkZXJSZXNwb25zZTwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPndzTGlzdEFubnVpdHlCeUhvbGRlclJldHVybjwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgIDwvd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgPC9zZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgICAgICA8c2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLW1ldGhvZC1uYW1lPndzQWRkU3ViQWNjb3VudHM8L2phdmEtbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8d3NkbC1vcGVyYXRpb24+d3NBZGRTdWJBY2NvdW50czwvd3NkbC1vcGVyYXRpb24+Ci0gICAgICAgICAgICA8d3JhcHBlZC1lbGVtZW50Pjwvd3JhcHBlZC1lbGVtZW50PgotICAgICAgICAgICAgPG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxwYXJhbS1wb3NpdGlvbj4wPC9wYXJhbS1wb3NpdGlvbj4KLSAgICAgICAgICAgICAgICA8cGFyYW0tdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLldTQW5udWl0eUNvbXBvc2l0ZURhdGE8L3BhcmFtLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOm1wcG09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+bXBwbTp3c0FkZFN1YkFjY291bnRzUmVxdWVzdDwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT5hQ0Q8L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXItbW9kZT5JTjwvcGFyYW1ldGVyLW1vZGU+Ci0gICAgICAgICAgICAgICAgPC93c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICA8bWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXBvc2l0aW9uPjE8L3BhcmFtLXBvc2l0aW9uPgotICAgICAgICAgICAgICAgIDxwYXJhbS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuU3ViQWNjdERhdGFbXTwvcGFyYW0tdHlwZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UgeG1sbnM6bXBwbT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5tcHBtOndzQWRkU3ViQWNjb3VudHNSZXF1ZXN0PC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPnNBRDwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHBhcmFtZXRlci1tb2RlPklOPC9wYXJhbWV0ZXItbW9kZT4KLSAgICAgICAgICAgICAgICA8L3dzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgPC9tZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgIDx3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcmV0dXJuLXZhbHVlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuV1NBbm51aXR5Q29tcG9zaXRlRGF0YTwvbWV0aG9kLXJldHVybi12YWx1ZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOndydm09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+d3J2bTp3c0FkZFN1YkFjY291bnRzUmVzcG9uc2U8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT53c0FkZFN1YkFjY291bnRzUmV0dXJuPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgPC93c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nPgotICAgICAgICA8L3NlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtbWV0aG9kLW5hbWU+d3NDcmVhdGVBbm51aXR5PC9qYXZhLW1ldGhvZC1uYW1lPgotICAgICAgICAgICAgPHdzZGwtb3BlcmF0aW9uPndzQ3JlYXRlQW5udWl0eTwvd3NkbC1vcGVyYXRpb24+Ci0gICAgICAgICAgICA8d3JhcHBlZC1lbGVtZW50Pjwvd3JhcHBlZC1lbGVtZW50PgotICAgICAgICAgICAgPG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxwYXJhbS1wb3NpdGlvbj4wPC9wYXJhbS1wb3NpdGlvbj4KLSAgICAgICAgICAgICAgICA8cGFyYW0tdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLldTQW5udWl0eUNvbXBvc2l0ZURhdGE8L3BhcmFtLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOm1wcG09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+bXBwbTp3c0NyZWF0ZUFubnVpdHlSZXF1ZXN0PC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPmFDRDwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHBhcmFtZXRlci1tb2RlPklOPC9wYXJhbWV0ZXItbW9kZT4KLSAgICAgICAgICAgICAgICA8L3dzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgPC9tZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgIDx3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcmV0dXJuLXZhbHVlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuV1NBbm51aXR5Q29tcG9zaXRlRGF0YTwvbWV0aG9kLXJldHVybi12YWx1ZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOndydm09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+d3J2bTp3c0NyZWF0ZUFubnVpdHlSZXNwb25zZTwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPndzQ3JlYXRlQW5udWl0eVJldHVybjwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgIDwvd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgPC9zZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgIDwvc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZz4KLSAgICA8c2VydmljZS1pbnRlcmZhY2UtbWFwcGluZz4KLSAgICAgICAgPHNlcnZpY2UtaW50ZXJmYWNlPmNvbS5pYm0ud3NzdnQuYWNtZS5hbm51aXR5LndzLkFubnVpdHlTZXJ2aWNlMjwvc2VydmljZS1pbnRlcmZhY2U+Ci0gICAgICAgIDx3c2RsLXNlcnZpY2UtbmFtZSB4bWxuczpzaW09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+c2ltOkFubnVpdHlTZXJ2aWNlMjwvd3NkbC1zZXJ2aWNlLW5hbWU+Ci0gICAgICAgIDxwb3J0LW1hcHBpbmc+Ci0gICAgICAgICAgICA8cG9ydC1uYW1lPkFubnVpdHlTZXJ2aWNlMjwvcG9ydC1uYW1lPgotICAgICAgICAgICAgPGphdmEtcG9ydC1uYW1lPkFubnVpdHlTZXJ2aWNlMjwvamF2YS1wb3J0LW5hbWU+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+Ci0gICAgPC9zZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nPgotPC9qYXZhLXdzZGwtbWFwcGluZz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvaWJtLXdlYnNlcnZpY2VzLWJuZC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL2libS13ZWJzZXJ2aWNlcy1ibmQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRjZjZjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvaWJtLXdlYnNlcnZpY2VzLWJuZC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tLmlibS5ldG9vbHMud2Vic2VydmljZS53c2JuZDpXU0JpbmRpbmcgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpjb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLndzYm5kPSJodHRwOi8vd3d3LmlibS5jb20vd2Vic3BoZXJlL2FwcHNlcnZlci9zY2hlbWFzLzUuMC4yL3dzYm5kLnhtaSIgeG1pOmlkPSJXU0JpbmRpbmdfMTA1NTczNzI0MTc5NyI+Ci0gIDx3c2Rlc2NCaW5kaW5ncyB4bWk6aWQ9IldTRGVzY0JpbmRpbmdfMTA1NTczNzI0MTc5NyIgd3NEZXNjTmFtZUxpbms9IlN0b2NrUXVvdGVGZXRjaGVyIj4KLSAgICA8cGNCaW5kaW5ncyB4bWk6aWQ9IlBDQmluZGluZ18xMDU1NzM3MjQxNzk3IiBwY05hbWVMaW5rPSJ1cm46eG1sdG9kYXktZGVsYXllZC1xdW90ZXMiIHNjb3BlPSJTZXNzaW9uIi8+Ci0gIDwvd3NkZXNjQmluZGluZ3M+Ci0gIDxyb3V0ZXJNb2R1bGVzIHhtaTppZD0iUm91dGVyTW9kdWxlXzEwNTU3MzcyNDE3OTciIHRyYW5zcG9ydD0iaHR0cCIgbmFtZT0iU3RvY2tRdW90ZS53YXIiLz4KLTwvY29tLmlibS5ldG9vbHMud2Vic2VydmljZS53c2JuZDpXU0JpbmRpbmc+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL2libS13ZWJzZXJ2aWNlcy1leHQueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS93ZWJzZXJ2aWNlcy9NRVRBLUlORi9pYm0td2Vic2VydmljZXMtZXh0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwNTAwZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL2libS13ZWJzZXJ2aWNlcy1leHQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08Y29tLmlibS5ldG9vbHMud2Vic2VydmljZS53c2V4dDpXc0V4dGVuc2lvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmNvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2Uud3NleHQ9Imh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzcGhlcmUvYXBwc2VydmVyL3NjaGVtYXMvNS4wLjIvd3NleHQueG1pIiB4bWk6aWQ9IldzRXh0ZW5zaW9uXzEwNTM0ODQ2MTUwNTQiPgotICA8d3NEZXNjRXh0IHhtaTppZD0iV3NEZXNjRXh0XzEwNTM0ODQ2MTUwNTQiIHdzRGVzY05hbWVMaW5rPSJTdG9ja1F1b3RlRmV0Y2hlciI+Ci0gICAgPHBjQmluZGluZyB4bWk6aWQ9IlBjQmluZGluZ18xMDUzNDg0NjE1MDU0IiBwY05hbWVMaW5rPSJ1cm46eG1sdG9kYXktZGVsYXllZC1xdW90ZXMiPgotICAgIDwvcGNCaW5kaW5nPgotICA8L3dzRGVzY0V4dD4KLTwvY29tLmlibS5ldG9vbHMud2Vic2VydmljZS53c2V4dDpXc0V4dGVuc2lvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvd2Vic2VydmljZXMueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS93ZWJzZXJ2aWNlcy9NRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNjkwNzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS93ZWJzZXJ2aWNlcy9NRVRBLUlORi93ZWJzZXJ2aWNlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIHdlYnNlcnZpY2VzIFBVQkxJQyAiLS8vSUJNIENvcnBvcmF0aW9uLCBJbmMuLy9EVEQgSjJFRSBXZWIgc2VydmljZXMgMS4wLy9FTiIgImh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzZXJ2aWNlcy9kdGQvajJlZV93ZWJfc2VydmljZXNfMV8wLmR0ZCI+Ci0KLSAgIDx3ZWJzZXJ2aWNlcyBpZD0iV2ViU2VydmljZXNfMTA1NTczNzI0MTY3MiI+Ci0gICAgICA8d2Vic2VydmljZS1kZXNjcmlwdGlvbiBpZD0iV2ViU2VydmljZURlc2NyaXB0aW9uXzEwNTU3MzcyNDE2ODgiPgotICAgICAgICAgPHdlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZT5TdG9ja1F1b3RlRmV0Y2hlcjwvd2Vic2VydmljZS1kZXNjcmlwdGlvbi1uYW1lPgotICAgICAgICAgPHdzZGwtZmlsZT5NRVRBLUlORi93c2RsL1N0b2NrUXVvdGVGZXRjaGVyLndzZGw8L3dzZGwtZmlsZT4KLSAgICAgICAgIDxqYXhycGMtbWFwcGluZy1maWxlPk1FVEEtSU5GL1N0b2NrUXVvdGVGZXRjaGVyX21hcHBpbmcueG1sPC9qYXhycGMtbWFwcGluZy1maWxlPgotICAgICAgICAgPHBvcnQtY29tcG9uZW50IGlkPSJQb3J0Q29tcG9uZW50XzEwNTU3MzcyNDE3MzQiPgotICAgICAgICAgICAgPHBvcnQtY29tcG9uZW50LW5hbWU+dXJuOnhtbHRvZGF5LWRlbGF5ZWQtcXVvdGVzPC9wb3J0LWNvbXBvbmVudC1uYW1lPgotICAgICAgICAgICAgPHdzZGwtcG9ydCBpZD0iV1NETFBvcnRfMTA1NTczNzI0MTczNCI+Ci0gICAgICAgICAgICAgICA8bmFtZXNwYWNlVVJJPmh0dHA6Ly9zdG9jay53ZWJzZXJ2aWNlcy5zYW1wbGVzLndlYnNwaGVyZS5pYm0uY29tPC9uYW1lc3BhY2VVUkk+Ci0gICAgICAgICAgICAgICA8bG9jYWxwYXJ0PlN0b2NrUXVvdGU8L2xvY2FscGFydD4KLSAgICAgICAgICAgIDwvd3NkbC1wb3J0PgotICAgICAgICAgICAgPHNlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlPmNvbS5pYm0ud2Vic3BoZXJlLnNhbXBsZXMud2Vic2VydmljZXMuc3RvY2suU3RvY2tRdW90ZTwvc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2U+Ci0gICAgICAgICAgICA8c2VydmljZS1pbXBsLWJlYW4gaWQ9IlNlcnZpY2VJbXBsQmVhbl8xMDU1NzM3MjQxNzM0Ij4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5jb21faWJtX3dlYnNwaGVyZV9zYW1wbGVzX3dlYnNlcnZpY2VzX3N0b2NrX1N0b2NrUXVvdGU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9zZXJ2aWNlLWltcGwtYmVhbj4KLSAgICAgICAgIDwvcG9ydC1jb21wb25lbnQ+Ci0gICAgICA8L3dlYnNlcnZpY2UtZGVzY3JpcHRpb24+Ci0gICA8L3dlYnNlcnZpY2VzPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZjY3MGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY29tbW9uLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNhYzYwNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXBlcmZvcm1hbmNlLmphcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlZDMzZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWQ0NTQ3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS5wZXJmb3JtYW5jZS5qYXIgPSBjb21tb24vCi1vdXRwdXQucGVyZm9ybWFuY2UuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwZXJmb3JtYW5jZS5qYXIsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL0Jhc2VQZXJmb3JtYW5jZVRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvQmFzZVBlcmZvcm1hbmNlVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3NTZhZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvQmFzZVBlcmZvcm1hbmNlVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBEZWMgNiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkJhc2VUZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVBlcmZvcm1hbmNlVGVzdENhc2UgZXh0ZW5kcyBCYXNlVGVzdENhc2UgewotCXByb3RlY3RlZCBzdGF0aWMgTWFwIHBlcmZvcm1hbmNlQ2xhc3MgPSBudWxsOwotCXN0YXRpYyBDbGFzc0xvYWRlciBjbGF6ekxvYWRlciA9IG51bGw7Ci0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZmlsZT0gbnVsbDsgCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlwZXJmb3JtYW5jZUNsYXNzID0gbnVsbDsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RTdWl0ZXMoKSA7Ci0JfQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIFRlc3QgY3JlYXRlVGVzdFN1aXRlcygpIHsKLQkJY3JlYXRlUGVyZm9ybWFuY2VDbGFzcygpOwotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHBlcmZvcm1hbmNlQ2xhc3Mua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlDbGFzcyBjbGF6eiA9IChDbGFzcykgaXRlci5uZXh0KCk7Ci0JCQlMaXN0IG1ldGhvZExpc3QgPSAoTGlzdClwZXJmb3JtYW5jZUNsYXNzLmdldChjbGF6eik7Ci0JCQlmb3IgKGludCB4PTA7IHg8IG1ldGhvZExpc3Quc2l6ZSgpOyArK3gpIHsKLQkJCQlQZXJmb3JtYW5jZVRlc3RPYmplY3QgdGVzdE9iamVjdCA9IChQZXJmb3JtYW5jZVRlc3RPYmplY3QpbWV0aG9kTGlzdC5nZXQoeCk7Ci0JCQkJVGVzdCB0ZXN0ID0gY3JlYXRlVGVzdChjbGF6eix0ZXN0T2JqZWN0LmdldE5hbWUoKSk7Ci0JCQkJaWYgKHRlc3QgaW5zdGFuY2VvZiBCYXNlVGVzdENhc2UpIHsKLQkJCQkJc3VpdGUuYWRkVGVzdChuZXcgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIoKEJhc2VUZXN0Q2FzZSl0ZXN0LCB0ZXN0T2JqZWN0LmdldFRhZ2dpbmcoKSAsIHRlc3RPYmplY3QuZ2V0U2hvcnROYW1lKCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXN0YXRpYyBwdWJsaWMgVGVzdCBjcmVhdGVUZXN0KENsYXNzIHRoZUNsYXNzLCBTdHJpbmcgbmFtZSkgewotCQlDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcjsKLQkJdHJ5IHsKLQkJCWNvbnN0cnVjdG9yPSBnZXRUZXN0Q29uc3RydWN0b3IodGhlQ2xhc3MpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIHdhcm5pbmcoIkNsYXNzICIrdGhlQ2xhc3MuZ2V0TmFtZSgpKyIgaGFzIG5vIHB1YmxpYyBjb25zdHJ1Y3RvciBUZXN0Q2FzZShTdHJpbmcgbmFtZSkgb3IgVGVzdENhc2UoKSIpOwotCQl9Ci0JCU9iamVjdCB0ZXN0OwotCQl0cnkgewotCQkJaWYgKGNvbnN0cnVjdG9yLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDApIHsKLQkJCQl0ZXN0PSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0WzBdKTsKLQkJCQlpZiAodGVzdCBpbnN0YW5jZW9mIFRlc3RDYXNlKQotCQkJCQkoKFRlc3RDYXNlKSB0ZXN0KS5zZXROYW1lKG5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQl0ZXN0PSBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117bmFtZX0pOwotCQkJfQotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybih3YXJuaW5nKCJDYW5ub3QgaW5zdGFudGlhdGUgdGVzdCBjYXNlOiAiK25hbWUrIiAoIitleGNlcHRpb25Ub1N0cmluZyhlKSsiKSIpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4od2FybmluZygiRXhjZXB0aW9uIGluIGNvbnN0cnVjdG9yOiAiK25hbWUrIiAoIitleGNlcHRpb25Ub1N0cmluZyhlLmdldFRhcmdldEV4Y2VwdGlvbigpKSsiKSIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4od2FybmluZygiQ2Fubm90IGFjY2VzcyB0ZXN0IGNhc2U6ICIrbmFtZSsiICgiK2V4Y2VwdGlvblRvU3RyaW5nKGUpKyIpIikpOwotCQl9Ci0JCXJldHVybiAoVGVzdCkgdGVzdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHRlc3Qgd2hpY2ggd2lsbCBmYWlsIGFuZCBsb2cgYSB3YXJuaW5nIG1lc3NhZ2UuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVGVzdCB3YXJuaW5nKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBuZXcgVGVzdENhc2UoIndhcm5pbmciKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgewotCQkJCWZhaWwobWVzc2FnZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29uc3RydWN0b3IgZ2V0VGVzdENvbnN0cnVjdG9yKENsYXNzIHRoZUNsYXNzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJQ2xhc3NbXSBhcmdzPSB7IFN0cmluZy5jbGFzcyB9OwotCQl0cnkgewotCQkJcmV0dXJuIHRoZUNsYXNzLmdldENvbnN0cnVjdG9yKGFyZ3MpOwkKLQkJfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGZhbGwgdGhyb3VnaAotCQl9Ci0JCXJldHVybiB0aGVDbGFzcy5nZXRDb25zdHJ1Y3RvcihuZXcgQ2xhc3NbMF0pOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uVG9TdHJpbmcoVGhyb3dhYmxlIHQpIHsKLQkJU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlcj0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciB3cml0ZXI9IG5ldyBQcmludFdyaXRlcihzdHJpbmdXcml0ZXIpOwotCQl0LnByaW50U3RhY2tUcmFjZSh3cml0ZXIpOwotCQlyZXR1cm4gc3RyaW5nV3JpdGVyLnRvU3RyaW5nKCk7Ci0KLQl9Ci0JLyoqCi0JICogQHBhcmFtIHBlcmZvcm1hbmNlQ2xhc3MyCi0JICovCi0JCi0JcHVibGljIHN0YXRpYyBNYXAgZ2V0UGVyZm9ybWFuY2VDbGFzcygpIHsKLQkJaWYgKHBlcmZvcm1hbmNlQ2xhc3MgPT0gbnVsbCkgewotCQkJY3JlYXRlUGVyZm9ybWFuY2VDbGFzcygpOwotCQl9Ci0JCXJldHVybiBwZXJmb3JtYW5jZUNsYXNzOwotCX0KLQkKLQkJCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNyZWF0ZVBlcmZvcm1hbmNlQ2xhc3MoKSB7Ci0JCWlmIChwZXJmb3JtYW5jZUNsYXNzID09IG51bGwpIHsKLQkJCXBlcmZvcm1hbmNlQ2xhc3MgPSBuZXcgVGVzdENhc2VTQVhQYXJzZXIoKS5kb0xvYWQobmV3IEZpbGUoZmlsZSkpOwotCQl9Ci0JfQotCQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjbGF6ekxvYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgewotCQlyZXR1cm4gY2xhenpMb2FkZXI7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBjbGF6ekxvYWRlciBUaGUgY2xhenpMb2FkZXIgdG8gc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDbGFzc0xvYWRlcihDbGFzc0xvYWRlciBjbGF6ekxvYWRlcikgewotCQlCYXNlUGVyZm9ybWFuY2VUZXN0Q2FzZS5jbGF6ekxvYWRlciA9IGNsYXp6TG9hZGVyOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmlsZShTdHJpbmcgZmlsZSkgewotCQlCYXNlUGVyZm9ybWFuY2VUZXN0Q2FzZS5maWxlID0gZmlsZTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHN1aXRlCi0JICogQHBhcmFtIHRlc3QKLQkgKiBAcGFyYW0gZ2xvYmFsCi0JICogQHBhcmFtIHN0cmluZwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhZGRQZXJmb3JtYW5jZVRlc3QoVGVzdFN1aXRlIHN1aXRlLCBCYXNlVGVzdENhc2UgdGVzdCwgaW50IHRhZ2dpbmcsIFN0cmluZyBzaG9ydE5hbWUpIHsKLQkJUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIgdGVzdENhc2UgPSBuZXcgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIodGVzdCwgdGFnZ2luZyAsIHNob3J0TmFtZSk7Ci0JCXN1aXRlLmFkZFRlc3QodGVzdENhc2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9IZWFkZXJQYXJzZXJQZXJmb3JtYW5jZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9IZWFkZXJQYXJzZXJQZXJmb3JtYW5jZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNhNzZlMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvSGVhZGVyUGFyc2VyUGVyZm9ybWFuY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuamVlLnV0aWwuaW50ZXJuYWwuSmF2YUVFUXVpY2tQZWVrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuUHJvamVjdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMucGx1Z2luLkhlYWRsZXNzVGVzdHNQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBIZWFkZXJQYXJzZXJQZXJmb3JtYW5jZVRlc3QgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0RJUiA9ICJUZXN0RGF0YSIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJoZWFkZXJQYXJzZXJUZXN0RGF0YSIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdCBkYXRhID0gZ2V0WE1MRGF0YSgpOwotCQlsb25nW10gdGltZXMgPSBuZXcgbG9uZ1tkYXRhLnNpemUoKV07Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEuc2l6ZSgpOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJVGVzdERhdGEgdGVzdERhdGEgPSAoVGVzdERhdGEpIGRhdGEuZ2V0KGkpOwotCQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShnZXREYXRhUGF0aCh0ZXN0RGF0YS5maWxlTmFtZSkpKTsKLQkJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJSmF2YUVFUXVpY2tQZWVrIHBlZWsgPSBuZXcgSmF2YUVFUXVpY2tQZWVrKGluKTsKLQkJCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCXRpbWVzW2ldID0gZW5kIC0gc3RhcnQ7Ci0JCQkJaWYgKHRpbWVzW2ldID09IDApIHsKLQkJCQkJdGltZXNbaV0gPSAxMDsgLy8gc3R1YiBpbiBhIG1pbmltdW0gdGltZQotCQkJCX0KLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKHRlc3REYXRhLnR5cGUsIHBlZWsuZ2V0VHlwZSgpKTsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKHRlc3REYXRhLm1vZFZlcnNpb24sIHBlZWsuZ2V0VmVyc2lvbigpKTsKLQkJCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKHRlc3REYXRhLmVlVmVyc2lvbiwgcGVlay5nZXRKYXZhRUVWZXJzaW9uKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBhbGwgdGltZXMgc2hvdWxkIGJlIHRoZSBzYW1lCi0JCUFycmF5cy5zb3J0KHRpbWVzKTsKLQkJaWYgKHRpbWVzWzBdICogMiA8IHRpbWVzW3RpbWVzLmxlbmd0aCAtIDFdKSB7Ci0JCQlBc3NlcnQuZmFpbCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgTGlzdCBnZXRYTUxEYXRhKCkgewotCQlMaXN0IGRhdGEgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgiYXBwbGljYXRpb24tY2xpZW50MTIueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lELCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCkpOwotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoImFwcGxpY2F0aW9uLWNsaWVudDEzLnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJhcHBsaWNhdGlvbi1jbGllbnQxNC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKSk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgiYXBwbGljYXRpb24tY2xpZW50NS54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9DTElFTlRfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRCwgSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRCkpOwotCi0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgiYXBwbGljYXRpb24xMi54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJhcHBsaWNhdGlvbjEzLnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lELCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCkpOwotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoImFwcGxpY2F0aW9uMTQueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKSk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgiYXBwbGljYXRpb241LnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQpKTsKLQotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoImVqYi1qYXIxMS54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRCwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJlamItamFyMjAueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKSk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgiZWpiLWphcjIxLnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8xX0lELCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkpOwotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoImVqYi1qYXIzMC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzNfMF9JRCwgSjJFRVZlcnNpb25Db25zdGFudHMuSkVFXzVfMF9JRCkpOwotCi0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgicmExMC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5DT05ORUNUT1JfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuSkNBXzFfMF9JRCwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJyYTE1LnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkNPTk5FQ1RPUl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KQ0FfMV81X0lELCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCkpOwotCi0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgid2ViMjIueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKSk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgid2ViMjMueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKSk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgid2ViMjQueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKSk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgid2ViMjUueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzVfSUQsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpFRV81XzBfSUQpKTsKLQotCQkvLyB0ZXN0IHNvbWUgYm9ndXMgZGRzIGFzIHdlbGwKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJub3R4bWwueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTiwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTiwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTikpOwotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoIm5vdGphdmFlZS54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOKSk7Ci0KLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJhcHBsaWNhdGlvbi1jbGllbnQwLnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkFQUExJQ0FUSU9OX0NMSUVOVF9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOKSk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgiYXBwbGljYXRpb24tY2xpZW50MDAueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04pKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJhcHBsaWNhdGlvbi1jbGllbnQwMDAueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fQ0xJRU5UX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04pKTsKLQotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoImFwcGxpY2F0aW9uMC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOKSk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgiYXBwbGljYXRpb24wMC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5BUFBMSUNBVElPTl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOKSk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgiYXBwbGljYXRpb24wMDAueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuQVBQTElDQVRJT05fVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTiwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTikpOwotCi0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgiZWpiLWphcjAueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04pKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJlamItamFyMDAueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuRUpCX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04pKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJlamItamFyMDAwLnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOKSk7Ci0KLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJyYTAueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuQ09OTkVDVE9SX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04pKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJyYTAwLnhtbCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkNPTk5FQ1RPUl9UWVBFLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5VTktOT1dOKSk7Ci0JCWRhdGEuYWRkKG5ldyBUZXN0RGF0YSgicmEwMDAueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuQ09OTkVDVE9SX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04pKTsKLQotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoIndlYjAueG1sIiwgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCX1RZUEUsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLlVOS05PV04pKTsKLQkJZGF0YS5hZGQobmV3IFRlc3REYXRhKCJ3ZWIwMC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTiwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTikpOwotCQlkYXRhLmFkZChuZXcgVGVzdERhdGEoIndlYjAwMC54bWwiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfVFlQRSwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTiwgSjJFRVZlcnNpb25Db25zdGFudHMuVU5LTk9XTikpOwotCQlyZXR1cm4gZGF0YTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhUGF0aChTdHJpbmcgc2hvcnROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSGVhZGxlc3NUZXN0c1BsdWdpbiBwbHVnaW4gPSBIZWFkbGVzc1Rlc3RzUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJU3RyaW5nIHBsdWdpblJlbGF0aXZlRmlsZU5hbWUgPSBEQVRBX0RJUiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgc2hvcnROYW1lOwotCQlyZXR1cm4gUHJvamVjdFV0aWxpdHkuZ2V0RnVsbEZpbGVOYW1lKHBsdWdpbiwgcGx1Z2luUmVsYXRpdmVGaWxlTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgVGVzdERhdGEgewotCQlTdHJpbmcgZmlsZU5hbWU7Ci0KLQkJaW50IHR5cGU7Ci0KLQkJaW50IG1vZFZlcnNpb247Ci0KLQkJaW50IGVlVmVyc2lvbjsKLQotCQlDbGFzcyBtb2RlbE9iamVjdEludGVyZmFjZTsKLQotCQlwdWJsaWMgVGVzdERhdGEoU3RyaW5nIGZpbGVOYW1lLCBpbnQgdHlwZSwgaW50IG1vZFZlcnNpb24sIGludCBlZVZlcnNpb24pIHsKLQkJCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLm1vZFZlcnNpb24gPSBtb2RWZXJzaW9uOwotCQkJdGhpcy5lZVZlcnNpb24gPSBlZVZlcnNpb247Ci0JCX0KLQotCQlwdWJsaWMgVGVzdERhdGEoU3RyaW5nIGZpbGVOYW1lLCBpbnQgdHlwZSwgaW50IG1vZFZlcnNpb24sIGludCBlZVZlcnNpb24sIENsYXNzIG1vZGVsVHlwZUNsYXNzKSB7Ci0JCQl0aGlzKGZpbGVOYW1lLCB0eXBlLCBtb2RWZXJzaW9uLCBlZVZlcnNpb24pOwotCQkJdGhpcy5tb2RlbE9iamVjdEludGVyZmFjZSA9IG1vZGVsVHlwZUNsYXNzOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1NWI3OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgUGVyZm9ybWFuY2VQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUGVyZm9ybWFuY2VQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBQZXJmb3JtYW5jZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyZm9ybWFuY2VQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFBlcmZvcm1hbmNlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVBsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODZiYmM4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE5vdiAyNCwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuQmFzZVRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyAgY2xhc3MgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIgZXh0ZW5kcyBQZXJmb3JtYW5jZVRlc3RDYXNlIHsKLQlwcm90ZWN0ZWQgQmFzZVRlc3RDYXNlIGZUZXN0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQ0FMID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHTE9CQUwgPSAyOwkKLQkKLQlwcml2YXRlIGJvb2xlYW4gdGFnQXNHbG9iYWxTdW1tYXJ5OwotCXByaXZhdGUgYm9vbGVhbiB0YWdBc1N1bW1hcnk7Ci0JcHJpdmF0ZSBTdHJpbmcgc2hvcnROYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElURVJBVElPTlMgPSAxMDsKLQotCXB1YmxpYyBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlcihCYXNlVGVzdENhc2UgdGVzdCwgCi0JCQkJCQkJCQlpbnQgdGFnZ2luZywKLQkJCQkJCQkJCVN0cmluZyBzaG9ydE5hbWUpIHsKLQkJZlRlc3Q9dGVzdDsKLQkJdGFnQXNHbG9iYWxTdW1tYXJ5ID0gKCh0YWdnaW5nICYgR0xPQkFMKSAhPSAwKTsKLQkgICAgdGFnQXNTdW1tYXJ5ID0gKCh0YWdnaW5nICYgTE9DQUwpICE9IDApOwotCSAgICB0aGlzLnNob3J0TmFtZSA9ICBzaG9ydE5hbWU7Ci0JfQotCQotCXB1YmxpYyBpbnQgY291bnRUZXN0Q2FzZXMoKSB7Ci0JCXJldHVybiBmVGVzdC5jb3VudFRlc3RDYXNlcygpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZlRlc3QudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdCBnZXRUZXN0KCkgewotCQlyZXR1cm4gZlRlc3Q7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZlRlc3Quc2V0VXBUZXN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGJhc2ljU2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyZm9ybWFuY2UgcGVyZm9ybWFuY2U9IFBlcmZvcm1hbmNlLmdldERlZmF1bHQoKTsKLQkJZlBlcmZvcm1hbmNlTWV0ZXI9IHBlcmZvcm1hbmNlLmNyZWF0ZVBlcmZvcm1hbmNlTWV0ZXIocGVyZm9ybWFuY2UuZ2V0RGVmYXVsdFNjZW5hcmlvSWQoZlRlc3QpKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBSdW5zIHRoZSBiYXJlIHRlc3Qgc2VxdWVuY2UuCi0JICogQGV4Y2VwdGlvbiBUaHJvd2FibGUgaWYgYW55IGV4Y2VwdGlvbiBpcyB0aHJvd24KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW5CYXJlKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCWJhc2ljU2V0VXAoKTsKLQkJdGFnSWZOZWNlc3Nhcnkoc2hvcnROYW1lLCBEaW1lbnNpb24uQ1BVX1RJTUUpOwotCQl0cnkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IElURVJBVElPTlM7IGkrKykgewotCQkJCXNldFVwKCk7Ci0JCQkJc3RhcnRNZWFzdXJpbmcoKTsKLQkJCQlydW5UZXN0KCk7Ci0JCQkJc3RvcE1lYXN1cmluZygpOwotCQkJfQotCQkJCi0JCQljb21taXRNZWFzdXJlbWVudHMoKTsKLQkJCWFzc2VydFBlcmZvcm1hbmNlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0ZWFyRG93bigpOwotCQl9Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNydW5UZXN0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJZlRlc3QucnVuQ29yZVRlc3QoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudGVzdC5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWZUZXN0LnRlYXJEb3duVGVzdCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0TmFtZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlmVGVzdC5zZXROYW1lKG5hbWUpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBmVGVzdC5nZXROYW1lKCk7Ci0JfQotCQotICAgIC8qKgotICAgICAqIEFuc3dlcnMgd2hldGhlciB0aGlzIHRlc3Qgc2hvdWxkIGJlIHRhZ2dlZCBnbG9iYWxseS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB0ZXN0IHNob3VsZCBiZSB0YWdnZWQgZ2xvYmFsbHkKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkR2xvYmFsbHlUYWcoKSB7Ci0gICAgCXJldHVybiB0YWdBc0dsb2JhbFN1bW1hcnk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEFuc3dlcnMgd2hldGhlciB0aGlzIHRlc3Qgc2hvdWxkIGJlIHRhZ2dlZCBsb2NhbGx5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIHRlc3Qgc2hvdWxkIGJlIHRhZ2dlZCBsb2NhbGx5Ci0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZExvY2FsbHlUYWcoKSB7Ci0gICAgCXJldHVybiB0YWdBc1N1bW1hcnk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRhZ0lmTmVjZXNzYXJ5KFN0cmluZyBzaG9ydE5hbWUsIERpbWVuc2lvbiBkaW1lbnNpb24pIHsKLQkJaWYgKHNob3VsZEdsb2JhbGx5VGFnKCkpIHsKLQkJCXRhZ0FzR2xvYmFsU3VtbWFyeShzaG9ydE5hbWUsIGRpbWVuc2lvbik7Ci0JCX0KLQkJaWYgKHNob3VsZExvY2FsbHlUYWcoKSkgewotCQkJdGFnQXNTdW1tYXJ5KHNob3J0TmFtZSwgZGltZW5zaW9uKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0YWdJZk5lY2Vzc2FyeShTdHJpbmcgc2hvcnROYW1lLCBEaW1lbnNpb24gW10gZGltZW5zaW9ucykgewotCQlpZiAoc2hvdWxkR2xvYmFsbHlUYWcoKSkgewotCQkJdGFnQXNHbG9iYWxTdW1tYXJ5KHNob3J0TmFtZSwgZGltZW5zaW9ucyk7Ci0JCX0KLQkJaWYgKHNob3VsZExvY2FsbHlUYWcoKSkgewotCQkJdGFnQXNTdW1tYXJ5KHNob3J0TmFtZSwgZGltZW5zaW9ucyk7Ci0JCX0KLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0T2JqZWN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0T2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMzkzNGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlVGVzdE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTm92IDI2LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgUGVyZm9ybWFuY2VUZXN0T2JqZWN0IHsKLQlpbnQgdGFnZ2luZzsKLQlTdHJpbmcgc2hvcnROYW1lOwotCVN0cmluZyBuYW1lOwotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBQZXJmb3JtYW5jZVRlc3RPYmplY3QoU3RyaW5nIG5hbWUsaW50IHRhZ2dpbmcsIFN0cmluZyBzaG9ydG5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy50YWdnaW5nID0gdGFnZ2luZzsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5zaG9ydE5hbWUgPSBzaG9ydG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc2hvcnROYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotCQlyZXR1cm4gc2hvcnROYW1lOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHRhZ2dpbmcuCi0JICovCi0JcHVibGljIGludCBnZXRUYWdnaW5nKCkgewotCQlyZXR1cm4gdGFnZ2luZzsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0U3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTI4MzE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkJhc2VUZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIGl0ZXdrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgUGVyZm9ybWFuY2VUZXN0U3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NJTVBMRV9OQU1FID0gIlBlcmZvcm1hbmNlIFRlc3QiOwotCQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFBlcmZvcm1hbmNlVGVzdFN1aXRlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRUZXN0KFRlc3QgdGVzdCkgewotCQkvL211c3QgYmUgYSBCYXNlVGVzdENhc2Ugc28gaXQgY2FuIGJlIHdyYXBwZWQgaW4gYSBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlcgotCQlpZih0ZXN0IGluc3RhbmNlb2YgQmFzZVRlc3RDYXNlKSB7Ci0JCQlQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlciBwZXJmb3JtYW5jZVRlc3QgPSBuZXcgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIoCi0JCQkJCShCYXNlVGVzdENhc2UpdGVzdCxQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsREVGQVVMVF9TSU1QTEVfTkFNRSk7Ci0JCQlzdXBlci5hZGRUZXN0KHBlcmZvcm1hbmNlVGVzdCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkVGVzdChUZXN0IHRlc3QsIFN0cmluZyBzaW1wbGVOYW1lKSB7Ci0JCS8vbXVzdCBiZSBhIEJhc2VUZXN0Q2FzZSBzbyBpdCBjYW4gYmUgd3JhcHBlZCBpbiBhIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyCi0JCWlmKHRlc3QgaW5zdGFuY2VvZiBCYXNlVGVzdENhc2UpIHsKLQkJCVBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyIHBlcmZvcm1hbmNlVGVzdCA9IG5ldyBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlcigKLQkJCQkJKEJhc2VUZXN0Q2FzZSl0ZXN0LFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCxzaW1wbGVOYW1lKTsKLQkJCXN1cGVyLmFkZFRlc3QocGVyZm9ybWFuY2VUZXN0KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9UZXN0Q2FzZVNBWFBhcnNlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1Rlc3RDYXNlU0FYUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxODllYTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1Rlc3RDYXNlU0FYUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTm92IDI5LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q2FzZVNBWFBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQlwcml2YXRlIHN0YXRpYyBNYXAgcGVyZm9ybWFuY2VDYXNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0FTRSA9ICJ0ZXN0Q2FzZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTID0gImNsYXNzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EID0gIm1ldGhvZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUX05BTUUgPSAic2hvcnROYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHR0lORyA9ICJ0YWdnaW5nIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX05BTUUgPSAibmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT0JBTCA9ICJHTE9CQUwiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTCA9ICJMT0NBTCI7Ci0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY3VycmVudENsYXp6ID0gbnVsbDsKLQkKLQotCQotCXB1YmxpYyBNYXAgZG9Mb2FkKEZpbGUgZmlsZSkgewotCQkgcGVyZm9ybWFuY2VDYXNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCSBEZWZhdWx0SGFuZGxlciBoYW5kbGVyID0gbmV3IFRlc3RDYXNlU0FYUGFyc2VyKCk7Ci0JCSBTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCSB0cnkgewotCQkgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCQkgIHNheFBhcnNlci5wYXJzZShmaWxlICwgaGFuZGxlciApOwotCQkgfQotCQkgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJICBTeXN0ZW0uZXJyLnByaW50bG4gKCJGYWlsZWQgdG8gY3JlYXRlIFNBWCBwYXJzZXI6IiArIGV4KTsKLQkJIH0KLQkJIGNhdGNoIChTQVhFeGNlcHRpb24gZXgpIHsKLQkJICBTeXN0ZW0uZXJyLnByaW50bG4gKCJTQVggcGFyc2VyIGV4Y2VlcHRpb246IiArIGV4KTsKLQkJIH0KLQkJIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkgIFN5c3RlbS5lcnIucHJpbnRsbiAoIklPIGV4ZWNlcHRpb246IiArIGV4KTsKLQkJIH0KLQkJIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJICBTeXN0ZW0uZXJyLnByaW50bG4gKCJJbnZhbGlkIGZpbGUgYXJndW1lbnQiICsgZXgpOwotCQkgfQotCQkgcmV0dXJuIHBlcmZvcm1hbmNlQ2FzZXM7Ci0JIH0KLQkKLQkgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIAotCSAgU3RyaW5nIHF1YWxpZmllZE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JIAlpZiAocXVhbGlmaWVkTmFtZS5lcXVhbHMoVEVTVF9DQVNFKSkgewotCQkgIGZvciAoaW50IGkgPSAwOyBpPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJICAgIGlmIChhdHRyaWJ1dGVzLmdldFFOYW1lKGkpLmVxdWFsc0lnbm9yZUNhc2UoQ0xBU1MpKSB7Ci0JCSAgICAJdHJ5IHsKLQkJICAgIAkJY3VycmVudENsYXp6ID0gbG9hZENsYXNzKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSkpOwotCQkJCQlpZiAocGVyZm9ybWFuY2VDYXNlcy5nZXQoY3VycmVudENsYXp6KSA9PSBudWxsKSB7Ci0JCQkgICAgCQlBcnJheUxpc3QgbWV0aG9kTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCSAgICAJCXBlcmZvcm1hbmNlQ2FzZXMucHV0KGN1cnJlbnRDbGF6eixtZXRob2RMaXN0KTsKLQkJICAgIAkJfQotCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQljdXJyZW50Q2xhenogPSBudWxsOwotCQkJCQkgU3lzdGVtLmVyci5wcmludGxuICgiRmFpbGVkIHRvIGxvYWQgY2xhc3M6IiArIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSkpOwotCQkJCQkvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkgICAgfSAvLyBlbmQgb2YgaWYKLQkJICB9IC8vIGVuZCBvZiBmb3IKLQkgCX0gLy8gZW5kIG9mIGlmIFRFU1RfQ0FTRQotCSAJZWxzZSBpZiAocXVhbGlmaWVkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1FVEhPRCkpIHsKLQkgCQkgU3RyaW5nIG1ldGhvZE5hbWUgPSBudWxsOwotCSAJCSBpbnQgdGFnZ2luZyA9IDA7Ci0JIAkJIFN0cmluZyBzaG9ydE5hbWUgPSBudWxsOwotCSAJCSAKLQkgCQkgaWYgKGN1cnJlbnRDbGF6eiA9PSBudWxsKSByZXR1cm47Ci0JIAkJIAotCSAJCSBmb3IgKGludCBpID0gMDsgaTwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JIAkJICAgIGlmIChhdHRyaWJ1dGVzLmdldFFOYW1lKGkpLmVxdWFsc0lnbm9yZUNhc2UoTUVUSE9EX05BTUUpKSB7Ci0JIAkJICAgIAltZXRob2ROYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLQkgCQkgICAgfSAKLQkgCQkgICAgZWxzZSBpZiAoYXR0cmlidXRlcy5nZXRRTmFtZShpKS5lcXVhbHNJZ25vcmVDYXNlKFRBR0dJTkcpKXsKLQkgCQkgICAgCWlmIChhdHRyaWJ1dGVzLmdldFZhbHVlKGkpLmVxdWFsc0lnbm9yZUNhc2UoR0xPQkFMKSkgewotCSAJCSAgICAJCXRhZ2dpbmcgPSBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUw7Ci0JIAkJICAgIAl9IGVsc2UgaWYgKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSkuZXF1YWxzSWdub3JlQ2FzZShMT0NBTCkpIHsKLQkgCQkgICAgCQl0YWdnaW5nID0gUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuTE9DQUw7Ci0JIAkJICAgIAl9IGVsc2UgewotCSAJCSAgICAJCXRhZ2dpbmcgPSBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5OT05FOwotCSAJCSAgICAJfQotCSAJCSAJfSBlbHNlIGlmKGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSkuZXF1YWxzSWdub3JlQ2FzZShTSE9SVF9OQU1FKSkgewotCSAJCSAJCXNob3J0TmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0JIAkJCX0KLQkgCQkgfSAvLyBlbmQgb2YgZm9yCi0JIAkJIExpc3QgbWV0aG9kTGlzdCA9IChMaXN0KSBwZXJmb3JtYW5jZUNhc2VzLmdldChjdXJyZW50Q2xhenopOwotCSAJCSBtZXRob2RMaXN0LmFkZChuZXcgUGVyZm9ybWFuY2VUZXN0T2JqZWN0KG1ldGhvZE5hbWUsdGFnZ2luZyxzaG9ydE5hbWUpKTsKLQkgCSB9Ci0JIH0KLQotCSBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxdWFsaWZpZWROYW1lKQotCSAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JICAgIGlmIChxdWFsaWZpZWROYW1lLmVxdWFscyhURVNUX0NBU0UpKSB7Ci0JICAJCWN1cnJlbnRDbGF6eiA9IG51bGw7Ci0JICAJfQotCSB9Ci0JIAotCSAvKioKLQkgKiBMb2FkcyB0aGUgdGVzdCBzdWl0ZSBjbGFzcy4KLQkgKi8KLQkgcHJpdmF0ZSBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpIAotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCSB9Ci0JIAotCSAvKioKLQkgKiBUaGUgY2xhc3MgbG9hZGVyIHRvIGJlIHVzZWQgZm9yIGxvYWRpbmcgdGVzdHMuCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gdXNlIGFub3RoZXIgY2xhc3MgbG9hZGVyLgotCSAqLwotCSBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0JCXJldHVybiBCYXNlUGVyZm9ybWFuY2VUZXN0Q2FzZS5nZXRDbGFzc0xvYWRlcigpOwotCSB9Ci0JIAotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvV1RQSGVhZGxlc3NQZXJmb3JtYW5jZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvV1RQSGVhZGxlc3NQZXJmb3JtYW5jZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxOGNkYzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1dUUEhlYWRsZXNzUGVyZm9ybWFuY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqCi0gKiAKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuZWFyLm9wZXJhdGlvbnMuRUFSUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdDsKLQotLyoqCi0gKiBAYXV0aG9yIGl0ZXdrCi0gKgotICovCi1wdWJsaWMgY2xhc3MgV1RQSGVhZGxlc3NQZXJmb3JtYW5jZVRlc3RzIGV4dGVuZHMgUGVyZm9ybWFuY2VUZXN0U3VpdGUgewotCXB1YmxpYyBXVFBIZWFkbGVzc1BlcmZvcm1hbmNlVGVzdHMoKSB7Ci0JCXN1cGVyKCJBbGwgV1RQIEhlYWRsZXNzIFBlcmZvcm1hbmNlcyBUZXN0cyIpOwotCQkKLQkJYWRkVGVzdChuZXcgRUFSUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdCgidGVzdEVBUjE0X1dpdGhEZXBlbmRlbmNpZXMiKSwgIlRlc3QgRUFSIDEuNCBQcm9qZWN0IENyZWF0aW9uIHdpdGggRGVwZW5kaW5jaWVzIik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpewotCQlyZXR1cm4gbmV3IFdUUEhlYWRsZXNzUGVyZm9ybWFuY2VUZXN0cygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODQ0ZTgwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlIgotICAgbmFtZT0iUGVyZm9ybWFuY2UgUGx1Zy1pbiIKLSAgIHZlcnNpb249IjEuMS4wIgotICAgcHJvdmlkZXItbmFtZT0iIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJwZXJmb3JtYW5jZS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTY1N2VlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IndlYm1vZHVsZS10b21jYXQtdGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzM2ZTM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotdWkuamFyCi10ZXN0cy5qYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMmMxY2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS5zZXJ2bGV0LnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlhYmJkMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSNTdW4gSnVuIDAzIDAxOjI0OjE3IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDJlMTEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBMVUdJTgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMjAxLnF1YWxpZmllcgotQnVuZGxlLUNsYXNzUGF0aDogdGVzdHMuamFyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy5TZXJ2bGV0VGVzdHNQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLAotIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLmJ2dCwKLSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50b21jYXQudGVzdHMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcywKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSJbMy44LjEsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cywKLSBvcmcuZWNsaXBzZS5qc3QuajJlZSwKLSBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9FeGFtcGxlMS53YXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9FeGFtcGxlMS53YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMzBhMzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvRXhhbXBsZTEud2FyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvVGVzdDEyV2ViLndhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL1Rlc3QxMldlYi53YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjIwYjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvVGVzdDEyV2ViLndhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL1Rlc3QxM1dlYi53YXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9UZXN0MTNXZWIud2FyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmFhOTI2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL1Rlc3QxM1dlYi53YXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9UZXN0MTRXZWIud2FyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvVGVzdDE0V2ViLndhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViMmEzZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9UZXN0MTRXZWIud2FyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvWW91ckNvbXBhbnlFeGFtcGxlLndhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL1lvdXJDb21wYW55RXhhbXBsZS53YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOTYyOGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvWW91ckNvbXBhbnlFeGFtcGxlLndhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTk5ZGYzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWRiMmU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UudGVzdHMuamFyID0gd2VibW9kdWxlLXRvbWNhdC10ZXN0cy8KLW91dHB1dC50ZXN0cy5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSB0ZXN0cy5qYXIsXAotICAgICAgICAgICAgICAgV0FSSW1wb3J0VGVzdHMvLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDdmMjFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVBMVUdJTj1vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cwotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3Rlc3QueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYmI5OGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotIDwhLS0gPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4gLS0+Ci0JPGVjaG8gbWVzc2FnZT0iYmFzZWRpciAke2Jhc2VkaXJ9IiAvPgotCTxlY2hvIG1lc3NhZ2U9ImVjbGlwc2UgcGxhY2UgJHtlY2xpcHNlLWhvbWV9IiAvPgotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgcGx1Z2luLW5hbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMS4wL2xpYnJhcnkueG1sIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9Ii1Eb3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTA9JHt0ZXN0RGlyfS8ke3RvbWNhdDUwRGlyfSIvPgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4KLSAgPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgPHRzdGFtcC8+Ci0gICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnKi54bWwiLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImpzdC1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vanN0X2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke2pzdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtqc3QtZm9sZGVyfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy5idnQuQXV0b21hdGVkQlZUIiAvPgotICAgCSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iJHtleHRyYVZNYXJnc30iLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3Rlc3RzL1NlcnZsZXRUZXN0c1BsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90ZXN0cy9TZXJ2bGV0VGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRiMmE3YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3Rlc3RzL1NlcnZsZXRUZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFNlcnZsZXRUZXN0c1BsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFNlcnZsZXRUZXN0c1BsdWdpbiBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFNlcnZsZXRUZXN0c1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmxldFRlc3RzUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBTZXJ2bGV0VGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsKSA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLlNlcnZsZXRUZXN0c1BsdWdpblJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90ZXN0cy9idnQvQXV0b21hdGVkQlZULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YjJiMjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90ZXN0cy9idnQvQXV0b21hdGVkQlZULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMuYnZ0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEF1dG9tYXRlZEJWVCBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlRGlyZWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAiV0FSSW1wb3J0VGVzdHMiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBVUkwgdXJsID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cyIpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAJQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCkuZ2V0RmlsZSgpICsgIlRlc3REYXRhIisgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgCi0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVzaW5nIHdvcmtpbmcgZGlyZWN0b3J5IHNpbmNlIGEgd29ya3NwYWNlIFVSTCBjb3VsZCBub3QgYmUgbG9jYXRlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9IAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IHVuaW1wbGVtZW50ZWRNZXRob2RzOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICB1bmltcGxlbWVudGVkTWV0aG9kcyA9IDA7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgICAgICBpZiAodW5pbXBsZW1lbnRlZE1ldGhvZHMgPiAwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ2FsbHMgdG8gd2FyblVuaW1wbDogIiArIHVuaW1wbGVtZW50ZWRNZXRob2RzKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEF1dG9tYXRlZEJWVCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSkgQXV0b21hdGVkQlZULnN1aXRlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VpdGUudGVzdENvdW50KCk7IGkrKykgewotICAgICAgICAgICAgYWRkVGVzdChzdWl0ZS50ZXN0QXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0IGZvciBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy5idnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAvL3N1aXRlLmFkZFRlc3QoQWxsVG9tY2F0VGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlRFY2xpcHNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlRFY2xpcHNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NGZiYjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90ZXN0cy9idnQvQXV0b21hdGVkQlZURWNsaXBzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDI1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy5idnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEF1dG9tYXRlZEJWVEVjbGlwc2UgZXh0ZW5kcyBBdXRvbWF0ZWRCVlQgewotCQotCXB1YmxpYyBBdXRvbWF0ZWRCVlRFY2xpcHNlKCl7Ci0JCXN1cGVyKCk7Ci0JCVVSTCB1cmwgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzIikuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHRyeSB7Ci0gICAgICAgIAlBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKS5nZXRGaWxlKCkgKyAiV0FSSW1wb3J0VGVzdHMiKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90b21jYXQvdGVzdHMvQWxsVG9tY2F0VGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdG9tY2F0L3Rlc3RzL0FsbFRvbWNhdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OGUzNWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90b21jYXQvdGVzdHMvQWxsVG9tY2F0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50b21jYXQudGVzdHM7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5TZXJ2ZXJDb3JlOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQWxsVG9tY2F0VGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCQotCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWUgVE9NQ0FUX1JVTlRJTUUgPSBjcmVhdGVSdW50aW1lKCk7Ci0JCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCl7Ci0gICAgICAgIHJldHVybiBuZXcgQWxsVG9tY2F0VGVzdHMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEFsbFRvbWNhdFRlc3RzKCl7Ci0gICAgICAgIHN1cGVyKCJXRUIgVGVzdHMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRUZXN0KFdlYlByb2plY3RDcmVhdGlvblRvbWNhdFRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoV2ViSW1wb3J0T3BlcmF0aW9uVG9tY2F0VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChXZWJFeHBvcnRPcGVyYXRpb25Ub21jYXRUZXN0LnN1aXRlKCkpOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUnVudGltZSBjcmVhdGVSdW50aW1lKCkgIHsKLSAgICAJU3RyaW5nIHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LjUwIik7IC8vJE5PTi1OTFMtMSQKLSAgICAJCi0gICAgCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCXRyeSB7Ci0gICAgCQlJUnVudGltZVR5cGUgcnQgPSBTZXJ2ZXJDb3JlLmZpbmRSdW50aW1lVHlwZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41MCIpOyAvLyROT04tTkxTLTEkCi0gICAgCQlJUnVudGltZVdvcmtpbmdDb3B5IHdjID0gcnQuY3JlYXRlUnVudGltZShudWxsLCBudWxsKTsKLSAgICAJCXdjLnNldExvY2F0aW9uKG5ldyBQYXRoKHMpKTsKLSAgICAJCXJldHVybiB3Yy5zYXZlKHRydWUsIG51bGwpOwotICAgIAl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgIAkJZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAJCXJldHVybiBudWxsOwotICAgIAl9Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90b21jYXQvdGVzdHMvV2ViRXhwb3J0T3BlcmF0aW9uVG9tY2F0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90b21jYXQvdGVzdHMvV2ViRXhwb3J0T3BlcmF0aW9uVG9tY2F0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODlkOTg2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdG9tY2F0L3Rlc3RzL1dlYkV4cG9ydE9wZXJhdGlvblRvbWNhdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudG9tY2F0LnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Qcm9qZWN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdDsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViRXhwb3J0T3BlcmF0aW9uVG9tY2F0VGVzdCBleHRlbmRzIE1vZHVsZUV4cG9ydE9wZXJhdGlvblRlc3QgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZUNvbXBpbGVKc3AgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHBvcnRTb3VyY2VGaWxlcyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJ3cml0ZUV4aXN0aW5nID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGF0YU1vZGVsU2hvdWxkQmVWYWxpZCA9IHRydWU7Ci0KLQlwdWJsaWMgV2ViRXhwb3J0T3BlcmF0aW9uVG9tY2F0VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVGVzdFN1aXRlKFdlYkV4cG9ydE9wZXJhdGlvblRvbWNhdFRlc3QuY2xhc3MpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk9wZXJhdGlvblRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlleGNsdWRlQ29tcGlsZUpzcCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGNsdWRlQ29tcGlsZUpzcE9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWV4Y2x1ZGVDb21waWxlSnNwID0gdHJ1ZTsKLQkJdGVzdEFsbEV4cG9ydFRlc3RDYXNlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZUV4cG9ydE9wZXJhdGlvblRlc3RDYXNlI2dldE1vZGVsSW5zdGFuY2UoKQotCSAqLwotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldE1vZGVsSW5zdGFuY2UoKSB7Ci0JCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JfQotCXByb3RlY3RlZCBJUHJvamVjdFtdIGdldEV4cG9ydGFibGVQcm9qZWN0cygpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJZGVsZXRlQWxsUHJvamVjdHMoKTsKLQkJV2ViSW1wb3J0T3BlcmF0aW9uVG9tY2F0VGVzdCBpbXBvcnRUZXN0Q2FzZSA9IChXZWJJbXBvcnRPcGVyYXRpb25Ub21jYXRUZXN0KWdldEltcG9ydFRlc3RDYXNlKCk7IAotCQlpbXBvcnRUZXN0Q2FzZS50ZXN0QWxsSW1wb3J0VGVzdENhc2VzKCk7Ci0KLQkJLy8gaWYgdGhlIHByb2plY3RzIGFyZW4ndCBjcmVhdGVkIHN1Y2Nlc3NmdWxseSwgdGhlIHByZXZpb3VzCi0JCS8vIGxpbmUgd2lsbCBmYWlsIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byB2ZXJpZnkKLQkJSVByb2plY3RbXSBwcm9qcyA9IFByb2plY3RVdGlsaXR5LmdldEFsbFByb2plY3RzKCk7Ci0JCQotCQlMaXN0IGZpbHRlcmVkUHJvanMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvanMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qc1tpXTsKLQkJCWlmIChKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KHByb2plY3QpKQotCQkJCWZpbHRlcmVkUHJvanMuYWRkKHByb2plY3QpOwotCQl9Ci0JCXJldHVybiAoSVByb2plY3RbXSkgZmlsdGVyZWRQcm9qcy50b0FycmF5KG5ldyBJUHJvamVjdFtmaWx0ZXJlZFByb2pzLnNpemUoKV0pOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbEV4cG9ydFRlc3RDYXNlcygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUZpbGUgZXhwb3J0RGlyZWN0b3J5ID0gbmV3IEZpbGUoQkFTRV9EQVRBX0RJUik7Ci0JCWlmIChleHBvcnREaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGNvbnRlbnRzID0gZXhwb3J0RGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghY29udGVudHNbaV0uaXNEaXJlY3RvcnkoKSkKLQkJCQkJY29udGVudHNbaV0uZGVsZXRlKCk7Ci0JCQl9Ci0JCX0KLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IGdldEV4cG9ydGFibGVQcm9qZWN0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0ZXN0RXhwb3J0KENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3RzW2ldKSwgZ2V0RmlsZU5hbWUocHJvamVjdHNbaV0uZ2V0TmFtZSgpKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShTdHJpbmcgYmFzZU5hbWUpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoYmFzZU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKChleHBvcnRTb3VyY2VGaWxlcykgPyAiX3dpdGhTb3VyY2UiIDogIl93aXRob3V0U291cmNlIikuYXBwZW5kKGdldE1vZHVsZUV4dGVuc2lvbigpKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RXhwb3J0KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBnZXRNb2RlbEluc3RhbmNlKCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuQVJDSElWRV9ERVNUSU5BVElPTiwgQkFTRV9EQVRBX0RJUiArIGZpbGVuYW1lKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5DT01QT05FTlQsIGNvbXBvbmVudCk7Ci0JCWRhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLkVYUE9SVF9TT1VSQ0VfRklMRVMsIGV4cG9ydFNvdXJjZUZpbGVzKTsKLQkJZGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuT1ZFUldSSVRFX0VYSVNUSU5HLCBvdmVyd3JpdGVFeGlzdGluZyk7Ci0KLQkJaWYgKGRhdGFNb2RlbFNob3VsZEJlVmFsaWQpCi0JCQlydW5BbmRWZXJpZnkoZGF0YU1vZGVsKTsKLQkJZWxzZQotCQkJdmVyaWZ5SW52YWxpZERhdGFNb2RlbChkYXRhTW9kZWwpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdENhc2UjZ2V0SW1wb3J0VGVzdENhc2UoKQotCSAqLwotCXByb3RlY3RlZCBNb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0IGdldEltcG9ydFRlc3RDYXNlKCkgewotCQlyZXR1cm4gbmV3IFdlYkltcG9ydE9wZXJhdGlvblRvbWNhdFRlc3QoIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YUZpbGVzVG9Qcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwKLQkJCVN0cmluZ1tdIGNsYXNzTmFtZXMsIFN0cmluZyBwcmFja2FnZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUphdmFGaWxlc0V4cG9ydGVkKFN0cmluZyBhcmNoaXZlUGF0aCwKLQkJCVN0cmluZ1tdIGNsYXNzTmFtZXMsIFN0cmluZyBwYWNrYWdlTmFtZSwgYm9vbGVhbiB3aXRoQ2xhc3NGaWxlcywKLQkJCWJvb2xlYW4gd2l0aFNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0RXhwb3J0RGF0YU1vZGVsKFN0cmluZyBwcm9qZWN0TmFtZSwKLQkJCVN0cmluZyBkZXN0aW5hdGlvbiwgYm9vbGVhbiBleHBvcnRTb3VyY2UsIGJvb2xlYW4gcnVuQnVpbGQsCi0JCQlib29sZWFuIG92ZXJ3cml0ZUV4aXN0aW5nKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiLndhciI7Ly8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdG9tY2F0L3Rlc3RzL1dlYkltcG9ydE9wZXJhdGlvblRvbWNhdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdG9tY2F0L3Rlc3RzL1dlYkltcG9ydE9wZXJhdGlvblRvbWNhdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q4MWMxNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9XZWJJbXBvcnRPcGVyYXRpb25Ub21jYXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDYsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRvbWNhdC50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmFyY2hpdmUub3BlcmF0aW9ucy5JT3ZlcndyaXRlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Qcm9qZWN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5wbHVnaW4uSGVhZGxlc3NUZXN0c1BsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViSW1wb3J0T3BlcmF0aW9uVG9tY2F0VGVzdCBleHRlbmRzIE1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3QgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RTX1BBVEggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJUZXN0RGF0YSIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJXQVJJbXBvcnRUZXN0cyI7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGF0YU1vZGVsU2hvdWxkQmVWYWxpZCA9IHRydWU7Ci0JCi0JcHVibGljIFdlYkltcG9ydE9wZXJhdGlvblRvbWNhdFRlc3QoKSB7Ci0JCXN1cGVyKCJXZWJJbXBvcnRPcGVyYXRpb25Ub21jYXRUZXN0cyIpOwotCX0KLQkKLQlwdWJsaWMgV2ViSW1wb3J0T3BlcmF0aW9uVG9tY2F0VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVGVzdFN1aXRlKFdlYkltcG9ydE9wZXJhdGlvblRvbWNhdFRlc3QuY2xhc3MpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlI2dldE1vZGVsSW5zdGFuY2UoKQotCSAqLwotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldE1vZGVsSW5zdGFuY2UoKSB7Ci0JCXJldHVybiBudWxsOyAvLyBuZXcgV2ViTW9kdWxlSW1wb3J0RGF0YU1vZGVsKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdENhc2UjZ2V0SW1wb3J0YWJsZUFyY2hpdmVGaWxlTmFtZXMoKQotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEltcG9ydGFibGVBcmNoaXZlRmlsZU5hbWVzKCkgewotCQlyZXR1cm4gUHJvamVjdFV0aWxpdHkuZ2V0V2Fyc0luRGlyZWN0b3J5KEhlYWRsZXNzVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLCBURVNUU19QQVRIKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZSNzZXRTZXJ2ZXJUYXJnZXRQcm9wZXJ0eShvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5vcGVyYXRpb25zLkoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VydmVyVGFyZ2V0UHJvcGVydHkoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJLy8gZGF0YU1vZGVsLnNldFByb3BlcnR5KFNlcnZlclRhcmdldERhdGFNb2RlbC5SVU5USU1FX1RBUkdFVF9JRCxBbGxUb21jYXRUZXN0cy5UT01DQVRfUlVOVElNRS5nZXRJZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbEltcG9ydFRlc3RDYXNlcygpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxpc3QgcHJvamVjdHMgPSBnZXRJbXBvcnRhYmxlQXJjaGl2ZUZpbGVOYW1lcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0JCQlTdHJpbmcgamFyTmFtZSA9IHByb2plY3RzLmdldChpKS50b1N0cmluZygpOwotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gamFyTmFtZS5zdWJzdHJpbmcoamFyTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcikgKyAxLCBqYXJOYW1lLmxlbmd0aCgpIC0gNCk7Ci0JCQl0ZXN0SW1wb3J0KHByb2plY3ROYW1lLCBqYXJOYW1lKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0VGVzdENhc2VfMCgpIHRocm93cyBFeGNlcHRpb24gewotCQlpbXBvcnRJbmRleCgwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0VGVzdENhc2VfMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlpbXBvcnRJbmRleCgxKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0VGVzdENhc2VfMigpIHRocm93cyBFeGNlcHRpb24gewotCQlpbXBvcnRJbmRleCgyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0VGVzdENhc2VfMygpIHRocm93cyBFeGNlcHRpb24gewotCQlpbXBvcnRJbmRleCgzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0VGVzdENhc2VfNCgpIHRocm93cyBFeGNlcHRpb24gewotCQlpbXBvcnRJbmRleCg0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0VGVzdENhc2VfNSgpIHRocm93cyBFeGNlcHRpb24gewotCQlpbXBvcnRJbmRleCg1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0VGVzdENhc2VfNigpIHRocm93cyBFeGNlcHRpb24gewotCQlpbXBvcnRJbmRleCg2KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0VGVzdENhc2VfNygpIHRocm93cyBFeGNlcHRpb24gewotCQlpbXBvcnRJbmRleCg3KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0VGVzdENhc2VfOCgpIHRocm93cyBFeGNlcHRpb24gewotCQlpbXBvcnRJbmRleCg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0VGVzdENhc2VfOSgpIHRocm93cyBFeGNlcHRpb24gewotCQlpbXBvcnRJbmRleCg5KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGltcG9ydEluZGV4KGludCBpbmRleCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3QgcHJvamVjdHMgPSBnZXRJbXBvcnRhYmxlQXJjaGl2ZUZpbGVOYW1lcygpOwotCQlpZiAoaW5kZXggPCBwcm9qZWN0cy5zaXplKCkpIHsKLQkJCVN0cmluZyBqYXJOYW1lID0gcHJvamVjdHMuZ2V0KGluZGV4KS50b1N0cmluZygpOwotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gamFyTmFtZS5zdWJzdHJpbmcoamFyTmFtZS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcikgKyAxLCBqYXJOYW1lLmxlbmd0aCgpIC0gNCk7Ci0JCQl0ZXN0SW1wb3J0KHByb2plY3ROYW1lLCBqYXJOYW1lKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0VGVzdENhc2VfcmVzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0IHByb2plY3RzID0gZ2V0SW1wb3J0YWJsZUFyY2hpdmVGaWxlTmFtZXMoKTsKLQkJZm9yIChpbnQgaSA9IDEwOyBpIDwgcHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBqYXJOYW1lID0gcHJvamVjdHMuZ2V0KGkpLnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBqYXJOYW1lLnN1YnN0cmluZyhqYXJOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSArIDEsIGphck5hbWUubGVuZ3RoKCkgLSA0KTsKLQkJCXRlc3RJbXBvcnQocHJvamVjdE5hbWUsIGphck5hbWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnQoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IGdldE1vZGVsSW5zdGFuY2UoKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsIGZpbGVuYW1lKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLQkJaWYgKGRhdGFNb2RlbFNob3VsZEJlVmFsaWQpCi0JCQlydW5BbmRWZXJpZnkoZGF0YU1vZGVsKTsKLQkJZWxzZQotCQkJdmVyaWZ5SW52YWxpZERhdGFNb2RlbChkYXRhTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWRGaWxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWRhdGFNb2RlbFNob3VsZEJlVmFsaWQgPSBmYWxzZTsKLQkJdGVzdEltcG9ydCgiQm9iVGhlUHJvamVjdCIsICJCb2JUaGVGaWxlIik7Ci0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldEV4cG9ydERhdGFNb2RlbChTdHJpbmcgcHJvamVjdE5hbWUsCi0JCQlTdHJpbmcgZGVzdGluYXRpb24sIGJvb2xlYW4gZXhwb3J0U291cmNlLCBib29sZWFuIHJ1bkJ1aWxkLAotCQkJYm9vbGVhbiBvdmVyd3JpdGVFeGlzdGluZykgewotCQkKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBnZXRJbXBvcnREYXRhTW9kZWwoU3RyaW5nIGZpbGVQYXRoLAotCQkJU3RyaW5nIHByb2plY3ROYW1lLCBJT3ZlcndyaXRlSGFuZGxlciBvdmVyd3JpdGVIYW5kbGVyLAotCQkJSURhdGFNb2RlbCBjcmVhdGlvbk1vZGVsLCBib29sZWFuIGNsb3NlQXJjaGl2ZU9uRGlzcG9zZSkgewotCQkKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVFeHRlbnNpb24oKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9XZWJQcm9qZWN0Q3JlYXRpb25Ub21jYXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9XZWJQcm9qZWN0Q3JlYXRpb25Ub21jYXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZWI0Y2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90b21jYXQvdGVzdHMvV2ViUHJvamVjdENyZWF0aW9uVG9tY2F0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDYsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRvbWNhdC50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSUFubm90YXRpb25zRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5BZGRTZXJ2bGV0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5wcm9qZWN0LmZhY2V0LklXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZhY2V0RGF0YU1vZGVsTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Mb2dVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuUHJvamVjdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5UYXNrVmlld1V0aWxpdHk7Ci0KLS8qKiAKLSAqIEBhdXRob3IgYmxhbmNldHQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtCi0gKiBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViUHJvamVjdENyZWF0aW9uVG9tY2F0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVTaW1wbGVQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotICAgICAgICBzZXRTZXJ2ZXJUYXJnZXRQcm9wZXJ0eShkYXRhTW9kZWwpOwotICAgICAgICBkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRhdGFNb2RlbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlclRhcmdldFByb3BlcnR5KElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0gICAgICAgIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUsIEFsbFRvbWNhdFRlc3RzLlRPTUNBVF9SVU5USU1FLmdldElkKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVTZXJ2bGV0KElEYXRhTW9kZWwgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgQWRkU2VydmxldE9wZXJhdGlvbiBvcCA9IG5ldyBBZGRTZXJ2bGV0T3BlcmF0aW9uKG1vZGVsKTsKLSAgICAgICAgIG9wLmV4ZWN1dGUobnVsbCxudWxsKTsKLSAgICAgICAgIFByb2plY3RVdGlsaXR5LnZlcmlmeVByb2plY3Qob3AuZ2V0VGFyZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdHJ1ZSk7IAotICAgICAgICAgVGFza1ZpZXdVdGlsaXR5LnZlcmlmeU5vRXJyb3JzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElEYXRhTW9kZWwgc2V0dXBTdGFuZGFsb25lV2ViUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGludCBqMmVlVmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNyZWF0ZVNpbXBsZVByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBJRGF0YU1vZGVsIG1vZGVsID0gZ2V0V2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwocHJvamVjdE5hbWUsIGoyZWVWZXJzaW9uKTsKLSAgICAgICAgY3JlYXRlU3RhbmRhbG9uZVdlYlByb2plY3QobW9kZWwpOwotICAgICAgICBjcmVhdGVTZXJ2bGV0KHByb2plY3ROYW1lKTsKLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyBJRGF0YU1vZGVsIHNldHVwU3RhbmRhbG9uZUFubm90YXRlZFdlYlByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBpbnQgajJlZVZlcnNpb24pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjcmVhdGVTaW1wbGVQcm9qZWN0KHByb2plY3ROYW1lKTsKLQotICAgICAgICBJRGF0YU1vZGVsIG1vZGVsID0gZ2V0V2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwocHJvamVjdE5hbWUsIGoyZWVWZXJzaW9uKTsKLSAgICAgICAgY3JlYXRlU3RhbmRhbG9uZVdlYlByb2plY3QobW9kZWwpOwotICAgICAgICBjcmVhdGVBbm5vdGF0ZWRTZXJ2bGV0KHByb2plY3ROYW1lKTsKLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlU3RhbmRhbG9uZVdlYlByb2plY3QoSURhdGFNb2RlbCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElEYXRhTW9kZWxPcGVyYXRpb24gd2ViT3AgPSBtb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0gICAgICAgIHdlYk9wLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0gICAgICAgIC8vIFByb2plY3RVdGlsaXR5LnZlcmlmeVByb2plY3QobW9kZWwuZ2V0VGFyZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwKLSAgICAgICAgLy8gdHJ1ZSk7Ci0gICAgICAgIFRhc2tWaWV3VXRpbGl0eS52ZXJpZnlOb0Vycm9ycygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElEYXRhTW9kZWwgZ2V0V2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoU3RyaW5nIHByb2plY3ROYW1lLCBpbnQgajJlZVZlcnNpb24pIHsKLSAgICAgICAgSVByb2plY3QgamF2YVByb2plY3QgPSBQcm9qZWN0VXRpbGl0eS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgU3RyaW5nIG1vZHVsZU5hbWUgPSBwcm9qZWN0TmFtZSArICJXZWJNb2R1bGUiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBtb2R1bGVEZXBsb3lOYW1lID0gbW9kdWxlTmFtZSArICIud2FyIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBJRGF0YU1vZGVsIG1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuY2xhc3MpOwotICAgICAgICBtb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgamF2YVByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAgICAgRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBtb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0gICAgICAgIElEYXRhTW9kZWwgd2ViTW9kZWwgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRFlOQU1JQ19XRUIpOwotICAgICAgICB3ZWJNb2RlbC5zZXRJbnRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT04sajJlZVZlcnNpb24pOwotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlU2VydmxldChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJRGF0YU1vZGVsIHNlcnZsZXRNb2RlbCA9IHNldHVwU2VydmxldENyZWF0aW9uRGF0YU1vZGVsKHByb2plY3ROYW1lLCBmYWxzZSk7Ci0gICAgICAgIGNyZWF0ZVNlcnZsZXQoc2VydmxldE1vZGVsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0ZWRTZXJ2bGV0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElEYXRhTW9kZWwgc2VydmxldE1vZGVsID0gc2V0dXBTZXJ2bGV0Q3JlYXRpb25EYXRhTW9kZWwocHJvamVjdE5hbWUsIHRydWUpOwotICAgICAgICBjcmVhdGVTZXJ2bGV0KHNlcnZsZXRNb2RlbCk7Ci0gICAgfQotCi0gICAgcHVibGljIElEYXRhTW9kZWwgc2V0dXBTZXJ2bGV0Q3JlYXRpb25EYXRhTW9kZWwoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGlzQW5ub3RhdGVkKSB7Ci0gICAgCUlEYXRhTW9kZWwgc2VydmxldERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKE5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLmNsYXNzKTsKLSAgICAgICAgc2VydmxldERhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLSAgICAgICAgc2VydmxldERhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSwgcHJvamVjdE5hbWUpOwotICAgICAgICBzZXJ2bGV0RGF0YU1vZGVsLnNldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUUsICJGb29TZXJ2bGV0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2VydmxldERhdGFNb2RlbC5zZXRQcm9wZXJ0eShJTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5ESVNQTEFZX05BTUUsICJGb29TZXJ2bGV0Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgc2VydmxldERhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSUFubm90YXRpb25zRGF0YU1vZGVsLlVTRV9BTk5PVEFUSU9OUywgaXNBbm5vdGF0ZWQpOwotICAgICAgICByZXR1cm4gc2VydmxldERhdGFNb2RlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVWYWlsZFByb2plY3RBbmRTZXJ2bGV0Q3JlYXRpb24oU3RyaW5nIHByb2plY3ROYW1lLCBpbnQgajJlZVZlcnNpb24pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMb2dVdGlsaXR5LmdldEluc3RhbmNlKCkucmVzZXRMb2dnaW5nKCk7Ci0gICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSBudWxsOwotICAgICAgICBtb2RlbCA9IHNldHVwU3RhbmRhbG9uZVdlYlByb2plY3QocHJvamVjdE5hbWUsIGoyZWVWZXJzaW9uKTsKLSAgICAgICAgTG9nVXRpbGl0eS5nZXRJbnN0YW5jZSgpLnZlcmlmeU5vV2FybmluZ3MoKTsKLSAgICAgICAgY2hlY2tWYWxpZERhdGFNb2RlbChtb2RlbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlVmFpbGRBbm5vdGF0ZWRQcm9qZWN0QW5kU2VydmxldENyZWF0aW9uKFN0cmluZyBwcm9qZWN0TmFtZSwgaW50IGoyZWVWZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTG9nVXRpbGl0eS5nZXRJbnN0YW5jZSgpLnJlc2V0TG9nZ2luZygpOwotICAgICAgICBJRGF0YU1vZGVsIG1vZGVsID0gbnVsbDsKLSAgICAgICAgbW9kZWwgPSBzZXR1cFN0YW5kYWxvbmVBbm5vdGF0ZWRXZWJQcm9qZWN0KHByb2plY3ROYW1lLCBqMmVlVmVyc2lvbik7Ci0gICAgICAgIExvZ1V0aWxpdHkuZ2V0SW5zdGFuY2UoKS52ZXJpZnlOb1dhcm5pbmdzKCk7Ci0gICAgICAgIGNoZWNrVmFsaWREYXRhTW9kZWwobW9kZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtb2RlbAotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrVmFsaWREYXRhTW9kZWwoSURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICAvLyBEYXRhTW9kZWxWZXJpZmllciB2ZXJpZmllciA9Ci0gICAgICAgIC8vIERhdGFNb2RlbFZlcmlmaWVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVZlcmlmaWVyKG1vZGVsKTsKLSAgICAgICAgLy8gdHJ5IHsKLSAgICAgICAgLy8gdmVyaWZpZXIudmVyaWZ5KG1vZGVsKTsKLSAgICAgICAgLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotICAgICAgICAvLyBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICAvLyB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFpbGQxMldlYlByb2plY3ROYW1lQ3JlYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLSAgICAgICAgY3JlYXRlVmFpbGRQcm9qZWN0QW5kU2VydmxldENyZWF0aW9uKCJGb29Ub21jYXRXZWJQcm9qZWN0MTIiLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIC8qCi0gICAgICogVE9ETyBVbmNvbW1lbnQgdGhpcyBtZXRob2Qgd2hlbiBBbm5vdGF0aW9uIHN1cHBvcnQgZm9yIHNlcnZsZXRzIGlzCi0gICAgICogZW5hYmxlZCBwdWJsaWMgdm9pZCB0ZXN0VmFpbGQxMkFubm90YXRlZFdlYlByb2plY3ROYW1lQ3JlYXRpb24oKSB0aHJvd3MKLSAgICAgKiBFeGNlcHRpb24geyBQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotICAgICAqIGNyZWF0ZVZhaWxkQW5ub3RhdGVkUHJvamVjdEFuZFNlcnZsZXRDcmVhdGlvbigiRm9vQW5ub3RhdGVkVG9tY2F0V2ViUHJvamVjdDEyIiwKLSAgICAgKiBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8yX0lEKTsgfQotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhaWxkMTNXZWJQcm9qZWN0TmFtZUNyZWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFByb2plY3RVdGlsaXR5LmRlbGV0ZUFsbFByb2plY3RzKCk7Ci0gICAgICAgIGNyZWF0ZVZhaWxkUHJvamVjdEFuZFNlcnZsZXRDcmVhdGlvbigiRm9vMVRvbWNhdFdlYlByb2plY3QxMyIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUT0RPIFVuY29tbWVudCB0aGlzIG1ldGhvZCB3aGVuIEFubm90YXRpb24gc3VwcG9ydCBmb3Igc2VydmxldHMgaXMKLSAgICAgKiBlbmFibGVkIHB1YmxpYyB2b2lkIHRlc3RWYWlsZDEzQW5ub3RhdGVkV2ViUHJvamVjdE5hbWVDcmVhdGlvbigpIHRocm93cwotICAgICAqIEV4Y2VwdGlvbiB7IFByb2plY3RVdGlsaXR5LmRlbGV0ZUFsbFByb2plY3RzKCk7Ci0gICAgICogY3JlYXRlVmFpbGRBbm5vdGF0ZWRQcm9qZWN0QW5kU2VydmxldENyZWF0aW9uKCJGb28xVG9tY2F0V2ViUHJvamVjdDEzIiwKLSAgICAgKiBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl8zX0lEKTsgfQotICAgICAqLwotCi0gICAgcHVibGljIHZvaWQgdGVzdFZhaWxkMTRXZWJQcm9qZWN0TmFtZUNyZWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFByb2plY3RVdGlsaXR5LmRlbGV0ZUFsbFByb2plY3RzKCk7Ci0gICAgICAgIGNyZWF0ZVZhaWxkUHJvamVjdEFuZFNlcnZsZXRDcmVhdGlvbigiRm9vMVRvbWNhdFdlYlByb2plY3QxNCIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUT0RPIFVuY29tbWVudCB0aGlzIG1ldGhvZCB3aGVuIEFubm90YXRpb24gc3VwcG9ydCBmb3Igc2VydmxldHMgaXMKLSAgICAgKiBlbmFibGVkIHB1YmxpYyB2b2lkIHRlc3RWYWlsZDE0QW5ub3RhdGVkV2ViUHJvamVjdE5hbWVDcmVhdGlvbigpIHRocm93cwotICAgICAqIEV4Y2VwdGlvbiB7IFByb2plY3RVdGlsaXR5LmRlbGV0ZUFsbFByb2plY3RzKCk7Ci0gICAgICogY3JlYXRlVmFpbGRBbm5vdGF0ZWRQcm9qZWN0QW5kU2VydmxldENyZWF0aW9uKCJGb28xVG9tY2F0V2ViUHJvamVjdDE0IiwKLSAgICAgKiBKMkVFVmVyc2lvbkNvbnN0YW50cy5XRUJfMl80X0lEKTsgfQotICAgICAqLwotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVRlc3RTdWl0ZShXZWJQcm9qZWN0Q3JlYXRpb25Ub21jYXRUZXN0LmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0I2dldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbCgpCi0gICAgICovCi0gICAgcHVibGljIElEYXRhTW9kZWwgZ2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsKCkgewotICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2MjE3Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnRpZXNWYWxpZGF0b3IvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydGllc1ZhbEZTLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InByb3BlcnRpZXNWYWxXQi8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmaWxlc3lzdGVtRldLLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTJmMDIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotcnVudGltZQotdGVtcC5mb2xkZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkwYjQ3Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3ZjgwZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS5ydW50aW1lL3Byb3BlcnRpZXNWYWxpZGF0b3IuamFyID0gcHJvcGVydGllc1ZhbGlkYXRvci8sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVmFsRlMvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllc1ZhbFdCLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzeXN0ZW1GV0svCi1iaW4uaW5jbHVkZXMgPSBydW50aW1lL3Byb3BlcnRpZXNWYWxpZGF0b3IuamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgZmlsZXN5c3RlbS5iYXQsXAotICAgICAgICAgICAgICAgcHJvcC5iYXQsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotamFycy5jb21waWxlLm9yZGVyID0gcnVudGltZS9wcm9wZXJ0aWVzVmFsaWRhdG9yLmphcgotb3V0cHV0LnJ1bnRpbWUvcHJvcGVydGllc1ZhbGlkYXRvci5qYXIgPSBiaW4vCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbS5iYXQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbS5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYzg1YTkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW0uYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi1SRU0gKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotUkVNIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi1SRU0gcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotUkVNIAotUkVNIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLVJFTSBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotUkVNIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLVJFTSBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLVJFTSB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLVJFTSAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi1SRU0gTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLVJFTSBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLVJFTSBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLVJFTSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi1SRU0gaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotUkVNIAotUkVNIFRoaXMgYmF0Y2ggZmlsZSBydW5zIHRoZSAiZmlsZXN5c3RlbSBmcmFtZXdvcmsiJ3MgYXBwbGljYXRpb24KLVJFTQotc2V0bG9jYWwKLQotaWYgIiVKQVZBX0hPTUUlIiBFUVUgIiIgZ290byBzeW50YXgKLQotc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTsuLlxjb20uaWJtLmV0b29scy5sb2dnaW5nLnV0aWxfNS4xLjBccnVudGltZVxsb2d1dGlsLmphcgotc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTsuLlxjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmNvcmVfNS4xLjBccnVudGltZVxjb21tb24uamFyCi1zZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOy5ccnVudGltZVxwcm9wZXJ0aWVzVmFsaWRhdG9yLmphcgotc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTsuXHJ1bnRpbWVcZmlsZXN5c3RlbUZXSy5qYXIKLXNldCBDTEFTU1BBVEg9JUNMQVNTUEFUSCU7LlxydW50aW1lXHByb3BlcnRpZXNWYWxXQi5qYXIKLXNldCBDTEFTU1BBVEg9JUNMQVNTUEFUSCU7LlxydW50aW1lXHByb3BlcnRpZXNWYWxGUy5qYXIKLQotJUpBVkFfSE9NRSVcYmluXGphdmEgY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5maWxlc3lzdGVtLkZpbGVzeXN0ZW1BcHBsaWNhdGlvbiAlMQotZ290byA6ZW5kCi0KLTpzeW50YXgKLWVjaG8uCi1lY2hvIFRoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgbXVzdCBiZSBzZXQgdG8gdGhlIEpSRSBkaXJlY3RvcnkuCi1lY2hvIGUuZy4sIHNldCBKQVZBX0hPTUU9QzpcSlJFCi1lY2hvIHdoZXJlIEpSRSBoYXMgYSBzdWJkaXJlY3RvcnkgbmFtZWQgImJpbiIKLWVjaG8uCi1lY2hvLgotZ290byA6ZW5kCi0KLTplbmQKLWVuZGxvY2FsCi1AZWNobyBvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL2ZpbGVzeXN0ZW0ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL2ZpbGVzeXN0ZW0ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcyODM0OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9maWxlc3lzdGVtLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jCi0jIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotIyAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0jIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0jIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSMKLSMgIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSMgIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0jICBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0jICBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSMgIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotIyAgIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotIyAgTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSMgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotIyAgVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0jICBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0jICBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0jCi0KLSMgVkZGUyA9IFZhbGlkYXRpb24gRnJhbWV3b3JrIEZpbGUgU3lzdGVtIAotVkZGUzAwMDAgPSBWRkZTMDAwMEU6IEludGVybmFsIGVycm9yIGNhdXNlZCBwcmVtYXR1cmUgdGVybWluYXRpb24gb2YgdmFsaWRhdG9yIHswfS4gU2VlIHRoZSBzdGFjayB0cmFjZSBiZWxvdy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9GaWxlc3lzdGVtQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1BcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTAwNzMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1BcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdG9yTGF1bmNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhIGZpbGUgc3lzdGVtIGJhc2VkIGFwcGxpY2F0aW9uCi0gKiB3aGljaCBuZWVkcyB0byB1c2UgdGhlIGNvbW1vbiB2YWxpZGF0aW9uIEFQSXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlc3lzdGVtQXBwbGljYXRpb24gewotCS8qKgotCSAqIFRoZSBhcmd2W10gcGFyYW1ldGVyIG5lZWRzIHRvIGJlIGEgZnVsbHktcXVhbGlmaWVkIGxpc3Qgb2YgZmlsZSBuYW1lcyAKLQkgKiBvZiBmaWxlcyB0aGF0IHNob3VsZCBiZSB2YWxpZGF0ZWQuIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLQkJSUZpbGVEZWx0YVtdIGZpbGVzID0gRmlsZXN5c3RlbU1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEZpbGVEZWx0YXMoYXJndik7Ci0JCWJvb2xlYW4gZnVsbEJ1aWxkID0gKChmaWxlcyA9PSBudWxsKSB8fCAoZmlsZXMubGVuZ3RoID09IDApKTsKLQotCQlJUmVwb3J0ZXIgcmVwb3J0ZXIgPSBudWxsOwotCQlpZiAoZnVsbEJ1aWxkKSB7Ci0JCQlyZXBvcnRlciA9IG5ldyBGdWxsUmVwb3J0ZXIoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlcG9ydGVyID0gbmV3IEluY3JlbWVudGFsUmVwb3J0ZXIoKTsKLQkJfQotCi0JCUZpbGVzeXN0ZW1Mb2FkZXIgbG9hZGVyc1tdID0gRmlsZXN5c3RlbU1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldExvYWRlcnMoZmlsZXMpOwotCQlmb3IgKGludCBpPTA7IGk8bG9hZGVycy5sZW5ndGg7IGkrKykgewotCQkJRmlsZXN5c3RlbUxvYWRlciBsb2FkZXIgPSBsb2FkZXJzW2ldOwotCQkJdHJ5IHsKLQkJCQlWYWxpZGF0b3JMYXVuY2hlci5nZXRMYXVuY2hlcigpLnN0YXJ0KGxvYWRlci5nZXRIZWxwZXIoKSwgbG9hZGVyLmdldFZhbGlkYXRvcigpLCByZXBvcnRlcik7Ci0JCQkJaWYgKCFmdWxsQnVpbGQpIHsKLQkJCQkJKChJbmNyZW1lbnRhbFJlcG9ydGVyKXJlcG9ydGVyKS5yZXBvcnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSgiZmlsZXN5c3RlbSIsIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksICJWRkZTMDAwMCIsIG5ldyBTdHJpbmdbXXtsb2FkZXIuZ2V0VmFsaWRhdG9yKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCl9KTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCXJlcG9ydGVyLmRpc3BsYXlTdWJ0YXNrKGxvYWRlci5nZXRWYWxpZGF0b3IoKSwgbWVzc2FnZSk7Ci0JCQkJCi0JCQkJaWYoZXhjLmdldEFzc29jaWF0ZWRNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZXhjLmdldEFzc29jaWF0ZWRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCQkKLQkJCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJaWYoZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWV4Yy5nZXRBc3NvY2lhdGVkRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCS8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgdmFsaWRhdGlvbgotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSgiZmlsZXN5c3RlbSIsIElNZXNzYWdlLkhJR0hfU0VWRVJJVFksICJWRkZTMDAwMCIsIG5ldyBTdHJpbmdbXXtsb2FkZXIuZ2V0VmFsaWRhdG9yKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCl9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobG9hZGVyLmdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLQkJCQkvLyBjb250aW51ZSB3aXRoIHRoZSBuZXh0IHZhbGlkYXRpb24KLQkJCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9GaWxlc3lzdGVtTG9hZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9GaWxlc3lzdGVtTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNDRmYzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vRmlsZXN5c3RlbUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBhc3NvY2lhdGVzIGEgVmFsaWRhdG9yIHdpdGggYSBIZWxwZXIgYW5kIHRoZSBmaWxlIGV4dGVuc2lvbnMgdGhhdAotICogdGhlIHZhbGlkYXRvciBydW5zIG9uLgotICovCi1wdWJsaWMgY2xhc3MgRmlsZXN5c3RlbUxvYWRlciB7Ci0JcHJpdmF0ZSBJRmlsZXN5c3RlbUhlbHBlciBfaGVscGVyID0gbnVsbDsKLQlwcml2YXRlIElWYWxpZGF0b3IgX3ZhbGlkYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBfZmlsZUV4dGVuc2lvbnMgPSBudWxsOwotCQotCXB1YmxpYyBGaWxlc3lzdGVtTG9hZGVyKFN0cmluZ1tdIGZpbGVFeHRlbnNpb25zLCBJRmlsZXN5c3RlbUhlbHBlciBoZWxwZXIsIElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJX2ZpbGVFeHRlbnNpb25zID0gZmlsZUV4dGVuc2lvbnM7Ci0JCV9oZWxwZXIgPSBoZWxwZXI7Ci0JCV92YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgaGVscGVyIHRoYXQgdGhlIHZhbGlkYXRvciBuZWVkcyB0byBhY2Nlc3MgaW5mb3JtYXRpb24gCi0JICogaW4gdGhlIGZpbGVzeXN0ZW0gdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0JICovCi0JcHVibGljIElGaWxlc3lzdGVtSGVscGVyIGdldEhlbHBlcigpIHsKLQkJcmV0dXJuIF9oZWxwZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWxpZGF0b3IgdGhhdCBjaGVja3MgdGhlIHJ1bGVzLgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIF92YWxpZGF0b3I7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgZmlsZSBuYW1lIGV4dGVuc2lvbnMgdGhhdCB0aGlzIHZhbGlkYXRvciB2YWxpZGF0ZXMuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEZpbGVFeHRlbnNpb25zKCkgewotCQlyZXR1cm4gX2ZpbGVFeHRlbnNpb25zOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1NYW5hZ2VyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9GaWxlc3lzdGVtTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWQzODNhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5GaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBoZWFydCBvZiB0aGUgZmlsZXN5c3RlbSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqIEl0ICZxdW90O2xvYWRzJnF1b3Q7IGVhY2ggdmFsaWRhdG9yJ3MgbWV0YWRhdGEKLSAqLwotcHVibGljIGNsYXNzIEZpbGVzeXN0ZW1NYW5hZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBGaWxlc3lzdGVtTWFuYWdlciBfaW5zdCA9IG51bGw7Ci0JcHJpdmF0ZSBTZXQgX2xvYWRlcnMgPSBudWxsOwotCQotCXByaXZhdGUgRmlsZXN5c3RlbU1hbmFnZXIoKSB7Ci0JCV9sb2FkZXJzID0gbmV3IEhhc2hTZXQoKTsKLQkJCi0JCS8vIFBsZWFzZSBwcmV0ZW5kIHRoYXQgdGhpcyBtZXRhZGF0YSwgaS5lLiwgdGhlIGZpbGUgZXh0ZW5zaW9uLCBmdWxseS1xdWFsaWZpZWQKLQkJLy8gY2xhc3MgbmFtZSBvZiB0aGUgaGVscGVyLCBhbmQgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHZhbGlkYXRvciwgCi0JCS8vIHdhcyBsb2FkZWQgZ2VuZXJpY2FsbHkgc29tZWhvdy4gSW4gcHJhY3RpY2UsIHRoaXMgaW5mb3JtYXRpb24gY291bGQgYmUgc3RvcmVkCi0JCS8vIGluIC54bWwgZmlsZXMsIGluIGEgY29uZmlndXJhdGlvbiBmaWxlLCBldGMuLCB0aGF0IHRoZSBmcmFtZXdvcmsgd291bGQgcmVhZAotCQkvLyB0byBmaW5kIHRoZSBpbnN0YWxsZWQgdmFsaWRhdG9ycy4KLQkJdHJ5IHsKLQkJCV9sb2FkZXJzLmFkZChuZXcgRmlsZXN5c3RlbUxvYWRlcihuZXcgU3RyaW5nW117Ii5wcm9wZXJ0aWVzIn0sIGxvYWRIZWxwZXIoIm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5maWxlc3lzdGVtaW1wbC5GaWxlc3lzdGVtUHJvcGVydGllc0hlbHBlciIpLCBsb2FkVmFsaWRhdG9yKCJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuUHJvcGVydGllc1ZhbGlkYXRvciIpKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCWNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQljYXRjaChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWNhdGNoKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJY2F0Y2goSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIGEgaGVscGVyLCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgaXQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSUZpbGVzeXN0ZW1IZWxwZXIgbG9hZEhlbHBlcihTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uICB7Ci0JCXJldHVybiAoSUZpbGVzeXN0ZW1IZWxwZXIpbG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIGEgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYSB2YWxpZGF0b3IsIHJldHVybiBhbiBpbnN0YW5jZSBvZiBpdC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJVmFsaWRhdG9yIGxvYWRWYWxpZGF0b3IoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiAgewotCQlyZXR1cm4gKElWYWxpZGF0b3IpbG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgaWRlbnRpZmllZCBieSB0aGUgY2xhc3NOYW1lIHBhcmFtZXRlciwKLQkgKiB3aGljaCBjb250YWlucyB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNsYXNzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIE9iamVjdCBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7Ci0JCWlmKGNsYXNzTmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsb2FkQ2xhc3MgYXJndW1lbnQgbXVzdCBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCUNsYXNzIGNsYXp6ID0gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCQlyZXR1cm4gY2xhenoubmV3SW5zdGFuY2UoKTsJCQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIEZpbGVzeXN0ZW1NYW5hZ2VyIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGVzeXN0ZW1NYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmKF9pbnN0ID09IG51bGwpIHsKLQkJCV9pbnN0ID0gbmV3IEZpbGVzeXN0ZW1NYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0OwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIGFycmF5IG9mIGZpbGUgbmFtZXMsIHJldHVybiBhbiBhcnJheSBvZiBJRmlsZURlbHRhCi0JICogaW5zdGFuY2VzIHRvIHBhc3MgdG8gdGhlIHZhbGlkYXRvciBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgSUZpbGVEZWx0YVtdIGdldEZpbGVEZWx0YXMoU3RyaW5nW10gZmlsZU5hbWVzKSB7Ci0JCWlmKChmaWxlTmFtZXMgPT0gbnVsbCkgfHwgKGZpbGVOYW1lcy5sZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlGaWxlRGVsdGFbXSBmaWxlcyA9IG5ldyBGaWxlRGVsdGFbZmlsZU5hbWVzLmxlbmd0aF07Ci0JCWZvcihpbnQgaT0wOyBpPGZpbGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJZmlsZXNbaV0gPSBuZXcgRmlsZURlbHRhKGZpbGVOYW1lc1tpXSwgSUZpbGVEZWx0YS5DSEFOR0VEKTsKLQkJfQotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIGFuIGFycmF5IG9mIElGaWxlRGVsdGEgaW5zdGFuY2VzLCByZXR1cm4gYW4gYXJyYXkKLQkgKiBvZiB0aGUgSVZhbGlkYXRvciBpbnN0YW5jZXMsIHdpdGggdGhlaXIgYXNzb2NpYXRlZCBJVmFsaWRhdGlvbkNvbnRleHQgaW5zdGFuY2VzLAotCSAqIHRoYXQgdmFsaWRhdGUgdGhlc2UgcGFydGljdWxhciBkZWx0YSBpbnN0YW5jZXMuCi0JICovCi0JcHVibGljIEZpbGVzeXN0ZW1Mb2FkZXJbXSBnZXRMb2FkZXJzKElGaWxlRGVsdGFbXSBkZWx0YXMpIHsKLQkJaWYoZGVsdGFzID09IG51bGwpIHsKLQkJCXJldHVybiBnZXRBbGxMb2FkZXJzKCk7Ci0JCX0KLQotCQlTZXQgbG9hZGVycyA9IG5ldyBIYXNoU2V0KCk7CQkKLQkJZm9yKGludCBpPTA7IGk8ZGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlc3lzdGVtTG9hZGVyW10gbG9hZGVyQXJyYXkgPSBnZXRMb2FkZXJzRm9yKGRlbHRhc1tpXSk7Ci0JCQlpZihsb2FkZXJBcnJheSAhPSBudWxsKSB7Ci0JCQkJZm9yKGludCBqPTA7IGo8bG9hZGVyQXJyYXkubGVuZ3RoOyBqKyspIHsKLQkJCQkJbG9hZGVycy5hZGQobG9hZGVyQXJyYXlbal0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJRmlsZXN5c3RlbUxvYWRlcltdIHJlc3VsdCA9IG5ldyBGaWxlc3lzdGVtTG9hZGVyW2xvYWRlcnMuc2l6ZSgpXTsKLQkJbG9hZGVycy50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIGFuIElWYWxpZGF0b3IgaW5zdGFuY2UsIHJldHVybiB0aGUgSVZhbGlkYXRpb25Db250ZXh0IGluc3RhbmNlIHRoYXQgdGhlCi0JICogSVZhbGlkYXRvciB1c2VzIHRvIGxvYWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlsZXN5c3RlbSB2YWxpZGF0aW9uCi0JICogZnJhbWV3b3JrIGVudmlyb25tZW50LgotCSAqLwotCXB1YmxpYyBJRmlsZXN5c3RlbUhlbHBlciBnZXRIZWxwZXIoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJaWYodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9sb2FkZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRmlsZXN5c3RlbUxvYWRlciBsb2FkZXIgPSAoRmlsZXN5c3RlbUxvYWRlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZih2YWxpZGF0b3IuZXF1YWxzKGxvYWRlci5nZXRWYWxpZGF0b3IoKSkpIHsKLQkJCQlyZXR1cm4gbG9hZGVyLmdldEhlbHBlcigpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSB2YWxpZGF0b3IsIHJldHVybiB0aGUgSVZhbGlkYXRvciBpbnN0YW5jZS4KLQkgKiBudWxsIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIElWYWxpZGF0b3IgY2Fubm90IGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcihTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lKSB7Ci0JCWlmKHZhbGlkYXRvckNsYXNzTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfbG9hZGVycy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUZpbGVzeXN0ZW1Mb2FkZXIgbG9hZGVyID0gKEZpbGVzeXN0ZW1Mb2FkZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYodmFsaWRhdG9yQ2xhc3NOYW1lLmVxdWFscyhsb2FkZXIuZ2V0VmFsaWRhdG9yKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIGxvYWRlci5nZXRWYWxpZGF0b3IoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBhbGwgRmlsZXN5c3RlbUxvYWRlciBpbnN0YW5jZXMuIEVhY2ggbG9hZGVyIGhhcwotCSAqIG9uZSBJVmFsaWRhdG9yIGFuZCBvbmUgSVZhbGlkYXRpb25Db250ZXh0LgotCSAqLwotCXB1YmxpYyBGaWxlc3lzdGVtTG9hZGVyW10gZ2V0QWxsTG9hZGVycygpIHsKLQkJRmlsZXN5c3RlbUxvYWRlcltdIHJlc3VsdCA9IG5ldyBGaWxlc3lzdGVtTG9hZGVyW19sb2FkZXJzLnNpemUoKV07Ci0JCV9sb2FkZXJzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhIGZpbGUgbmFtZSwgcmV0dXJuIHRoZSBsb2FkZXIgd2hpY2ggY29udGFpbnMgdGhlIHZhbGlkYXRvciAmIGhlbHBlcgotCSAqIHdoaWNoIGNhbiB2YWxpZGF0ZSB0aGF0IGZpbGUsIGlmIG9uZSBleGlzdHMuCi0JICovCi0JcHVibGljIEZpbGVzeXN0ZW1Mb2FkZXJbXSBnZXRMb2FkZXJzRm9yKElGaWxlRGVsdGEgZGVsdGEpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfbG9hZGVycy5pdGVyYXRvcigpOwotCQlGaWxlc3lzdGVtTG9hZGVyW10gdGVtcExvYWRlcnMgPSBuZXcgRmlsZXN5c3RlbUxvYWRlcltfbG9hZGVycy5zaXplKCldOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUZpbGVzeXN0ZW1Mb2FkZXIgbG9hZGVyID0gKEZpbGVzeXN0ZW1Mb2FkZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nW10gZmlsZUV4dGVuc2lvbnMgPSBsb2FkZXIuZ2V0RmlsZUV4dGVuc2lvbnMoKTsKLQkJCWlmKGZpbGVFeHRlbnNpb25zID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJZm9yKGludCBpPTA7IGk8ZmlsZUV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZihkZWx0YS5nZXRGaWxlTmFtZSgpLmVuZHNXaXRoKGZpbGVFeHRlbnNpb25zW2ldKSAmJiAoZGVsdGEuZ2V0RGVsdGFUeXBlKCkgPT0gSUZpbGVEZWx0YS5BRERFRCB8fCBkZWx0YS5nZXREZWx0YVR5cGUoKSA9PSBJRmlsZURlbHRhLkNIQU5HRUQgfHwgZGVsdGEuZ2V0RGVsdGFUeXBlKCkgPT0gSUZpbGVEZWx0YS5ERUxFVEVEKSkgewotCQkJCQl0ZW1wTG9hZGVyc1tjb3VudCsrXSA9IGxvYWRlcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCUZpbGVzeXN0ZW1Mb2FkZXJbXSByZXN1bHQgPSBuZXcgRmlsZXN5c3RlbUxvYWRlcltjb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcExvYWRlcnMsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vRnVsbFJlcG9ydGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9GdWxsUmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk1OWIyYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9GdWxsUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLmZpbGVzeXN0ZW07Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIHJlcG9ydGVyIGlzIHVzZWQgd2hlbiBmdWxsIHZhbGlkYXRpb24gaXMgbmVlZGVkLiBJdCBkb2Vzbid0IGNhY2hlCi0gKiBhbnl0aGluZywgc28gaXQncyBmYXN0ZXIgdGhhbiB0aGUgSW5jcmVtZW50YWxSZXBvcnRlci4KLSAqLwotcHVibGljIGNsYXNzIEZ1bGxSZXBvcnRlciBpbXBsZW1lbnRzIElSZXBvcnRlciB7Ci0JcHVibGljIEZ1bGxSZXBvcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSZXBvcnRlciNhZGRNZXNzYWdlKElWYWxpZGF0b3IsIElNZXNzYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VNYW5hZ2VyLmZvcm1hdE1lc3NhZ2UodmFsaWRhdG9yLCBtZXNzYWdlKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI2Rpc3BsYXlTdWJ0YXNrKElWYWxpZGF0b3IsIElNZXNzYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3BsYXlTdWJ0YXNrKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCS8vIEZsdXNoIHRoZSBtZXNzYWdlIHRvIHRoZSB1c2VyIGltbWVkaWF0ZWx5LgotCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZS5nZXRUZXh0KCkpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElSZXBvcnRlciNnZXRNZXNzYWdlcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoKSB7Ci0JCS8vIHRoaXMgcmVwb3J0ZXIgZG9lcyBub3Qgc3VwcG9ydCBtZXNzYWdlIGFjY2VzcyAKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI2lzQ2FuY2VsbGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKLQkJLy8gdG8gbWFrZSB0aGluZ3MgZWFzeSwgZG8gbm90IGFsbG93IHRoZSB1c2VyIHRvIGNhbmNlbCB2YWxpZGF0aW9uLgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI3JlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJLy8gc2luY2Ugbm8gbWVzc2FnZXMgYXJlIHN0b3JlZCwgdGhlcmUncyBub3RoaW5nIHRvIHJlbW92ZQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElSZXBvcnRlciNyZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yLCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmplY3QpIHsKLQkJLy8gc2luY2Ugbm8gbWVzc2FnZXMgYXJlIHN0b3JlZCwgdGhlcmUncyBub3RoaW5nIHRvIHJlbW92ZQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElSZXBvcnRlciNyZW1vdmVNZXNzYWdlU3Vic2V0KElWYWxpZGF0b3IsIE9iamVjdCwgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VTdWJzZXQoSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmosIFN0cmluZyBncm91cE5hbWUpIHsKLQkJLy8gU2luY2UgdGhpcyByZXBvcnRlciBkb2Vzbid0IHN0b3JlIG1lc3NhZ2VzLCB0aGVyZSBpcyBubyByZW1vdmFsIG9mIGFueSBtZXNzYWdlcwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0lGaWxlc3lzdGVtSGVscGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9JRmlsZXN5c3RlbUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTM4NTEzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0lGaWxlc3lzdGVtSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5maWxlc3lzdGVtOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci0KLS8qKgotICogVG8gaW50ZWdyYXRlIGEgdmFsaWRhdG9yIGludG8gdGhpcyBmcmFtZXdvcmssIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMKLSAqIElWYWxpZGF0aW9uQ29udGV4dCBtdXN0IGJlIHByb3ZpZGVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGaWxlc3lzdGVtSGVscGVyIGV4dGVuZHMgSVZhbGlkYXRpb25Db250ZXh0IHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBmaWxlIHdoaWNoIHRoZSBJTWVzc2FnZSBpcyByZXBvcnRlZCBhZ2FpbnN0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoSU1lc3NhZ2UgbWVzc2FnZSk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9JbmNyZW1lbnRhbFJlcG9ydGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9JbmNyZW1lbnRhbFJlcG9ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZTNkYmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vSW5jcmVtZW50YWxSZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLmZpbGVzeXN0ZW07Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgZmlsZSBzeXN0ZW0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgYW4gaW5jcmVtZW50YWwgSVJlcG9ydGVyLgotICogSXQgY2FjaGVzIHZhbGlkYXRpb24gbWVzc2FnZXMsIHNvIHRoYXQgbWVzc2FnZXMgY2FuIGJvdGggYmUgYWRkZWQgYW5kIGRlbGV0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmNyZW1lbnRhbFJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKLQkKLQlwdWJsaWMgSW5jcmVtZW50YWxSZXBvcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjYWRkTWVzc2FnZShJVmFsaWRhdG9yLCBJTWVzc2FnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVmFsaWRhdG9yTWVzc2FnZXMgdm0gPSBNZXNzYWdlTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0TWVzc2FnZXModmFsaWRhdG9yKTsKLQkJaWYgKHZtICE9IG51bGwpIHsKLQkJCXZtLmFkZFZhbGlkYXRpb25NZXNzYWdlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjZGlzcGxheVN1YnRhc2soSVZhbGlkYXRvciwgSU1lc3NhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVN1YnRhc2soSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJLy8gRmx1c2ggdGhlIG1lc3NhZ2UgdG8gdGhlIHVzZXIgaW1tZWRpYXRlbHkuCi0JCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlLmdldFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjZ2V0TWVzc2FnZXMoKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBNYXAgb2YgU3RyaW5nIGZ1bGx5LXF1YWxpZmllZCB2YWxpZGF0b3IgY2xhc3MgbmFtZXMsCi0JICogd2l0aCBhIHZhbHVlIG9mIENvbGxlY3Rpb24sIGFuZCB0aGUgQ29sbGVjdGlvbiBjb250YWlucyB0aGUKLQkgKiBNZXNzYWdlTWV0YURhdGEgcmVwb3J0ZWQgYnkgdGhlIHZhbGlkYXRvciwgb2YgdGhlIGdpdmVuIHNldmVyaXR5LgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0TWVzc2FnZXMoaW50IG1lc3NhZ2VUeXBlKSB7Ci0JCXJldHVybiBNZXNzYWdlTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0TWVzc2FnZXMobWVzc2FnZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI2lzQ2FuY2VsbGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKLQkJLy8gRm9yIHNpbXBsaWNpdHksIG5ldmVyIGFsbG93IGNhbmNlbGxhdGlvbi4KLQkJLy8gSW4gYSBwcm9kdWN0aW9uIHN5c3RlbSwgdGhpcyBtZXRob2QgbWlnaHQgcXVlcnkgYW5vdGhlciBvYmplY3QgdG8gZmluZCBvdXQgaXRzIGNhbmNlbGxhdGlvbiBzdGF0dXMuCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSZXBvcnRlciNyZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCU1lc3NhZ2VNYW5hZ2VyLmdldE1hbmFnZXIoKS5yZW1vdmVBbGxNZXNzYWdlcyh2YWxpZGF0b3IpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI3JlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQotCQlNZXNzYWdlTWFuYWdlci5nZXRNYW5hZ2VyKCkucmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI3JlbW92ZU1lc3NhZ2VTdWJzZXQoSVZhbGlkYXRvciwgT2JqZWN0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iaiwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQkvLyBpbXBsZW1lbnQgbGF0ZXIKLQl9Ci0KLQkvKioKLQkgKiBEaXNwbGF5IGEgZm9ybWF0dGVkIGxpc3Qgb2YgYWxsIG9mIHRoZSBwcm9ibGVtcyBmb3VuZCB3aGlsZQotCSAqIHZhbGlkYXRpbmcgdGhlIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgcmVwb3J0KCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBtZXNzYWdlcyIpOyAvLyROT04tTkxTLTEkCi0JCU1hcCBtZXNzYWdlcyA9IGdldE1lc3NhZ2VzKElNZXNzYWdlLkhJR0hfU0VWRVJJVFkpOwotCQlyZXBvcnQobWVzc2FnZXMpOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmcgbWVzc2FnZXMiKTsgLy8kTk9OLU5MUy0xJAotCQltZXNzYWdlcyA9IGdldE1lc3NhZ2VzKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSk7Ci0JCXJlcG9ydChtZXNzYWdlcyk7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiSW5mb3JtYXRpb24gbWVzc2FnZXMiKTsgLy8kTk9OLU5MUy0xJAotCQltZXNzYWdlcyA9IGdldE1lc3NhZ2VzKElNZXNzYWdlLkxPV19TRVZFUklUWSk7Ci0JCXJlcG9ydChtZXNzYWdlcyk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI3JlcG9ydChNYXApCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlcG9ydChNYXAgbWVzc2FnZXMpIHsKLQkJaWYobWVzc2FnZXMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtZXNzYWdlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUgPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gRmlsZXN5c3RlbU1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFZhbGlkYXRvcih2YWxpZGF0b3JDbGFzc05hbWUpOwotCQkJSUZpbGVzeXN0ZW1IZWxwZXIgaGVscGVyID0gRmlsZXN5c3RlbU1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEhlbHBlcih2YWxpZGF0b3IpOwotCQkJTGlzdCBtc3NnTGlzdCA9IChMaXN0KW1lc3NhZ2VzLmdldCh2YWxpZGF0b3IpOwotCQkJaWYobXNzZ0xpc3QgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlDb2xsZWN0aW9ucy5zb3J0KG1zc2dMaXN0LCBNZXNzYWdlTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0TWVzc2FnZUNvbXBhcmF0b3IoaGVscGVyKSk7Ci0JCQkKLQkJCWZvcihpbnQgaT0wOyBpPG1zc2dMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJSU1lc3NhZ2UgbXNzZyA9IChJTWVzc2FnZSltc3NnTGlzdC5nZXQoaSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VNYW5hZ2VyLmZvcm1hdE1lc3NhZ2UodmFsaWRhdG9yLCBtc3NnKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9NZXNzYWdlTWFuYWdlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vTWVzc2FnZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiMWM5ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9NZXNzYWdlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLmZpbGVzeXN0ZW07Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIG1hbmFnZXMgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMgZm9yIGVhY2ggdmFsaWRhdG9yLiBFYWNoIHZhbGlkYXRvcidzCi0gKiBtZXNzYWdlcyBjYW4gYmUgcmV0cmlldmVkIGJ5IHVzaW5nIHRoZSB2YWxpZGF0b3IncyB1bmlxdWUgbmFtZSBhcyBhIGtleSBpbnRvIHRoZQotICogdGFibGUuIChpLmUuLCBjYWxsIGdldE1lc3NhZ2VzIHdpdGggdGhlIHZhbGlkYXRvcidzIHVuaXF1ZSBuYW1lIGFzIHRoZSBwYXJhbWV0ZXIuKQotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZU1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIE1lc3NhZ2VNYW5hZ2VyIF9zaW5nbGV0b24gPSBudWxsOwotCXByaXZhdGUgQ29tcGFyYXRvciBfY29tcGFyYXRvciA9IG51bGw7Ci0KLQlwcml2YXRlIE1hcCBfdmFsaWRhdGlvbk1lc3NhZ2VzID0gbnVsbDsKLQotCXByaXZhdGUgTWVzc2FnZU1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJX3ZhbGlkYXRpb25NZXNzYWdlcyA9IG5ldyBIYXNoTWFwKDEwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIE1lc3NhZ2VNYW5hZ2VyIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1lc3NhZ2VNYW5hZ2VyIGdldE1hbmFnZXIoKSB7Ci0JCWlmIChfc2luZ2xldG9uID09IG51bGwpIHsKLQkJCV9zaW5nbGV0b24gPSBuZXcgTWVzc2FnZU1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gX3NpbmdsZXRvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbWFwIG9mIGFsbCBtZXNzYWdlcyBvZiB0aGUgZ2l2ZW4gc2V2ZXJpdHkuIFRoZSBrZXkgb2YgdGhlIG1hcAotCSAqIGlzIHRoZSBJVmFsaWRhdG9yLCB0aGUgdmFsdWUgb2YgdGhlIElWYWxpZGF0b3IgaXMgdGhlIExpc3Qgb2YgSU1lc3NhZ2UKLQkgKiBpbnN0YW5jZXMgb2YgdGhlIGdpdmVuIHNldmVyaXR5LgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0TWVzc2FnZXMoaW50IG1lc3NhZ2VUeXBlcykgewotCQlNYXAgbWVzc2FnZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3ZhbGlkYXRpb25NZXNzYWdlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVZhbGlkYXRvck1lc3NhZ2VzIG1zc2cgPSAoVmFsaWRhdG9yTWVzc2FnZXMpIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJbWVzc2FnZXMucHV0KG1zc2cuZ2V0VmFsaWRhdG9yKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIG1zc2cuZ2V0TWVzc2FnZXMobWVzc2FnZVR5cGVzKSk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VzOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBWYWxpZGF0aW9uTWVzc2FnZSBvd25lZCBieSB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3IsCi0JICogaWYgb25lIGV4aXN0cy4gSWYgb25lIGRvZXNuJ3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQgJiByZWdpc3RlcmVkLCBhbmQgdGhlbiAKLQkgKiByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWVzc2FnZXMgZ2V0TWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVZhbGlkYXRvck1lc3NhZ2VzIG1lc3NhZ2UgPSAoVmFsaWRhdG9yTWVzc2FnZXMpIF92YWxpZGF0aW9uTWVzc2FnZXMuZ2V0KHZhbGlkYXRvci5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCS8vIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZSBpdC4KLQkJCW1lc3NhZ2UgPSBuZXcgVmFsaWRhdG9yTWVzc2FnZXModmFsaWRhdG9yKTsKLQkJCV92YWxpZGF0aW9uTWVzc2FnZXMucHV0KHZhbGlkYXRvci5nZXRDbGFzcygpLmdldE5hbWUoKSwgbWVzc2FnZSk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhbGwgbWVzc2FnZXMgb3duZWQgYnkgdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJX3ZhbGlkYXRpb25NZXNzYWdlcy5yZW1vdmUodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBtZXNzYWdlcywgb3duZWQgYnkgdGhlIGlkZW50aWZpZWQgdmFsaWRhdG9yLCByZXBvcnRlZAotCSAqIGFnYWluc3QgdGhlIGdpdmVuIHRhcmdldCBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlWYWxpZGF0b3JNZXNzYWdlcyBtZXNzYWdlID0gZ2V0TWVzc2FnZXModmFsaWRhdG9yKTsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJbWVzc2FnZS5yZW1vdmVBbGxNZXNzYWdlcyhvYmplY3QpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRvIHN1cHBvcnQgcmVtb3ZhbCBvZiBhIHN1YnNldCBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzLCBhbiBJVmFsaWRhdG9yCi0JICogbWF5IGFzc2lnbiBncm91cCBuYW1lcyB0byBJTWVzc2FnZXMuIEFuIElNZXNzYWdlIHN1YnNldCB3aWxsIGJlIGlkZW50aWZpZWQKLQkgKiBieSB0aGUgbmFtZSBvZiBpdHMgZ3JvdXAuIERlZmF1bHQgKG51bGwpIG1lYW5zIG5vIGdyb3VwLiBUaGlzIG1ldGhvZCB3aWxsCi0JICogcmVtb3ZlIG9ubHkgdGhlIElNZXNzYWdlJ3MgdGhhdCBhcmUgaW4gdGhlIGdyb3VwIGlkZW50aWZpZWQgYnkgZ3JvdXBOYW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VTdWJzZXQoSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmplY3QsIFN0cmluZyBncm91cE5hbWUpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlWYWxpZGF0b3JNZXNzYWdlcyBtZXNzYWdlID0gZ2V0TWVzc2FnZXModmFsaWRhdG9yKTsKLQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJbWVzc2FnZS5yZW1vdmVBbGxNZXNzYWdlcyhvYmplY3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJTWVzc2FnZSBhcyBhIFN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheWluZyB0byB0aGUgdXNlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXRNZXNzYWdlKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gbWVzc2FnZS5nZXRTZXZlcml0eSgpOwotCQlPYmplY3Qgb2JqZWN0ID0gbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKTsKLQkJU3RyaW5nQnVmZmVyIGZvcm1hdHRlZE1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXN3aXRjaCAoc2V2ZXJpdHkpIHsKLQkJCWNhc2UgKElNZXNzYWdlLkhJR0hfU0VWRVJJVFkpIDoKLQkJCQl7Ci0JCQkJCWZvcm1hdHRlZE1lc3NhZ2UuYXBwZW5kKCJFcnJvcjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQljYXNlIChJTWVzc2FnZS5MT1dfU0VWRVJJVFkpIDoKLQkJCQl7Ci0JCQkJCWZvcm1hdHRlZE1lc3NhZ2UuYXBwZW5kKCJJbmZvcm1hdGlvbjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQljYXNlIChJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpIDoKLQkJCWRlZmF1bHQgOgotCQkJCXsKLQkJCQkJZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQoIldhcm5pbmc6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJfQotCi0JCWZvcm1hdHRlZE1lc3NhZ2UuYXBwZW5kKG1lc3NhZ2UuZ2V0VGV4dCgpKTsKLQotCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVzeXN0ZW1NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRIZWxwZXIodmFsaWRhdG9yKS5nZXRGaWxlTmFtZShtZXNzYWdlKTsKLQkJCWludCBsaW5lTnVtYmVyID0gbWVzc2FnZS5nZXRMaW5lTnVtYmVyKCk7Ci0KLQkJCWlmKChmaWxlTmFtZSAhPSBudWxsKSB8fCAobGluZU51bWJlciAhPSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQpKSB7Ci0JCQkJZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQoIlsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCQkJZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQoZmlsZU5hbWUpOwotCQkJCX0KLQkJCQlpZihsaW5lTnVtYmVyICE9IElNZXNzYWdlLkxJTkVOT19VTlNFVCkgewotCQkJCQlmb3JtYXR0ZWRNZXNzYWdlLmFwcGVuZCgiIGxpbmUgbnVtYmVyOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3JtYXR0ZWRNZXNzYWdlLmFwcGVuZChTdHJpbmcudmFsdWVPZihsaW5lTnVtYmVyKSk7Ci0JCQkJfQotCQkJCWZvcm1hdHRlZE1lc3NhZ2UuYXBwZW5kKCJdICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZm9ybWF0dGVkTWVzc2FnZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgQ29tcGFyYXRvciBpcyB1c2VkIHRvIHNvcnQgbWVzc2FnZXMgZmlyc3QgYnkgZmlsZSBuYW1lLCB0aGVuIGJ5IGxpbmUgbnVtYmVyLgotCSAqLwotCXB1YmxpYyBDb21wYXJhdG9yIGdldE1lc3NhZ2VDb21wYXJhdG9yKGZpbmFsIElGaWxlc3lzdGVtSGVscGVyIGhlbHBlcikgewotCQlpZihfY29tcGFyYXRvciA9PSBudWxsKSB7Ci0JCQlfY29tcGFyYXRvciA9IAluZXcgQ29tcGFyYXRvcigpIHsKLQkJCQlwcm90ZWN0ZWQgaW50IGNvbXBhcmUoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0JCQkJCWlmKChhID09IG51bGwpICYmIChiID09IG51bGwpKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQkJCQllbHNlIGlmKGEgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJcmV0dXJuIGEuY29tcGFyZVRvKGIpOwotCQkJCX0KLQkJCQkKLQkJCQlwcm90ZWN0ZWQgaW50IGNvbXBhcmUoaW50IGEsIGludCBiKSB7Ci0JCQkJCWlmKChhID09IElNZXNzYWdlLkxJTkVOT19VTlNFVCkgJiYgKGIgPT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSkgewotCQkJCQkJcmV0dXJuIDA7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihhID09IElNZXNzYWdlLkxJTkVOT19VTlNFVCkgewotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoYiA9PSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQpIHsKLQkJCQkJCXJldHVybiAxOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gKGEgLSBiKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJCQlpZigoYSA9PSBudWxsKSAmJiAoYiA9PSBudWxsKSkgewotCQkJCQkJcmV0dXJuIDA7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihhID09IG51bGwpIHsKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJfQotCQkJCQllbHNlIGlmKGIgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCUlNZXNzYWdlIGFNc3NnID0gKElNZXNzYWdlKWE7Ci0JCQkJCUlNZXNzYWdlIGJNc3NnID0gKElNZXNzYWdlKWI7Ci0JCQkJCQotCQkJCQkvLyBTb3J0IGJ5IGZpbGUgbmFtZSwgdGhlbiBsaW5lIG51bWJlci4gVW5zZXQgbGluZSBudW1iZXJzIGdvIHRvIHRoZSBzdGFydCBvZiB0aGUgbGlzdC4KLQkJCQkJU3RyaW5nIGFGaWxlTmFtZSA9IGhlbHBlci5nZXRGaWxlTmFtZShhTXNzZyk7Ci0JCQkJCVN0cmluZyBiRmlsZU5hbWUgPSBoZWxwZXIuZ2V0RmlsZU5hbWUoYk1zc2cpOwotCQkJCQlpbnQgcmVzdWx0ID0gY29tcGFyZShhRmlsZU5hbWUsIGJGaWxlTmFtZSk7Ci0JCQkJCWlmKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpbnQgYUxpbmVOdW1iZXIgPSBhTXNzZy5nZXRMaW5lTnVtYmVyKCk7Ci0JCQkJCWludCBiTGluZU51bWJlciA9IGJNc3NnLmdldExpbmVOdW1iZXIoKTsKLQkJCQkJcmV0dXJuIGNvbXBhcmUoYUxpbmVOdW1iZXIsIGJMaW5lTnVtYmVyKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBfY29tcGFyYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9WYWxpZGF0b3JNZXNzYWdlcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vVmFsaWRhdG9yTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxNmRmMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9WYWxpZGF0b3JNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLmZpbGVzeXN0ZW07Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyBtZXNzYWdlcyBmb3Igb25lIHZhbGlkYXRvci4gRWFjaCB2YWxpZGF0b3IgCi0gKiBjYW4gc3RvcmUgdGhyZWUgdHlwZXMgb2YgbWVzc2FnZXM6IGVycm9yIChTZXZlcml0eUVudW0uSElHSF9TRVZFUklUWSksIAotICogd2FybmluZyAoU2V2ZXJpdHlFbnVtLk5PUk1BTF9TRVZFUklUWSksIGFuZCBpbmZvIChTZXZlcml0eUVudW0uTE9XX1NFVkVSSVRZKS4KLSAqIEVhY2ggbWVzc2FnZSBpcyBhc3NvY2lhdGVkIHdpdGggYW4gT2JqZWN0IChmb3IgaW5jcmVtZW50YWwgdmFsaWRhdGlvbikuCi0gKiBJZiBhIG1lc3NhZ2UgZG9lcyBub3QgYXBwbHkgdG8gYSBwYXJ0aWN1bGFyIE9iamVjdCwgdGhlIGRlZmF1bHQgT2JqZWN0Ci0gKiBpcyB1c2VkLgotICoKLSAqIEVhY2ggT2JqZWN0IGlzIGFzc29jaWF0ZWQgd2l0aCBlaXRoZXIgMCwgMSwgb3IgPjEgbWVzc2FnZXMuIAotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yTWVzc2FnZXMgewotCXByaXZhdGUgTWFwIF9tZXNzYWdlcyA9IG51bGw7Ci0JcHJpdmF0ZSBJVmFsaWRhdG9yIF92YWxpZGF0b3IgPSBudWxsOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT2JqZWN0IERFRkFVTFRfT0JKRUNUID0gbmV3IE9iamVjdCgpOwotCi0JcHVibGljIFZhbGlkYXRvck1lc3NhZ2VzKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCV9tZXNzYWdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCV92YWxpZGF0b3IgPSB2YWxpZGF0b3I7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsaWRhdG9yIHRoYXQgb3ducyB0aGVzZSBtZXNzYWdlcy4KLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBfdmFsaWRhdG9yOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYW4gSU1lc3NhZ2UgdG8gdGhlIGRlZmF1bHQgZ3JvdXAuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShtZXNzYWdlLCBudWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIGFuIElNZXNzYWdlIHRvIHRoZSBuYW1lZCBncm91cC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uTWVzc2FnZShJTWVzc2FnZSBtZXNzYWdlLCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpID09IG51bGwpIHsKLQkJCS8vIElmIG9iamVjdCBpcyBudWxsLCB0aGUgZXJyb3IgbWVzc2FnZSBkb2VzIG5vdCBhcHBseSB0byBhIHBhcnRpY3VsYXIgb2JqZWN0LgotCQkJLy8KLQkJCS8vIFRoaXMgdmFsdWUgbWlnaHQgYmUgdXNlZCBpZiwgZm9yIGV4YW1wbGUsIHRoZSB2YWxpZGF0b3IgZXhwZXJpZW5jZXMgYW4gaW50ZXJuYWwsIHVucmVjb3ZlcmFibGUgZXJyb3IuCi0JCQkvLyBZb3UgbmVlZCB0byBsZXQgdGhlIHVzZXIga25vdyB0aGF0IHZhbGlkYXRpb24gdGVybWluYXRlZCBhYm5vcm1hbGx5LCBidXQgYSBsaXN0Ci0JCQkvLyBvZiB0aGUgdmFsaWRhdGlvbiB3aGljaCBwcm9jZWVkZWQgbm9ybWFsbHkgY2FuIGhlbHAgdG8gbmFycm93IGRvd24gd2hhdCBwYXJ0IG9mIHRoZQotCQkJLy8gY29kZSBjYXVzZWQgYSBwcm9ibGVtLgotCQkJLy8KLQkJCS8vIE9yIGl0IGNvdWxkIGJlIHNvbWV0aGluZyBnZW5lcmljLCBlLmcuIGl0IGFwcGxpZXMgdG8gYSAuamFyIGZpbGUsIGluc3RlYWQgb2YgYSBmaWxlIGluIHRoZSAuamFyLgotCQkJbWVzc2FnZS5zZXRUYXJnZXRPYmplY3QoZ2V0RGVmYXVsdE9iamVjdCgpKTsKLQkJfQotCQkKLQkJaWYoZ3JvdXBOYW1lICE9IG51bGwpIHsKLQkJCW1lc3NhZ2Uuc2V0R3JvdXBOYW1lKGdyb3VwTmFtZSk7Ci0JCX0KLQotCQlMaXN0IGxpc3QgPSAoTGlzdCkgX21lc3NhZ2VzLmdldChtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpKTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlsaXN0LmFkZChtZXNzYWdlKTsKLQkJX21lc3NhZ2VzLnB1dChtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpLCBsaXN0KTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIElNZXNzYWdlIGRvZXMgbm90IGhhdmUgYSB0YXJnZXQgb2JqZWN0LCB0aGUgb2JqZWN0Ci0JICogcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgdXNlZCBhcyB0aGUga2V5IGluIHRoZSBNYXAuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0RGVmYXVsdE9iamVjdCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfT0JKRUNUOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIG1lc3NhZ2VzIHdob3NlIHNldmVyaXR5IG1hdGNoZXMgdGhlIG1lc3NhZ2VUeXBlcyBzZXZlcml0eS4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcyhpbnQgbWVzc2FnZVR5cGVzKSB7Ci0JCUxpc3QgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfbWVzc2FnZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJTGlzdCBsaXN0ID0gKExpc3QpIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJT2JqZWN0W10gbGlzdENvbnRlbnRzID0gbGlzdC50b0FycmF5KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RDb250ZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSAoSU1lc3NhZ2UpIGxpc3RDb250ZW50c1tpXTsKLQotCQkJCWlmICgobWVzc2FnZVR5cGVzICYgbWVzc2FnZS5nZXRTZXZlcml0eSgpKSAhPSAwKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZChtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2VzOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgYWxsIG1lc3NhZ2VzIHRoYXQgYXBwbHkgdG8gdGhlIGdpdmVuIG9iamVjdC4gSWYgb2JqZWN0IGlzCi0JICogbnVsbCwgdGhlIG1lc3NhZ2VzIG93bmVkIGJ5IHRoZSBkZWZhdWx0IG9iamVjdCBhcmUgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJb2JqZWN0ID0gZ2V0RGVmYXVsdE9iamVjdCgpOwotCQl9Ci0KLQkJX21lc3NhZ2VzLnJlbW92ZShvYmplY3QpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgYWxsIG1lc3NhZ2VzIHRoYXQgYXBwbHkgdG8gdGhlIGdpdmVuIG9iamVjdCB3aGljaCBhcmUgaW4KLQkgKiB0aGUgbmFtZWQgZ3JvdXAuIElmIE9iamVjdCBpcyBudWxsLCB0aGUgZGVmYXVsdCBvYmplY3QgaXMgdXNlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlU3Vic2V0KE9iamVjdCBvYmplY3QsIFN0cmluZyBncm91cE5hbWUpIHsKLQkJaWYgKGdyb3VwTmFtZSA9PSBudWxsKSB7Ci0JCQlyZW1vdmVBbGxNZXNzYWdlcyhvYmplY3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQlvYmplY3QgPSBnZXREZWZhdWx0T2JqZWN0KCk7Ci0JCX0KLQotCQlMaXN0IGxpc3QgPSAoTGlzdCkgX21lc3NhZ2VzLmdldChvYmplY3QpOwotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobGlzdC5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUlNZXNzYWdlIG1zZyA9IChJTWVzc2FnZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nIG1zZ0dyb3VwTmFtZSA9IG1zZy5nZXRHcm91cE5hbWUoKTsKLQkJCWlmIChncm91cE5hbWUuZXF1YWxzKG1zZ0dyb3VwTmFtZSkpIHsKLQkJCQlsaXN0LnJlbW92ZShtc2cpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3BsdWdpbi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IwOGQwMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlIgotICAgbmFtZT0iUHJvcGVydGllcyBWYWxpZGF0b3IiCi0gICB2ZXJzaW9uPSIxLjEuMCIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUud29ya2JlbmNoaW1wbC5Qcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJydW50aW1lL3Byb3BlcnRpZXNWYWxpZGF0b3IuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmhlbHAiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0udXRpbCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgPC9yZXF1aXJlcz4KLQotCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIFByb3BlcnRpZXMgVmFsaWRhdG9yIENvbnRyaWJ1dGlvbnMgICAgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iUHJvcGVydGllc1ZhbGlkYXRvciIKLSAgICAgICAgIG5hbWU9IlByb3BlcnRpZXMgVmFsaWRhdG9yIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+Ci0gICAgICA8dmFsaWRhdG9yPgotICAgICAgICAgPHByb2plY3ROYXR1cmUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIj4KLSAgICAgICAgIDwvcHJvamVjdE5hdHVyZT4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIG5hbWVGaWx0ZXI9IioucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIGFjdGlvbj0iYWRkLCBjaGFuZ2UiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBlbmFibGVkPSJmYWxzZSIKLSAgICAgICAgICAgICAgIGFzeW5jPSJmYWxzZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuUHJvcGVydGllc1ZhbGlkYXRvciI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgICAgIDxoZWxwZXIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUud29ya2JlbmNoaW1wbC5Qcm9wZXJ0aWVzSGVscGVyIj4KLSAgICAgICAgIDwvaGVscGVyPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gVmFsaWRhdGlvbiBEb2N1bWVudGF0aW9uICAgICAgICAgICAgICAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gVmFsaWRhdG9yIERldmVsb3BlcidzIEd1aWRlICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgICA8dG9jCi0gICAgICAgICAgICBmaWxlPSJkb2MvZGV2ZWxvcGVyR3VpZGUvdG9jLnhtbCIKLSAgICAgICAgICAgIHByaW1hcnk9InRydWUiPgotICAgICAgPC90b2M+Ci0gICA8L2V4dGVuc2lvbj4KLS0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBWYWxpZGF0aW9uIEd1aWRlICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIDx0b2MKLSAgICAgICAgICAgIGZpbGU9ImRvYy9ndWlkZS90b2MueG1sIgotICAgICAgICAgICAgcHJpbWFyeT0idHJ1ZSI+Ci0gICAgICA8L3RvYz4KLSAgIDwvZXh0ZW5zaW9uPgotLS0+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3AuYmF0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3AuYmF0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGJmOTQwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLUBlY2hvIG9mZgotUkVNIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotUkVNIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLVJFTSBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotUkVNIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLVJFTSAKLVJFTSBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi1SRU0gVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLVJFTSBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi1SRU0gcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi1SRU0geW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi1SRU0gIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotUkVNIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi1SRU0gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi1SRU0gVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi1SRU0gZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotUkVNIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLVJFTSAKLVJFTSBUaGlzIGJhdGNoIGZpbGUgZmlyZXMgb2ZmIHRoZSBwcm9wZXJ0eSBmaWxlIHBhcnNlIG9yIGNvbXBhcmlzb24uCi1SRU0KLXNldGxvY2FsCi0KLWlmICIlSkFWQV9IT01FJSIgRVFVICIiIGdvdG8gTk9fSkFWQQotCi1zZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOy4uXGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZV81LjEuMFxydW50aW1lXGNvbW1vbi5qYXIKLXNldCBDTEFTU1BBVEg9JUNMQVNTUEFUSCU7LlxydW50aW1lXHByb3BlcnRpZXNWYWxpZGF0b3IuamFyCi1pZiAiJTEiID09ICIiIGdvdG8gc3ludGF4Ci0KLSVKQVZBX0hPTUUlXGJpblxqYXZhIGNvbS5pYm0uZXRvb2xzLnBhcnNlci5NYWluICUxICUyICUzCi1nb3RvIDplbmQKLQotOk5PX0pBVkEKLWVjaG8uCi1lY2hvIFRoZSBKQVZBX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgbXVzdCBiZSBzZXQgdG8gdGhlIEpSRSBkaXJlY3RvcnkuCi1lY2hvIGUuZy4sIHNldCBKQVZBX0hPTUU9QzpcSlJFCi1lY2hvIHdoZXJlIEpSRSBoYXMgYSBzdWJkaXJlY3RvcnkgbmFtZWQgImJpbiIKLWVjaG8uCi1nb3RvIDplbmQKLQotOnN5bnRheAotJUpBVkFfSE9NRSVcYmluXGphdmEgY29tLmlibS5ldG9vbHMucGFyc2VyLk1haW4KLQotOmVuZAotZW5kbG9jYWwKLUBlY2hvIG9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxGUy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbWltcGwvRmlsZXN5c3RlbVByb3BlcnRpZXNIZWxwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsRlMvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW1pbXBsL0ZpbGVzeXN0ZW1Qcm9wZXJ0aWVzSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYmJmYjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxGUy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbWltcGwvRmlsZXN5c3RlbVByb3BlcnRpZXNIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5maWxlc3lzdGVtaW1wbDsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLlBNb2RlbEVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLmZpbGVzeXN0ZW0uSUZpbGVzeXN0ZW1IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlci5BUHJvcGVydHlGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIuUHJvcGVydHlMaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIElWYWxpZGF0aW9uQ29udGV4dCBpbXBsZW1lbnRhdGlvbiwgdXNlZCBieSB0aGUgUHJvcGVydGllc1ZhbGlkYXRvciwKLSAqIHdoZW4gdGhlIHZhbGlkYXRvciBpcyBydW4gaW4gdGhlIGZpbGVzeXN0ZW0gdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlc3lzdGVtUHJvcGVydGllc0hlbHBlciBpbXBsZW1lbnRzIElGaWxlc3lzdGVtSGVscGVyIHsKLQlwdWJsaWMgRmlsZXN5c3RlbVByb3BlcnRpZXNIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0I2xvYWRNb2RlbChTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlyZXR1cm4gbG9hZE1vZGVsKHN5bWJvbGljTmFtZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0I2xvYWRNb2RlbChTdHJpbmcsIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUsIE9iamVjdFtdIHBhcm0pIHsKLQkJaWYgKChzeW1ib2xpY05hbWUgPT0gbnVsbCkgfHwgKHN5bWJvbGljTmFtZS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChzeW1ib2xpY05hbWUuZXF1YWxzKFBNb2RlbEVudW0uTElORUlOUFVUUkVBREVSKSAmJiAocGFybSAhPSBudWxsKSAmJiAocGFybS5sZW5ndGggPT0gMSkgJiYgKHBhcm1bMF0gaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQlyZXR1cm4gbG9hZExpbmVOdW1iZXJSZWFkZXIoKFN0cmluZykgcGFybVswXSk7Ci0JCX0KLQkJZWxzZSBpZiAoc3ltYm9saWNOYW1lLmVxdWFscyhQTW9kZWxFbnVtLlJFTEVBU0VfTElORUlOUFVUUkVBREVSKSAmJiAocGFybSAhPSBudWxsKSAmJiAocGFybS5sZW5ndGggPT0gMSkgJiYgKHBhcm1bMF0gaW5zdGFuY2VvZiBMaW5lTnVtYmVyUmVhZGVyKSkgewotCQkJcmV0dXJuIHJlbGVhc2VMaW5lTnVtYmVyUmVhZGVyKChMaW5lTnVtYmVyUmVhZGVyKSBwYXJtWzBdKTsKLQkJfQotCQllbHNlIGlmIChzeW1ib2xpY05hbWUuZXF1YWxzKFBNb2RlbEVudW0uQUxMX1BST1BFUlRJRVNfRklMRVMpKSB7Ci0JCQlyZXR1cm4gbG9hZEFsbFByb3BlcnRpZXNGaWxlcygpOwotCQl9Ci0JCWVsc2UgaWYoc3ltYm9saWNOYW1lLmVxdWFscyhQTW9kZWxFbnVtLkZJTFRFUikpIHsKLQkJCS8vIEJlY2F1c2UgdGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBjb3B5IHJlc291cmNlcyBpbnRvIGEgImJpbiIgZGlyZWN0b3J5LAotCQkJLy8gdGhlIGlucHV0IGlzIGFscmVhZHkgZmlsdGVyZWQuCi0JCQlyZXR1cm4gcGFybTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIGZpbGUgbmFtZSBvZiBhbiBleGlzdGluZyAucHJvcGVydGllcyBmaWxlLCByZXR1cm4KLQkgKiB0aGUgTGluZU51bWJlclJlYWRlciB0aGF0IHdpbGwgcmVhZCB0aGUgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGxvYWRMaW5lTnVtYmVyUmVhZGVyKFN0cmluZyBmaWxlTmFtZSkgewotCQlGaWxlIHByb3BlcnR5RmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJaWYgKCFwcm9wZXJ0eUZpbGUuZXhpc3RzKCkgfHwgIXByb3BlcnR5RmlsZS5pc0ZpbGUoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlGaWxlUmVhZGVyIGlucHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlucHV0ID0gbmV3IEZpbGVSZWFkZXIocHJvcGVydHlGaWxlKTsKLQkJfQotCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gQmVjYXVzZSB3ZSB3YW50IHRvIHJlYWQgaW4gYSBsaW5lIGF0IGEgdGltZSBmcm9tIHRoZSBmaWxlLCBjb252ZXJ0IHRoZSBGaWxlUmVhZGVyIHRvIGEgTGluZVJlYWRlcgotCQlMaW5lTnVtYmVyUmVhZGVyIGxpbmVJbnB1dCA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKGlucHV0KTsKLQkJcmV0dXJuIGxpbmVJbnB1dDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGxvYWQgYW55dGhpbmc7IGl0IHJlbGVhc2VzIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVkCi0JICogYnkgdGhlIGxvYWRMaW5lTnVtYmVyUmVhZGVyIG1ldGhvZC4gSXRzIHJlc3VsdCB3aWxsIG5ldmVyIGJlIHVzZWQsIHNvIGFsd2F5cwotCSAqIHJldHVybiBudWxsLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgcmVsZWFzZUxpbmVOdW1iZXJSZWFkZXIoTGluZU51bWJlclJlYWRlciByZWFkZXIpIHsKLQkJaWYgKHJlYWRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXRyeSB7Ci0JCQlyZWFkZXIuY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogV2hlbiB0aGUgdmFsaWRhdG9yIGlzIHRvbGQgdG8gcGVyZm9ybSBhIGZ1bGwgdmFsaWRhdGlvbiwgdGhpcwotCSAqIG1ldGhvZCByZXR1cm5zIGFuIElGaWxlRGVsdGFbXSwgd2l0aCBvbmUgSUZpbGVEZWx0YSBmb3IgZXZlcnkKLQkgKiAucHJvcGVydGllcyBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgaXRzIHN1YmRpcmVjdG9yaWVzLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbG9hZEFsbFByb3BlcnRpZXNGaWxlcygpIHsKLQkJU3RyaW5nIHB3ZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsgLy8kTk9OLU5MUy0xJAotCQlGaWxlIHB3ZERpciA9IG5ldyBGaWxlKHB3ZCk7Ci0JCWlmICghcHdkRGlyLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICghcHdkRGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU2V0IHRlbXBTZXQgPSBuZXcgSGFzaFNldCgpOwotCQl0cmF2ZXJzZURpcmVjdG9yaWVzKHB3ZERpciwgdGVtcFNldCk7Ci0JCQotCQlJRmlsZURlbHRhW10gcmVzdWx0ID0gbmV3IElGaWxlRGVsdGFbdGVtcFNldC5zaXplKCldOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHRlbXBTZXQuaXRlcmF0b3IoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlGaWxlIGZpbGUgPSAoRmlsZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlyZXN1bHRbY291bnQrK10gPSBuZXcgRmlsZURlbHRhKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIElGaWxlRGVsdGEuQ0hBTkdFRCk7Ci0JCX0KLQkJdGVtcFNldC5jbGVhcigpOwotCQl0ZW1wU2V0ID0gbnVsbDsKLQkJaXRlcmF0b3IgPSBudWxsOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRyYXZlcnNlIHRoZSBkaXJlY3RvcnksIGxvb2tpbmcgZm9yIC5wcm9wZXJ0aWVzIGZpbGVzLCBhbmQgaWYgYQotCSAqIC5wcm9wZXJ0aWVzIGZpbGUgaXMgZm91bmQgdGhlbiBhZGQgaXQgdG8gdGhlIFNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmF2ZXJzZURpcmVjdG9yaWVzKEZpbGUgZGlyZWN0b3J5VG9TZWFyY2gsIFNldCByZXN1bHQpIHsKLQkJaWYgKGRpcmVjdG9yeVRvU2VhcmNoID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChkaXJlY3RvcnlUb1NlYXJjaC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkvLyBUcmF2ZXJzZSBpbnRvIHRoaXMgZGlyZWN0b3J5J3MgY2hpbGRyZW4uCi0JCQlTdHJpbmdbXSBjaGlsZHJlbiA9IGRpcmVjdG9yeVRvU2VhcmNoLmxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlGaWxlIGNoaWxkID0gbmV3IEZpbGUoZGlyZWN0b3J5VG9TZWFyY2gsIGNoaWxkcmVuW2ldKTsKLQkJCQl0cmF2ZXJzZURpcmVjdG9yaWVzKGNoaWxkLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYoZGlyZWN0b3J5VG9TZWFyY2guaXNGaWxlKCkpIHsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IGRpcmVjdG9yeVRvU2VhcmNoLmdldE5hbWUoKTsKLQkJCWlmKChmaWxlTmFtZSAhPSBudWxsKSAmJiBmaWxlTmFtZS5lbmRzV2l0aCgicHJvcGVydGllcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYWRkKGRpcmVjdG9yeVRvU2VhcmNoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiBhbiBJTWVzc2FnZSwgcmV0dXJuIHRoZSBmaWxlIG5hbWUgb2YgdGhlIC5wcm9wZXJ0aWVzIGZpbGUgdGhhdAotCSAqIHRoZSBtZXNzYWdlIHdhcyByZXBvcnRlZCBhZ2FpbnN0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlPYmplY3Qgb2JqZWN0ID0gbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKTsKLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpb2JqZWN0OwotCQkJQVByb3BlcnR5RmlsZSBwRmlsZSA9IGxpbmUuZ2V0RmlsZSgpOwotCQkJcmV0dXJuIHBGaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCk7IC8vIGEgVmFsaWRhdGlvblByb3BlcnR5RmlsZSByZXR1cm5zIHRoZSBmaWxlIG5hbWUgYXMgaXRzIHF1YWxpZmllZCBuYW1lCi0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBBUHJvcGVydHlGaWxlKSB7Ci0JCQlBUHJvcGVydHlGaWxlIHBGaWxlID0gKEFQcm9wZXJ0eUZpbGUpb2JqZWN0OwotCQkJcmV0dXJuIHBGaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCk7IC8vIGEgVmFsaWRhdGlvblByb3BlcnR5RmlsZSByZXR1cm5zIHRoZSBmaWxlIG5hbWUgYXMgaXRzIHF1YWxpZmllZCBuYW1lCi0JCX0KLQkJcmV0dXJuICIiOwkvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFVSSXMoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9QbHVnaW5Qcm9wZXJ0eUZpbGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsV0Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3dvcmtiZW5jaGltcGwvUGx1Z2luUHJvcGVydHlGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZGE5NDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9QbHVnaW5Qcm9wZXJ0eUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUud29ya2JlbmNoaW1wbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uTGluZU51bWJlclJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlci5BUHJvcGVydHlGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIuTWVzc2FnZU1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogQSBQbHVnaW5Qcm9wZXJ0eUZpbGUgcmVwcmVzZW50cyBhIHJlc291cmNlIGJ1bmRsZSB0aGF0IGlzIGV4cG9ydGVkIGJ5IGEgcGx1Z2luLgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2luUHJvcGVydHlGaWxlIGV4dGVuZHMgQVByb3BlcnR5RmlsZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX2J1bmRsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9wbHVnaW5JZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX2xhbmdWYXJpYW50ID0gbnVsbDsgLy8gZS5nLiwgZW5fVVMgdnMgZW4KLQlwcml2YXRlIENsYXNzTG9hZGVyIF9jbGFzc0xvYWRlciA9IG51bGw7IC8vIHRoZSBDbGFzc0xvYWRlciB1c2VkIHRvIGxvYWQgdGhlIGJ1bmRsZQotCQotCQotCS8qKgotCSAqIEJvdGggdGhlIHBsdWdpbklkIGFuZCB0aGUgYnVuZGxlTmFtZSBtdXN0IG5vdCBiZSBudWxsLCBtdXN0Ci0JICogcmVmZXIgdG8gYW4gZXhpc3RpbmcgcGx1Z2luLCBhbmQgbXVzdCByZWZlciB0byBhbiBleGlzdGluZyBidW5kbGUgCi0JICogZXhwb3J0ZWQgYnkgdGhhdCBwbHVnaW4uCi0JICovCi0JcHVibGljIFBsdWdpblByb3BlcnR5RmlsZShTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBidW5kbGVOYW1lKSB7Ci0JCV9wbHVnaW5JZCA9IHBsdWdpbklkOwotCQlfYnVuZGxlTmFtZSA9IGJ1bmRsZU5hbWU7Ci0JCQotCQlDbGFzc0xvYWRlciBjbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGluUyA9IG51bGw7Ci0JCVBsdWdpbiBwbHVnaW4gPSBnZXRQbHVnaW4ocGx1Z2luSWQpOwkJCQotCQlpZihidW5kbGVOYW1lLmVxdWFscygicGx1Z2luIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJLy8gVHJ5IGxvYWRpbmcgaXQgZnJvbSB0aGUgUGx1Z2luIHBhcmVudCAoYSAicGx1Z2luLnByb3BlcnRpZXMiKQotCQkJY2wgPSBnZXRQbHVnaW5Qcm9wZXJ0aWVzQ2xhc3NMb2FkZXIocGx1Z2luKTsKLQkJfQotCQllbHNlIHsKLQkJCWNsID0gcGx1Z2luLmdldERlc2NyaXB0b3IoKS5nZXRQbHVnaW5DbGFzc0xvYWRlcigpOwotCQl9Ci0JCWluUyA9IGdldElucHV0U3RyZWFtKGNsLCBidW5kbGVOYW1lKTsKLQkJCi0JCUlucHV0U3RyZWFtUmVhZGVyIGluUiA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpblMpOwotCQlMaW5lTnVtYmVyUmVhZGVyIGxpbmVSID0gbmV3IExpbmVOdW1iZXJSZWFkZXIoaW5SKTsKLQkJcGFyc2VGaWxlKGxpbmVSKTsgLy8gcG9wdWxhdGUgdGhpcyBwcm9wZXJ0eSBmaWxlCi0JCXRyeSB7Ci0JCQlsaW5lUi5jbG9zZSgpOwotCQkJaW5SLmNsb3NlKCk7Ci0JCX0KLQkJY2F0Y2goSU9FeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gUHJvcGVydGllc1ZhbGlkYXRvclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTs7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlpZihpblMgIT0gbnVsbCkgewotCQkJCWluUy5jbG9zZSgpOwotCQkJfQotCQl9Ci0JCWNhdGNoKElPRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQkJCi0JCV9jbGFzc0xvYWRlciA9IGNsOyAvLyBzdG9yZSB0aGUgQ2xhc3NMb2FkZXIgd2hpY2ggd2FzIHVzZWQgdG8gbG9hZCB0aGUgYnVuZGxlCi0JfQotCQotCXByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oQ2xhc3NMb2FkZXIgY2wsIFN0cmluZyBidW5kbGVOYW1lKSB7Ci0JCUxvY2FsZSBsID0gTG9jYWxlLmdldERlZmF1bHQoKTsKLQkJU3RyaW5nIGxhbmd1YWdlID0gbC5nZXRMYW5ndWFnZSgpOwotCQlTdHJpbmcgY291bnRyeSA9IGwuZ2V0Q291bnRyeSgpOwotCQlTdHJpbmcgdmFyaWFudCA9IGwuZ2V0VmFyaWFudCgpOwotCQkKLQkJU3RyaW5nIGxhbmcgPSBudWxsOwotCQlTdHJpbmcgbGFuZ19jb3VudHJ5ID0gbnVsbDsKLQkJU3RyaW5nIGxhbmdfY291bnRyeV92YXJpYW50ID0gbnVsbDsKLQkJaWYoKGxhbmd1YWdlICE9IG51bGwpICYmICEobGFuZ3VhZ2UuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJbGFuZyA9ICJfIiArIGxhbmd1YWdlOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZigoY291bnRyeSAhPSBudWxsKSAmJiAhKGNvdW50cnkuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJbGFuZ19jb3VudHJ5ID0gbGFuZyArICJfIiArIGNvdW50cnk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmKCh2YXJpYW50ICE9IG51bGwpICYmICEodmFyaWFudC5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlsYW5nX2NvdW50cnlfdmFyaWFudCA9IGxhbmdfY291bnRyeSArICJfIiArIHZhcmlhbnQ7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJSW5wdXRTdHJlYW0gaW5TID0gbnVsbDsKLQkJaWYobGFuZ19jb3VudHJ5X3ZhcmlhbnQgIT0gbnVsbCkgewotCQkJaW5TID0gZ2V0UmVzb3VyY2VBc1N0cmVhbShjbCwgYnVuZGxlTmFtZSwgbGFuZ19jb3VudHJ5X3ZhcmlhbnQpOwotCQkJaWYoaW5TICE9IG51bGwpIHsKLQkJCQlfbGFuZ1ZhcmlhbnQgPSBsYW5nX2NvdW50cnlfdmFyaWFudDsKLQkJCQlyZXR1cm4gaW5TOwotCQkJfQotCQl9Ci0JCQotCQlpZihsYW5nX2NvdW50cnkgIT0gbnVsbCkgewotCQkJaW5TID0gZ2V0UmVzb3VyY2VBc1N0cmVhbShjbCwgYnVuZGxlTmFtZSwgbGFuZ19jb3VudHJ5KTsKLQkJCWlmKGluUyAhPSBudWxsKSB7Ci0JCQkJX2xhbmdWYXJpYW50ID0gbGFuZ19jb3VudHJ5OwotCQkJCXJldHVybiBpblM7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKGxhbmcgIT0gbnVsbCkgewotCQkJaW5TID0gZ2V0UmVzb3VyY2VBc1N0cmVhbShjbCwgYnVuZGxlTmFtZSwgbGFuZyk7Ci0JCQlpZihpblMgIT0gbnVsbCkgewotCQkJCV9sYW5nVmFyaWFudCA9IGxhbmc7Ci0JCQkJcmV0dXJuIGluUzsKLQkJCX0KLQkJfQotCQkKLQkJaWYoTG9jYWxlLmdldERlZmF1bHQoKS5lcXVhbHMoTG9jYWxlLlVTKSkgewotCQkJLy8gUnVubmluZyB0aGUgVFZUIHBsdWdpbiBpbiBlbl9VUyBtb2RlLCBzbyByZXR1cm4gdGhlIGRlZmF1bHQgLnByb3BlcnRpZXMgZmlsZS4KLQkJCWluUyA9IGdldFJlc291cmNlQXNTdHJlYW0oY2wsIGJ1bmRsZU5hbWUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYoaW5TICE9IG51bGwpIHsKLQkJCQlfbGFuZ1ZhcmlhbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBpblM7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKGZpbmFsIENsYXNzTG9hZGVyIGNsLCBmaW5hbCBTdHJpbmcgYnVuZGxlTmFtZSwgZmluYWwgU3RyaW5nIGxhbmd1YWdlKSB7Ci0JCVN0cmluZyByZXNOYW1lID0gYnVuZGxlTmFtZS5yZXBsYWNlKCcuJywgJy8nKSArIGxhbmd1YWdlICsgIi5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gY2wuZ2V0UmVzb3VyY2VBc1N0cmVhbShyZXNOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0UGx1Z2luUHJvcGVydGllc0NsYXNzTG9hZGVyKFBsdWdpbiBwKSB7Ci0JCS8vIENvcGllZCBmcm9tIFBsdWdpbkRlc2NyaXB0b3IuamF2YSdzIGdldFJlc291cmNlQnVuZGxlIG1ldGhvZC4KLQkJVVJMW10gY3AgPSAoKFVSTENsYXNzTG9hZGVyKXAuZ2V0RGVzY3JpcHRvcigpLmdldFBsdWdpbkNsYXNzTG9hZGVyKCkpLmdldFVSTHMoKTsKLQkJVVJMW10gbmV3Y3AgPSBuZXcgVVJMW2NwLmxlbmd0aCsxXTsKLQkJZm9yIChpbnQgaT0wOyBpPGNwLmxlbmd0aDsgaSsrKSBuZXdjcFtpKzFdID0gY3BbaV07Ci0JCXRyeSB7Ci0JCQluZXdjcFswXSA9IFBsYXRmb3JtLnJlc29sdmUocC5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiLyIpKTsgLy8kTk9OLU5MUy0xJCAvLyBhbHdheXMgdHJ5IHRvIHJlc29sdmUgVVJMcyB1c2VkIGluIGxvYWRlcnMKLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQluZXdjcFswXSA9IHAuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUNsYXNzTG9hZGVyIHJlc291cmNlTG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKG5ld2NwLCBudWxsKTsKLQkJcmV0dXJuIHJlc291cmNlTG9hZGVyOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBQbHVnaW4gZ2V0UGx1Z2luKFN0cmluZyBwbHVnaW5JZCkgewotCQlpZiAocGx1Z2luSWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJUGx1Z2luUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpOwotCQlJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjID0gcmVnaXN0cnkuZ2V0UGx1Z2luRGVzY3JpcHRvcihwbHVnaW5JZCk7Ci0JCWlmKHBsdWdpbkRlc2MgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlyZXR1cm4gcGx1Z2luRGVzYy5nZXRQbHVnaW4oKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7OwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JfQotCi0JCi0JLyoKLQkgKiBAc2VlIEFQcm9wZXJ0eUZpbGUjcmVwb3J0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoU3RyaW5nIHN0cikgewotCQlhZGRQYXJzZVdhcm5pbmcobmV3IE1lc3NhZ2VNZXRhRGF0YShzdHIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVwb3J0KElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEobWVzc2FnZS5nZXRCdW5kbGVOYW1lKCksIG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSwgbWVzc2FnZS5nZXRJZCgpLCBtZXNzYWdlLmdldFBhcmFtcygpLCBtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpLCBtZXNzYWdlLmdldExpbmVOdW1iZXIoKSwgbWVzc2FnZS5nZXRPZmZzZXQoKSwgbWVzc2FnZS5nZXRMZW5ndGgoKSk7Ci0JCWFkZFBhcnNlV2FybmluZyhtbWQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXBvcnQoTWVzc2FnZU1ldGFEYXRhIG1tZCkgewotCQlhZGRQYXJzZVdhcm5pbmcobW1kKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUGFyc2VXYXJuaW5nKElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEobWVzc2FnZS5nZXRCdW5kbGVOYW1lKCksIG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSwgbWVzc2FnZS5nZXRJZCgpLCBtZXNzYWdlLmdldFBhcmFtcygpLCBtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpLCBtZXNzYWdlLmdldExpbmVOdW1iZXIoKSwgbWVzc2FnZS5nZXRPZmZzZXQoKSwgbWVzc2FnZS5nZXRMZW5ndGgoKSk7Ci0JCWFkZFBhcnNlV2FybmluZyhtbWQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlyZXR1cm4gX3BsdWdpbklkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QnVuZGxlTmFtZSgpIHsKLQkJcmV0dXJuIF9idW5kbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZEZpbGVOYW1lKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRQbHVnaW5JZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiOjoiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGdldEJ1bmRsZU5hbWUoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoX2xhbmdWYXJpYW50KTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ1ZhcmlhbnQoKSB7Ci0JCXJldHVybiBfbGFuZ1ZhcmlhbnQ7Ci0JfQotCQotCXB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKLQkJcmV0dXJuIF9jbGFzc0xvYWRlcjsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9Qcm9wZXJ0aWVzSGVscGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbFdCL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS93b3JrYmVuY2hpbXBsL1Byb3BlcnRpZXNIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNmYThhYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbFdCL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS93b3JrYmVuY2hpbXBsL1Byb3BlcnRpZXNIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS53b3JrYmVuY2hpbXBsOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uTGluZU51bWJlclJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLlBNb2RlbEVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlci5BUHJvcGVydHlGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIuUHJvcGVydHlMaW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hGaWxlRGVsdGE7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBXZWJTcGhlcmUgU3R1ZGlvIElWYWxpZGF0aW9uQ29udGV4dCBmb3IgdGhlIAotICogUHJvcGVydGllcyBWYWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzSGVscGVyIGV4dGVuZHMgV29ya2JlbmNoQ29udGV4dCB7Ci0JcHVibGljIFByb3BlcnRpZXNIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCSAKLQkJcmVnaXN0ZXJNb2RlbChQTW9kZWxFbnVtLkxJTkVJTlBVVFJFQURFUiwgImxvYWRMaW5lTnVtYmVyUmVhZGVyIiwgbmV3IENsYXNzW117amF2YS5sYW5nLlN0cmluZy5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JCXJlZ2lzdGVyTW9kZWwoUE1vZGVsRW51bS5SRUxFQVNFX0xJTkVJTlBVVFJFQURFUiwgInJlbGVhc2VMaW5lTnVtYmVyUmVhZGVyIiwgbmV3IENsYXNzW117amF2YS5pby5MaW5lTnVtYmVyUmVhZGVyLmNsYXNzfSk7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJNb2RlbChQTW9kZWxFbnVtLkFMTF9QUk9QRVJUSUVTX0ZJTEVTLCAibG9hZEFsbFByb3BlcnRpZXNGaWxlcyIpOyAvLyROT04tTkxTLTEkCi0JCXJlZ2lzdGVyTW9kZWwoUE1vZGVsRW51bS5NU0dMT0dHRVIsICJnZXRNc2dMb2dnZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3Rlck1vZGVsKFBNb2RlbEVudW0uRklMVEVSLCAiZmlsdGVyIiwgbmV3IENsYXNzW117SUZpbGVEZWx0YVtdLmNsYXNzfSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRlLklXb3JrYmVuY2hDb250ZXh0I2dldFRhcmdldE9iamVjdE5hbWUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0T2JqZWN0TmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRlLklXb3JrYmVuY2hDb250ZXh0I2dldFJlc291cmNlKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKE9iamVjdCBvYmplY3QpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCWlmKG9iamVjdCBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKW9iamVjdDsKLQkJCUFQcm9wZXJ0eUZpbGUgcEZpbGUgPSBsaW5lLmdldEZpbGUoKTsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IHBGaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCk7IC8vIGEgVmFsaWRhdGlvblByb3BlcnR5RmlsZSByZXR1cm5zIHRoZSBmaWxlIG5hbWUgYXMgaXRzIHF1YWxpZmllZCBuYW1lCi0JCQlmaWxlID0gZ2V0RmlsZShmaWxlTmFtZSk7Ci0JCX0KLQkJZWxzZSBpZihvYmplY3QgaW5zdGFuY2VvZiBBUHJvcGVydHlGaWxlKSB7Ci0JCQlBUHJvcGVydHlGaWxlIHBGaWxlID0gKEFQcm9wZXJ0eUZpbGUpb2JqZWN0OwotCQkJU3RyaW5nIGZpbGVOYW1lID0gcEZpbGUuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKTsgLy8gYSBWYWxpZGF0aW9uUHJvcGVydHlGaWxlIHJldHVybnMgdGhlIGZpbGUgbmFtZSBhcyBpdHMgcXVhbGlmaWVkIG5hbWUKLQkJCWZpbGUgPSBnZXRGaWxlKGZpbGVOYW1lKTsKLQkJfQotCQkKLQkJaWYoKGZpbGUgPT0gbnVsbCkgfHwgKCFmaWxlLmV4aXN0cygpKSkgewotCQkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCS8qKgotCSAqIFdoZW4gYSBmdWxsIHZhbGlkYXRpb24gaXMgcGVyZm9ybWVkLCB0aGlzIG1ldGhvZCByZXR1cm5zIGFuCi0JICogSUZpbGVEZWx0YVtdIGNvbnRhaW5pbmcgb25lIElGaWxlRGVsdGEgZm9yIGVhY2ggLnByb3BlcnRpZXMgCi0JICogZmlsZSBpbiB0aGUgSVByb2plY3QuCi0JICovCi0JcHVibGljIElGaWxlRGVsdGFbXSBsb2FkQWxsUHJvcGVydGllc0ZpbGVzKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQkKLQkJZmluYWwgU2V0IGZpbGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJSVJlc291cmNlVmlzaXRvciB2aXNpdG9yID0gbmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJaWYoIXJlcy5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGlmIHRoZSByZXNvdXJjZSBpc24ndCBhY2Nlc3NpYmxlIHRoZW4gbmVpdGhlciBhcmUgaXRzIGNoaWxkcmVuCi0JCQkJfQotCQkJCQotCQkJCWlmKGlzU3JjRmlsZShyZXMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJV29ya2JlbmNoRmlsZURlbHRhIG5ld0ZpbGVEZWx0YSA9IG5ldyBXb3JrYmVuY2hGaWxlRGVsdGEocmVzLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgSUZpbGVEZWx0YS5DSEFOR0VELCByZXMpOwotCQkJCQlmaWxlcy5hZGQobmV3RmlsZURlbHRhKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdHJ1ZTsgLy8gdmlzaXQgdGhlIHJlc291cmNlJ3MgY2hpbGRyZW4gYXMgd2VsbAotCQkJfQotCQl9OwotCi0JCXRyeSB7Ci0JCQlwcm9qZWN0LmFjY2VwdCh2aXNpdG9yLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIHRydWUpOyAvLyB0cnVlIG1lYW5zIGluY2x1ZGUgcGhhbnRvbSByZXNvdXJjZXMKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKGUpOwotCQkJfQotCQl9Ci0JCQotCQlJRmlsZURlbHRhW10gcmVzdWx0ID0gbmV3IElGaWxlRGVsdGFbZmlsZXMuc2l6ZSgpXTsKLQkJZmlsZXMudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIElGaWxlIGhhbmRsZSBmb3IgdGhlIGZpbGUgaWRlbnRpZmllZCBieSBmaWxlTmFtZS4KLQkgKiBudWxsIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JcHVibGljIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCUlGaWxlIGZpbGUgPSAoSUZpbGUpUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kTWVtYmVyKGZpbGVOYW1lKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIHRoZSBmaWxlIG5hbWUgb2YgYW4gZXhpc3RpbmcgLnByb3BlcnRpZXMgZmlsZSwgcmV0dXJuCi0JICogdGhlIExpbmVOdW1iZXJSZWFkZXIgdGhhdCB3aWxsIHJlYWQgdGhlIGZpbGUuCi0JICovCi0JcHVibGljIExpbmVOdW1iZXJSZWFkZXIgbG9hZExpbmVOdW1iZXJSZWFkZXIoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShmaWxlTmFtZSk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCUlucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbik7Ci0JCi0JCQkvLyBCZWNhdXNlIHdlIHdhbnQgdG8gcmVhZCBpbiBhIGxpbmUgYXQgYSB0aW1lIGZyb20gdGhlIGZpbGUsIGNvbnZlcnQgdGhlIElucHV0U3RyZWFtUmVhZGVyIHRvIGEgTGluZVJlYWRlcgotCQkJTGluZU51bWJlclJlYWRlciBsaW5lSW5wdXQgPSBuZXcgTGluZU51bWJlclJlYWRlcihyZWFkZXIpOwotCQkJcmV0dXJuIGxpbmVJbnB1dDsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IGdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoZXhjKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbG9hZCBhbnl0aGluZzsgaXQgcmVsZWFzZXMgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQKLQkgKiBieSB0aGUgbG9hZExpbmVOdW1iZXJSZWFkZXIgbWV0aG9kLiBJdHMgcmVzdWx0IHdpbGwgbmV2ZXIgYmUgdXNlZCwgc28gYWx3YXlzCi0JICogcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIExpbmVOdW1iZXJSZWFkZXIgcmVsZWFzZUxpbmVOdW1iZXJSZWFkZXIoTGluZU51bWJlclJlYWRlciByZWFkZXIpIHsKLQkJaWYocmVhZGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQl0cnkgewotCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IGdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoZXhjKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgTXNnTG9nZ2VyIGZyb20gdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gbG9nIGV4Y2VwdGlvbnMuCi0JICogVGhpcyBtZXRob2Qgd2lsbCBuZXZlciByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpIHsKLQkJcmV0dXJuIFByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JfQotCQotCS8vIHBhY2thZ2UgdmlzaWJpbGl0eSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyAoc3ludGhldGljIGFjY2Vzc29yIG1ldGhvZCkKLQlib29sZWFuIGlzU3JjRmlsZShJUmVzb3VyY2UgcmVzKSB7Ci0JCS8vIFdhbnQgdG8gZmlsdGVyIG91dCB0aGUgY29waWVzIGluIHRoZSAiYmluIiBkaXJlY3RvcnkuCi0JCWlmKHJlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKCEocmVzIGluc3RhbmNlb2YgSUZpbGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKCEicHJvcGVydGllcyIuZXF1YWxzKHJlcy5nZXRGaWxlRXh0ZW5zaW9uKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsgCQkKLQkJfQotCQkKLQkJaWYocmVzLmlzRGVyaXZlZCgpKSB7Ci0JCQkvLyBDcmVhdGVkIGJ5IGVjbGlwc2UKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBJRmlsZURlbHRhW10gZmlsdGVyKElGaWxlRGVsdGFbXSBjaGFuZ2VkRmlsZXMpIHsKLQkJSUZpbGVEZWx0YVtdIHRlbXAgPSBuZXcgSUZpbGVEZWx0YVtjaGFuZ2VkRmlsZXMubGVuZ3RoXTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yKGludCBpPTA7IGk8Y2hhbmdlZEZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmlsZURlbHRhIGZkID0gY2hhbmdlZEZpbGVzW2ldOwotCQkJSVJlc291cmNlIHJlc291cmNlID0gKChXb3JrYmVuY2hGaWxlRGVsdGEpZmQpLmdldFJlc291cmNlKCk7Ci0JCQlpZihpc1NyY0ZpbGUocmVzb3VyY2UpKSB7Ci0JCQkJdGVtcFtjb3VudCsrXSA9IGZkOwotCQkJfQotCQl9Ci0JCQotCQlpZihjb3VudCA9PSBjaGFuZ2VkRmlsZXMubGVuZ3RoKSB7Ci0JCQlyZXR1cm4gY2hhbmdlZEZpbGVzOwotCQl9Ci0JCQotCQlJRmlsZURlbHRhW10gcmVzdWx0ID0gbmV3IElGaWxlRGVsdGFbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9Qcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbFdCL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS93b3JrYmVuY2hpbXBsL1Byb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRiYTY1ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbFdCL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS93b3JrYmVuY2hpbXBsL1Byb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS53b3JrYmVuY2hpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuV1RQUGx1Z2luOwotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBQbHVnaW4gY2xhc3MgaWRlbnRpZmllZCBieSB0aGUgY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5jb3JlLnByb3AncyBwbHVnaW4ueG1sCi0gKiBmaWxlIChpLmUuLCB0aGUgJmx0O3BsdWdpbiA8YnI+PGJyPgotICogY2xhc3M9JnF1b3Q7Y2xhc3M9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5wcm9wZXJ0aWVzLndvcmtiZW5jaGltcGwuUHJvcGVydGllc1ZhbGlkYXRvclBsdWdpbiImcXVvdCZndDsKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4gZXh0ZW5kcyBXVFBQbHVnaW4gewotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4gX2luc3QgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIF9sb2dnZXI7Ci0JcHVibGljIFByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChfaW5zdCA9PSBudWxsKSB7Ci0JCQlfaW5zdCA9IHRoaXM7Ci0JCX0KLQl9Ci0JcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIF9pbnN0OwotCX0KLQlwdWJsaWMgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpIHsKLQkJaWYgKF9sb2dnZXIgPT0gbnVsbCkKLQkJCV9sb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKCk7Ci0JCXJldHVybiBfbG9nZ2VyOwotCX0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGNvbS5pYm0ud3RwLmNvbW1vbi5XVFBQbHVnaW4jZ2V0UGx1Z2luSUQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JCXJldHVybiBQTFVHSU5fSUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL1BNb2RlbEVudW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9QTW9kZWxFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MTZlZWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL1BNb2RlbEVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSBjb25zdGFudHMgdGhhdCB1bmlxdWVseSBpZGVudGlmeSBlYWNoCi0gKiBtb2RlbCB0aGF0IHRoZSBQcm9wZXJ0aWVzIFZhbGlkYXRvcidzIGhlbHBlciBtdXN0IGxvYWQuIEFsbCBvZgotICogdGhlc2UgbW9kZWxzIG11c3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBJVmFsaWRhdGlvbkNvbnRleHQgaW1wbGVtZW50YXRpb24KLSAqIG9yIHRoZSBoZWxwZXIgY2Fubm90IGJlIHVzZWQgdG8gc3VwcG9ydCB0aGUgUHJvcGVydGllcyBWYWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUE1vZGVsRW51bSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORUlOUFVUUkVBREVSID0gImdldCBhIExpbmVJbnB1dFJlYWRlciBmb3IgYSAucHJvcGVydGllcyBmaWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTEVBU0VfTElORUlOUFVUUkVBREVSID0gInJlbGFzZSAoY2xvc2UpIHRoZSBMaW5lSW5wdXRSZWFkZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX1BST1BFUlRJRVNfRklMRVMgPSAicmV0dXJuIGFuIElGaWxlRGVsdGFbXSBvZiBhbGwgb2YgdGhlIC5wcm9wZXJ0aWVzIGZpbGVzIGluIHRoZSBwcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR0xPR0dFUiA9ICJnZXQgdGhlIE1zZ0xvZ2dlciBuZWVkZWQgdG8gbG9nIG1lc3NhZ2VzLiBUaGlzIE1zZ0xvZ2dlciBtdXN0IG5ldmVyIGJlIG51bGwuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTFRFUiA9ICJnZXQgb25seSB0aGUgLnByb3BlcnRpZXMgZmlsZXMgdGhhdCBhcmUgaW4gc3JjIGRpcjsgZmlsdGVyIG91dCB0aGUgLnByb3BlcnRpZXMgZmlsZXMgdGhhdCBhcmUgaW4gYmluIGRpciAoaS5lLiwgZG9uJ3QgdmFsaWRhdGUgdGhlIHNhbWUgZmlsZSB0d2ljZSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL1Byb3BlcnRpZXNWYWxpZGF0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9Qcm9wZXJ0aWVzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYmZiMjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL1Byb3BlcnRpZXNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIuSVZhbGlkYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjaGVja3MgdGhhdCB0aGUgLnByb3BlcnRpZXMgZmlsZXMgaGFzIG5vIHN5bnRheCBvcgotICogb3IgcHJvYmxlbXMuIFRoaXMgdmFsaWRhdG9yIGNhbiBydW4gaW4gYW55IHZhbGlkYXRpb24gZnJhbWV3b3JrCi0gKiBpbXBsZW1lbnRhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnRpZXNWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLQotCS8qCi0JICogQHNlZSBJVmFsaWRhdG9yI2NsZWFudXAoSVJlcG9ydGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIFRoaXMgdmFsaWRhdG9yIGRvZXNuJ3QgY2FjaGUgYW55dGhpbmcgc28gaXQgZG9lc24ndCBuZWVkIHRvIGNsZWFuIGFueXRoaW5nIHVwLgotCX0KLQotCS8qCi0JICogQHNlZSBJVmFsaWRhdG9yI3ZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCwgSVJlcG9ydGVyLCBJRmlsZURlbHRhW10pCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUlGaWxlRGVsdGFbXSBmaWxlVVJJcyA9IG51bGw7Ci0JCWlmKChmaWxlVVJJcyA9PSBudWxsKSB8fCAoZmlsZVVSSXMubGVuZ3RoID09IDApKSB7Ci0JCQlmaWxlVVJJcyA9IChJRmlsZURlbHRhW10paGVscGVyLmxvYWRNb2RlbChQTW9kZWxFbnVtLkFMTF9QUk9QRVJUSUVTX0ZJTEVTKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIEZpbHRlciBvdXQgdGhlIGZpbGVzIHRoYXQgYXJlIGluIHRoZSAiYmluIiBkaXJlY3RvcnkuCi0JCQlmaWxlVVJJcyA9IChJRmlsZURlbHRhW10paGVscGVyLmxvYWRNb2RlbChQTW9kZWxFbnVtLkZJTFRFUiwgbmV3IE9iamVjdFtde2hlbHBlci5nZXRVUklzKCl9KTsKLQkJfQotCQlpZihmaWxlVVJJcyA9PSBudWxsKSB7Ci0JCQkvLyBQcm9ibGVtIGxvYWRpbmcgdGhlIGZpbGVzLiAKLQkJCUxvZ2dlciBsb2dnZXIgPSAoTG9nZ2VyKWhlbHBlci5sb2FkTW9kZWwoUE1vZGVsRW51bS5NU0dMT0dHRVIpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCJjaGFuZ2VkRmlsZXMgPT0gbnVsbDsgdGVybWluYXRpbmcgdmFsaWRhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCVN0cmluZ1tdIHVyaXMgPSBoZWxwZXIuZ2V0VVJJcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVyaXMubGVuZ3RoOyBpKyspIHsKLQkJCS8vIExvYWQgdGhlIHJlYWRlciBmb3IgdGhlIGZpbGUKLQkJCUxpbmVOdW1iZXJSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcmVhZGVyID0gKExpbmVOdW1iZXJSZWFkZXIpaGVscGVyLmxvYWRNb2RlbChQTW9kZWxFbnVtLkxJTkVJTlBVVFJFQURFUiwgbmV3IE9iamVjdFtde3VyaXNbaV19KTsKLQkJCQlpZihyZWFkZXIgPT0gbnVsbCkgewotCQkJCQkvLyBFaXRoZXI6IAotCQkJCQkvLyAxLiBUaGUgZmlsZSBkb2Vzbid0IGV4aXN0IG9yCi0JCQkJCS8vIDIuIFRoZSBmaWxlIGlzbid0IGEgLnByb3BlcnRpZXMgZmlsZSBvcgotCQkJCQkvLyAzLiBUaGUgZmlsZSBjYW4ndCBiZSByZWFkCi0JCQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMDkwLCBuZXcgU3RyaW5nW117dXJpc1tpXX0pOwotCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCi0JCQkJLy8gSWYgd2UgY2FuIGdldCBhIHJlYWRlciB0aGVuIHdlIGNhbiBnZXQgYSBQcm9wZXJ0eUZpbGUKLQkJCQlWYWxpZGF0b3JQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgVmFsaWRhdG9yUHJvcGVydHlGaWxlKHJlYWRlciwgdXJpc1tpXSwgcmVwb3J0ZXIsIHRoaXMpOwotCQkJCXByb3BGaWxlLnByaW50U3ludGF4V2FybmluZ3MoKTsKLQkJCQlwcm9wRmlsZS5wcmludER1cGxpY2F0ZU1lc3NhZ2VJZCgpOwotCQkJCXByb3BGaWxlLnByaW50RHVwbGljYXRlTWVzc2FnZVByZWZpeCgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8gRG9uJ3QgY2F0Y2ggVGhyb3dhYmxlLCBNZXNzYWdlTGltaXRFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uLCBvciBWYWxpZGF0aW9uRXhjZXB0aW9uLgotCQkJCS8vIExldCB0aGVtIHRyYXZlbCB1cCB0byB0aGUgZnJhbWV3b3JrIGFuZCB0aGUgZnJhbWV3b3JrIHdpbGwgbG9nIG9yIGNsZWFudXAgYXMgYXBwcm9wcmlhdGUuCi0JCQkJaWYocmVhZGVyICE9IG51bGwpIHsKLQkJCQkJLy8gUmVsZWFzZSB0aGUgcmVhZGVyIGZvciB0aGUgZmlsZS4KLQkJCQkJLy8gQmVjYXVzZSBkaWZmZXJlbnQgdmFsaWRhdGlvbiBmcmFtZXdvcmtzIG1heSBhbGxvY2F0ZSBMaW5lTnVtYmVyUmVhZGVycwotCQkJCQkvLyBkaWZmZXJlbnRseSwgZG9uJ3QgY2xvc2UgdGhlIHJlYWRlciBpbiB0aGUgdmFsaWRhdG9yLiBJbnN0ZWFkLCBwYXNzIHRoZQotCQkJCQkvLyByZWFkZXIgYmFjayB0byB0aGUgaGVscGVyLCBhbmQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSByZWFkZXIgc2hvdWxkIAotCQkJCQkvLyBiZSBjbG9zZWQgb3IgcmV1c2VkLCB0aGUgaGVscGVyIGtub3dzIHRoZSByaWdodCB0aGluZyB0byBkbyBmb3IgaXRzCi0JCQkJCS8vIGZyYW1ld29yayBlbnZpcm9ubWVudC4KLQkJCQkJaGVscGVyLmxvYWRNb2RlbChQTW9kZWxFbnVtLlJFTEVBU0VfTElORUlOUFVUUkVBREVSLCBuZXcgT2JqZWN0W117cmVhZGVyfSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL1ZhbGlkYXRvclByb3BlcnR5RmlsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL1ZhbGlkYXRvclByb3BlcnR5RmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWRkMzZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9WYWxpZGF0b3JQcm9wZXJ0eUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLkFQcm9wZXJ0eUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlci5NZXNzYWdlTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBBUHJvcGVydHlGaWxlIHRoYXQgaXMgaW5zdGFudGlhdGVkIGJ5IGEgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yUHJvcGVydHlGaWxlIGV4dGVuZHMgQVByb3BlcnR5RmlsZSB7Ci0JcHJpdmF0ZSBJUmVwb3J0ZXIgX3JlcG9ydGVyID0gbnVsbDsKLQlwcml2YXRlIElWYWxpZGF0b3IgX3ZhbGlkYXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX2ZpbGVOYW1lID0gbnVsbDsgLy8gaWYgdGhpcyBpcyBjcmVhdGVkIGZyb20gYSByZWFkZXIgaW5zdGVhZCBvZiBhIGZpbGUgbmFtZSwgd2Ugb25seSBoYXZlIHRoZSBidW5kbGUgbmFtZQotCQotCXB1YmxpYyBWYWxpZGF0b3JQcm9wZXJ0eUZpbGUoTGluZU51bWJlclJlYWRlciByZWFkZXIsIFN0cmluZyBmaWxlTmFtZSwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlzdXBlcigpOwotCQlzZXRGaWxlTmFtZShmaWxlTmFtZSk7Ci0JCV9yZXBvcnRlciA9IHJlcG9ydGVyOwotCQlfdmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCQlwYXJzZUZpbGUocmVhZGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGJ1bmRsZU5hbWUpIHsKLQkJX2ZpbGVOYW1lID0gYnVuZGxlTmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSAucHJvcGVydGllcyBmaWxlIChvciBidW5kbGUpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBfZmlsZU5hbWU7Ci0JfQotCQotCS8qCi0JICogQHNlZSBBUHJvcGVydHlGaWxlI3JlcG9ydChTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwb3J0KFN0cmluZyBzdHIpIHsKLQkJLy8gTmV2ZXIgcHJpbnQgdGl0bGVzIGxpa2UgIkRVUExJQ0FURSBNRVNTQUdFIElEUyIuIFByaW50IG9ubHkgdGhlIElNZXNzYWdlLgotCX0KLQkKLQkvKgotCSAqIEBzZWUgQVByb3BlcnR5RmlsZSNyZXBvcnQoTWVzc2FnZU1ldGFEYXRhKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydChNZXNzYWdlTWV0YURhdGEgbW1kKSB7Ci0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZSgpOwotCQltZXNzYWdlLnNldEJ1bmRsZU5hbWUobW1kLmdldEJ1bmRsZU5hbWUoKSk7Ci0JCW1lc3NhZ2Uuc2V0U2V2ZXJpdHkoZ2V0U2V2ZXJpdHkobW1kLmdldFNldmVyaXR5KCkpKTsKLQkJbWVzc2FnZS5zZXRJZChtbWQuZ2V0SWQoKSk7Ci0JCW1lc3NhZ2Uuc2V0UGFyYW1zKG1tZC5nZXRQYXJhbXMoKSk7Ci0JCW1lc3NhZ2Uuc2V0VGFyZ2V0T2JqZWN0KG1tZC5nZXRUYXJnZXRPYmplY3QoKSk7Ci0JCW1lc3NhZ2Uuc2V0TGluZU5vKG1tZC5nZXRMaW5lTnVtYmVyKCkpOwotCQltZXNzYWdlLnNldExlbmd0aChtbWQuZ2V0TGVuZ3RoKCkpOwotCQltZXNzYWdlLnNldE9mZnNldChtbWQuZ2V0T2Zmc2V0KCkpOwotCQltZXNzYWdlLnNldExlbmd0aChtbWQuZ2V0TGVuZ3RoKCkpOwotCQlfcmVwb3J0ZXIuYWRkTWVzc2FnZShnZXRWYWxpZGF0b3IoKSwgbWVzc2FnZSk7Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIHRoZSBzZXZlcml0eSBvZiB0aGUgTWVzc2FnZU1ldGFEYXRhLCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiBzZXZlcml0eSBvZiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFNldmVyaXR5KGludCBtbWRTZXZlcml0eSkgewotCQlzd2l0Y2gobW1kU2V2ZXJpdHkpIHsKLQkJCWNhc2UoTWVzc2FnZU1ldGFEYXRhLkVSUk9SKTogewotCQkJCXJldHVybiBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCQkJfQotCQkJCi0JCQljYXNlKE1lc3NhZ2VNZXRhRGF0YS5JTkZPKTogewotCQkJCXJldHVybiBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0JCQl9Ci0JCQkKLQkJCWRlZmF1bHQ6IHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSVZhbGlkYXRvciBpbnN0YW5jZSB0aGF0IGlzIGNoZWNraW5nIHRoaXMgZmlsZS4KLQkgKi8KLQlwdWJsaWMgSVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBfdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGZpbGUgdGhhdCBpZGVudGlmaWVzIHRoaXMgZmlsZSB1bmlxdWVseS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZEZpbGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0RmlsZU5hbWUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9BUHJvcGVydHlGaWxlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL0FQcm9wZXJ0eUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjOGI5ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL0FQcm9wZXJ0eUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXI7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uTGluZU51bWJlclJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSAucHJvcGVydGllcyBmaWxlOyBleHRlbnNpb25zIG9mIHRoaXMgY2xhc3MgaW1wbGVtZW50Ci0gKiBlbnZpcm9ubWVudC1zcGVjaWZpYyBtZXNzYWdlcywgc3VjaCBhcyBob3cgdG8gcmVwb3J0IHRoZSBrbm93biBwcm9ibGVtcy4gVGhpcwotICogY2xhc3MsIGFuZCBldmVyeSBjbGFzcyBpbiB0aGUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlciBwYWNrYWdlLCBpcyBpbmRlcGVuZGVudAotICogb2YgdGhlIGZyYW1ld29yayBlbnZpcm9ubWVudC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFQcm9wZXJ0eUZpbGUgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUVVBTFMgPSAiPSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTGlzdCBfcHJvcGVydHlMaW5lcyA9IG51bGw7IC8vIFRoZSBMaXN0IG9mIFByb3BlcnR5TGluZSBpbnN0YW5jZXMuCi0JcHJpdmF0ZSBMaXN0IF9wYXJzZVdhcm5pbmdzID0gbnVsbDsgLy8gVGhlIExpc3Qgb2YgTWVzc2FnZU1ldGFEYXRhIHdhcm5pbmdzIGZvdW5kIHdoZW4gcGFyc2luZyB0aGUgLnByb3BlcnRpZXMgZmlsZS4KLQlwcml2YXRlIGJvb2xlYW4gX2RlYnVnID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuYW1lIHRoYXQgaWRlbnRpZmllcyB0aGlzIGZpbGUgdW5pcXVlbHkuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRRdWFsaWZpZWRGaWxlTmFtZSgpOwotCQotCS8qKgotCSAqIFRlbGwgdGhlIHVzZXIgdGhhdCB0aGVyZSBpcyBhIHByb2JsZW0gLSBpbiBXZWJTcGhlcmUgU3R1ZGlvLCB0aGlzCi0JICogc2hvd3MgdXAgYXMgYSByb3cgaW4gdGhlIFRhc2sgVmlldzsgaW4gdGhlIHNhbXBsZSBmaWxlc3lzdGVtIGZyYW1ld29yaywKLQkgKiB0aGlzIGFwcGVhcnMgYXMgYSBtZXNzYWdlIHRvIFN5c3RlbS5vdXQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVwb3J0KFN0cmluZyBzdHIpOwotCQotCS8qKgotCSAqIFRlbGwgdGhlIHVzZXIgdGhhdCB0aGVyZSBpcyBhIHByb2JsZW0gLSBpbiBXZWJTcGhlcmUgU3R1ZGlvLCB0aGlzCi0JICogc2hvd3MgdXAgYXMgYSByb3cgaW4gdGhlIFRhc2sgVmlldzsgaW4gdGhlIHNhbXBsZSBmaWxlc3lzdGVtIGZyYW1ld29yaywKLQkgKiB0aGlzIGFwcGVhcnMgYXMgYSBtZXNzYWdlIHRvIFN5c3RlbS5vdXQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVwb3J0KE1lc3NhZ2VNZXRhRGF0YSBtbWQpOwotCQotCXByb3RlY3RlZCBBUHJvcGVydHlGaWxlKCkgewotCQlfcHJvcGVydHlMaW5lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJX3BhcnNlV2FybmluZ3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCQotCS8qKgotCSAqIEFkZCB0aGUgTGlzdCBvZiBNZXNzYWdlTWV0YURhdGEgdG8gdGhlIGxpc3Qgb2Ygd2FybmluZyBtZXNzYWdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYXJzZVdhcm5pbmdzKExpc3QgbGlzdCkgewotCQlfcGFyc2VXYXJuaW5ncy5hZGRBbGwobGlzdCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgc2luZ2xlIHdhcm5pbmcgbWVzc2FnZSB0byB0aGUgbGlzdCBvZiBwYXJzZSB3YXJuaW5ncy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYXJzZVdhcm5pbmcoTWVzc2FnZU1ldGFEYXRhIG1tZCkgewotCQlfcGFyc2VXYXJuaW5ncy5hZGQobW1kKTsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybiB0aGUgTGlzdCBvZiB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgcmVwb3J0IHByb2JsZW1zIGZvdW5kCi0JICogd2hpbGUgcGFyc2luZyB0aGUgLnByb3BlcnRpZXMgZmlsZS4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQYXJzZVdhcm5pbmdzKCkgewotCQlyZXR1cm4gX3BhcnNlV2FybmluZ3M7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRRdWFsaWZpZWRGaWxlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFNob3VsZCBkZWJ1ZyBpbmZvcm1hdGlvbiBiZSBwcmludGVkIHdoZW4gcGFyc2luZz8KLQkgKi8JCi0JcHVibGljIGJvb2xlYW4gZGVidWcoKSB7Ci0JCXJldHVybiBfZGVidWc7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlYnVnKGJvb2xlYW4gZCkgewotCQlfZGVidWcgPSBkOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYobyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKCEobyBpbnN0YW5jZW9mIFByb3BlcnR5RmlsZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJUHJvcGVydHlGaWxlIGZpbGUgPSAoUHJvcGVydHlGaWxlKW87Ci0JCXJldHVybiBnZXRRdWFsaWZpZWRGaWxlTmFtZSgpLmVxdWFscyhmaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKS5oYXNoQ29kZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIGluIHRoZSBmaWxlLCBpbmNsdWRpbmcgZHVwbGljYXRlcyAmIGJsYW5rcy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bVByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBfcHJvcGVydHlMaW5lcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVkaW5nIG1lc3NhZ2UgaWRzIGFuZCBlcnJvciBpZHMsIG91dHB1dCB0aGUgbnVtYmVyIG9mIHdvcmRzIGluIHRoZQotCSAqIC5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHVibGljIGludCBnZXROdW1Xb3JkcygpIHsKLQkJLy8gTk9UIGEgZmFzdCBtZXRob2QuLi4uaG93IHRvIG9wdGltaXplPwotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9wcm9wZXJ0eUxpbmVzLml0ZXJhdG9yKCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJY291bnQgKz0gbGluZS5nZXROdW1Xb3JkcygpOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiB1bmlxdWUgbWVzc2FnZSBwcmVmaXhlcyBpbiB0aGUgZmlsZS4KLQkgKiAoQSBtZXNzYWdlIHByZWZpeCBzdGFydHMgdGhlIG1lc3NhZ2UgdGV4dCwgZS5nLiwgQUJDRDAwMDBFLikKLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bVVuaXF1ZVByZWZpeGVzKCkgewotCQlTZXQgdW5pcXVlSWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRQcm9wZXJ0eUxpbmVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYobGluZS5oYXNNZXNzYWdlUHJlZml4KCkpIHsKLQkJCQl1bmlxdWVJZHMuYWRkKGxpbmUuZ2V0TWVzc2FnZVByZWZpeCgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdW5pcXVlSWRzLnNpemUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBtZXNzYWdlIHByZWZpeGVzIHVzZWQgaW4gdGhlIGZpbGUuCi0JICogVXN1YWxseSB0aGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgdW5pcXVlIHByZWZpeGVzLCBidXQgaWYgCi0JICogYSAucHJvcGVydGllcyBmaWxlIGhhcyB2YXJpYXRpb25zIG9mIGEgbWVzc2FnZSAoc2xpZ2h0bHkgZGlmZmVyZW50IAotCSAqIHdvcmRpbmcgZm9yIGEgZGlmZmVyZW50IGNvbnRleHQpLCB0aGVuIHRoZSBudW1iZXIgb2YgcHJlZml4ZXMgd2lsbCAKLQkgKiBiZSBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBwcmVmaXhlc3MuCi0JICovCi0JcHVibGljIGludCBnZXROdW1QcmVmaXhlcygpIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRQcm9wZXJ0eUxpbmVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYobGluZS5oYXNNZXNzYWdlUHJlZml4KCkpIHsKLQkJCQljb3VudCsrOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzIHRoYXQgZG8gbm90IHVzZSBwcmVmaXhlcyBpbiB0aGUgZmlsZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bVdpdGhvdXRQcmVmaXhlcygpIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRQcm9wZXJ0eUxpbmVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoIWxpbmUuaGFzTWVzc2FnZVByZWZpeCgpKSB7Ci0JCQkJY291bnQrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgTGlzdCBvZiB0aGUgUHJvcGVydHlMaW5lIGluc3RhbmNlcyBjb250YWluZWQgaW4gdGhpcyBmaWxlLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb3BlcnR5TGluZXMoKSB7Ci0JCXJldHVybiBfcHJvcGVydHlMaW5lczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBQcm9wZXJ0eUxpbmUgaW5zdGFuY2UgdGhhdCBpcyBpZGVudGlmaWVkIGJ5IHRoZSAKLQkgKiBnaXZlbiBtZXNzYWdlSWQuCi0JICovCi0JcHVibGljIFByb3BlcnR5TGluZSBnZXRQcm9wZXJ0eUxpbmUoU3RyaW5nIG1lc3NhZ2VJZCkgewotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VJZENvbXBhcmF0b3IoKSk7Ci0JCWludCBpbmRleCA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChfcHJvcGVydHlMaW5lcywgbWVzc2FnZUlkLCBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VJZENvbXBhcmF0b3IoKSk7Ci0JCWlmKGluZGV4IDwgMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVByb3BlcnR5TGluZSByZXN1bHQgPSAoUHJvcGVydHlMaW5lKV9wcm9wZXJ0eUxpbmVzLmdldChpbmRleCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgdGhlIGZpbGUgdG8gY3JlYXRlIGEgY29sbGVjdGlvbiBvZiB1bmlxdWVseSBpZGVudGlmaWVkIAotCSAqIGtleXMgd2l0aCB0aGVpciBhc3NvY2lhdGVkIHZhbHVlcy4gSWYgdGhlcmUgYXJlIGFueSBkdXBsaWNhdGUgCi0JICoga2V5cywgdGhlIGxhc3QgdmFsdWUgaXMgdGhlIG9uZSB0aGF0IGlzIHN0b3JlZC4gU3RvcmUgdGhlIAotCSAqIHZhbHVlIG9mIHRoZSBkdXBsaWNhdGUga2V5cywgYW5kIHRoZSBsaW5lIG51bWJlciBvbiB3aGljaCAKLQkgKiBlYWNoIGluc3RhbmNlIG9mIHRoZSBrZXkgKGFuZCBpdHMgdmFsdWUpIGFyZSBsb2NhdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhcnNlRmlsZShGaWxlIHByb3BlcnR5RmlsZSkgewotCQlGaWxlUmVhZGVyIGlucHV0ID0gbnVsbDsKLQkJTGluZU51bWJlclJlYWRlciBsaW5lSW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBuZXcgRmlsZVJlYWRlcihwcm9wZXJ0eUZpbGUpOwotCQl9Ci0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gV2UgY2FuIGlnbm9yZSB0aGlzIGV4Y2VwdGlvbiBiZWNhdXNlIHdlIGhhdmUgYWxyZWFkeSBjaGVja2VkIGluIHRoZSBjb25zdHJ1Y3RvciB0aGF0IHRoZQotCQkJLy8gZmlsZSBleGlzdHMuCi0JCX0KLQotCQkvLyBCZWNhdXNlIHdlIHdhbnQgdG8gcmVhZCBpbiBhIGxpbmUgYXQgYSB0aW1lIGZyb20gdGhlIGZpbGUsIGNvbnZlcnQgdGhlIEZpbGVSZWFkZXIgdG8gYSBMaW5lUmVhZGVyCi0JCWxpbmVJbnB1dCA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKGlucHV0KTsKLQkJCi0JCXBhcnNlRmlsZShsaW5lSW5wdXQpOwotCQkKLQkJdHJ5IHsKLQkJCWxpbmVJbnB1dC5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJaW5wdXQgPSBudWxsOwotCQlsaW5lSW5wdXQgPSBudWxsOwotCX0KLQkJCi0JLyoqCi0JICogR2l2ZW4gYSBMaW5lTnVtYmVyUmVhZGVyIG9uIGEgLnByb3BlcnRpZXMgZmlsZSwgcmVhZCB0aGUKLQkgKiBmaWxlIGFuZCBub3RlIGFueSBwcm9ibGVtcyB0aGF0IG1heSBuZWVkIHRvIGJlIHJlcG9ydGVkIHRvCi0JICogdGhlIHVzZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VGaWxlKExpbmVOdW1iZXJSZWFkZXIgbGluZUlucHV0KSB7Ci0JCV9wcm9wZXJ0eUxpbmVzLmNsZWFyKCk7Ci0JCV9wYXJzZVdhcm5pbmdzLmNsZWFyKCk7Ci0KLQkJYm9vbGVhbiBpc05ld0tleSA9IHRydWU7Ci0JCVN0cmluZyBrZXkgPSBudWxsOwotCQlpbnQgbGluZU51bWJlciA9IDA7Ci0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSAwOyAvLyBlYWNoIC5wcm9wZXJ0aWVzIGxpbmUgbmVlZHMgdG8ga25vdyBpdHMgb2Zmc2V0IHNvIHRoYXQgY29sdW1ucyBpbiB0aGUgbGluZSBjYW4gYmUgY2FsY3VsYXRlZC4KLQkJaW50IG1lc3NhZ2VPZmZzZXQgPSAwOyAvLyB0aGUgb2Zmc2V0LCByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUsIHdoZXJlIHRoZSBtZXNzYWdlIHByZWZpeCBzdGFydHMKLQkJU3RyaW5nIGxpbmUgPSBudWxsOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJdHJ5IHsKLQkJCQlsaW5lID0gbGluZUlucHV0LnJlYWRMaW5lKCk7IC8vIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGluIHRoZSBmaW5hbGx5IGJsb2NrCi0JCQkJaWYgKGxpbmUgPT0gbnVsbCkKLQkJCQkJYnJlYWs7Ci0JCQkJbGluZSA9IGxpbmUudHJpbSgpOwotCi0JCQkJLy8gaWdub3JlIGJsYW5rIGxpbmVzCi0JCQkJaWYgKGxpbmUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQljb250aW51ZTsKLQotCQkJCS8vIHN0cmlwIG9mZiBsaW5lcyB0aGF0IGJlZ2luIHdpdGggJyMnCi0JCQkJaWYgKGxpbmUuc3RhcnRzV2l0aCgiIyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJLy8gc3RyaXAgb2ZmIGxpbmVzIHRoYXQgYmVnaW4gd2l0aCAnLycKLQkJCQlpZiAobGluZS5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAoaXNOZXdLZXkpIHsKLQkJCQkJLy8gV2Uga25vdyB0aGF0IHRoZSBsaW5lIGlzIG9mIHRoZSBmb3JtCi0JCQkJCS8vCi0JCQkJCS8vIEtFWU5BTUUgPSBWQUxVRQotCQkJCQkvLwotCQkJCQlpZiAobGluZS5pbmRleE9mKEVRVUFMUykgIT0gLTEpIHsKLQkJCQkJCS8vIE1ha2Ugc3VyZSB0aGUgbGluZSBpcyBub3Qgb2YgdGhlIGZvcm0gIiA9IE1lc3NhZ2UiIChpLmUuLCBtaXNzaW5nIHRoZSBtZXNzYWdlIGlkKS4KLQkJCQkJCWlmKGxpbmUuaW5kZXhPZihFUVVBTFMpID09IDApIHsKLQkJCQkJCQl0aHJvdyBuZXcgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJLy8gVGhlIHVzZXIgbWF5IG9yIG1heSBub3QgcHV0IHNwYWNlcyBiZXR3ZWVuIHRoZSBrZXkKLQkJCQkJCS8vIG5hbWUsIHRoZSBlcXVhbHMgc2lnbiwgYW5kIHRoZSB2YWx1ZS4gVGhpcyBnaXZlcyB1cyBmb3VyIGNhc2VzOgotCQkJCQkJLy8gICAgMS4ga2V5bmFtZT12YWx1ZQotCQkJCQkJLy8gICAgMi4ga2V5bmFtZT0gdmFsdWUKLQkJCQkJCS8vICAgIDMuIGtleW5hbWUgPXZhbHVlCi0JCQkJCQkvLyAgICA0LiBrZXluYW1lID0gdmFsdWUKLQkJCQkJCS8vIFRoZSB3YXkgdG8gZGVhbCB3aXRoIGFsbCBmb3VyIGNhc2VzIGlzIHRvIGZpbmQgdGhlIGluZGV4IG9mIHRoZQotCQkJCQkJLy8gJz0nIHNpZ24sIGFuZCB0aGUgdmFsdWUgaXMgdGhlIHJlbWFpbmRlciBvZiB0aGUgbGluZSBhZnRlciB0aGUKLQkJCQkJCS8vIHNpZ24uCi0JCQkJCQkvLwotCQkJCQkJa2V5ID0gbGluZS5zdWJzdHJpbmcoMCwgbGluZS5pbmRleE9mKEVRVUFMUykpOwotCQkJCQkJa2V5ID0ga2V5LnRyaW0oKTsKLQotCQkJCQkJLy8gYWRkIDEgdG8gdGhlIEVRVUFMUyBpbmRleCBiZWNhdXNlICc9JyBpcyBvbmUgY2hhcmFjdGVyIGxvbmcKLQkJCQkJCXZhbHVlID0gbGluZS5zdWJzdHJpbmcobGluZS5pbmRleE9mKEVRVUFMUykgKyAxKTsKLQkJCQkJCXZhbHVlID0gdmFsdWUudHJpbSgpOwotCi0JCQkJCQltZXNzYWdlT2Zmc2V0ID0gbGluZS5pbmRleE9mKHZhbHVlKTsKLQotCQkJCQkJbGluZU51bWJlciA9IGxpbmVJbnB1dC5nZXRMaW5lTnVtYmVyKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBlcnJvciBpbiBsaW5lIHN5bnRheAotCQkJCQkJdGhyb3cgbmV3IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG5lZWQgdG8gcmVhZCBpbiB0aGUgbXVsdGlwbGUgbGluZXMgdG8gZ2V0IHRoZSBtdWx0aS1saW5lIHZhbHVlCi0JCQkJCXZhbHVlICs9IGxpbmU7Ci0JCQkJfQotCi0JCQkJaWYgKHZhbHVlLmVuZHNXaXRoKCJcXCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gbXVsdGktbGluZSB2YWx1ZQotCQkJCQkvLyByZWFkIGluIGV2ZXJ5IGxpbmUgZnJvbSB0aGUgZmlsZSB1bnRpbCB5b3UgcmVhY2ggYW4gZW5kLW9mLWxpbmUKLQkJCQkJaXNOZXdLZXkgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGVuZCBvZiBtdWx0aS1saW5lIHZhbHVlLCBvciBlbmQgb2Ygc2luZ2xlLWxpbmUgdmFsdWUKLQkJCQkJaXNOZXdLZXkgPSB0cnVlOwotCQkJCQlQcm9wZXJ0eUxpbmUgcGxpbmUgPSBuZXcgUHJvcGVydHlMaW5lKHRoaXMsIG9mZnNldCwgbWVzc2FnZU9mZnNldCwga2V5LCB2YWx1ZSwgbGluZU51bWJlcik7Ci0JCQkJCV9wcm9wZXJ0eUxpbmVzLmFkZChwbGluZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBXaGVuIHRoZXJlIGlzIGFuIElPRXhjZXB0aW9uLCB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWYgYSBsaW5lIGlzIG5vdCBvZiB0aGUgZm9ybSBLRVlOQU1FID0gVkFMVUUsIHRoZXJlIG1pZ2h0IGJlIGEgbnVsbCBleGNlcHRpb24uCi0JCQkJLy8gSnVzdCBjb250aW51ZSBvbnRvIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGZpbGUKLQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuRVJST1IsIElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMDgwLCBudWxsLCB0aGlzLCBsaW5lSW5wdXQuZ2V0TGluZU51bWJlcigpKTsKLQkJCQlyZXBvcnQobW1kKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWYgYSBsaW5lIGlzIG5vdCBvZiB0aGUgZm9ybSBLRVlOQU1FID0gVkFMVUUsIHRoZXJlIG1pZ2h0IGJlIGEgTm9TdWNoRWxlbWVudCBleGNlcHRpb24uCi0JCQkJLy8gSnVzdCBjb250aW51ZSBvbnRvIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGZpbGUKLQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuRVJST1IsIElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMDgwLCBudWxsLCB0aGlzLCBsaW5lSW5wdXQuZ2V0TGluZU51bWJlcigpKTsKLQkJCQlyZXBvcnQobW1kKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmKGxpbmUgIT0gbnVsbCkgewotCQkJCQlvZmZzZXQgKz0gbGluZS5sZW5ndGgoKSArIDI7IC8vIGhhY2suIAotCQkJCQkvLyBDYW4ndCBnZXQgb2Zmc2V0IGZyb20gQnVmZmVyZWRSZWFkZXIsIGFuZCBzaW5jZSB0aGUgcmVhZGVyIHN0cmlwcyAKLQkJCQkJLy8gdGhlICdcbicgYW5kICdccicgZnJvbSB0aGUgbGluZSBiZWZvcmUgdGhlIGxpbmUgaXMgcmV0dXJuZWQsIHRoZSAKLQkJCQkJLy8gdHJ1ZSBsZW5ndGggb2YgdGhlIGxpbmUgY2FuJ3QgYmUgYXNjZXJ0YWluZWQuIFRoaXMgaGFjayB3aWxsIG5vdCAKLQkJCQkJLy8gd29yayBvbiBVbml4IGJlY2F1c2UgdW5peCdzIEVPTCBjaGFyIGlzIGRpZmZlcmVudCB0aGFuIFdpbmRvd3MuCi0JCQkJCS8vCi0JCQkJCS8vIFdoZW4gdGhlcmUncyB0aW1lLCBuZWVkIHRvIGZpbmQgYW4gYWx0ZXJuYXRpdmUgdG8gTGluZU51bWJlclJlYWRlci4KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgYSBsaXN0IG9mIGFsbCBtZXNzYWdlIHByZWZpeGVzLCBlLmcuLCBBQkNEMDAwMEUsIHRoYXQgYXJlIHVzZWQKLQkgKiBpbiB0aGUgLnByb3BlcnRpZXMgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludEFsbE1lc3NhZ2VQcmVmaXhlcygpIHsKLQkJcmVwb3J0KCJMaW5lIE51bWJlclx0TWVzc2FnZSBwcmVmaXhcdE1lc3NhZ2UgaWQiKTsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yKCkpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9wcm9wZXJ0eUxpbmVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKChsaW5lLmdldE1lc3NhZ2VQcmVmaXgoKSAhPSBudWxsKSAmJiAoIWxpbmUuZ2V0TWVzc2FnZVByZWZpeCgpLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihTdHJpbmcudmFsdWVPZihsaW5lLmdldExpbmVOdW1iZXIoKSkpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKGxpbmUuZ2V0TWVzc2FnZVByZWZpeCgpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChsaW5lLmdldE1lc3NhZ2VJZCgpKTsKLQkJCQlyZXBvcnQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgYSBsaXN0IG9mIGFsbCBvZiB0aGUgbWVzc2FnZSBwcmVmaXhlcywgZS5nLiwgQUJDRDExMTFFLCAKLQkgKiB0aGF0IGFyZSBub3QgdXNlZCBpbiB0aGUgZmlsZS4gQSBtZXNzYWdlIHByZWZpeCBpcyBjb25zaWRlcmVkCi0JICogJnF1b3Q7bWlzc2luZyZxdW90OyBpZiBhIG1lc3NhZ2UgcHJlZml4IHRoYXQgcHJlY2VkZXMgaXQsIAotCSAqIGUuZy4gQUJDRDAwMDBFLCBhbmQgYSBtZXNzYWdlIHByZWZpeCB0aGF0IGZvbGxvd3MgaXQsIAotCSAqIGUuZy4gQUJDRDIyMjJFLCBhcmUgY29udGFpbmVkIGluIHRoZSBmaWxlLCBidXQgdGhlIHByZWZpeCBpcyBub3QuCi0JICogVGhpcyBsaXN0IGlzIHVzZWZ1bCB3aGVuIGFkZGluZyBhIG5ldyBtZXNzYWdlIHRvIHRoZSBmaWxlOwotCSAqIHRoZSBwcmVmaXhlcyBwcmludGVkIGJ5IHRoaXMgbWV0aG9kIGFyZSB1bnVzZWQgYW5kIG9uZSBjYW4gYmUKLQkgKiBzZWxlY3RlZCBmb3IgdGhlIG5ldyBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRBbGxNaXNzaW5nTWVzc2FnZVByZWZpeGVzKCkgewotCQlpbnQgbGFzdE51bWJlciA9IC0xOwotCQkKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmcgcHJlZml4ID0gbGluZS5nZXRNZXNzYWdlUHJlZml4KCk7Ci0JCQlpbnQgcHJlZml4TnVtYmVyID0gMDsKLQkJCWlmKHByZWZpeCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWlmKHByZWZpeC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIHByZWZpeExldHRlcnMgPSBwcmVmaXguc3Vic3RyaW5nKDAsIDQpOyAvLyAiQUJDRCIgb2YgIkFCQ0QwMDAwVyIKLQkJCXRyeSB7Ci0JCQkJLy8gUmU6IG1hZ2ljIG51bWJlcnMgIjQiIGFuZCAiOCIgYmVsb3cuCi0JCQkJLy8gU2luY2UgdGhlIG1lc3NhZ2UgcHJlZml4IGlzIG9mIHRoZSBmb3JtIEFCQ0QwMDAwRSwKLQkJCQkvLyBzdHJpcCBvZmYgdGhlIGZpcnN0IGZvdXIgY2hhcmFjdGVycyB1cCB0byAoYW5kIGV4Y2x1ZGluZykgdGhlIAotCQkJCS8vIGVpZ2h0aCBjaGFyYWN0ZXIsICJFIi4KLQkJCQlwcmVmaXhOdW1iZXIgPSBJbnRlZ2VyLnBhcnNlSW50KHByZWZpeC5zdWJzdHJpbmcoNCwgOCkpOwotCQkJfQotCQkJY2F0Y2goTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBqdXN0IGNvbnRpbnVlCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZihsYXN0TnVtYmVyICE9IC0xKSB7Ci0JCQkJaWYocHJlZml4TnVtYmVyICE9IChsYXN0TnVtYmVyICsgMSkpIHsKLQkJCQkJLy8gU3RhcnQgYXQgbGFzdE51bWJlciArIDEgYmVjYXVzZSBsYXN0TnVtYmVyIGV4aXN0cy4KLQkJCQkJLy8gRXhjbHVkZSBwcmVmaXhOdW1iZXIgYmVjYXVzZSBwcmVmaXhOdW1iZXIgZXhpc3RzLgotCQkJCQlmb3IoaW50IGk9bGFzdE51bWJlcisxOyBpPHByZWZpeE51bWJlcjsgaSsrKSB7Ci0JCQkJCQlyZXBvcnQocHJlZml4TGV0dGVycyArIGkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJbGFzdE51bWJlciA9IHByZWZpeE51bWJlcjsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50IGFsbCBvZiB0aGUgbWVzc2FnZXMgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUgdGhhdCB1c2UKLQkgKiBhIG1lc3NhZ2UgcHJlZml4LCBlLmcuIEFCQ0QwMDAwRS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludEFsbE1lc3NhZ2VzV2l0aEFNZXNzYWdlUHJlZml4KCkgewotCQlyZXBvcnQoIk1FU1NBR0VTIFdJVEggUFJFRklYRVMiKTsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldExpbmVOb0NvbXBhcmF0b3IoKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYobGluZS5oYXNNZXNzYWdlUHJlZml4KCkpIHsKLQkJCQlyZXBvcnQobGluZS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50IGFsbCBvZiB0aGUgbWVzc2FnZXMgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUgd2hvc2UgbWVzc2FnZQotCSAqIHRleHQgZG9lcyBub3QgYmVnaW4gd2l0aCBhIG1lc3NhZ2UgcHJlZml4LCBlLmcuLCBBQkNEMDAwMEUuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRBbGxNZXNzYWdlc1dpdGhvdXRBTWVzc2FnZVByZWZpeCgpIHsKLQkJcmVwb3J0KCJCTEFOSyBNRVNTQUdFIFBSRUZJWCIpOyAvLyROT04tTkxTLTEkCi0JCUNvbGxlY3Rpb25zLnNvcnQoX3Byb3BlcnR5TGluZXMsIFByb3BlcnR5TGluZUNvbXBhcmF0b3IuZ2V0TGluZU5vQ29tcGFyYXRvcigpKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZighbGluZS5oYXNNZXNzYWdlUHJlZml4KCkpIHsKLQkJCQlyZXBvcnQobGluZS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQcmludCBhIGxpc3Qgb2YgYWxsIG1lc3NhZ2VzIHdob3NlIHRleHQgaXMgdGhlIGVtcHR5IHN0cmluZyAoJnF1b3Q7JnF1b3Q7KS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludEFsbE1lc3NhZ2VzV2hpY2hBcmVCbGFuaygpIHsKLQkJcmVwb3J0KCJCTEFOSyBNRVNTQUdFUyIpOyAvLyROT04tTkxTLTEkCi0JCUNvbGxlY3Rpb25zLnNvcnQoX3Byb3BlcnR5TGluZXMsIFByb3BlcnR5TGluZUNvbXBhcmF0b3IuZ2V0TGluZU5vQ29tcGFyYXRvcigpKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihsaW5lLmdldE1lc3NhZ2UoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigibGluZSBudW1iZXIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKGxpbmUuZ2V0TGluZU51bWJlcigpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCIsIG1lc3NhZ2UgaWQgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKGxpbmUuZ2V0TWVzc2FnZUlkKCkpOwotCQkJCXJlcG9ydChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgYSBsaXN0IG9mIHRoZSBsaW5lcyB0aGF0IGhhdmUgc3ludGF4IGVycm9ycywgZm9yIGV4YW1wbGUsCi0JICogbWlzc2luZyB0aGUgZXF1YWxzIHNpZ24gYmV0d2VlbiB0aGUgbWVzc2FnZSBpZCBhbmQgdGhlIG1lc3NhZ2UgCi0JICogdGV4dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFN5bnRheFdhcm5pbmdzKCkgewotCQlMaXN0IHBhcnNlV2FybmluZ3MgPSBnZXRQYXJzZVdhcm5pbmdzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcGFyc2VXYXJuaW5ncy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZXBvcnQoKE1lc3NhZ2VNZXRhRGF0YSlpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgYSBsaXN0IG9mIGFsbCBvZiB0aGUgbWVzc2FnZXMgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUgdGhhdAotCSAqIHVzZSB0aGUgc2FtZSBtZXNzYWdlIGlkLiBJZiBtb3JlIHRoYW4gb25lIG1lc3NhZ2UgdXNlcyB0aGUgc2FtZQotCSAqIGlkLCB3aGVuIHRoZSBSZXNvdXJjZUJ1bmRsZSBpcyBhc2tlZCBmb3IgdGhhdCBtZXNzYWdlIGlkLCBpdCB3aWxsCi0JICogcmV0dXJuIHRoZSBsYXN0IG1lc3NhZ2UgKGkuZS4sIHRoZSBsYXJnZXN0IGxpbmUgbnVtYmVyKSB3aXRoIHRoYXQKLQkgKiBpZCBpbiB0aGUgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludER1cGxpY2F0ZU1lc3NhZ2VJZCgpIHsKLQkJcHJpbnREdXBsaWNhdGVNZXNzYWdlSWQodHJ1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFByaW50IGEgbGlzdCBvZiBhbGwgb2YgdGhlIG1lc3NhZ2VzIGluIHRoZSAucHJvcGVydGllcyBmaWxlIHRoYXQKLQkgKiB1c2UgdGhlIHNhbWUgbWVzc2FnZSBpZC4gSWYgbW9yZSB0aGFuIG9uZSBtZXNzYWdlIHVzZXMgdGhlIHNhbWUKLQkgKiBpZCwgd2hlbiB0aGUgUmVzb3VyY2VCdW5kbGUgaXMgYXNrZWQgZm9yIHRoYXQgbWVzc2FnZSBpZCwgaXQgd2lsbAotCSAqIHJldHVybiB0aGUgbGFzdCBtZXNzYWdlIChpLmUuLCB0aGUgbGFyZ2VzdCBsaW5lIG51bWJlcikgd2l0aCB0aGF0Ci0JICogaWQgaW4gdGhlIGZpbGUuCi0JICogCi0JICogVGhlIGJvb2xlYW4gcGFyYW1ldGVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IAotCSAqIHRoZSAmcXVvdDtEVVBMSUNBVEUgTUVTU0FHRSBJRFMmcXVvdDsgdGl0bGUgaXMgZW1pdHRlZCBiZWZvcmUgCi0JICogdGhlIGxpc3Qgb2YgZHVwbGljYXRlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludER1cGxpY2F0ZU1lc3NhZ2VJZChib29sZWFuIHByaW50VGl0bGUpIHsKLQkJaWYocHJpbnRUaXRsZSkgewotCQkJcmVwb3J0KCJEVVBMSUNBVEUgTUVTU0FHRSBJRFMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUNvbXBhcmF0b3IgYyA9IFByb3BlcnR5TGluZUNvbXBhcmF0b3IuZ2V0TWVzc2FnZUlkQ29tcGFyYXRvcigpOwotCQlTdHJpbmcgbWVzc2FnZUlkID0gSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAwNjA7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoX3Byb3BlcnR5TGluZXMsIGMpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9wcm9wZXJ0eUxpbmVzLml0ZXJhdG9yKCk7Ci0JCVByb3BlcnR5TGluZSBsYXN0TGluZSA9IG51bGw7Ci0JCVByb3BlcnR5TGluZSBsaW5lID0gbnVsbDsKLQkJYm9vbGVhbiBuZWVkVG9QcmludExhc3QgPSBmYWxzZTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlsYXN0TGluZSA9IGxpbmU7Ci0JCQlsaW5lID0gKFByb3BlcnR5TGluZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkKLQkJCWlmKGMuY29tcGFyZShsYXN0TGluZSwgbGluZSkgPT0gMCkgewotCQkJCW5lZWRUb1ByaW50TGFzdCA9IHRydWU7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLldBUk5JTkcsIG1lc3NhZ2VJZCwgbmV3IFN0cmluZ1tde2xhc3RMaW5lLmdldE1lc3NhZ2VJZCgpfSwgbGFzdExpbmUsIGxhc3RMaW5lLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJcmVwb3J0KG1tZCk7Ci0JCQl9Ci0JCQllbHNlIGlmKG5lZWRUb1ByaW50TGFzdCkgewotCQkJCS8vIFRoZSBsYXN0IGR1cGxpY2F0ZSBsaW5lIG5lZWRzIHRvIGJlIHByaW50ZWQsIGJlY2F1c2UgbGFzdExpbmUgaXMgYWx3YXlzIHByaW50ZWQgYnV0IGxpbmUgbmVlZHMgdG8gYmUgcHJpbnRlZCB0b28uCi0JCQkJbmVlZFRvUHJpbnRMYXN0ID0gZmFsc2U7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLldBUk5JTkcsIG1lc3NhZ2VJZCwgbmV3IFN0cmluZ1tde2xhc3RMaW5lLmdldE1lc3NhZ2VJZCgpfSwgbGFzdExpbmUsIGxhc3RMaW5lLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJcmVwb3J0KG1tZCk7Ci0JCQl9Ci0JCX0KLQotCQlpZihuZWVkVG9QcmludExhc3QpIHsKLQkJCS8vIFRoZSBsYXN0IGR1cGxpY2F0ZSBsaW5lIG5lZWRzIHRvIGJlIHByaW50ZWQsIGJlY2F1c2UgbGFzdExpbmUgaXMgYWx3YXlzIHByaW50ZWQgYnV0IGxpbmUgbmVlZHMgdG8gYmUgcHJpbnRlZCB0b28uCi0JCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuV0FSTklORywgbWVzc2FnZUlkLCBuZXcgU3RyaW5nW117bGluZS5nZXRNZXNzYWdlSWQoKX0sIGxpbmUsIGxpbmUuZ2V0TGluZU51bWJlcigpKTsKLQkJCXJlcG9ydChtbWQpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFByaW50IGEgbGlzdCBvZiBhbGwgb2YgdGhlIG1lc3NhZ2VzIGluIHRoZSAucHJvcGVydGllcyBmaWxlIHRoYXQKLQkgKiBkbyBub3QgdXNlIGEgdW5pcXVlIG1lc3NhZ2UgcHJlZml4IChlLmcuLCBBQkNEMDAwMEUpLCB3aXRoIHRoZSAKLQkgKiBleGNlcHRpb24gb2YgYWxsIG1lc3NhZ2VzIHdoaWNoIGFyZSBpbnRlbmRlZCB0byBiZSBkdXBsaWNhdGVzLgotCSAqIEdlbmVyYWxseSwgdXNlcnMgZXhwZWN0IG9uZSBtZXNzYWdlIHByZWZpeCBwZXIgcHJvYmxlbSwgc28gCi0JICogcmV1c2VkIG1lc3NhZ2UgcHJlZml4ZXMgY2FuIGJlIGNvbmZ1c2luZy4gQW55IG1lc3NhZ2Ugd2hpY2ggCi0JICogZGVsaWJlcmF0ZWx5IHJldXNlcyBhIG1lc3NhZ2UgcHJlZml4IG11c3QgdXNlIGEgbWVzc2FnZSBpZCAKLQkgKiB0aGF0IHN0YXJ0cyB3aXRoIHRoYXQgcHJlZml4LgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50RHVwbGljYXRlTWVzc2FnZVByZWZpeCgpIHsKLQkJcHJpbnREdXBsaWNhdGVNZXNzYWdlUHJlZml4KHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBQcmludCBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBtZXNzYWdlcyBpbiB0aGUgLnByb3BlcnRpZXMgZmlsZSB0aGF0Ci0JICogZG8gbm90IHVzZSBhIHVuaXF1ZSBtZXNzYWdlIHByZWZpeCAoZS5nLiwgQUJDRDAwMDBFKSwgd2l0aCB0aGUgCi0JICogZXhjZXB0aW9uIG9mIGFsbCBtZXNzYWdlcyB3aGljaCBhcmUgaW50ZW5kZWQgdG8gYmUgZHVwbGljYXRlcy4KLQkgKiBHZW5lcmFsbHksIHVzZXJzIGV4cGVjdCBvbmUgbWVzc2FnZSBwcmVmaXggcGVyIHByb2JsZW0sIHNvIAotCSAqIHJldXNlZCBtZXNzYWdlIHByZWZpeGVzIGNhbiBiZSBjb25mdXNpbmcuIEFueSBtZXNzYWdlIHdoaWNoIAotCSAqIGRlbGliZXJhdGVseSByZXVzZXMgYSBtZXNzYWdlIHByZWZpeCBtdXN0IHVzZSBhIG1lc3NhZ2UgaWQgCi0JICogdGhhdCBzdGFydHMgd2l0aCB0aGF0IHByZWZpeC4KLQkgKiAKLQkgKiBUaGUgYm9vbGVhbiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgCi0JICogdGhlICZxdW90O0RVUExJQ0FURSBNRVNTQUdFIFBSRUZJWEVTUyZxdW90OyB0aXRsZSBpcyBlbWl0dGVkIAotCSAqIGJlZm9yZSB0aGUgbGlzdCBvZiBkdXBsaWNhdGVzLgotCSAqLwkKLQlwdWJsaWMgdm9pZCBwcmludER1cGxpY2F0ZU1lc3NhZ2VQcmVmaXgoYm9vbGVhbiBwcmludFRpdGxlKSB7Ci0JCWlmKHByaW50VGl0bGUpIHsKLQkJCXJlcG9ydCgiRFVQTElDQVRFIE1FU1NBR0UgUFJFRklYRVMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUNvbXBhcmF0b3IgYyA9IFByb3BlcnR5TGluZUNvbXBhcmF0b3IuZ2V0TWVzc2FnZVByZWZpeENvbXBhcmF0b3IoKTsKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgYyk7Ci0JCVN0cmluZyBtZXNzYWdlSWQgPSBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDA3MDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQlQcm9wZXJ0eUxpbmUgbGFzdExpbmUgPSBudWxsOwotCQlQcm9wZXJ0eUxpbmUgbGluZSA9IG51bGw7Ci0JCWJvb2xlYW4gbmVlZFRvUHJpbnRMYXN0ID0gZmFsc2U7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbGFzdExpbmUgPSBsaW5lOwotCQkJbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJCi0JCQlpZihsYXN0TGluZSAhPSBudWxsKSB7Ci0JCQkJaWYoIWxhc3RMaW5lLmdldE1lc3NhZ2VJZCgpLnN0YXJ0c1dpdGgobGFzdExpbmUuZ2V0U2hvcnRNZXNzYWdlUHJlZml4KCkpKSB7Ci0JCQkJCWlmKGMuY29tcGFyZShsYXN0TGluZSwgbGluZSkgPT0gMCkgewotCQkJCQkJbmVlZFRvUHJpbnRMYXN0ID0gdHJ1ZTsKLQkJCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5XQVJOSU5HLCBtZXNzYWdlSWQsIG5ldyBTdHJpbmdbXXtsYXN0TGluZS5nZXRNZXNzYWdlUHJlZml4KCl9LCBsYXN0TGluZSwgbGFzdExpbmUuZ2V0TGluZU51bWJlcigpKTsKLQkJCQkJCXJlcG9ydChtbWQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYobmVlZFRvUHJpbnRMYXN0KSB7Ci0JCQkJCQkvLyBUaGUgbGFzdCBkdXBsaWNhdGUgbGluZSBuZWVkcyB0byBiZSBwcmludGVkLCBiZWNhdXNlIGxhc3RMaW5lIGlzIGFsd2F5cyBwcmludGVkIGJ1dCBsaW5lIG5lZWRzIHRvIGJlIHByaW50ZWQgdG9vLgotCQkJCQkJbmVlZFRvUHJpbnRMYXN0ID0gZmFsc2U7Ci0JCQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuV0FSTklORywgbWVzc2FnZUlkLCBuZXcgU3RyaW5nW117bGFzdExpbmUuZ2V0TWVzc2FnZVByZWZpeCgpfSwgbGFzdExpbmUsIGxhc3RMaW5lLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJCQlyZXBvcnQobW1kKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmKGxhc3RMaW5lICE9IG51bGwpIHsKLQkJCWlmKCFsYXN0TGluZS5nZXRNZXNzYWdlSWQoKS5zdGFydHNXaXRoKGxhc3RMaW5lLmdldFNob3J0TWVzc2FnZVByZWZpeCgpKSkgewotCQkJCWlmKG5lZWRUb1ByaW50TGFzdCkgewotCQkJCQkvLyBUaGUgbGFzdCBkdXBsaWNhdGUgbGluZSBuZWVkcyB0byBiZSBwcmludGVkLCBiZWNhdXNlIGxhc3RMaW5lIGlzIGFsd2F5cyBwcmludGVkIGJ1dCBsaW5lIG5lZWRzIHRvIGJlIHByaW50ZWQgdG9vLgotCQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuV0FSTklORywgbWVzc2FnZUlkLCBuZXcgU3RyaW5nW117bGluZS5nZXRNZXNzYWdlUHJlZml4KCl9LCBsaW5lLCBsaW5lLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJCXJlcG9ydChtbWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50IGEgbGlzdCBvZiBtZXNzYWdlIHByZWZpeGVzIHdob3NlIGZpcnN0IGNoYXJhY3RlcnMgbWF0Y2gKLQkgKiB0aGUgcHJlZml4IHBhcmFtZXRlci4gVGhpcyBtZXRob2QgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VlCi0JICogaWYgYSByYW5nZSBvZiBwcmVmaXhlcyBpcyBpbiB1c2Ugb3Igbm90LgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50TWVzc2FnZVByZWZpeFN0YXJ0aW5nV2l0aChmaW5hbCBTdHJpbmcgcHJlZml4KSB7Ci0JCXJlcG9ydCgiRmluZCBhbGwgZXJyb3IgcHJlZml4ZXMgc3RhcnRpbmcgd2l0aCAiICsgcHJlZml4KTsgLy8kTk9OLU5MUy0xJAotCQlDb21wYXJhdG9yIGMgPSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yKCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoX3Byb3BlcnR5TGluZXMsIGMpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9wcm9wZXJ0eUxpbmVzLml0ZXJhdG9yKCk7Ci0JCVByb3BlcnR5TGluZSBsaW5lID0gbnVsbDsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlsaW5lID0gKFByb3BlcnR5TGluZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobGluZS5nZXRNZXNzYWdlUHJlZml4KCkuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoU3RyaW5nLnZhbHVlT2YobGluZS5nZXRMaW5lTnVtYmVyKCkpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChsaW5lLmdldE1lc3NhZ2VQcmVmaXgoKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQobGluZS5nZXRNZXNzYWdlSWQoKSk7Ci0JCQkJcmVwb3J0KGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQcmludCB0aGUgbGFzdCBwcmVmaXggKGkuZS4sIHRoZSBvbmUgd2l0aCB0aGUgbGFyZ2VzdCBudW1iZXIsIAotCSAqIGUuZy4gQUJDRDIyMjIgaXMgbGFyZ2VyIHRoYW4gQUJDRDExMTEgb3IgQUJDRDAwMDApIGluIHRoZSBmaWxlIAotCSAqIHdob3NlIGZpcnN0IGNoYXJhY3RlcnMgbWF0Y2ggdGhlIHByZWZpeCBwYXJhbWV0ZXIuIAotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50TGFzdE1lc3NhZ2VQcmVmaXhTdGFydGluZ1dpdGgoZmluYWwgU3RyaW5nIHByZWZpeCkgewotCQlyZXBvcnQoIkZpbmQgbGFzdCBlcnJvciBwcmVmaXggc3RhcnRpbmcgd2l0aCAiICsgcHJlZml4KTsgLy8kTk9OLU5MUy0xJAotCQlDb21wYXJhdG9yIGMgPSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yKCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoX3Byb3BlcnR5TGluZXMsIGMpOwotCQlQcm9wZXJ0eUxpbmVbXSBsaW5lcyA9IG5ldyBQcm9wZXJ0eUxpbmVbX3Byb3BlcnR5TGluZXMuc2l6ZSgpXTsKLQkJX3Byb3BlcnR5TGluZXMudG9BcnJheShsaW5lcyk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yKGludCBpPWxpbmVzLmxlbmd0aDsgaT4tMTsgaS0tKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IGxpbmVzW2ldOwotCQkJaWYgKGxpbmUuZ2V0TWVzc2FnZVByZWZpeCgpLnN0YXJ0c1dpdGgocHJlZml4KSkgewotCQkJCXJlcG9ydChsaW5lLnRvU3RyaW5nKCkpOwotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZighZm91bmQpIHsKLQkJCXJlcG9ydCgiTm8gZXJyb3IgaWRzIHdlcmUgZm91bmQgdGhhdCBzdGFydGVkIHdpdGggIiArIHByZWZpeCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdpdmVuIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIHN1YnN0aXR1dGlvbiBwYXJhbWV0ZXIsCi0JICogcHJpbnQgYSBsaXN0IG9mIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIGdpdmVuIG1lc3NhZ2UsIGlmIGVhY2ggCi0JICogcGFyYW1ldGVyIGlzIHJlcGxhY2VkIHdpdGggJnF1b3Q7bGVuZ3RoJnF1b3Q7IGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRFeHBlY3RlZFN0cmluZ0xlbmd0aChmaW5hbCBpbnQgbGVuZ3RoKSB7Ci0JCXJlcG9ydCgiRVhQRUNURUQgTEVOR1RIIE9GIE1FU1NBR0UgV0lUSCBQQVJBTUVURVJTICIgKyBsZW5ndGggKyAiIExPTkciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUNvbXBhcmF0b3IgYyA9IFByb3BlcnR5TGluZUNvbXBhcmF0b3IuZ2V0U3RyaW5nTGVuZ3RoQ29tcGFyYXRvcihsZW5ndGgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBjKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCJMZW5ndGg6ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKGxpbmUuZ2V0RXhwZWN0ZWRMZW5ndGgobGVuZ3RoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKGxpbmUudG9TdHJpbmdXaXRoRXhwZWN0ZWRMZW5ndGgobGVuZ3RoKSk7Ci0JCQlyZXBvcnQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGVhY2ggbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFN0cmluZ0xlbmd0aCgpIHsKLQkJLy8gIjAiIG1lYW5zIG5vIHN1YnN0aXR1dGlvbgotCQlwcmludEV4cGVjdGVkU3RyaW5nTGVuZ3RoKDApOwotCX0KLQotCS8qKgotCSAqIFByaW50IHRoZSBjb250ZW50cyBvZiB0aGUgLnByb3BlcnRpZXMgZmlsZSwgc29ydGVkIGJ5IG1lc3NhZ2UgaWQuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRDb250ZW50cygpIHsKLQkJcmVwb3J0KCJDT05URU5UUyBPRiAucHJvcGVydGllcyBGSUxFLCBTT1JURUQgQlkgTUVTU0FHRSBJRCIpOyAvLyROT04tTkxTLTEkCi0JCUNvbXBhcmF0b3IgYyA9IFByb3BlcnR5TGluZUNvbXBhcmF0b3IuZ2V0TWVzc2FnZUlkQ29tcGFyYXRvcigpOwotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBjKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlyZXBvcnQobGluZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvQ29tcGFyZVByb3BlcnRpZXMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvQ29tcGFyZVByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNhYjQxMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL0NvbXBhcmVQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb21wYXJlcyB0d28gLnByb3BlcnRpZXMgZmlsZSBhbmQgb3V0cHV0cyBhIGxpc3QKLSAqIG9mIHRoZSBkaWZmZXJlbmNlcy4gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNvdW50IHRoZSBudW1iZXIKLSAqIG9mIHdvcmRzIHRoYXQgaGF2ZSBjaGFuZ2VkLgotICovCi1wdWJsaWMgY2xhc3MgQ29tcGFyZVByb3BlcnRpZXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGxpbmVTZXBhcmF0b3IgPSBqYXZhLmxhbmcuU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBUcmVlU2V0IF9kZWxldGVkID0gbnVsbDsKLQlwcml2YXRlIFRyZWVNYXAgX2NoYW5nZWQgPSBudWxsOwotCXByaXZhdGUgVHJlZVNldCBfYWRkZWQgPSBudWxsOwotLy8JcHJpdmF0ZSBQcm9wZXJ0eUZpbGUgX29sZEZpbGUgPSBudWxsOwotCXByaXZhdGUgUHJvcGVydHlGaWxlIF9uZXdGaWxlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzdG9yZSBQcm9wZXJ0eUxpbmUgaW5zdGFuY2VzIHdoaWNoIGhhdmUgdGhlIHNhbWUKLQkgKiBtZXNzYWdlIGlkLCBidXQgZGlmZmVyZW50IHZhbHVlcy4gV2hlbiB0aGUgbGlzdCBvZiBkaWZmZXJlbmNlcyBpcyBvdXRwdXQsCi0JICogYWxsIHZhbHVlcyBhcmUgb3V0cHV0IHNvIHRoYXQgdGhlIHVzZXIgY2FuIGNvbXBhcmUgdGhlIGxpbmVzIG1hbnVhbGx5LCB0bwotCSAqIHNlZSB3aGF0J3MgZGlmZmVyZW50LgotCSAqLwotCWNsYXNzIENvbXBhcmVMaW5lIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7Ci0JCXByaXZhdGUgQXJyYXlMaXN0IF9saW5lczsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX21lc3NhZ2VJZDsKLQotCQlwdWJsaWMgQ29tcGFyZUxpbmUoU3RyaW5nIG1lc3NhZ2VJZCkgewotCQkJX21lc3NhZ2VJZCA9IG1lc3NhZ2VJZDsKLQkJCV9saW5lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZChQcm9wZXJ0eUxpbmUgb2xkTGluZSwgUHJvcGVydHlMaW5lIG5ld0xpbmUpIHsKLQkJCV9saW5lcy5hZGQobmV3IFByb3BlcnR5TGluZVtde29sZExpbmUsIG5ld0xpbmV9KTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfbGluZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlidWZmZXIuYXBwZW5kKGxpbmVTZXBhcmF0b3IpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUxpbmVbXSBsaW5lcyA9IChQcm9wZXJ0eUxpbmVbXSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCi0JCQkJYnVmZmVyLmFwcGVuZChsaW5lc1swXSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQobGluZXNbMV0pOwotCQkJfQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNpbmNlIHRoaXMgaXMgYSBjaGFuZ2VkIHN0cmluZywgcmV0dXJuIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIG9mIHdvcmRzIGJldHdlZW4gdGhlIHN0cmluZ3MuCi0JCSAqLwkJCi0JCXB1YmxpYyBpbnQgZ2V0TnVtV29yZHMoKSB7Ci0JCQlpbnQgbnVtV29yZHMgPSAwOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfbGluZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlQcm9wZXJ0eUxpbmVbXSBsaW5lcyA9IChQcm9wZXJ0eUxpbmVbXSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJbnVtV29yZHMgPSBudW1Xb3JkcyArIGNvbXBhcmUobGluZXNbMF0sIGxpbmVzWzFdKTsKLQkJCX0KLQkJCXJldHVybiBudW1Xb3JkczsKLQkJfQotCQkKLQkJcHJpdmF0ZSBpbnQgY29tcGFyZShQcm9wZXJ0eUxpbmUgb2xkTGluZSwgUHJvcGVydHlMaW5lIG5ld0xpbmUpIHsKLQkJCS8vIEZvciBldmVyeSB3b3JkIGluIHRoZSBvbGQgc3RyaW5nLCBzZWUgaWYgaXQgZXhpc3RzIGluIHRoZSBuZXcKLQkJCS8vIHN0cmluZy4gVGhlIHBvc2l0aW9uIG9mIHRoZSB3b3JkIGRvZXNuJ3QgbWF0dGVyIC0gaWYgdGhlIHdvcmQKLQkJCS8vIGV4aXN0cyBpbiB0aGUgbmV3LCB0aGVuIHRoZSB3b3JkIGlzIG5vdCBjb3VudGVkIGFzIGEgImNoYW5nZWQiCi0JCQkvLyB3b3JkLiAKLQkJCS8vICAgIDEuIElmIHRoZSB3b3JkIGV4aXN0cywgcmVtb3ZlIHRoZSB3b3JkIGZyb20gdGhlIG5ld0xpbmUgYW5kCi0JCQkvLyAgICAgICBhZHZhbmNlIHRvIHRoZSBuZXh0IG9sZCB0b2tlbi4gKFJlbW92ZSB3b3JkIGZyb20gbmV3TGluZQotCQkJLy8gICAgICAgaW4gY2FzZSB0aGUgd29yZCBleGlzdGVkIHR3aWNlIGluIHRoZSBvbGQgc3RyaW5nIGJ1dCBvbmx5Ci0JCQkvLyAgICAgICBvbmNlIGluIHRoZSBuZXcuIFRoZSBzZWNvbmQgb2xkV29yZCBzaG91bGQgYmUgY291bnRlZCBhcwotCQkJLy8gICAgICAgYSBjaGFuZ2VkIHdvcmQuKQotCQkJLy8gICAgMi4gSWYgdGhlIHdvcmQgZG9lc24ndCBleGlzdCwgbnVtQ2hhbmdlZCsrIGFuZCBhZHZhbmNlIHRvIHRoZQotCQkJLy8gICAgICAgbmV4dCBvbGQgdG9rZW4uCi0JCQkvLyAgICAzLiBPbmNlIGFsbCBvZiB0aGUgb2xkV29yZHMgaGF2ZSBiZWVuIGNoZWNrZWQsIHRva2VuaXplIHRoZQotCQkJLy8gICAgICAgcmVtYWluaW5nIG5ld1dvcmQgYW5kIGNvdW50IHRoZSBudW1iZXIgb2Ygd29yZHMgaW4gdGhlIHN0cmluZy4KLQkJCS8vICAgICAgIFRoZXNlIHdvcmRzIGhhdmUgYmVlbiBhZGRlZCBhbmQgZWFjaCBvbmUgY291bnRzIGFzIGEgCi0JCQkvLyAgICAgICBjaGFuZ2VkIHdvcmQuCi0JCQlpbnQgbnVtQ2hhbmdlZFdvcmRzID0gMDsKLQkJCVN0cmluZ1Rva2VuaXplciBvbGRUb2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG9sZExpbmUuZ2V0TWVzc2FnZSgpKTsKLQotCQkJLy8gTmVlZCB0byBiZSBjYXJlZnVsLi4ud2FudCB0aGUgZW50aXJlIHdvcmQsIG5vdCBvbGRXb3JkPSJvbiIgbWlzdGFrZW4gZm9yIG5ld1dvcmQ9Im9uZSIgb3IgbmV3V29yZD0iYm9uZCIKLQkJCS8vIEVhc2llciB0byBjcmVhdGUgYSBsaXN0IG9mIG5ldyB3b3JkcyB0byBjb21wYXJlIGFnYWluc3QuCi0JCQlTdHJpbmdUb2tlbml6ZXIgbmV3VG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihuZXdMaW5lLmdldE1lc3NhZ2UoKSk7Ci0JCQlMaXN0IG5ld1dvcmRzID0gbmV3IEFycmF5TGlzdCgpOyAvLyBDYW4ndCB1c2UgYSBzZXQgaW4gY2FzZSB0aGUgbmV3TGluZSB1c2VzIGEgd29yZCwgZS5nLiAidGhlIiwgbW9yZSB0aGFuIG9uY2UuCi0JCQl3aGlsZShuZXdUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJbmV3V29yZHMuYWRkKG5ld1Rva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQl9Ci0JCQkKLQkJCXdoaWxlKG9sZFRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgb2xkV29yZCA9IG9sZFRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQlpZihuZXdXb3Jkcy5jb250YWlucyhvbGRXb3JkKSkgewotCQkJCQluZXdXb3Jkcy5yZW1vdmUob2xkV29yZCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQludW1DaGFuZ2VkV29yZHMrKzsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIENhbiBjb3VudCB0aGUgdG9rZW5zIGJ1dCBub3QgdGhlIGVsbWVudHMuCi0JCQludW1DaGFuZ2VkV29yZHMgKz0gbmV3V29yZHMuc2l6ZSgpOwotCQkJcmV0dXJuIG51bUNoYW5nZWRXb3JkczsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZUlkKCkgewotCQkJcmV0dXJuIF9tZXNzYWdlSWQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgewotCQkJLy8gYnkgZGVmYXVsdCwgc29ydCBieSBtZXNzYWdlIGlkCi0JCQlpZiAoIShvIGluc3RhbmNlb2YgQ29tcGFyZUxpbmUpKSB7Ci0JCQkJLy8gdGhlbiBob3cgb24gZWFydGggZGlkIHRoaXMgbWV0aG9kIGdldCBjYWxsZWQ/PwotCQkJCS8vIHB1dCBpdCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0KLQkJCXJldHVybiBnZXRNZXNzYWdlSWQoKS5jb21wYXJlVG8oKChDb21wYXJlTGluZSkgbykuZ2V0TWVzc2FnZUlkKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcGFyZSB0aGUgdHdvIFByb3BlcnR5RmlsZSBhbmQgcHJpbnQgb3V0IGEgbGlzdCBvZiB0aGUgZGlmZmVyZW5jZXM7IAotCSAqIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIG9sZGVyIC5wcm9wZXJ0aWVzIGZpbGUsIGFuZCB0aGUgc2Vjb25kIAotCSAqIHBhcmFtZXRlciBpcyB0aGUgbmV3ZXIgLnByb3BlcnRpZXMgZmlsZS4KLQkgKi8KLQlwdWJsaWMgQ29tcGFyZVByb3BlcnRpZXMoUHJvcGVydHlGaWxlIG9sZEZpbGUsIFByb3BlcnR5RmlsZSBuZXdGaWxlKSB7Ci0JCV9kZWxldGVkID0gbmV3IFRyZWVTZXQoKTsKLQkJX2NoYW5nZWQgPSBuZXcgVHJlZU1hcCgpOwotCQlfYWRkZWQgPSBuZXcgVHJlZVNldCgpOwotCQkKLS8vCQlfb2xkRmlsZSA9IG9sZEZpbGU7Ci0JCV9uZXdGaWxlID0gbmV3RmlsZTsKLQotCQljb21wYXJlKG9sZEZpbGUsIG5ld0ZpbGUpOwotCX0KLQkKLQkvKioKLQkgKiBJbiB0aGUgb2xkZXIgUHJvcGVydHlGaWxlLCB0aGUgbWVzc2FnZSB0ZXh0IHdhcyBkaWZmZXJlbnQ7IGNhY2hlIHRoZQotCSAqIG9sZGVyIHZlcnNpb24gb2YgdGhlIFByb3BlcnR5TGluZSBhbmQgdGhlIG5ld2VyIHZlcnNpb24gb2YgdGhlIFByb3BlcnR5TGluZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQ2hhbmdlZChQcm9wZXJ0eUxpbmUgb2xkTGluZSwgUHJvcGVydHlMaW5lIG5ld0xpbmUpIHsKLQkJQ29tcGFyZUxpbmUgY2wgPSAoQ29tcGFyZUxpbmUpIF9jaGFuZ2VkLmdldChvbGRMaW5lLmdldE1lc3NhZ2VJZCgpKTsKLQkJaWYgKGNsID09IG51bGwpIHsKLQkJCWNsID0gbmV3IENvbXBhcmVMaW5lKG9sZExpbmUuZ2V0TWVzc2FnZUlkKCkpOwotCQl9Ci0JCWNsLmFkZChvbGRMaW5lLCBuZXdMaW5lKTsKLQkJX2NoYW5nZWQucHV0KG9sZExpbmUuZ2V0TWVzc2FnZUlkKCksIGNsKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29tcGFyZSB0aGUgdHdvIHByb3BlcnR5IGZpbGVzIGFuZCBidWlsZCB0aGUgY29sbGVjdGlvbnMgb2YgdmFyaWFibGUgbmFtZXMgd2l0aAotCSAqIHRoZWlyIGFzc29jaWF0ZWQgdmFsdWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXBhcmUoUHJvcGVydHlGaWxlIG9sZEZpbGUsIFByb3BlcnR5RmlsZSBuZXdGaWxlKSB7Ci0JCV9hZGRlZC5jbGVhcigpOwotCQlfZGVsZXRlZC5jbGVhcigpOwotCQlfY2hhbmdlZC5jbGVhcigpOwotCi0JCS8vIEZvciBlYWNoIGVsZW1lbnQgaW4gZmlsZSAxLCBzZWUgaWYgaXQgZXhpc3RzIGluIGZpbGUgMgotCQkvLyAgIGEpIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGFkZCBpdCB0byB0aGUgbGlzdCBvZiAiZGVsZXRlZCIgc3RyaW5ncwotCQkvLyAgIGIpIGlmIGl0IGV4aXN0cywgYW5kIGlmIHRoZSB2YWx1ZSBpcyBkaWZmZXJlbnQsIGFkZCBpdCB0byB0aGUgbGlzdCBvZiAiY2hhbmdlZCIgc3RyaW5ncwotCQkvLyAgIGMpIGlmIGl0IGV4aXN0cywgYW5kIGlmIHRoZSB2YWx1ZSBpcyB0aGUgc2FtZSwgYWRkIGl0IHRvIHRoZSBsaXN0IG9mICJub3QgY2hhbmdlZCIgc3RyaW5ncwotCQkvLyAgIGQpIGRlbGV0ZSB0aGUgZW50cnksIGlmIGl0IGV4aXN0cywgZnJvbSBmaWxlIDIncyBoYXNodGFibGUgc28gd2UgZG9uJ3QgY2hlY2sgaXQgdHdpY2UuCi0JCS8vIEZvciBlYWNoIGVsZW1lbnQgaW4gZmlsZSAyIG5vdCBjaGVja2VkIGFscmVhZHksIGl0IGNhbm5vdCBleGlzdCBpbiBmaWxlIDEsIHNvIGFkZCBpdCB0byB0aGUgbGlzdCBvZiAibmV3IiBzdHJpbmdzCi0JCS8vCi0JCS8vIE5lZWQgc29tZSB3YXkgdG8gYWJvcnQgY29tcGFyaXNvbiBpZiBlaXRoZXIgb2YgdGhlIGZpbGVzIGNvbnRhaW5zIGR1cGxpY2F0ZQotCQkvLyBtZXNzYWdlIGlkcy4KLQkJLy8KLQkJTGlzdCBvbGRLZXlzID0gbmV3IEFycmF5TGlzdChvbGRGaWxlLmdldFByb3BlcnR5TGluZXMoKSk7Ci0JCUxpc3QgbmV3S2V5cyA9IG5ldyBBcnJheUxpc3QobmV3RmlsZS5nZXRQcm9wZXJ0eUxpbmVzKCkpOwotCQlDb2xsZWN0aW9ucy5zb3J0KG9sZEtleXMsIFByb3BlcnR5TGluZUNvbXBhcmF0b3IuZ2V0TWVzc2FnZUlkQ29tcGFyYXRvcigpKTsKLQkJQ29sbGVjdGlvbnMuc29ydChuZXdLZXlzLCBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VJZENvbXBhcmF0b3IoKSk7Ci0JCUl0ZXJhdG9yIG9sZEl0ZXJhdG9yID0gb2xkS2V5cy5pdGVyYXRvcigpOwotCQlJdGVyYXRvciBuZXdJdGVyYXRvciA9IG5ld0tleXMuaXRlcmF0b3IoKTsKLQkJUHJvcGVydHlMaW5lIG9sZExpbmUgPSAob2xkSXRlcmF0b3IuaGFzTmV4dCgpKSA/IChQcm9wZXJ0eUxpbmUpIG9sZEl0ZXJhdG9yLm5leHQoKSA6IG51bGw7Ci0JCVByb3BlcnR5TGluZSBuZXdMaW5lID0gKG5ld0l0ZXJhdG9yLmhhc05leHQoKSkgPyAoUHJvcGVydHlMaW5lKSBuZXdJdGVyYXRvci5uZXh0KCkgOiBudWxsOwotCQl3aGlsZSAoKG9sZExpbmUgIT0gbnVsbCkgJiYgKG5ld0xpbmUgIT0gbnVsbCkpIHsKLQkJCS8vIG9sZExpbmUgbWVzc2FnZSBpZCBpcyBlaXRoZXIgPCwgPSwgb3IgPiBuZXdMaW5lIG1lc3NhZ2UgaWQuCi0JCQkvLyBpZiA8LCBtZXNzYWdlIGlkIGhhcyBiZWVuIGRlbGV0ZWQuCi0JCQkvLyBpZiA9LCBzZWUgaWYgY2hhbmdlZCAob3IganVzdCBjb21wYXJlIG1lc3NhZ2UgaWRzLikKLQkJCS8vIGlmID4sIG5ldyBsaW5lIGlzIGEgbmV3IG1lc3NhZ2UgaWQuCi0JCQkvLyB0byBpbmNyZW1lbnQsIGluY3JlbWVudCBvbmx5IHRoZSA8ICh3aGV0aGVyIGl0J3Mgb2xkTGluZSBvciBuZXdMaW5lKS4KLQkJCWludCBjb21wYXJlID0gb2xkTGluZS5nZXRNZXNzYWdlSWQoKS5jb21wYXJlVG8obmV3TGluZS5nZXRNZXNzYWdlSWQoKSk7Ci0JCQlpZiAoY29tcGFyZSA8IDApIHsKLQkJCQkvLyBkZWxldGVkCi0JCQkJX2RlbGV0ZWQuYWRkKG9sZExpbmUpOwotCQkJCWlmIChvbGRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJb2xkTGluZSA9IChQcm9wZXJ0eUxpbmUpIG9sZEl0ZXJhdG9yLm5leHQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW9sZExpbmUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGNvbXBhcmUgPT0gMCkgewotCQkJCS8vIGV4aXN0ZWQgYmVmb3JlLiBDaGVjayBpZiBjaGFuZ2VkLgotCQkJCWlmICghb2xkTGluZS5nZXRNZXNzYWdlKCkuZXF1YWxzKG5ld0xpbmUuZ2V0TWVzc2FnZSgpKSkgewotCQkJCQkvLyBjaGFuZ2VkCi0JCQkJCWFkZENoYW5nZWQob2xkTGluZSwgbmV3TGluZSk7Ci0JCQkJfQotCQkJCWlmIChvbGRJdGVyYXRvci5oYXNOZXh0KCkgJiYgbmV3SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCW9sZExpbmUgPSAoUHJvcGVydHlMaW5lKSBvbGRJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCW5ld0xpbmUgPSAoUHJvcGVydHlMaW5lKSBuZXdJdGVyYXRvci5uZXh0KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlvbGRMaW5lID0gbnVsbDsKLQkJCQkJbmV3TGluZSA9IG51bGw7Ci0JCQkJfQotCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBhZGRlZAotCQkJCV9hZGRlZC5hZGQobmV3TGluZSk7Ci0JCQkJaWYgKG5ld0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQluZXdMaW5lID0gKFByb3BlcnR5TGluZSkgbmV3SXRlcmF0b3IubmV4dCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmV3TGluZSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKG9sZExpbmUgIT0gbnVsbCkgewotCQkJX2RlbGV0ZWQuYWRkKG9sZExpbmUpOwotCQl9Ci0KLQkJaWYgKG5ld0xpbmUgIT0gbnVsbCkgewotCQkJX2FkZGVkLmFkZChuZXdMaW5lKTsKLQkJfQotCi0JCXdoaWxlIChvbGRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCS8vIGFsbCBvZiB0aGUgcmVzdCBoYXZlIGJlZW4gZGVsZXRlZAotCQkJX2RlbGV0ZWQuYWRkKG9sZEl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQotCQl3aGlsZSAobmV3SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkvLyBhbGwgb2YgdGhlIHJlc3QgaGF2ZSBiZWVuIGFkZGVkCi0JCQlfYWRkZWQuYWRkKG5ld0l0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgQ29sbGN0aW9uIG9mIFByb3BlcnR5TGluZSBpbnN0YW5jZXMgdGhhdCBleGlzdCBpbgotCSAqIHRoZSBuZXdlciBQcm9wZXJ0eUZpbGUgdGhhdCBhcmVuJ3QgaW4gdGhlIG9sZGVyIFByb3BlcnR5RmlsZS4KLQkgKi8KLQlwdWJsaWMgU2V0IGdldEFkZGVkKCkgewotCQlyZXR1cm4gX2FkZGVkOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBDb2xsZWN0aW9uIG9mIENvbXBhcmVMaW5lIGluc3RhbmNlcyB0aGF0IHJlcHJlc2VudAotCSAqIHRoZSB0d28gUHJvcGVydHlMaW5lIGluc3RhbmNlczsgb25lIGZyb20gdGhlIG9sZGVyIFByb3BlcnR5RmlsZSwKLQkgKiBhbmQgb25lIGZyb20gdGhlIG5ld2VyIFByb3BlcnR5RmlsZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGFuZ2VkKCkgewotCQlyZXR1cm4gX2NoYW5nZWQudmFsdWVzKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIENvbGxlY3Rpb24gb2YgUHJvcGVydHlMaW5lIGluc3RhbmNlcyB0aGF0IGRvIG5vdAotCSAqIGV4aXN0IGluIHRoZSBuZXdlciBQcm9wZXJ0eUZpbGUgeWV0IHRoYXQgZXhpc3QgaW4gdGhlIG9sZGVyCi0JICogUHJvcGVydHlGaWxlLgotCSAqLwotCXB1YmxpYyBTZXQgZ2V0RGVsZXRlZCgpIHsKLQkJcmV0dXJuIF9kZWxldGVkOwotCX0KLQkKLQkvKioKLQkgKiBQcmludCBvdXQgYWxsIG9mIHRoZSBjb2xsZWN0aW9ucyBvZiB2YXJpYWJsZSBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50UmVzdWx0cygpIHsKLQkJLy8gY3JlYXRlIGFuIG91dHB1dCBsb2cgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBhbmQgaW4gaXQgbGlzdCB0aGUgc3RyaW5ncyBpbiBhIHNlY3Rpb24gZWFjaC4KLQkJaW50IG51bU5ldyA9IHByaW50U3RyaW5ncygiTkVXIFBST1BFUlRJRVMiLCBfYWRkZWQpOyAvLyROT04tTkxTLTEkCi0JCQotCQlpbnQgbnVtV29yZHNEZWxldGVkID0gcHJpbnRTdHJpbmdzKCJERUxFVEVEIFBST1BFUlRJRVMiLCBfZGVsZXRlZCk7IC8vJE5PTi1OTFMtMSQKLQkJaW50IG51bVdvcmRzQ2hhbmdlZCA9ICBwcmludFN0cmluZ3MoIkNIQU5HRUQgUFJPUEVSVElFUyIsIF9jaGFuZ2VkLnZhbHVlcygpKTsgLy8kTk9OLU5MUy0xJAotCQlmbG9hdCB0b3RhbENoYW5nZSA9IG51bU5ldyArIG51bVdvcmRzRGVsZXRlZCArIG51bVdvcmRzQ2hhbmdlZDsKLQkJZmxvYXQgbnVtV29yZHMgPSBfbmV3RmlsZS5nZXROdW1Xb3JkcygpOwotCQlmbG9hdCBwZXJjZW50ID0gdG90YWxDaGFuZ2UgLyBudW1Xb3JkcyAqIDEwMDsKLQkJCi0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiBuZXcgd29yZHM6ICIgKyBudW1OZXcpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVyIG9mIHdvcmRzIGluIGRlbGV0ZWQgbWVzc2FnZXM6ICIgKyBudW1Xb3Jkc0RlbGV0ZWQpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVyIG9mIGNoYW5nZWQgd29yZHMgaW4gbW9kaWZpZWQgbWVzc2FnZXM6ICIgKyBudW1Xb3Jkc0NoYW5nZWQpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVyIG9mIHdvcmRzIGluIGZpbGUgIiArIF9uZXdGaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCkgKyAiOiAiICsgbnVtV29yZHMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCBjaGFuZ2Ugb2Ygd29yZHM6ICIgKyB0b3RhbENoYW5nZSArICIsIHdoaWNoIGlzIGEgIiArIHBlcmNlbnQgKyAiJSBjaGFuZ2UuIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQkKLQlwdWJsaWMgdm9pZCBwcmludFJlc3VsdHNGb3JUcmFuc2xhdGlvbigpIHsKLQkJLy8gY3JlYXRlIGFuIG91dHB1dCBsb2cgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBhbmQgaW4gaXQgbGlzdCB0aGUgc3RyaW5ncyBpbiBhIHNlY3Rpb24gZWFjaC4KLQkJcHJpbnRTdHJpbmdzRm9yVHJhbnNsYXRpb24oIkRFTEVURUQgUFJPUEVSVElFUyIsIF9kZWxldGVkKTsgLy8kTk9OLU5MUy0xJAotCQlwcmludFN0cmluZ3NGb3JUcmFuc2xhdGlvbigiTkVXIFBST1BFUlRJRVMiLCBfYWRkZWQpOyAvLyROT04tTkxTLTEkCi0JCXByaW50U3RyaW5nc0ZvclRyYW5zbGF0aW9uKCJDSEFOR0VEIFBST1BFUlRJRVMiLCBfY2hhbmdlZC52YWx1ZXMoKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgLnByb3BlcnRpZXMgZmlsZS4KLQkgKi8KLQlwcml2YXRlIGludCBwcmludFN0cmluZ3MoU3RyaW5nIGhlYWRlciwgQ29sbGVjdGlvbiBsaW5lcykgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGhlYWRlcik7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWludCBudW1Xb3JkcyA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGxpbmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZihsaW5lIGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSB7Ci0JCQkJbnVtV29yZHMgKz0gKChQcm9wZXJ0eUxpbmUpbGluZSkuZ2V0TnVtV29yZHMoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG11c3QgYmUgYSBjb21wYXJlIGxpbmUKLQkJCQludW1Xb3JkcyArPSAoKENvbXBhcmVMaW5lKWxpbmUpLmdldE51bVdvcmRzKCk7Ci0JCQl9Ci0JCQkKLQkJCWNvdW50Kys7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJOdW1iZXIgb2YgcHJvcGVydGllczogIiArIGNvdW50KTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJcmV0dXJuIG51bVdvcmRzOwotCX0KLQkKLQkvKioKLQkgKiBQcmludCB0aGUgY29udGVudHMgb2YgdGhlIHNvcnRlZCBjb2xsZWN0aW9uIG9mIGxpbmVzIGZyb20gdGhlIC5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByaW50U3RyaW5nc0ZvclRyYW5zbGF0aW9uKFN0cmluZyBoZWFkZXIsIENvbGxlY3Rpb24gbGluZXMpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihoZWFkZXIpOwotCQlpbnQgY291bnQgPSAwOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpbmVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWNvdW50Kys7Ci0JCQlPYmplY3QgbGluZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChsaW5lIGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSB7Ci0JCQkJUHJvcGVydHlMaW5lIHByb3BsaW5lID0gKFByb3BlcnR5TGluZSkgbGluZTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocHJvcGxpbmUuZ2V0TWVzc2FnZUlkKCkpOwotCQkJfQotCQkJZWxzZSBpZiAobGluZSBpbnN0YW5jZW9mIENvbXBhcmVMaW5lKSB7Ci0JCQkJQ29tcGFyZUxpbmUgcHJvcGxpbmUgPSAoQ29tcGFyZUxpbmUpIGxpbmU7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKHByb3BsaW5lLmdldE1lc3NhZ2VJZCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiaW5zdGFuY2Ugb2YgIiArIGxpbmUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbDogIiArIGNvdW50KTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9JVmFsaWRhdGlvbkNvbnN0YW50cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9JVmFsaWRhdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGFlOWU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvSVZhbGlkYXRpb25Db25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlcjsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgdGhlIG1lc3NhZ2UgaWRzIG9mIGFsbCBvZiB0aGUgUHJvcGVydGllcwotICogVmFsaWRhdG9yJ3MgbWVzc2FnZXMsIGFuZCB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHRoYXQgCi0gKiBjb250YWlucyB0aG9zZSBtZXNzYWdlcy4gCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25Db25zdGFudHMgewotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFTkFNRSA9ICJwcm9wZXJ0aWVzVmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAwMDAgPSAiQUJDRDAwMDAiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDAxMEUgPSAiQUJDRDAwMTBFIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAwMTBXID0gIkFCQ0QwMDEwVyI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDIwID0gIkFCQ0QwMDIwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAwMzAgPSAiQUJDRDAwMzAiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDA0MCA9ICJBQkNEMDA0MCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDUwID0gIkFCQ0QwMDUwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAwNjAgPSAiQUJDRDAwNjAiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDA3MCA9ICJBQkNEMDA3MCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDgwID0gIkFCQ0QwMDgwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAwOTAgPSAiQUJDRDAwOTAiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDExMCA9ICJBQkNEMDExMCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMTIwID0gIkFCQ0QwMTIwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAxMzAgPSAiQUJDRDAxMzAiOyAvLyROT04tTkxTLTEkCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfTE9DID0gIkxJTkVfTE9DIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9NYWluLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL01haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkNmVlMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL01haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXI7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBwZXJmb3JtIHZhbGlkYXRpb24gb3IgLnByb3BlcnRpZXMgZmlsZSBxdWVyaWVzCi0gKiB3aXRob3V0IHVzaW5nIGFuIElWYWxpZGF0b3IuIAotICovCi1wdWJsaWMgY2xhc3MgTWFpbiB7Ci0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgewotCQlpZihhcmd2Lmxlbmd0aCA8IDEpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicHJvcCAtdHIgWy1hIHwgLWFjIHwgLWFtIHwgLWFuIHwgLWFsIFBSRUZJWCB8IC1hcCBQUkVGSVggfCAtYXUgfCAtYiB8IC1kaSB8IC1kcCB8IC1sIHwgLWxlIDxwb3NpdGl2ZSBpbnRlZ2VyPiB8IC1wIF0gZjpcXGRpcjFcXGRpcjJcXG15UHJvcGVydGllc0ZpbGUucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIm9yICIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInByb3AgWy1jfC1jdF0gZjpcXGRpcjFcXGRpcjJcXG15UHJvcGVydGllc0ZpbGUucHJvcGVydGllcyBmOlxcZGlyMVxcZGlyMlxcbXlOZXdQcm9wZXJ0aWVzRmlsZS5wcm9wZXJ0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgLWE6IHByaW50IGFsbCBlcnJvci93YXJuaW5nL2luZm8gcHJlZml4ZXMgaW4gdGhlIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIC1hYzogcHJpbnQgYSBjb3VudCBvZiBtZXNzYWdlcyB3aXRoIGFuZCB3aXRob3V0IHByZWZpeGVzIGluIHRoZSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtYW06IHByaW50IGFsbCBtZXNzYWdlcyB3aXRoIGEgcHJlZml4Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtYW46IHByaW50IGFsbCBtZXNzYWdlcyB3aXRob3V0IGFuIGVycm9yIHByZWZpeCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWFsOiBwcmludCB0aGUgbGFzdCBlcnJvci93YXJuaW5nL2luZm8gcHJlZml4LCBzdGFydGluZyB3aXRoIFBSRUZJWCwgaW4gdGhlIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIC1hcDogcHJpbnQgYW55IGVycm9yL3dhcm5pbmcvaW5mbyBwcmVmaXhlcywgc3RhcnRpbmcgd2l0aCBQUkVGSVgsIGluIHRoZSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtYXU6IHByaW50IGFsbCBlcnJvci93YXJuaW5nL2luZm8gcHJlZml4ZXMgdGhhdCBhcmUgbm90IHVzZWQgaW4gdGhlIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAtYjogcHJpbnQgYW55IGJsYW5rIG1lc3NhZ2VzIGluIHRoZSBwcm9wZXJ0aWVzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAtYzogY29tcGFyZSB0aGUgdHdvIHByb3BlcnR5IGZpbGVzIGxpc3RlZC4gVGhlIGZpcnN0IGlzIHRoZSBvbGRlciwgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIG5ld2VyLiIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWN0OiBjb21wYXJlIHRoZSB0d28gcHJvcGVydHkgZmlsZXMgbGlzdGVkLiBUaGUgZmlyc3QgaXMgdGhlIG9sZGVyLCBhbmQgdGhlIHNlY29uZCBpcyB0aGUgbmV3ZXIuIE91dHB1dCBhIGxpc3Qgb2YgdGhlIGFkZGVkLCBkZWxldGVkLCBhbmQgY2hhbmdlZCBzdHJpbmdzLCBidXQgcHJpbnQgb25seSB0aGUgbWVzc2FnZSBpZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIC1kaTogcHJpbnQgYW55IGR1cGxpY2F0ZSBtZXNzYWdlIGlkcyBhbmQgc3ludGF4IGVycm9ycyBpbiB0aGUgcHJvcGVydGllcyBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtZHA6IHByaW50IGFueSBkdXBsaWNhdGUgZXJyb3Ivd2FybmluZy9pbmZvIHByZWZpeGVzIGluIHRoZSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgLWw6IHByaW50IHRoZSBsZW5ndGggb2YgZWFjaCBtZXNzYWdlIGluIHRoZSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtbGU6IHByaW50IHRoZSBsZW5ndGggb2YgZWFjaCBtZXNzYWdlIGluIHRoZSBmaWxlIGlmIGVhY2ggcGFyYW1ldGVyIGlzIDxwb3NpdGl2ZSBpbnRlZ2VyPiBjaGFyYWN0ZXJzIGxvbmcuIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgLW46IHByaW50IHRoZSBudW1iZXIgb2Ygd29yZHMgaW4gdGhlIGZpbGUsIGluY2x1ZGluZyBtZXNzYWdlIHByZWZpeGVzIGFuZCBwYXJhbWV0ZXJzIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgLXA6IHByaW50IHRoZSBjb250ZW50cyBvZiB0aGUgcHJvcGVydHkgZmlsZSwgc29ydGVkIGJ5IG1lc3NhZ2UgaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIC10cjogcHJpbnQgdHJhY2UgaW5mb3JtYXRpb24gd2hpbGUgcGFyc2luZyB0aGUgLnByb3BlcnRpZXMgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlIGRlZmF1bHQgYWN0aW9uIGlzIHRvIHByaW50IHRoZSBzeW50YXggZXJyb3JzLCBkdXBsaWNhdGVzLCBhbmQgb3RoZXIgdHlwZXMgb2YgZXJyb3JzIGluIHRoZSBnaXZlbiAucHJvcGVydGllcyBmaWxlLiIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0uZXhpdCgtMSk7Ci0JCX0KLQotCQkvLyBUaGlzIGlzIG5vdCByb2J1c3QgZXJyb3ItY2hlY2tpbmcgYnkgYW55IHN0cmV0Y2ggb2YgdGhlIGltYWdpbmF0aW9uIQotCQlpbnQgaW5kZXggPSAwOwotCQlTdHJpbmcgb3B0aW9uID0gYXJndltpbmRleCsrXS50b0xvd2VyQ2FzZSgpOwotCQlib29sZWFuIHRyYWNlID0gZmFsc2U7Ci0JCWlmKG9wdGlvbi5lcXVhbHMoIi10ciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRyYWNlID0gdHJ1ZTsKLQkJCW9wdGlvbiA9IGFyZ3ZbaW5kZXgrK10udG9Mb3dlckNhc2UoKTsKLQkJfQotCQkKLQkJaWYgKG9wdGlvbi5lcXVhbHMoIi1hIikgJiYgKGFyZ3YubGVuZ3RoID49IDIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1thcmd2Lmxlbmd0aC0xXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndiwgMSwgZmlsZXMsIDAsIGZpbGVzLmxlbmd0aCk7Ci0JCQlwcmludEFsbEVycm9yUHJlZml4KHRyYWNlLCBmaWxlcyk7Ci0JCX0KLQkJZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWFjIikgJiYgKGFyZ3YubGVuZ3RoID49IDIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1thcmd2Lmxlbmd0aC0xXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndiwgMSwgZmlsZXMsIDAsIGZpbGVzLmxlbmd0aCk7Ci0JCQlwcmludFByZWZpeENvdW50KHRyYWNlLCBmaWxlcyk7Ci0JCX0KLQkJZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWFsIikgJiYgKGFyZ3YubGVuZ3RoID49IDMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1thcmd2Lmxlbmd0aC0yXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndiwgMiwgZmlsZXMsIDAsIGZpbGVzLmxlbmd0aCk7Ci0JCQlwcmludEVycm9yUHJlZml4KHRyYWNlLCBhcmd2W2luZGV4XSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hbSIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRFcnJvck1lc3NhZ2VzKHRyYWNlLCBmaWxlcyk7Ci0JCX0KLQkJZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWFuIikgJiYgKGFyZ3YubGVuZ3RoID49IDIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1thcmd2Lmxlbmd0aC0xXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndiwgMSwgZmlsZXMsIDAsIGZpbGVzLmxlbmd0aCk7Ci0JCQlwcmludE1lc3NhZ2VzV2l0aG91dFByZWZpeGVzKHRyYWNlLCBmaWxlcyk7Ci0JCX0KLQkJZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWFwIikgJiYgKGFyZ3YubGVuZ3RoID49IDMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1thcmd2Lmxlbmd0aC0yXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndiwgMiwgZmlsZXMsIDAsIGZpbGVzLmxlbmd0aCk7Ci0JCQlwcmludEVycm9yUHJlZml4UmFuZ2UodHJhY2UsIGFyZ3ZbaW5kZXhdLCBmaWxlcyk7Ci0JCX0KLQkJZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWF1IikgJiYgKGFyZ3YubGVuZ3RoID49IDIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1thcmd2Lmxlbmd0aC0xXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndiwgMSwgZmlsZXMsIDAsIGZpbGVzLmxlbmd0aCk7Ci0JCQlwcmludEFsbE1pc3NpbmdFcnJvclByZWZpeCh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1iIikgJiYgKGFyZ3YubGVuZ3RoID49IDIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1thcmd2Lmxlbmd0aC0xXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndiwgMSwgZmlsZXMsIDAsIGZpbGVzLmxlbmd0aCk7Ci0JCQlwcmludEJsYW5rcyh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1jIikgJiYgKGFyZ3YubGVuZ3RoID09IDMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgb2xkRmlsZSA9IG5ldyBGaWxlKGFyZ3ZbaW5kZXgrK10pOwotCQkJRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUoYXJndltpbmRleF0pOwotCQkJY29tcGFyZUZpbGVzKHRyYWNlLCBvbGRGaWxlLCBuZXdGaWxlKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItY3QiKSAmJiAoYXJndi5sZW5ndGggPT0gMykpIHsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBvbGRGaWxlID0gbmV3IEZpbGUoYXJndltpbmRleCsrXSk7Ci0JCQlGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShhcmd2W2luZGV4XSk7Ci0JCQljb21wYXJlRmlsZXNGb3JUcmFuc2xhdGlvbih0cmFjZSwgb2xkRmlsZSwgbmV3RmlsZSk7Ci0JCX0KLQkJZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWRpIikgJiYgKGFyZ3YubGVuZ3RoID49IDIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1thcmd2Lmxlbmd0aC0xXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndiwgMSwgZmlsZXMsIDAsIGZpbGVzLmxlbmd0aCk7Ci0JCQlwcmludER1cGxpY2F0ZUlkcyh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1kcCIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnREdXBsaWNhdGVQcmVmaXhlcyh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1sIikgJiYgKGFyZ3YubGVuZ3RoID49IDIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIGZpbGVzID0gbmV3IFN0cmluZ1thcmd2Lmxlbmd0aC0xXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJndiwgMSwgZmlsZXMsIDAsIGZpbGVzLmxlbmd0aCk7Ci0JCQlwcmludFN0cmluZ0xlbmd0aCh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1sZSIpICYmIChhcmd2Lmxlbmd0aCA+PSAzKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDIsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRFeHBlY3RlZFN0cmluZ0xlbmd0aCh0cmFjZSwgYXJndltpbmRleF0sIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItbiIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRXb3JkQ291bnQodHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItcCIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRGaWxlQ29udGVudHModHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIHsKLQkJCXByaW50RGVmYXVsdCh0cmFjZSwgYXJndik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRBbGxFcnJvclByZWZpeChib29sZWFuIHRyYWNlLCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnRBbGxNZXNzYWdlUHJlZml4ZXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEFsbE1pc3NpbmdFcnJvclByZWZpeChib29sZWFuIHRyYWNlLCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnRBbGxNaXNzaW5nTWVzc2FnZVByZWZpeGVzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRCbGFua3MoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50QWxsTWVzc2FnZXNXaGljaEFyZUJsYW5rKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRNZXNzYWdlc1dpdGhvdXRQcmVmaXhlcyhib29sZWFuIHRyYWNlLCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnRBbGxNZXNzYWdlc1dpdGhvdXRBTWVzc2FnZVByZWZpeCgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbXBhcmVGaWxlcyhib29sZWFuIHRyYWNlLCBGaWxlIG9sZEZpbGUsIEZpbGUgbmV3RmlsZSkgewotCQlpZihvbGRGaWxlLmlzRmlsZSgpICYmIG5ld0ZpbGUuaXNGaWxlKCkpIHsKLQkJCXRyeSB7Ci0JCQkJUHJvcGVydHlGaWxlIG9sZFByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShvbGRGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0cmFjZSk7Ci0JCQkJUHJvcGVydHlGaWxlIG5ld1Byb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShuZXdGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0cmFjZSk7Ci0JCQkJQ29tcGFyZVByb3BlcnRpZXMgY3AgPSBuZXcgQ29tcGFyZVByb3BlcnRpZXMob2xkUHJvcEZpbGUsIG5ld1Byb3BGaWxlKTsKLQkJCQljcC5wcmludFJlc3VsdHMoKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYob2xkRmlsZS5pc0RpcmVjdG9yeSgpICYmIG5ld0ZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJU3RyaW5nW10gb2xkQ2hpbGRyZW4gPSBvbGRGaWxlLmxpc3QoKTsKLQkJCWZvcihpbnQgaT0wOyBpPG9sZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmlsZSBuZXdDaGlsZCA9IG5ldyBGaWxlKG5ld0ZpbGUsIG9sZENoaWxkcmVuW2ldKTsKLQkJCQlpZihuZXdDaGlsZC5leGlzdHMoKSkgewotCQkJCQkvLyBGb3VuZCBhIGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgaXMgbmFtZWQgdGhlIHNhbWUgaW4gdGhlIG9sZCAmIG5ldy4gQ29tcGFyZS4KLQkJCQkJY29tcGFyZUZpbGVzKHRyYWNlLCBuZXcgRmlsZShvbGRGaWxlLCBvbGRDaGlsZHJlbltpXSksIG5ld0NoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBhcmUgdHdvIGZpbGVzIG9yIHR3byBkaXJlY3Rvcmllcy4gRG8gbm90IGNvbXBhcmUgYSBmaWxlIHRvIGEgZGlyZWN0b3J5ICgiICsgb2xkRmlsZS5nZXROYW1lKCkgKyAiLCAiICsgbmV3RmlsZS5nZXROYW1lKCkgKyAiKS4iKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29tcGFyZUZpbGVzRm9yVHJhbnNsYXRpb24oYm9vbGVhbiB0cmFjZSwgRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUpIHsKLQkJaWYob2xkRmlsZS5pc0ZpbGUoKSAmJiBuZXdGaWxlLmlzRmlsZSgpKSB7Ci0JCQl0cnkgewotCQkJCVByb3BlcnR5RmlsZSBvbGRQcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUob2xkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdHJhY2UpOwotCQkJCVByb3BlcnR5RmlsZSBuZXdQcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUobmV3RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdHJhY2UpOwotCQkJCUNvbXBhcmVQcm9wZXJ0aWVzIGNwID0gbmV3IENvbXBhcmVQcm9wZXJ0aWVzKG9sZFByb3BGaWxlLCBuZXdQcm9wRmlsZSk7Ci0JCQkJY3AucHJpbnRSZXN1bHRzRm9yVHJhbnNsYXRpb24oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYob2xkRmlsZS5pc0RpcmVjdG9yeSgpICYmIG5ld0ZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJU3RyaW5nW10gb2xkQ2hpbGRyZW4gPSBvbGRGaWxlLmxpc3QoKTsKLQkJCWZvcihpbnQgaT0wOyBpPG9sZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmlsZSBuZXdDaGlsZCA9IG5ldyBGaWxlKG5ld0ZpbGUsIG9sZENoaWxkcmVuW2ldKTsKLQkJCQlpZihuZXdDaGlsZC5leGlzdHMoKSkgewotCQkJCQkvLyBGb3VuZCBhIGZpbGUgb3IgZGlyZWN0b3J5IHRoYXQgaXMgbmFtZWQgdGhlIHNhbWUgaW4gdGhlIG9sZCAmIG5ldy4gQ29tcGFyZS4KLQkJCQkJY29tcGFyZUZpbGVzRm9yVHJhbnNsYXRpb24odHJhY2UsIG5ldyBGaWxlKG9sZEZpbGUsIG9sZENoaWxkcmVuW2ldKSwgbmV3Q2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29tcGFyZSB0d28gZmlsZXMgb3IgdHdvIGRpcmVjdG9yaWVzLiBEbyBub3QgY29tcGFyZSBhIGZpbGUgdG8gYSBkaXJlY3RvcnkgKCIgKyBvbGRGaWxlLmdldE5hbWUoKSArICIsICIgKyBuZXdGaWxlLmdldE5hbWUoKSArICIpLiIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludER1cGxpY2F0ZUlkcyhib29sZWFuIHRyYWNlLCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnREdXBsaWNhdGVNZXNzYWdlSWQoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEVycm9yUHJlZml4KGJvb2xlYW4gdHJhY2UsIFN0cmluZyBwcmVmaXgsIFN0cmluZ1tdIGZpbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludExhc3RNZXNzYWdlUHJlZml4U3RhcnRpbmdXaXRoKHByZWZpeCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFcnJvclByZWZpeFJhbmdlKGJvb2xlYW4gdHJhY2UsIFN0cmluZyBwcmVmaXgsIFN0cmluZ1tdIGZpbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludE1lc3NhZ2VQcmVmaXhTdGFydGluZ1dpdGgocHJlZml4KTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludER1cGxpY2F0ZVByZWZpeGVzKGJvb2xlYW4gdHJhY2UsIFN0cmluZ1tdIGZpbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludER1cGxpY2F0ZU1lc3NhZ2VQcmVmaXgoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFN0cmluZ0xlbmd0aChib29sZWFuIHRyYWNlLCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnRTdHJpbmdMZW5ndGgoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEV4cGVjdGVkU3RyaW5nTGVuZ3RoKGJvb2xlYW4gdHJhY2UsIFN0cmluZyBzbGVuZ3RoLCBTdHJpbmdbXSBmaWxlcykgewotCQlpbnQgbGVuZ3RoID0gMDsKLQkJCi0JCXRyeSB7Ci0JCQlsZW5ndGggPSBuZXcgSW50ZWdlcihzbGVuZ3RoKS5pbnRWYWx1ZSgpOwotCQl9Ci0JCWNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGMpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQYXJhbWV0ZXIgbXVzdCBiZSBhbiBpbnRlZ2VyLiIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50RXhwZWN0ZWRTdHJpbmdMZW5ndGgobGVuZ3RoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEVycm9yTWVzc2FnZXMoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50QWxsTWVzc2FnZXNXaXRoQU1lc3NhZ2VQcmVmaXgoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFdvcmRDb3VudChib29sZWFuIHRyYWNlLCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKHByb3BGaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCkgKyAiOjogTnVtYmVyIG9mIHdvcmRzIDo6ICIgKyBwcm9wRmlsZS5nZXROdW1Xb3JkcygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50UHJlZml4Q291bnQoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXN1YWxseSB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBwcmVmaXhlcyBhbmQgdGhlIG51bWJlciBvZiBwcmVmaXhlcyBpcyB0aGUgc2FtZSwgYnV0IGlmIGEgLnByb3BlcnRpZXMgZmlsZSBoYXMgdmFyaWF0aW9ucyBvZiBhIG1lc3NhZ2UgKHNsaWdodGx5IGRpZmZlcmVudCB3b3JkaW5nIGZvciBhIGRpZmZlcmVudCBjb250ZXh0KSwgdGhlbiB0aGUgbnVtYmVyIG9mIHByZWZpeCBtZXNzYWdlcyB3aWxsIGJlIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgdW5pcXVlIHByZWZpeGVzLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKHByb3BGaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCkgKyAiOjogTnVtYmVyIG9mIHVuaXF1ZSBwcmVmaXhlcyA6OiAiICsgcHJvcEZpbGUuZ2V0TnVtVW5pcXVlUHJlZml4ZXMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocHJvcEZpbGUuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKSArICI6OiBOdW1iZXIgb2YgbWVzc2FnZXMgd2l0aCBwcmVmaXhlcyA6OiAiICsgcHJvcEZpbGUuZ2V0TnVtUHJlZml4ZXMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocHJvcEZpbGUuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKSArICI6OiBOdW1iZXIgb2YgbWVzc2FnZXMgd2l0aG91dCBwcmVmaXhlcyA6OiAiICsgcHJvcEZpbGUuZ2V0TnVtV2l0aG91dFByZWZpeGVzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50RmlsZUNvbnRlbnRzKGJvb2xlYW4gdHJhY2UsIFN0cmluZ1tdIGZpbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludENvbnRlbnRzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnREZWZhdWx0KGJvb2xlYW4gdHJhY2UsIFN0cmluZ1tdIGZpbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJLy8gcHJpbnQgYWxsIGVycm9ycywgd2FybmluZ3MsIGV0Yy4KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50U3ludGF4V2FybmluZ3MoKTsKLQkJCQlwcm9wRmlsZS5wcmludER1cGxpY2F0ZU1lc3NhZ2VJZCgpOwotCQkJCXByb3BGaWxlLnByaW50RHVwbGljYXRlTWVzc2FnZVByZWZpeCgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50KFN0cmluZ1tdIGFyZ3YpIHsKLQkJZm9yKGludCBpID0wO2k8YXJndi5sZW5ndGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGkgKyAiLiAiICsgYXJndltpXSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL01lc3NhZ2VNZXRhRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9NZXNzYWdlTWV0YURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA3ZTU1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL01lc3NhZ2VNZXRhRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlcjsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBob2xkcyB0aGUgbWV0YWRhdGEgZm9yIGFuIElNZXNzYWdlIHRoYXQgbXVzdCBiZSAKLSAqIHJlcG9ydGVkIHRvIHRoZSB1c2VyIChpLmUuLCBhIHZhbGlkYXRpb24gZXJyb3IsIHdhcm5pbmcsCi0gKiBvciBpbmZvcm1hdGlvbiBtZXNzYWdlKS4gCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlTWV0YURhdGEgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVF9VTlNFVCA9IC0xOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gMzsKLQkKLQlwcml2YXRlIFN0cmluZyBfYnVuZGxlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgX3NldmVyaXR5ID0gSU5UX1VOU0VUOwotCXByaXZhdGUgU3RyaW5nIF9tZXNzYWdlSWQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nW10gX3Bhcm1zID0gbnVsbDsKLQlwcml2YXRlIE9iamVjdCBfdGFyZ2V0T2JqZWN0ID0gbnVsbDsKLQlwcml2YXRlIGludCBfbGluZU51bWJlciA9IElOVF9VTlNFVDsKLQlwcml2YXRlIGludCBfb2Zmc2V0ID0gSU5UX1VOU0VUOwotCXByaXZhdGUgaW50IF9sZW5ndGggPSBJTlRfVU5TRVQ7Ci0JcHJpdmF0ZSBTdHJpbmcgX3RleHQgPSBudWxsOwotCQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQgaWYgdGhlIG1lc3NhZ2UgdGV4dCBoYXMgYWxyZWFkeQotCSAqIGJlZW4gdHJhbnNsYXRlZC4KLQkgKi8KLQlwdWJsaWMgTWVzc2FnZU1ldGFEYXRhKFN0cmluZyBtZXNzYWdlVGV4dCkgewotCQlfdGV4dCA9IG1lc3NhZ2VUZXh0OwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBtZXNzYWdlIHRleHQgaXMgbm90IHRyYW5zbGF0ZWQKLQkgKiB1bnRpbCBqdXN0IGJlZm9yZSB0aGUgdGV4dCBzaG91bGQgYmUgc2hvd24gdG8gdGhlIHVzZXIuCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIGluIHdoaWNoIHRoZSBtZXNzYWdlIGlzIGNvbnRhaW5lZAotCSAqIEBwYXJhbSBzZXZlcml0eSAtIE9uZSBvZiB0aGUgY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5jb3JlLlNldmVyaXR5RW51bSBjb25zdGFudHM7IHRoaXMgcGFyYW1ldGVyIHJlcHJlc2VudHMgdGhlIHNldmVyaXR5IG9mIHRoZSBJTWVzc2FnZS4KLQkgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIG1lc3NhZ2UgaWQgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBtZXNzYWdlIHRvIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBidW5kbGUuCi0JICogQHBhcmFtIHBhcm1zIC0gVGhlIHBhcmFtZXRlcnMgdG8gYmUgc3Vic3RpdHV0ZWQgaW50byB0aGUgamF2YS50ZXh0Lk1lc3NhZ2VUZXh0J3MgcGF0dGVybnMuCi0JICogQHBhcmFtIHRhcmdldE9iamVjdCAtIFRoZSB0YXJnZXQgb2JqZWN0IG9mIHRoZSBJTWVzc2FnZSAoc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5JTWVzc2FnZSkuCi0JICogQHBhcmFtIGxpbmVOdW1iZXIgLSBUaGUgbGluZSBudW1iZXIgd2hlcmUgdGhlIHByb2JsZW0gY2FuIGJlIGZvdW5kLgotCSAqLwotCXB1YmxpYyBNZXNzYWdlTWV0YURhdGEoU3RyaW5nIGJ1bmRsZU5hbWUsIGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIE9iamVjdCB0YXJnZXRPYmplY3QsIGludCBsaW5lTnVtYmVyKSB7Ci0JCXRoaXMoYnVuZGxlTmFtZSwgc2V2ZXJpdHksIG1lc3NhZ2VJZCwgcGFybXMsIHRhcmdldE9iamVjdCwgbGluZU51bWJlciwgSU5UX1VOU0VULCBJTlRfVU5TRVQpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBtZXNzYWdlIHRleHQgaXMgbm90IHRyYW5zbGF0ZWQKLQkgKiB1bnRpbCBqdXN0IGJlZm9yZSB0aGUgdGV4dCBzaG91bGQgYmUgc2hvd24gdG8gdGhlIHVzZXIuCi0JICogCi0JICogQHBhcmFtIGJ1bmRsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIGluIHdoaWNoIHRoZSBtZXNzYWdlIGlzIGNvbnRhaW5lZAotCSAqIEBwYXJhbSBzZXZlcml0eSAtIE9uZSBvZiB0aGUgY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5jb3JlLlNldmVyaXR5RW51bSBjb25zdGFudHM7IHRoaXMgcGFyYW1ldGVyIHJlcHJlc2VudHMgdGhlIHNldmVyaXR5IG9mIHRoZSBJTWVzc2FnZS4KLQkgKiBAcGFyYW0gbWVzc2FnZUlkIC0gVGhlIG1lc3NhZ2UgaWQgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBtZXNzYWdlIHRvIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBidW5kbGUuCi0JICogQHBhcmFtIHBhcm1zIC0gVGhlIHBhcmFtZXRlcnMgdG8gYmUgc3Vic3RpdHV0ZWQgaW50byB0aGUgamF2YS50ZXh0Lk1lc3NhZ2VUZXh0J3MgcGF0dGVybnMuCi0JICogQHBhcmFtIHRhcmdldE9iamVjdCAtIFRoZSB0YXJnZXQgb2JqZWN0IG9mIHRoZSBJTWVzc2FnZSAoc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5JTWVzc2FnZSkuCi0JICogQHBhcmFtIGxpbmVOdW1iZXIgLSBUaGUgbGluZSBudW1iZXIgd2hlcmUgdGhlIHByb2JsZW0gY2FuIGJlIGZvdW5kLgotCSAqIEBwYXJhbSBvZmZzZXQgLSBJbiBudW1iZXIgb2YgY2hhcmFjdGVycywgaG93IG1hbnkgY2hhcmFjdGVycyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgLnByb3BlcnRpZXMgZmlsZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHByb2JsZW0uCi0JICogQHBhcmFtIGxlbmd0aCAtIEluIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBob3cgbWFueSBjaGFyYWN0ZXJzIGZyb20gdGhlIG9mZnNldCB0byB0aGUgZW5kIG9mIHRoZSBwcm9ibGVtLgotCSAqLwotCXB1YmxpYyBNZXNzYWdlTWV0YURhdGEoU3RyaW5nIGJ1bmRsZU5hbWUsIGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIE9iamVjdCB0YXJnZXRPYmplY3QsIGludCBsaW5lTnVtYmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCV9idW5kbGVOYW1lID0gYnVuZGxlTmFtZTsKLQkJX3NldmVyaXR5ID0gc2V2ZXJpdHk7Ci0JCV9tZXNzYWdlSWQgPSBtZXNzYWdlSWQ7Ci0JCV9wYXJtcyA9IHBhcm1zOwotCQlfdGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0OwotCQlfbGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0JCV9vZmZzZXQgPSBvZmZzZXQ7Ci0JCV9sZW5ndGggPSBsZW5ndGg7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QnVuZGxlTmFtZSgpIHsKLQkJcmV0dXJuIF9idW5kbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gX3NldmVyaXR5OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gX21lc3NhZ2VJZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldFBhcmFtcygpIHsKLQkJcmV0dXJuIF9wYXJtczsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRUYXJnZXRPYmplY3QoKSB7Ci0JCXJldHVybiBfdGFyZ2V0T2JqZWN0OwotCX0KLQkKLQlwdWJsaWMgaW50IGdldExpbmVOdW1iZXIoKSB7Ci0JCXJldHVybiBfbGluZU51bWJlcjsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBfb2Zmc2V0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gX2xlbmd0aDsKLQl9Ci0JCi0JLyoqCi0JICogVXNlIHRoZSBnaXZlbiBDbGFzc0xvYWRlciB0byBsb2FkIHRoaXMgbWVzc2FnZSdzIHRleHQKLQkgKiBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCWlmKF90ZXh0ID09IG51bGwpIHsKLQkJCXJldHVybiBnZXRUZXh0KExvY2FsZS5nZXREZWZhdWx0KCksIGNsYXNzTG9hZGVyKTsKLQkJfQotCQlyZXR1cm4gX3RleHQ7Ci0JfQotCi0JLyoqCi0JICogVXNlIHRoZSBnaXZlbiBDbGFzc0xvYWRlciB0byBsb2FkIHRoaXMgbWVzc2FnZSdzIHRleHQsCi0JICogZm9yIHRoZSBMb2NhbGUsIGZyb20gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKi8JCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsb2NhbGUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCWlmKF90ZXh0ID09IG51bGwpIHsKLQkJCXJldHVybiBnZXRUZXh0KGdldEJ1bmRsZU5hbWUoKSwgbG9jYWxlLCBjbGFzc0xvYWRlciwgZ2V0SWQoKSwgZ2V0UGFyYW1zKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gX3RleHQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdHJhbnNsYXRlZCBtZXNzYWdlLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGVOYW1lIFRoZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBidW5kbGUgdG8gc2VhcmNoIGZvciB0aGUgbWVzc2FnZS4KLQkgKiBAcGFyYW0gbG9jYWxlIFRoZSBMb2NhbGUgZm9yIHdoaWNoIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBsb2FkZWQuCi0JICogQHBhcmFtIGNsYXNzTG9hZGVyIFRoZSBDbGFzc0xvYWRlciB3aGljaCBjYW4gbG9jYXRlIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogQHBhcmFtIG1lc3NhZ2VJZCBUaGUgdW5pcXVlIGlkLCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlLCB0aGF0IGlkZW50aWZpZXMgdGhlIG1lc3NhZ2UuCi0JICogQHBhcmFtIHBhcm1zIFRoZSBwYXJhbWV0ZXJzIHRvIHN1YnN0aXR1dGUgaW50byB0aGUgcGF0dGVybiBvZiB0aGUgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGV4dChTdHJpbmcgYnVuZGxlTmFtZSwgTG9jYWxlIGxvY2FsZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAobG9jYWxlID09IG51bGwpIHsKLQkJCXJldHVybiBtZXNzYWdlOwotCQl9Ci0KLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIGxvY2FsZSwgY2xhc3NMb2FkZXIpOwotCQlpZiAoYnVuZGxlID09IG51bGwpIHsKLQkJCXJldHVybiBtZXNzYWdlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCW1lc3NhZ2UgPSBidW5kbGUuZ2V0U3RyaW5nKG1lc3NhZ2VJZCk7Ci0KLQkJCWlmIChwYXJtcyAhPSBudWxsKSB7Ci0JCQkJbWVzc2FnZSA9IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdChtZXNzYWdlLCBwYXJtcyk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleGMpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihleGMuZ2V0TWVzc2FnZSgpKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlSWQpOwotCQl9Ci0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleGMpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihleGMuZ2V0TWVzc2FnZSgpKTsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlSWQpOwotCQl9Ci0KLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBidW5kbGUgd2hpY2ggY29udGFpbnMgdGhlIG1lc3NhZ2VzLCBhcyBpZGVudGlmaWVkIGJ5Ci0JICogQGxpbmsgI2dldEJ1bmRsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBidW5kbGVOYW1lLCBMb2NhbGUgbG9jYWxlLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKGNsYXNzTG9hZGVyID09IG51bGwpIHsKLQkJCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgbG9jYWxlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBsb2NhbGUsIGNsYXNzTG9hZGVyKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9Ci0JCi19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvUHJvcGVydHlGaWxlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Byb3BlcnR5RmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjYwYjE0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvUHJvcGVydHlGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBUaGlzIFByb3BlcnR5RmlsZSBpcyBpbnN0YW50aWF0ZWQgYnkgY29kZSB0aGF0IGlzbid0IGFuIElWYWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUZpbGUgZXh0ZW5kcyBBUHJvcGVydHlGaWxlIHsKLQlwcml2YXRlIFN0cmluZyBfZW5jbG9zaW5nWmlwRmlsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9wcm9wZXJ0eUZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfZmlsZU5hbWUgPSBudWxsOwotCQotCXB1YmxpYyBQcm9wZXJ0eUZpbGUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXRoaXMoZmlsZU5hbWUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHlGaWxlKFN0cmluZyBmaWxlTmFtZSwgYm9vbGVhbiB0cmFjZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl0aGlzKG5ldyBGaWxlKGZpbGVOYW1lKSwgdHJhY2UpOwotCX0KLQkKLQlwdWJsaWMgUHJvcGVydHlGaWxlKEZpbGUgcHJvcGVydHlGaWxlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXRoaXMocHJvcGVydHlGaWxlLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBQcm9wZXJ0eUZpbGUoRmlsZSBwcm9wZXJ0eUZpbGUsIGJvb2xlYW4gdHJhY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJdGhpcyhudWxsLCBwcm9wZXJ0eUZpbGUsIHRyYWNlKTsKLQl9Ci0JCi0JcHVibGljIFByb3BlcnR5RmlsZShTdHJpbmcgZW5jbG9zaW5nWmlwRmlsZU5hbWUsIEZpbGUgcHJvcGVydHlGaWxlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXRoaXMoZW5jbG9zaW5nWmlwRmlsZU5hbWUsIHByb3BlcnR5RmlsZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBQcm9wZXJ0eUZpbGUoU3RyaW5nIGVuY2xvc2luZ1ppcEZpbGVOYW1lLCBGaWxlIHByb3BlcnR5RmlsZSwgYm9vbGVhbiBkZWJ1ZykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlpZiAoIXByb3BlcnR5RmlsZS5leGlzdHMoKSkKLQkJCXRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCJDYW5ub3QgZmluZCBmaWxlICIgKyBwcm9wZXJ0eUZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIXByb3BlcnR5RmlsZS5pc0ZpbGUoKSkKLQkJCXRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHByb3BlcnR5RmlsZS5nZXROYW1lKCkgKyAiIGlzIG5vdCBhIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIXByb3BlcnR5RmlsZS5jYW5SZWFkKCkpCi0JCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigiQ2Fubm90IHJlYWQgIiArIHByb3BlcnR5RmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCWlmICghcHJvcGVydHlGaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgicHJvcGVydGllcyIpKSAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigiQ2FuIHBhcnNlIG9ubHkgLnByb3BlcnRpZXMgZmlsZXM7IGlnbm9yaW5nICIgKyBwcm9wZXJ0eUZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXNldERlYnVnKGRlYnVnKTsKLQkJCQotCQlfZW5jbG9zaW5nWmlwRmlsZU5hbWUgPSBlbmNsb3NpbmdaaXBGaWxlTmFtZTsKLQkJCi0JCV9maWxlTmFtZSA9IHByb3BlcnR5RmlsZS5nZXROYW1lKCk7Ci0JCQotCQlyZXBvcnQoIkZpbGUgbmFtZTogIiArIF9maWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VGaWxlKHByb3BlcnR5RmlsZSk7Ci0JCXJlcG9ydCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlwcm9wZXJ0eUZpbGUgPSBudWxsOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgQVByb3BlcnR5RmlsZSNyZXBvcnQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydChTdHJpbmcgc3RyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihzdHIpOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgQVByb3BlcnR5RmlsZSNyZXBvcnQoTWVzc2FnZU1ldGFEYXRhKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydChNZXNzYWdlTWV0YURhdGEgbWVzc2FnZSkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihtZXNzYWdlLmdldFRleHQoZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoUmVzb3VyY2VIYW5kbGVyLmdldEV4dGVybmFsaXplZE1lc3NhZ2UoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgSVZhbGlkYXRpb25Db25zdGFudHMuTElORV9MT0MsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihtZXNzYWdlLmdldExpbmVOdW1iZXIoKSksIGdldFF1YWxpZmllZEZpbGVOYW1lKCl9KSk7Ci0JCXJlcG9ydChidWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKSB7Ci0JCWlmIChfcHJvcGVydHlGaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAoX2VuY2xvc2luZ1ppcEZpbGVOYW1lID09IG51bGwpIHsKLQkJCQlfcHJvcGVydHlGaWxlTmFtZSA9IF9maWxlTmFtZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCV9wcm9wZXJ0eUZpbGVOYW1lID0gX2VuY2xvc2luZ1ppcEZpbGVOYW1lICsgIjo6IiArIF9maWxlTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBfcHJvcGVydHlGaWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotCQlyZXR1cm4gX2ZpbGVOYW1lOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Byb3BlcnR5TGluZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUxpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2OWM3Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Byb3BlcnR5TGluZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlcjsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBQcm9wZXJ0eUxpbmUgcmVwcmVzZW50cyBhIGxpbmUgaW4gYSBQcm9wZXJ0eUZpbGUuIEl0IGhhcyBhIG1lc3NhZ2UgaWQsCi0gKiBhIG1lc3NhZ2UgdmFsdWUgKHRoZSB0ZXh0IG9mIHRoZSBwcm9wZXJ0eTsgdGhpcyBpcyB0aGUgdGV4dCB3aGljaCBpcwotICogdHJhbnNsYXRlZCksIGEgbGluZSBudW1iZXIsIGFuZCwgb3B0aW9uYWxseSwgYW4gdW5pcXVlIGVycm9yIGlkIChvZiB0aGUKLSAqIGZvcm0gQUJDRDEyMzR7RXxXfEl9KS4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5TGluZSBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCXByaXZhdGUgU3RyaW5nIF9tZXNzYWdlSWQ7IC8vIHRoZSBtZXNzYWdlIGlkIChub3QgdHJhbnNsYXRlZCkKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZSA9IG51bGw7IC8vIHRoZSBtZXNzYWdlIHZhbHVlIHdpdGggdGhlIGVycm9yIGlkICh0cmFuc2xhdGVkKQotCXByaXZhdGUgU3RyaW5nIF9tZXNzYWdlUHJlZml4ID0gbnVsbDsgLy8gdGhlIHByZWZpeCAoZS5nLiBBQkNEMTIzNHtFfFd8SX0KLQlwcml2YXRlIFN0cmluZyBfc2hvcnRNZXNzYWdlID0gbnVsbDsgLy8gdGhlIG1lc3NhZ2UgdmFsdWUgd2l0aG91dCB0aGUgZXJyb3IgaWQgKHRyYW5zbGF0ZWQpCi0JcHJpdmF0ZSBpbnQgX2xpbmVOdW1iZXIgPSAtMTsgLy8gdGhlIGxpbmUgbnVtYmVyIG9mIHRoaXMgbWVzc2FnZSB2YWx1ZQotCXByaXZhdGUgaW50IF9udW1Xb3JkcyA9IC0xOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEVNUFRZID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIEFQcm9wZXJ0eUZpbGUgX2ZpbGUgPSBudWxsOwotCXByaXZhdGUgaW50IF9vZmZzZXQgPSAtMTsgLy8gdGhlIG9mZnNldCwgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUsIHdoZXJlIHRoaXMgbGluZSBiZWdpbnMKLQlwcml2YXRlIGludCBfbWVzc2FnZU9mZnNldCA9IC0xOyAgLy8gdGhlIG9mZnNldCBpbiB0aGUgbGluZSwgYWZ0ZXIgdGhlIEVRVUFMUywgd2hlcmUgdGhlIG1lc3NhZ2UgcHJlZml4IGJlZ2lucwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUVVPVEUgPSAnXCcnOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgT0JSQUNLRVQgPSAneyc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBDQlJBQ0tFVCA9ICd9JzsKLQotCS8vIFRoZSBFbnVtIGZvciB0aGUgbWVzc2FnZSBzZXZlcml0eSBjYW4gYmUgb25lIG9mIHRoZXNlIGZvdXIgdmFsdWVzLiBJZiB0aGVyZSBpcyBhbiBlcnJvciBpZCwKLQkvLyBVTkFTU0lHTkVEIGluZGljYXRlcyBhbiBpbnZhbGlkIHZhbHVlLiAKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBVTkFTU0lHTkVEID0gMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFUlJPUiA9IDB4MTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBXQVJOSU5HID0gMHgyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElORk8gPSAweDM7Ci0KLQlwcml2YXRlIGludCBfc2V2ZXJpdHkgPSBVTkFTU0lHTkVEOyAvLyB0aGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UsIGlmIHRoaXMgbWVzc2FnZSBoYXMgYW4gZXJyb3IgaWQuIFVOQVNTSUdORUQgbWVhbnMgZWl0aGVyIHRoYXQgdGhlIHNldmVyaXR5IHdhcyBhbiBpbnZhbGlkIHNldmVyaXR5IChub3QgaW5mbywgd2Fybiwgb3IgZXJyb3IpLCBvciB0aGF0IHRoZSBtZXNzYWdlIGhhcyBubyBlcnJvciBpZC4gQ2hlY2sgdGhlIHZhbHVlIG9mIHRoZSBlcnJvciBpZCB0byBmaW5kIG91dCB3aGljaCBvZiB0aGUgdHdvIGlzIHRoZSBjYXNlLgotCXByaXZhdGUgaW50IF9udW1QYXJtcyA9IDA7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEJMQU5LID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLnRvQ2hhckFycmF5KCk7IC8vIHRoaXMgc3RyaW5nIGlzIDEwMCBjaGFyYWN0ZXJzIGxvbmcuIEl0J3MgdXNlZCB0byBxdWlja2x5IGdldCBhIGJsYW5rIHN0cmluZyBpbiB0aGUgZ2V0QmxhbmsoaW50KSBtZXRob2QuIEhvcGVmdWxseSB0aGUgdXNlciB3aWxsIG5ldmVyIHdhbnQgbW9yZSB0aGFuIDEwMCBjaGFyIGluIGEgZ2l2ZW4gcGFyYW1ldGVyLiAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgUHJvcGVydHlMaW5lKEFQcm9wZXJ0eUZpbGUgZmlsZSwgaW50IG9mZnNldCwgaW50IG1lc3NhZ2VPZmZzZXQsIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZU51bWJlcikgewotCQkvLyBDb21tZW50IG9uIHRoZSB1c2Ugb2YgaW50ZXJuKCkuCi0JCS8vIEJlY2F1c2UgaXQncyBsaWtlbHkgdGhhdCB3ZSdsbCBiZSBjb21wYXJpbmcgdGhpcyBzdHJpbmcgYSBsb3QsCi0JCS8vIGxvYWQgaXQgaW50byB0aGUgSmF2YSBjb25zdGFudHMgc3BhY2UgdGhyb3VnaCBpbnRlcm4oKS4gU2luY2Ugd2Ugd29uJ3QKLQkJLy8gYmUgbW9kaWZ5aW5nIHRoaXMgc3RyaW5nLCBpdCdzIHNhZmUgdG8gbG9hZCBpdCBpbnRvIHRoZSBjb25zdGFudHMgc3BhY2UuCi0JCS8vCi0JCV9vZmZzZXQgPSBvZmZzZXQ7IC8vIHRoZSBvZmZzZXQgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUgd2hlcmUgdGhpcyBsaW5lIGJlZ2lucwotCQlfbWVzc2FnZU9mZnNldCA9IG1lc3NhZ2VPZmZzZXQ7IC8vIHRoZSBvZmZzZXQgaW4gdGhlIGxpbmUsIGFmdGVyIHRoZSBFUVVBTFMsIHdoZXJlIHRoZSBtZXNzYWdlIHByZWZpeCBiZWdpbnMKLQkJX21lc3NhZ2VJZCA9IG1lc3NhZ2VJZDsKLQkJX21lc3NhZ2UgPSBtZXNzYWdlOyAvLyByZTogaW50ZXJuKCkuIERpdHRvLgotCQlfbGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0JCV9maWxlID0gZmlsZTsKLQotCQlwYXJzZShtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgewotCQkvLyBieSBkZWZhdWx0LCBzb3J0IGJ5IG1lc3NhZ2UgaWQKLQkJaWYgKCEobyBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkpIHsKLQkJCS8vIHRoZW4gaG93IG9uIGVhcnRoIGRpZCB0aGlzIG1ldGhvZCBnZXQgY2FsbGVkPz8KLQkJCS8vIHB1dCBpdCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0JCQlyZXR1cm4gMTsKLQkJfQotCi0JCXJldHVybiBnZXRNZXNzYWdlSWQoKS5jb21wYXJlVG8oKChQcm9wZXJ0eUxpbmUpIG8pLmdldE1lc3NhZ2VJZCgpKTsKLQl9Ci0KLQlwdWJsaWMgQVByb3BlcnR5RmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gX2ZpbGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlUHJlZml4KCkgewotCQlyZXR1cm4gX21lc3NhZ2VQcmVmaXg7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc01lc3NhZ2VQcmVmaXgoKSB7Ci0JCWlmKF9tZXNzYWdlUHJlZml4ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoX21lc3NhZ2VQcmVmaXguZXF1YWxzKEVNUFRZKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotCQlyZXR1cm4gX2xpbmVOdW1iZXI7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZCgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlSWQ7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRNZXNzYWdlKCkgewotCQlyZXR1cm4gX3Nob3J0TWVzc2FnZTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHdvcmRzIGluIHRoZSBtZXNzYWdlIGV4Y2x1ZGluZyAKLQkgKiB0aGUgbWVzc2FnZSBlcnJvciBpZCBwcmVmaXguCi0JICovCi0JcHVibGljIGludCBnZXROdW1Xb3JkcygpIHsKLQkJaWYoX251bVdvcmRzID09IC0xKSB7Ci0JCQlfbnVtV29yZHMgPSAwOwotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZ2V0U2hvcnRNZXNzYWdlKCkpOwotCQkJX251bVdvcmRzID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0JCX0KLQkJcmV0dXJuIF9udW1Xb3JkczsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIAotCSAqIG1lc3NhZ2UgaW5jbHVkaW5nIHRoZSBtZXNzYWdlIHByZWZpeCBhbmQgcGFyYW1ldGVycy4gKGkuZS4sIHswfSB3b3VsZAotCSAqIGJlIGNvdW50ZWQgYXMgdGhyZWUgY2hhcmFjdGVycy4pCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRNZXNzYWdlKCkubGVuZ3RoKCk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSAKLQkgKiBtZXNzYWdlIGluY2x1ZGluZyB0aGUgbWVzc2FnZSBwcmVmaXggYW5kIHRoZSBleHBlY3RlZCAKLQkgKiBudW1iZXIgb2YgY2hhcmFjdGVycy4gKFRoYXQgaXMsIHRoZSBsZW5ndGhQYXJtIHBhcmFtZXRlcgotCSAqIGlzIHVzZWQgYXMgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgbGVuZ3RoIG9mIGVhY2ggcGFyYW1ldGVyCi0JICogaW4gdGhlIG1lc3NhZ2UuKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXhwZWN0ZWRMZW5ndGgoaW50IGxlbmd0aFBhcm0pIHsKLQkJaWYoaGFzUGFyYW1ldGVycygpICYmIChsZW5ndGhQYXJtID4gMCkpIHsKLQkJCXJldHVybiBnZXRFeHBlY3RlZE1lc3NhZ2UobGVuZ3RoUGFybSkubGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIGdldExlbmd0aCgpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzdWJzdGl0dXRlcyBhIGJsYW5rIHN0dWIgb2YgdGhlIGdpdmVuIGxlbmd0aAotCSAqIGV2ZXJ5IHBsYWNlIGluIHRoZSBzdHJpbmcgd2hlcmUgdGhlcmUgaXMgYSBwYXJtLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXhwZWN0ZWRNZXNzYWdlKGludCBsZW5ndGhQYXJtKSB7Ci0JCWlmKGhhc1BhcmFtZXRlcnMoKSAmJiAobGVuZ3RoUGFybSA+IDApKSB7Ci0JCQkvLyBtZXNzYWdlIGNhbm5vdCBiZSBudWxsIG9yIGJsYW5rIG9yIGl0IHdvdWxkbid0IGhhdmUgcGFyYW1ldGVycwotCQkJU3RyaW5nIGJsYW5rID0gZ2V0QmxhbmsobGVuZ3RoUGFybSk7Ci0JCQkKLQkJCWludCBudW1QYXJtID0gZ2V0TnVtUGFyYW1ldGVycygpOwotCQkJU3RyaW5nW10gcGFybSA9IG5ldyBTdHJpbmdbbnVtUGFybV07Ci0JCQlmb3IoaW50IGk9MDsgaTxwYXJtLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcGFybVtpXSA9IGJsYW5rOwotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0TWVzc2FnZSgpLCBwYXJtKTsKLQkJCX0KLQkJCWNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlpZihnZXRGaWxlKCkuZGVidWcoKSkgewotCQkJCQlnZXRGaWxlKCkucmVwb3J0KGV4Yy5nZXRNZXNzYWdlKCkpOwotCQkJCQlnZXRGaWxlKCkucmVwb3J0KGdldEZpbGUoKS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpICsgIjo6IiArIGdldE1lc3NhZ2VJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gZ2V0TWVzc2FnZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRNZXNzYWdlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGJsYW5rIHN0cmluZyBvZiB0aGUgZ2l2ZW4gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEJsYW5rKGludCBsZW5ndGgpIHsKLQkJY2hhcltdIGJsYW5rID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJaWYobGVuZ3RoID4gQkxBTksubGVuZ3RoKSB7Ci0JCQlmb3IoaW50IGk9MDsgaTxsZW5ndGg7IGkrKykgewotCQkJCWJsYW5rW2ldID0gJyAnOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJU3lzdGVtLmFycmF5Y29weShCTEFOSywgMCwgYmxhbmssIDAsIGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoYmxhbmspOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBsaW5lIGhhcyBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdCBwYXR0ZXJucy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQYXJhbWV0ZXJzKCkgewotCQlyZXR1cm4gZ2V0TnVtUGFyYW1ldGVycygpID4gMDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgcGF0dGVybnMgaW4gdGhlIHByb3BlcnR5IGxpbmUuCi0JICovCi0JcHVibGljIGludCBnZXROdW1QYXJhbWV0ZXJzKCkgewotCQlyZXR1cm4gX251bVBhcm1zOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSwgdG8KLQkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWVzc2FnZU9mZnNldCgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlT2Zmc2V0OwotCX0KLQkKLQkvKioKLQkgKiBUaGUgb2Zmc2V0LCBpbiB0aGUgLnByb3BlcnRpZXMgZmlsZSwgd2hlcmUgdGhpcyBsaW5lIGJlZ2lucy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIF9vZmZzZXQ7Ci0JfQotCQotCS8qKgotCSAqIFRoZSBzZXZlcml0eSBvZiB0aGUgbWVzc2FnZSwgaWYgdGhpcyBtZXNzYWdlIGhhcyBhbiBlcnJvciBpZC4gCi0JICogVU5BU1NJR05FRCBtZWFucyBlaXRoZXIgdGhhdCB0aGUgc2V2ZXJpdHkgd2FzIGFuIGludmFsaWQgc2V2ZXJpdHkgCi0JICogKG5vdCBpbmZvLCB3YXJuLCBvciBlcnJvciksIG9yIHRoYXQgdGhlIG1lc3NhZ2UgaGFzIG5vIGVycm9yIGlkLiBDaGVjayAKLQkgKiB0aGUgdmFsdWUgb2YgdGhlIGVycm9yIGlkIHRvIGZpbmQgb3V0IHdoaWNoIG9mIHRoZSB0d28gaXMgdGhlIGNhc2UuCi0JICovCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJcmV0dXJuIF9zZXZlcml0eTsKLQl9Ci0KLQkvKioKLQkqIFBhcnNlIHRoZSBtZXNzYWdlIHZhbHVlIHRvIGV4dHJhY3QgdGhlIHVuaXF1ZSBlcnJvciBpZCwgaWYgYW55IGV4aXN0cy4KLQkqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHNvbWUgb2YgdGhlIGZpZWxkcyBpbiB0aGlzIGNsYXNzLgotCSovCi0JcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJLy8gVG8gc2VlIHdoeSBpdCdzIHNhZmUgdG8gY2FsbCBpbnRlcm4oKSwgcmVhZCB0aGUgY29tbWVudCBpbiB0aGUKLQkJLy8gY29uc3RydWN0b3IuCi0KLQkJLy8gQ2FzZSAxOiBBQkNEMDAwMEU6IEJsYWggQmxhaCBCbGFoCi0JCS8vIENhc2UgMjogQUJDRDAwMDBFICBCbGFoIEJsYWggQmxhaAotCQkvLyBDYXNlIDM6IEFCQ0QwMDAwRSA6IEJsYWggQmxhaCBCbGFoCi0JCS8vIENhc2UgNDogQUJDRDAwMDBFICBCbGFoOkJsYWggQmxhaAotCQkvLyBDYXNlIDU6IEFCQ0QwMDAwRSA6Ci0JCS8vIENhc2UgNjogQmxhaCBCbGFoIEJsYWggKGkuZS4sIG5vIHByZWZpeCkKLQkJLy8gQ2FzZSA3OiBBQkNEMDAwMEU6IEJsYWgKLQkJLy8gQ2FzZSA4OiBBQkNEMDAwMEUgIEJsYWgKLQkJLy8gQ2FzZSA5OiBBQkNEMDAwMEUgOiBCbGFoCi0JCS8vIENhc2UgMTA6IEFCQ0QwMDAwRSBCbGFoCi0JCS8vIENhc2UgMTE6IEFCQ0QwMDAwRQotCi0JCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCV9tZXNzYWdlUHJlZml4ID0gRU1QVFk7Ci0JCQlfc2hvcnRNZXNzYWdlID0gRU1QVFk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihtZXNzYWdlKTsKLQkJaW50IG51bVRva2VucyA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQlpZiAobnVtVG9rZW5zID09IDApIHsKLQkJCV9tZXNzYWdlUHJlZml4ID0gRU1QVFk7Ci0JCQlfc2hvcnRNZXNzYWdlID0gbWVzc2FnZTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBlcnJvcklkID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJYm9vbGVhbiBwcmVmaXhFeGlzdHMgPSBmYWxzZTsKLQotCQkJLy8gU29tZXRpbWVzIHRoZSAnOicgaXNuJ3QgdGhlcmUgb3IgaXNuJ3QgaW4gdGhlIHJpZ2h0IHBsYWNlLCBzbyBkb24ndCBkZXRlcm1pbmUgdGhlIG1lc3NhZ2UgcHJlZml4IGJhc2VkIG9uIHRoYXQuCi0JCQlTdHJpbmcgYWZ0ZXJQcmVmaXggPSBudWxsOwotCQkJaWYoZXJyb3JJZC5sZW5ndGgoKSA+PSA5KSB7Ci0JCQkJYWZ0ZXJQcmVmaXggPSBlcnJvcklkLnN1YnN0cmluZygwLCA5KTsgLy8gTXVzdCBiZSBvZiB0aGUgZm9ybSBBQkNEMTIzNEUsIHdoaWNoIGlzIDkgY2hhciBsb25nCi0JCQkJY2hhcltdIHRlbXAgPSBhZnRlclByZWZpeC50b0NoYXJBcnJheSgpOwotCQkJCXByZWZpeEV4aXN0cyA9IENoYXJhY3Rlci5pc0xldHRlcih0ZW1wWzBdKSAmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2UodGVtcFswXSk7Ci0JCQkJcHJlZml4RXhpc3RzID0gcHJlZml4RXhpc3RzICYmIENoYXJhY3Rlci5pc0xldHRlcih0ZW1wWzFdKSAmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2UodGVtcFswXSk7Ci0JCQkJcHJlZml4RXhpc3RzID0gcHJlZml4RXhpc3RzICYmIENoYXJhY3Rlci5pc0xldHRlcih0ZW1wWzJdKSAmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2UodGVtcFswXSk7Ci0JCQkJcHJlZml4RXhpc3RzID0gcHJlZml4RXhpc3RzICYmIENoYXJhY3Rlci5pc0xldHRlcih0ZW1wWzNdKSAmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2UodGVtcFswXSk7Ci0JCQkJcHJlZml4RXhpc3RzID0gcHJlZml4RXhpc3RzICYmIENoYXJhY3Rlci5pc0RpZ2l0KHRlbXBbNF0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNEaWdpdCh0ZW1wWzVdKTsKLQkJCQlwcmVmaXhFeGlzdHMgPSBwcmVmaXhFeGlzdHMgJiYgQ2hhcmFjdGVyLmlzRGlnaXQodGVtcFs2XSk7Ci0JCQkJcHJlZml4RXhpc3RzID0gcHJlZml4RXhpc3RzICYmIENoYXJhY3Rlci5pc0RpZ2l0KHRlbXBbN10pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFs4XSkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHRlbXBbMF0pOwotCi0JCQkJaWYgKHByZWZpeEV4aXN0cykgewotCQkJCQlzd2l0Y2ggKHRlbXBbOF0pIHsKLQkJCQkJCWNhc2UgKCdFJykgOgotCQkJCQkJCXsKLQkJCQkJCQkJX3NldmVyaXR5ID0gRVJST1I7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCWNhc2UgKCdXJykgOgotCQkJCQkJCXsKLQkJCQkJCQkJX3NldmVyaXR5ID0gV0FSTklORzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJY2FzZSAoJ0knKSA6Ci0JCQkJCQkJewotCQkJCQkJCQlfc2V2ZXJpdHkgPSBJTkZPOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCi0JCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQl7Ci0JCQkJCQkJCV9zZXZlcml0eSA9IFVOQVNTSUdORUQ7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJfQotCQkJCQlfbWVzc2FnZVByZWZpeCA9IGFmdGVyUHJlZml4OwotCQkJCQkKLQkJCQkJaW50IGNvbG9uSW5kZXggPSBlcnJvcklkLmluZGV4T2YoJzonKTsKLQkJCQkJYm9vbGVhbiBub0NvbG9uID0gKGNvbG9uSW5kZXggPT0gLTEpOwotCQotCQkJCQlpbnQgc2hvcnRNZXNzYWdlSW5kZXggPSAxMDsgLy8gYXNzdW1lIHRoYXQgb25seSB0aGUgQUJDRDAwMDBFIHByZWZpeCB3aWxsIGJlIHN0cmlwcGVkIChpLmUuLCBubyBjb2xvbikKLQkJCQkJaWYobm9Db2xvbikgewotCQkJCQkJLy8gTm8gY29sb24gZm9sbG93aW5nIG1lc3NhZ2UgcHJlZml4IGltbWVkaWF0ZWx5LgotCQkJCQkJLy8gSXMgdGhlcmUgd2hpdGVzcGFjZSBiZWZvcmUgdGhlIGNvbG9uPwotCQkJCQkJaWYgKG51bVRva2VucyA+IDEpIHsKLQkJCQkJCQlTdHJpbmcgbmV4dFRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJCQkJCWNvbG9uSW5kZXggPSBuZXh0VG9rZW4uaW5kZXhPZignOicpOwotCQkJCQkJCW5vQ29sb24gPSAoKGNvbG9uSW5kZXggPT0gLTEpIHx8IChuZXh0VG9rZW4udHJpbSgpLmluZGV4T2YoJzonKSAhPSAwKSk7IC8vIGNhc2UgNCB0cmltIGNvbmRpdGlvbiB3aWxsIGJlIHRydWUKLQkJCQkJCQkKLQkJCQkJCQkvLyAiOiIgc2hvdWxkIGZvbGxvdyB0aGUgbWVzc2FnZSBwcmVmaXggaW1tZWRpYXRlbHkKLQkJCQkJCQkvLyBLbm93IHRoZXJlJ3MgYSBwcmVmaXgsIGFuZCB0aGF0J3MgOSBjaGFyCi0JCQkJCQkJaWYobm9Db2xvbikgewotCQkJCQkJCQkvLyBDYXNlIDIsIDQsIDggb3IgMTAKLS8vCQkJCQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuSU5GTywgSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAxMjAsIG5ldyBTdHJpbmdbXXt9LCB0aGlzLCBnZXRMaW5lTnVtYmVyKCkpOwotLy8JCQkJCQkJCWdldEZpbGUoKS5hZGRQYXJzZVdhcm5pbmcobW1kKTsKLQkJCQkJCQkJc2hvcnRNZXNzYWdlSW5kZXggPSAxMDsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0vLwkJCQkJCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLklORk8sIElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMTMwLCBuZXcgU3RyaW5nW117fSwgdGhpcywgZ2V0TGluZU51bWJlcigpKTsKLS8vCQkJCQkJCQlnZXRGaWxlKCkuYWRkUGFyc2VXYXJuaW5nKG1tZCk7Ci0JCQkJCQkJCQotCQkJCQkJCQlpZihudW1Ub2tlbnMgPiAyKSB7Ci0JCQkJCQkJCQkvLyBDYXNlIDMgb3IgOQotCQkJCQkJCQkJbmV4dFRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJCQkJCQkJc2hvcnRNZXNzYWdlSW5kZXggPSBtZXNzYWdlLmluZGV4T2YobmV4dFRva2VuKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCS8vIENhc2UgNQotCQkJCQkJCQkJc2hvcnRNZXNzYWdlSW5kZXggPSBjb2xvbkluZGV4ICsgMTsKLQkJCQkJCQkJfQkJCQkJCQkJCi0JCQkJCQkJfQotCQkJCQkJCV9zaG9ydE1lc3NhZ2UgPSBtZXNzYWdlLnN1YnN0cmluZyhzaG9ydE1lc3NhZ2VJbmRleCwgbWVzc2FnZS5sZW5ndGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBDYXNlIDExCi0JCQkJCQkJX3Nob3J0TWVzc2FnZSA9IEVNUFRZOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gQ2FzZSAxIG9yIDcKLQkJCQkJCXNob3J0TWVzc2FnZUluZGV4ID0gY29sb25JbmRleCArIDE7Ci0JCQkJCQlfc2hvcnRNZXNzYWdlID0gbWVzc2FnZS5zdWJzdHJpbmcoc2hvcnRNZXNzYWdlSW5kZXgsIG1lc3NhZ2UubGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQotCQkJfQotCi0JCQlpZiAoIXByZWZpeEV4aXN0cykgewotCQkJCS8vIENhc2UgNgotCQkJCV9tZXNzYWdlUHJlZml4ID0gRU1QVFk7Ci0JCQkJX3Nob3J0TWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCQl9Ci0JCX0KLQotCQlnZXRGaWxlKCkuYWRkUGFyc2VXYXJuaW5ncyhwYXJzZU1lc3NhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogT25jZSB0aGUgZmllbGQgdGhhdCBob2xkcyB0aGUgbWVzc2FnZSB0ZXh0IGhhcyBiZWVuIHNldCAoaS5lLiwgcGFyc2UoU3RyaW5nKQotCSAqIGhhcyBiZWVuIGNhbGxlZCksIHRoaXMgbWV0aG9kIHBhcnNlcyB0aGUgbWVzc2FnZSB0ZXh0LCBmaW5kcyBhbnkgc3ludGF4IG9yCi0JICogb3RoZXIgcHJvYmxlbXMsIGFuZCByZXR1cm5zIGEgTGlzdCBvZiBNZXNzYWdlTWV0YURhdGEsIHdpdGggb25lIE1lc3NhZ2VNZXRhRGF0YQotCSAqIGZvciBlYWNoIHByb2JsZW0uCi0JICovCi0JcHVibGljIExpc3QgcGFyc2VNZXNzYWdlKCkgewotCQkvLyBub3cgcGFyc2UgdG8gc2VlIGlmIGFsbCBhcG9zdHJvcGhlcyBhcmUgaW4gcGFpcnMsIGlmIHRoZXJlIGFyZSBwYXJhbWV0ZXJzIG9yIG5vdCwgZXRjLgotCQlBcnJheUxpc3QgaW50TGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW50IG51bU9icmFja2V0cyA9IDA7Ci0JCWludCBudW1DYnJhY2tldHMgPSAwOwotCQlpbnQgaW5kZXggPSAwOwotCQljaGFyIHRva2VuOwotCQlpbnQgc2luZ2xlUXVvdGVJbmRleCA9IC0xOwotCQlpbnQgZG91YmxlUXVvdGVJbmRleCA9IC0xOwotCQlpbnQgbWlzc2luZ1Rlcm1pbmF0aW5nUXVvdGVJbmRleCA9IC0xOwotCQlib29sZWFuIHBhcm1FeGlzdHMgPSBmYWxzZTsKLQkJaW50IG51bUNoYXJCZWZvcmVTaG9ydCA9IGdldE1lc3NhZ2VPZmZzZXQoKSArIGdldE1lc3NhZ2UoKS5pbmRleE9mKGdldFNob3J0TWVzc2FnZSgpKTsKLQkJCi0JCXdoaWxlIChpbmRleCA8IGdldFNob3J0TWVzc2FnZSgpLmxlbmd0aCgpKSB7Ci0JCQl0b2tlbiA9IGdldFNob3J0TWVzc2FnZSgpLmNoYXJBdChpbmRleCsrKTsKLQkJCWlmICh0b2tlbiA9PSBRVU9URSkgewotCQkJCWlmIChpbmRleCA8IGdldFNob3J0TWVzc2FnZSgpLmxlbmd0aCgpKSB7Ci0JCQkJCXRva2VuID0gZ2V0U2hvcnRNZXNzYWdlKCkuY2hhckF0KGluZGV4KyspOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdG9rZW4gPSAnICc7Ci0JCQkJfQotCQkJCQotCQkJCWlmICgodG9rZW4gPT0gT0JSQUNLRVQpIHx8ICh0b2tlbiA9PSBDQlJBQ0tFVCkpewotCQkJCQlpZiAoaW5kZXggPCBnZXRTaG9ydE1lc3NhZ2UoKS5sZW5ndGgoKSkgewotCQkJCQkJdG9rZW4gPSBnZXRTaG9ydE1lc3NhZ2UoKS5jaGFyQXQoaW5kZXgrKyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl0b2tlbiA9ICcgJzsKLQkJCQkJfQotCQkJCQkKLQkJCQkJLy8gRG9lcyB0aGUgeyBvciB9IGNoYXJhY3RlciBoYXZlIGEgdGVybWluYXRpbmcgc2luZ2xlIHF1b3RlPwotCQkJCQlpZih0b2tlbiAhPSBRVU9URSkgewotCQkJCQkJbWlzc2luZ1Rlcm1pbmF0aW5nUXVvdGVJbmRleCA9IChudW1DaGFyQmVmb3JlU2hvcnQgKyBpbmRleC0xKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICgodG9rZW4gPT0gUVVPVEUpKSB7Ci0JCQkJCWRvdWJsZVF1b3RlSW5kZXggPSAobnVtQ2hhckJlZm9yZVNob3J0ICsgaW5kZXgtMSk7Ci0JCQkJfQotCQkJCWVsc2UgIHsKLQkJCQkJLy8gJ3snIG1lYW5zIHRoYXQgYSB7IHdpbGwgYmUgb3V0cHV0LAotCQkJCQkvLyAnfScgbWVhbnMgdGhhdCBhIH0gd2lsbCBiZSBvdXRwdXQsCi0JCQkJCS8vICcnIG1lYW5zIHRoYXQgYSAnIHdpbGwgYmUgb3V0cHV0LgotCQkJCQkKLQkJCQkJLy8gU2luY2UgdGhlIHF1b3RlIGlzIGEgc3BlY2lhbCBjaGFyYWN0ZXIsIGFuZCB0aGUgb3BlbmluZyBicmFja2V0IGlzIGEgCi0JCQkJCS8vIHNwZWNpYWwgY2hhcmFjdGVyLCBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2Ygb3BlbiBicmFja2V0cy4gSWYgdGhlCi0JCQkJCS8vIGZvbGxvd2luZyBjaGFyYWN0ZXIgaXNuJ3QgYSBxdW90ZSBvciBvcGVuaW5nIGJyYWNrZXQsIHdhcm4gdGhlIHVzZXIgCi0JCQkJCS8vIHRoYXQgaXQgdGFrZXMgdHdvIGFwb3N0cm9waGVzIHRvIHNlZSBvbmUgYXBvc3Ryb3BoZS4KLQkJCQkJc2luZ2xlUXVvdGVJbmRleCA9IChudW1DaGFyQmVmb3JlU2hvcnQgKyBpbmRleC0xKTsKLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbiA9PSBPQlJBQ0tFVCkgewotCQkJCW51bU9icmFja2V0cysrOwotCQkJCXBhcm1FeGlzdHMgPSB0cnVlOwotCQkJCVN0cmluZ0J1ZmZlciBudW1CdWZmZXIgPSBudWxsOwotCQkJCWlmIChpbmRleCA8IGdldFNob3J0TWVzc2FnZSgpLmxlbmd0aCgpKSB7Ci0JCQkJCW51bUJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJd2hpbGUgKGluZGV4IDwgZ2V0U2hvcnRNZXNzYWdlKCkubGVuZ3RoKCkpIHsKLQkJCQkJCWNoYXIgZGlnaXQgPSBnZXRTaG9ydE1lc3NhZ2UoKS5jaGFyQXQoaW5kZXgpOwotCQkJCQkJaWYgKChDaGFyYWN0ZXIuaXNEaWdpdChkaWdpdCkpIHx8IChkaWdpdCA9PSAnLScpIHx8IChkaWdpdCA9PSAnKycpKSB7Ci0JCQkJCQkJbnVtQnVmZmVyLmFwcGVuZChkaWdpdCk7Ci0JCQkJCQkJaW5kZXgrKzsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBub3QgYW4gZXJyb3I7IGp1c3Qgbm90IGEgbnVtYmVyLiBDb3VsZCBiZSBvbmUgb2YgdGhlIG90aGVyIAotCQkJCQkvLyBDaG9pY2VGb3JtYXQsIG9yIHdoYXRldmVyLCBmb3JtYXRzLiBEbyBub3QgZ2V0IHRoZSBuZXh0IAotCQkJCQkvLyB0b2tlbiwgYmVjYXVzZSB3ZSBzdGlsbCBuZWVkIHRvIHByb2Nlc3MgdGhpcyBvbmUuCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXRyeSB7Ci0JCQkJCWlmICgobnVtQnVmZmVyICE9IG51bGwpICYmIChudW1CdWZmZXIubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJSW50ZWdlciBwYXJtTnVtID0gSW50ZWdlci52YWx1ZU9mKG51bUJ1ZmZlci50b1N0cmluZygpKTsKLQkJCQkJCWludExpc3QuYWRkKHBhcm1OdW0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCS8vIG5vdCBhbiBlcnJvcjsganVzdCBub3QgYSBudW1iZXIuIENvdWxkIGJlIG9uZSBvZiB0aGUgb3RoZXIgCi0JCQkJCS8vIENob2ljZUZvcm1hdCwgb3Igd2hhdGV2ZXIsIGZvcm1hdHMuIERvIG5vdCBnZXQgdGhlIG5leHQgCi0JCQkJCS8vIHRva2VuLCBiZWNhdXNlIHdlIHN0aWxsIG5lZWQgdG8gcHJvY2VzcyB0aGlzIG9uZS4KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbiA9PSBDQlJBQ0tFVCkgewotCQkJCW51bUNicmFja2V0cysrOwotCQkJfQotCQl9Ci0JCQotCQlfbnVtUGFybXMgPSBNYXRoLm1heChudW1PYnJhY2tldHMsIG51bUNicmFja2V0cyk7Ci0KLQkJLy8gZmluZCBwYXJzZSB3YXJuaW5ncwotCQlMaXN0IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAobnVtT2JyYWNrZXRzICE9IG51bUNicmFja2V0cykgewotCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLkVSUk9SLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDAwMCwgbmV3IFN0cmluZ1tde1N0cmluZy52YWx1ZU9mKG51bU9icmFja2V0cyksIFN0cmluZy52YWx1ZU9mKG51bUNicmFja2V0cyl9LCB0aGlzLCBnZXRMaW5lTnVtYmVyKCkpOwotCQkJbWVzc2FnZXMuYWRkKG1tZCk7Ci0JCX0KLQkJCi0JCWlmKG1pc3NpbmdUZXJtaW5hdGluZ1F1b3RlSW5kZXggIT0gLTEpIHsKLQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5JTkZPLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDExMCwgbmV3IFN0cmluZ1tde1N0cmluZy52YWx1ZU9mKG1pc3NpbmdUZXJtaW5hdGluZ1F1b3RlSW5kZXgpfSwgdGhpcywgZ2V0TGluZU51bWJlcigpLCBnZXRPZmZzZXQoKSArIG1pc3NpbmdUZXJtaW5hdGluZ1F1b3RlSW5kZXgsIDEpOyAvLyBtYWdpYyBudW1iZXIgMSBiZWNhdXNlIGEgcXVvdGUgaXMgb25lIGNoYXJhY3RlciBsb25nCi0JCQltZXNzYWdlcy5hZGQobW1kKTsKLQkJfQotCi0JCS8vIE5vdyBzb3J0IHRoZSBsaXN0LCB0byBzZWUgaWYgdGhlcmUncyBhbnkgbnVtYmVycyBtaXNzaW5nLCBkdXBsaWNhdGVkLCBvciBuZWdhdGl2ZQotCQlDb2xsZWN0aW9ucy5zb3J0KGludExpc3QsIG5ldyBDb21wYXJhdG9yKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJCS8vIG5lZ2F0aXZlID0gYiBiZWZvcmUgYQotCQkJCS8vIHplcm8gPSBhID0gYgotCQkJCS8vIHBvc2l0aXZlID0gYSBiZWZvcmUgYgotCQkJCXJldHVybiAoKEludGVnZXIpIGEpLmludFZhbHVlKCkgLSAoKEludGVnZXIpIGIpLmludFZhbHVlKCk7Ci0JCQl9Ci0JCX0pOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGludExpc3QuaXRlcmF0b3IoKTsKLQkJaW50IHBhcm1Db3VudCA9IDA7Ci0JCWludCBsYXN0TnVtYmVyID0gLTE7Ci0JCWludCBsYXJnZXN0TnVtYmVyID0gLTE7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUludGVnZXIgcGFybSA9IChJbnRlZ2VyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAocGFybS5pbnRWYWx1ZSgpIDwgMCkgewotCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5FUlJPUiwgSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAwMTBFLCBuZXcgU3RyaW5nW117U3RyaW5nLnZhbHVlT2YocGFybS5pbnRWYWx1ZSgpKX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSk7Ci0JCQkJbWVzc2FnZXMuYWRkKG1tZCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwYXJtLmludFZhbHVlKCkgPT0gbGFzdE51bWJlcikgewotCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5JTkZPLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDAyMCwgbmV3IFN0cmluZ1tde1N0cmluZy52YWx1ZU9mKGxhc3ROdW1iZXIpfSwgdGhpcywgZ2V0TGluZU51bWJlcigpKTsKLQkJCQltZXNzYWdlcy5hZGQobW1kKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBhcm0uaW50VmFsdWUoKSAhPSBwYXJtQ291bnQpIHsKLQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuSU5GTywgSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAwMzAsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihwYXJtQ291bnQpfSwgdGhpcywgZ2V0TGluZU51bWJlcigpKTsKLQkJCQltZXNzYWdlcy5hZGQobW1kKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcm1Db3VudCsrOwotCQkJfQotCQkJbGFzdE51bWJlciA9IHBhcm0uaW50VmFsdWUoKTsKLQkJCWxhcmdlc3ROdW1iZXIgPSBNYXRoLm1heChsYXJnZXN0TnVtYmVyLCBwYXJtLmludFZhbHVlKCkpOwotCQl9Ci0JCWlmKGxhcmdlc3ROdW1iZXIgPiAwKSB7Ci0JCQkvLyBOb3QgYSBjaG9pY2UgZm9ybWF0LgotCQkJLy8KLQkJCS8vIEFsdGhvdWdoIHRoZSBmaXJzdCBkZWZhdWx0IChjb3VudGluZyB0aGUgbnVtYmVyIG9mIAotCQkJLy8gYnJhY2tldHMpIGlzIG9rYXkgaW4gbW9zdCBjYXNlcywgc29tZXRpbWVzIGEgcGFyYW1ldGVyIAotCQkJLy8gaXMgbWlzc2luZywgYW5kIHNvIHRoZSBudW1iZXIgb2YgcGFyYW10ZXJzIHBhc3NlZCBpbnRvIAotCQkJLy8gdGhlIE1lc3NhZ2VGb3JtYXQgbmVlZHMgdG8gYmUgbGFyZ2VyLiAoZS5nLiB7MH0gezJ9LCAKLQkJCS8vIG5lZWQgU3RyaW5nW10gdG8gYmUgeyIiLCAiIiwgIiJ9LCBub3QgeyIiLCAiIn0pLiAKLQkJCQotCQkJLy8gTmVlZCB0byBhZGQgIjEiIHRvIGl0IGJlY2F1c2UgdGhlIG51bWJlcnMgc3RhcnQgYXQgYSAwIGluZGV4LgotCQkJX251bVBhcm1zID0gbGFyZ2VzdE51bWJlciArIDE7IAotCQl9Ci0JCQotCQlpZihsYXJnZXN0TnVtYmVyID4gOSkgewotCQkJLy8gTWVzc2FnZUZvcm1hdCB3aWxsIG5vdCBzdWJzdGl0dXRlIGluIHBhcmFtZXRlcnMgYWZ0ZXIgdGhlIDEwIHBhcmFtZXRlciAoaS5lLiwgbnVtYmVyIDkpLgotCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLldBUk5JTkcsIElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMDEwVywgbmV3IFN0cmluZ1tde1N0cmluZy52YWx1ZU9mKGxhcmdlc3ROdW1iZXIpfSwgdGhpcywgZ2V0TGluZU51bWJlcigpKTsKLQkJCW1lc3NhZ2VzLmFkZChtbWQpOwotCQl9Ci0KLQkJaWYgKChzaW5nbGVRdW90ZUluZGV4ID4gLTEpICYmIHBhcm1FeGlzdHMpIHsKLQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5JTkZPLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDA0MCwgbmV3IFN0cmluZ1tde1N0cmluZy52YWx1ZU9mKHNpbmdsZVF1b3RlSW5kZXgpfSwgdGhpcywgZ2V0TGluZU51bWJlcigpLCBnZXRPZmZzZXQoKSArIHNpbmdsZVF1b3RlSW5kZXgsIDEpOyAvLyBtYWdpYyBudW1iZXIgMSBiZWNhdXNlIGEgcXVvdGUgaXMgb25lIGNoYXJhY3RlciBsb25nCi0JCQltZXNzYWdlcy5hZGQobW1kKTsKLQkJfQotCQllbHNlIGlmICgoZG91YmxlUXVvdGVJbmRleCA+IC0xKSAmJiAhcGFybUV4aXN0cykgewotCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLklORk8sIElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMDUwLCBuZXcgU3RyaW5nW117U3RyaW5nLnZhbHVlT2YoZG91YmxlUXVvdGVJbmRleCl9LCB0aGlzLCBnZXRMaW5lTnVtYmVyKCksIGdldE9mZnNldCgpICsgZG91YmxlUXVvdGVJbmRleCwgMSk7IC8vIG1hZ2ljIG51bWJlciAxIGJlY2F1c2UgYSBxdW90ZSBpcyBvbmUgY2hhcmFjdGVyIGxvbmcKLQkJCW1lc3NhZ2VzLmFkZChtbWQpOwotCQl9Ci0KLQkJcmV0dXJuIG1lc3NhZ2VzOwotCX0KLQotCS8qKgotCSAqIEZvcm1hdCB0aGlzIC5wcm9wZXJ0aWVzIGxpbmUgZm9yIGRpc3BsYXkuCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWlmKGdldEZpbGUoKSA9PSBudWxsKSB7Ci0JCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGdldEZpbGUoKS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCJcdExpbmUgbnVtYmVyOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGdldExpbmVOdW1iZXIoKSkpOwotCQlidWZmZXIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoZ2V0TWVzc2FnZUlkKCkpOwotCQlidWZmZXIuYXBwZW5kKCIgPSAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGdldE1lc3NhZ2UoKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogRm9ybWF0IHRoaXMgLnByb3BlcnRpZXMgbGluZSBmb3IgZGlzcGxheSwgYW5kIHN1YnN0aXR1dGUgYSBzdHViLAotCSAqIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpbnRvIGVhY2ggamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nV2l0aEV4cGVjdGVkTGVuZ3RoKGludCBsZW5ndGgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWlmKGdldEZpbGUoKSA9PSBudWxsKSB7Ci0JCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGdldEZpbGUoKS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCJcdExpbmUgbnVtYmVyOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGdldExpbmVOdW1iZXIoKSkpOwotCQlidWZmZXIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoZ2V0TWVzc2FnZUlkKCkpOwotCQlidWZmZXIuYXBwZW5kKCIgPSAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGdldEV4cGVjdGVkTWVzc2FnZShsZW5ndGgpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1lc3NhZ2UgcHJlZml4IHdpdGhvdXQgdGhlIHNldmVyaXR5LCBlLmcuLAotCSAqIEFCQ0QwMDAwIGluc3RlYWQgb2YgQUJDRDAwMDBFLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRNZXNzYWdlUHJlZml4KCkgewotCQlTdHJpbmcgcHJlZml4ID0gZ2V0TWVzc2FnZVByZWZpeCgpOwotCQlpZihwcmVmaXguZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJY2hhciBwcmVmaXhFbmQgPSBwcmVmaXguY2hhckF0KHByZWZpeC5sZW5ndGgoKSAtIDEpOwotCQlpZiAoKHByZWZpeEVuZCA9PSAnRScpIHx8IChwcmVmaXhFbmQgPT0gJ1cnKSB8fCAocHJlZml4RW5kID09ICdJJykpIHsKLQkJCXByZWZpeCA9IHByZWZpeC5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci0JCi0JLyoqCi0JICogQSBQcm9wZXJ0eUxpbmUgaXMgZXF1YWwgaWYgaXQgaXMgaW4gdGhlIHNhbWUgZmlsZSBhbmQgb24gdGhlIHNhbWUgbGluZSBudW1iZXIuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmKG8gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZighKG8gaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCVByb3BlcnR5TGluZSBvTGluZSA9IChQcm9wZXJ0eUxpbmUpbzsKLQkJaWYoIShnZXRMaW5lTnVtYmVyKCkgPT0gb0xpbmUuZ2V0TGluZU51bWJlcigpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZighZ2V0RmlsZSgpLmVxdWFscyhvTGluZS5nZXRGaWxlKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gKGdldEZpbGUoKS5oYXNoQ29kZSgpICsgZ2V0TGluZU51bWJlcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Byb3BlcnR5TGluZUNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhYWQyOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Byb3BlcnR5TGluZUNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXI7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyBhbGwgb2YgdGhlIENvbXBhcmF0b3IgY2xhc3NlcyB0aGF0IGNhbiBiZSB1c2VkCi0gKiB0byBzb3J0IFByb3BlcnR5TGluZSBpbnN0YW5jZXMgaW4gYW4gQVByb3BlcnR5RmlsZS4gKEZvciBleGFtcGxlLAotICogdG8gZmluZCBkdXBsaWNhdGUgbWVzc2FnZSBpZHMsIHRoZSBNZXNzYWdlSWRDb21wYXJhdG9yIHdvdWxkIGJlIHVzZWQKLSAqIHRvIHNvcnQgdGhlIGxpbmVzIGFjY29yZGluZyB0byBtZXNzYWdlIGlkLiBUaGUgc29ydGVkIGxpc3QgaXMgCi0gKiB0cmF2ZXJzZWQgdG8gZmluZCBvdXQgaWYgb25lIGxpbmUgaGFzIGFuIGlkZW50aWNhbCBtZXNzYWdlIGlkIAotICogdG8gdGhlIGxpbmUgdGhhdCBmb2xsb3dzIGl0LCBhbmQgaWYgc28sIGEgcGFyc2Ugd2FybmluZyBpcyByZXBvcnRlZC4pCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yIGluc3QgPSBuZXcgUHJvcGVydHlMaW5lQ29tcGFyYXRvcigpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgX21lc3NhZ2VQcmVmaXhDb21wYXJhdG9yID0gaW5zdC5uZXcgTWVzc2FnZVByZWZpeENvbXBhcmF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIF9tZXNzYWdlSWRDb21wYXJhdG9yID0gaW5zdC5uZXcgTWVzc2FnZUlkQ29tcGFyYXRvcigpOwotCXByaXZhdGUgc3RhdGljIENvbXBhcmF0b3IgX3N0cmluZ0xlbmd0aENvbXBhcmF0b3IgPSBuZXcgU3RyaW5nTGVuZ3RoQ29tcGFyYXRvcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgX3ZhbHVlQ29tcGFyYXRvciA9IGluc3QubmV3IFZhbHVlQ29tcGFyYXRvcigpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3IgX2xpbmVOb0NvbXBhcmF0b3IgPSBpbnN0Lm5ldyBMaW5lTm9Db21wYXJhdG9yKCk7Ci0KLQlwcml2YXRlIFByb3BlcnR5TGluZUNvbXBhcmF0b3IoKSB7Ci0JfQkKLQotCS8qKgotCSAqIFRoaXMgY2xhc3MgY29tcGFyZXMgUHJvcGVydHlMaW5lIGluc3RhbmNlcyBhbmQgc29ydHMgdGhlbSBhY2NvcmRpbmcgdG8gCi0JICogdGhlaXIgbWVzc2FnZSBwcmVmaXggKGUuZy4sIEFCQ0QwMDAwRSkuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBNZXNzYWdlUHJlZml4Q29tcGFyYXRvciBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQotCQkJLy8gQ2FuJ3QganVzdCBsb29rIHRvIHNlZSBpZiB0aGV5J3JlIHRoZSBzYW1lOyBuZWVkIHRvIG1hcmsKLQkJCS8vIHRoZW0gYXMgdGhlIHNhbWUgZXZlbiBpZiB0aGUgbGFzdCBsZXR0ZXIgKEV8V3xJKSBpcyBkaWZmZXJlbnQuCi0JCQlTdHJpbmcgYWlkID0gKChQcm9wZXJ0eUxpbmUpIGEpLmdldE1lc3NhZ2VQcmVmaXgoKTsKLQkJCVN0cmluZyBiaWQgPSAoKFByb3BlcnR5TGluZSkgYikuZ2V0TWVzc2FnZVByZWZpeCgpOwotCQkJaWYoKGFpZCA9PSBudWxsKSAmJiAoYmlkID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKGFpZCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiaWQgPT0gbnVsbCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJCQotCQkJYWlkID0gYWlkLnRvVXBwZXJDYXNlKCkudHJpbSgpOwotCQkJYmlkID0gYmlkLnRvVXBwZXJDYXNlKCkudHJpbSgpOwotCi0JCQlpZigoYWlkLmVxdWFscygiIikpICYmIChiaWQuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhaWQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiaWQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0KLQkJCXJldHVybiAoKFByb3BlcnR5TGluZSlhKS5nZXRTaG9ydE1lc3NhZ2VQcmVmaXgoKS50b1VwcGVyQ2FzZSgpLmNvbXBhcmVUbygoKFByb3BlcnR5TGluZSliKS5nZXRTaG9ydE1lc3NhZ2VQcmVmaXgoKS50b1VwcGVyQ2FzZSgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIGNvbXBhcmF0b3Igc29ydHMgUHJvcGVydHlMaW5lIGJ5IHRoZWlyIG1lc3NhZ2UgaWQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBNZXNzYWdlSWRDb21wYXJhdG9yIGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlpZigoYSA9PSBudWxsKSAmJiAoYiA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhID09IG51bGwpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQllbHNlIGlmKGIgPT0gbnVsbCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJCi0JCQlTdHJpbmcgYU1lc3NhZ2VJZCA9IG51bGw7Ci0JCQlTdHJpbmcgYk1lc3NhZ2VJZCA9IG51bGw7Ci0JCQlpZihhIGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSB7Ci0JCQkJYU1lc3NhZ2VJZCA9ICgoUHJvcGVydHlMaW5lKWEpLmdldE1lc3NhZ2VJZCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYU1lc3NhZ2VJZCA9IChTdHJpbmcpYTsKLQkJCX0KLQkJCQotCQkJaWYoYiBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkgewotCQkJCWJNZXNzYWdlSWQgPSAoKFByb3BlcnR5TGluZSliKS5nZXRNZXNzYWdlSWQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJNZXNzYWdlSWQgPSAoU3RyaW5nKWI7Ci0JCQl9Ci0JCQkJCi0JCQkKLQkJCWlmKChhTWVzc2FnZUlkID09IG51bGwpICYmIChiTWVzc2FnZUlkID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKGFNZXNzYWdlSWQgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYk1lc3NhZ2VJZCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gYU1lc3NhZ2VJZC5jb21wYXJlVG8oYk1lc3NhZ2VJZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU29ydCB0aGUgUHJvcGVydHlMaW5lIGJ5IHRoZSBsZW5ndGggb2YgY2hhcmFjdGVycyBpbiB0aGUgbWVzc2FnZSB0ZXh0OwotCSAqIGlmIHlvdSB3YW50IHRvIHN1YnN0aXR1dGUgY2hhcmFjdGVycyBmb3IgdGhlIG1lc3NhZ2UgcGFyYW1ldGVycywgCi0JICogc2V0IHRoZSBsZW5ndGggZmllbGQuCi0JICovCi0Jc3RhdGljIGNsYXNzIFN0cmluZ0xlbmd0aENvbXBhcmF0b3IgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBzdGF0aWMgaW50IGxlbmd0aCA9IDA7Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQkvLyByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgb2JqZWN0IGEgaXMgbGVzcyB0aGFuIG9iamVjdCBiCi0JCQkvLyByZXR1cm4gYSB6ZXJvIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVhbAotCQkJLy8gcmV0dXJuIGEgcG9zaXRpdmUgbnVtYmVyIGlmIG9iamVjdCBhIGlzIGdyZWF0ZXIgdGhhbiBvYmplY3QgYgotCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQotCQkJaW50IGFMZW5ndGggPSAoKFByb3BlcnR5TGluZSlhKS5nZXRFeHBlY3RlZExlbmd0aChsZW5ndGgpOwotCQkJaW50IGJMZW5ndGggPSAoKFByb3BlcnR5TGluZSliKS5nZXRFeHBlY3RlZExlbmd0aChsZW5ndGgpOwotCQkJCQotCQkJcmV0dXJuIChhTGVuZ3RoIC0gYkxlbmd0aCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQWxwaGFiZXRpemUgdGhlIG1lc3NhZ2UgdGV4dCBvZiB0aGUgUHJvcGVydHlMaW5lLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVmFsdWVDb21wYXJhdG9yIGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlpZigoYSA9PSBudWxsKSAmJiAoYiA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhID09IG51bGwpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQllbHNlIGlmKGIgPT0gbnVsbCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJCi0JCQlTdHJpbmcgYU1lc3NhZ2UgPSAoKFByb3BlcnR5TGluZSlhKS5nZXRNZXNzYWdlKCk7Ci0JCQlTdHJpbmcgYk1lc3NhZ2UgPSAoKFByb3BlcnR5TGluZSliKS5nZXRNZXNzYWdlKCk7Ci0JCQlpZigoYU1lc3NhZ2UgPT0gbnVsbCkgJiYgKGJNZXNzYWdlID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKGFNZXNzYWdlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQllbHNlIGlmKGJNZXNzYWdlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQkKLQkJCXJldHVybiBhTWVzc2FnZS5jb21wYXJlVG8oYk1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNvcnQgYnkgbGluZSBudW1iZXIgb2YgdGhlIFByb3BlcnR5TGluZSwgd2l0aCB0aGUgc21hbGxlc3QgbGluZQotCSAqIG51bWJlciBmaXJzdCBpbiB0aGUgbGlzdC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIExpbmVOb0NvbXBhcmF0b3IgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCS8vIHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciBpZiBvYmplY3QgYSBpcyBsZXNzIHRoYW4gb2JqZWN0IGIKLQkJCS8vIHJldHVybiBhIHplcm8gaWYgdGhlIG9iamVjdHMgYXJlIGVxdWFsCi0JCQkvLyByZXR1cm4gYSBwb3NpdGl2ZSBudW1iZXIgaWYgb2JqZWN0IGEgaXMgZ3JlYXRlciB0aGFuIG9iamVjdCBiCi0JCQlpZigoYSA9PSBudWxsKSAmJiAoYiA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhID09IG51bGwpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQllbHNlIGlmKGIgPT0gbnVsbCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJCi0JCQlpbnQgYUxpbmVObyA9ICgoUHJvcGVydHlMaW5lKWEpLmdldExpbmVOdW1iZXIoKTsKLQkJCWludCBiTGluZU5vID0gKChQcm9wZXJ0eUxpbmUpYikuZ2V0TGluZU51bWJlcigpOwotCQkJaWYoKGFMaW5lTm8gPCAwKSAmJiAoYkxpbmVObyA8IDApKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKGFMaW5lTm8gPCAwKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiTGluZU5vIDwgMCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gKGFMaW5lTm8gLSBiTGluZU5vKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBnZXRNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIF9tZXNzYWdlUHJlZml4Q29tcGFyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBhcmF0b3IgZ2V0TWVzc2FnZUlkQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIF9tZXNzYWdlSWRDb21wYXJhdG9yOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBnZXRTdHJpbmdMZW5ndGhDb21wYXJhdG9yKGludCBsZW5ndGgpIHsKLQkJU3RyaW5nTGVuZ3RoQ29tcGFyYXRvci5sZW5ndGggPSBsZW5ndGg7Ci0JCXJldHVybiBfc3RyaW5nTGVuZ3RoQ29tcGFyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBhcmF0b3IgZ2V0VmFsdWVDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gX3ZhbHVlQ29tcGFyYXRvcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIGdldExpbmVOb0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBfbGluZU5vQ29tcGFyYXRvcjsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvUmVzb3VyY2VIYW5kbGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Jlc291cmNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGQ3YjU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvUmVzb3VyY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXI7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXRyaWV2ZXMgdGhlIFN0cmluZ3MgZnJvbSB0aGUgLnByb3BlcnRpZXMgZmlsZSBhcHByb3ByaWF0ZQotICogZm9yIHRoZSBtYWNoaW5lJ3MgTG9jYWxlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUmVzb3VyY2VIYW5kbGVyIHsKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBfYnVuZGxlID0gbnVsbDsKLQkKLQlwcml2YXRlIFJlc291cmNlSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBidW5kbGUgd2hpY2ggY29udGFpbnMgdGhlIG1lc3NhZ2VzCi0JICogaW4gdGhlIHJlc291cmNlIGlkZW50aWZpZWQgYnkgYnVuZGxlTmFtZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRCdW5kbGUoU3RyaW5nIGJ1bmRsZU5hbWUpIHsKLQkJaWYgKF9idW5kbGUgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlfYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUpOwotCQkJfQotCQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQlfYnVuZGxlID0gbnVsbDsKLQkJCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF9idW5kbGU7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIG5hbWUgb2YgdGhlIGJ1bmRsZSBhbmQgdGhlIG1lc3NhZ2UgaWQgKGtleSkgaW50byB0aGUKLQkgKiBidW5kbGUsIHJldHVybiB0aGUgbWVzc2FnZSB0ZXh0IGlkZW50aWZpZWQgYnkgdGhlIGlkLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKFN0cmluZyBidW5kbGVOYW1lLCBTdHJpbmcga2V5KSB7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBnZXRCdW5kbGUoYnVuZGxlTmFtZSk7Ci0JCQlpZiAoYnVuZGxlID09IG51bGwpIHsKLQkJCQlyZXR1cm4ga2V5OwotCQkJfQotCi0JCQlyZXR1cm4gYnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9Ci0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4ga2V5OwotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiB0aGUgbmFtZSBvZiB0aGUgYnVuZGxlLCB0aGUgbWVzc2FnZSBpZCAoa2V5KSBpbnRvIHRoZQotCSAqIGJ1bmRsZSwgYW5kIHBhcmFtZXRlcnMgdG8gYmUgc3Vic3RpdHV0ZWQgaW50byB0aGUgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQncwotCSAqIHBhdHRlcm5zLCByZXR1cm4gdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcGFyYW1ldGVycyBzdWJzdGl0dXRlZCBpbi4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcgYnVuZGxlTmFtZSwgU3RyaW5nIGtleSwgU3RyaW5nW10gcGFybXMpIHsKLQkJU3RyaW5nIHJlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlyZXMgPSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShidW5kbGVOYW1lLCBrZXkpLCBwYXJtcyk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9wcm9wZXJ0aWVzVmFsaWRhdG9yLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9wcm9wZXJ0aWVzVmFsaWRhdG9yLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYTViZGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3IvcHJvcGVydGllc1ZhbGlkYXRvci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotIwotIyBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSMgKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotIyBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotIyByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0jCi0jICBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0jICBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotIyAgQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotIyAgcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0jICB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSMgICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSMgIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0jICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSMgIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotIyAgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotIyAgaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotIwotCi1BQkNEMDAwMCA9IEFCQ0QwMDAwRTogTWF0Y2ggdGhlIGJyYWNlcyBpbiB0aGUgbWVzc2FnZS4gVGhlcmUgYXJlIHswfSAneycgYW5kIHsxfSAnfScuIE1lc3NhZ2VGb3JtYXQgd2lsbCB0aHJvdyBhIE51bGxQb2ludGVyRXhjZXB0aW9uIHdoZW4gdGhlcmUgYXJlIG1pc21hdGNoaW5nIGJyYWNlcy4KLUFCQ0QwMDEwRSA9IEFCQ0QwMDEwRTogQ2hhbmdlIGFyZ3VtZW50ICgneyd7MH0nfScpIHRvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA5IGluY2x1c2l2ZSBpbiB0aGUgbWVzc2FnZS4gTWVzc2FnZUZvcm1hdCBjYW5ub3QgcHJvY2VzcyBhbiBpbnRlZ2VyIHBhcmFtZXRlciB0aGF0IGlzIGxlc3MgdGhhbiAwLgotQUJDRDAwMTBXID0gQUJDRDAwMTBXOiBDaGFuZ2UgYXJndW1lbnQgKCd7J3swfSd9JykgdG8gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDkgaW5jbHVzaXZlIGluIHRoZSBtZXNzYWdlLiBNZXNzYWdlRm9ybWF0IGlnbm9yZXMgYW55IHBhcmFtZXRlcnMgbGFyZ2VyIHRoYW4gOS4KLUFCQ0QwMDIwID0gQUJDRDAwMjBJOiBSZW1vdmUgcmVkdW5kYW50IHBhcmFtZXRlciAneyd7MH0nfScgZnJvbSB0aGUgbWVzc2FnZS4gTWFrZSBtZXNzYWdlcyBzdWNjaW5jdC4KLUFCQ0QwMDMwID0gQUJDRDAwMzBJOiBDaGVjayB0aGF0IGFyZ3VtZW50ICd7J3swfSd9JyB3YXMgb21pdHRlZCBmcm9tIHRoZSBtZXNzYWdlIGRlbGliZXJhdGVseS4gSWYgaXQgd2FzIG9taXR0ZWQgYWNjaWRlbnRhbGx5LCBhbmQgdGhlIGNvZGUgZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggcGFyYW1ldGVycywgTWVzc2FnZUZvcm1hdCB3aWxsIHRocm93IGEgTnVsbFBvaW50ZXJFeGNlcHRpb24uCi1BQkNEMDA0MCA9IEFCQ0QwMDQwSTogVXNlIHR3byBhcG9zdHJvcGhlcyBpbiB0aGUgbWVzc2FnZSBhdCBjb2x1bW4gezB9LiBNZXNzYWdlRm9ybWF0IHJlbW92ZXMgc2luZ2xlIGFwb3N0cm9waGVzOyBmb3IgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheSBhbiBhcG9zdHJvcGhlLCB0d28gYXBvc3Ryb3BoZXMgbXVzdCBleGlzdCBpbiB0aGUgc3RyaW5nLiAoQW4gYXBvc3Ryb3BoZSBpcyBhIHJlc2VydmVkIGNoYXJhY3RlciBvZiBNZXNzYWdlRm9ybWF0LikKLUFCQ0QwMDUwID0gQUJDRDAwNTBJOiBVc2Ugb25lIGFwb3N0cm9waGUgaW4gdGhlIG1lc3NhZ2UgYXQgY29sdW1uIHswfS4gTWVzc2FnZUZvcm1hdCBwcm9jZXNzZXMgb25seSBtZXNzYWdlcyB3aXRoIHBhcmFtZXRlcnM7IHdpdGhvdXQgTWVzc2FnZUZvcm1hdCwgdGhlIGV4dHJhIGFwb3N0cm9waGUgd2lsbCBub3QgYmUgcmVtb3ZlZC4KLQotQUJDRDAwNjAgPSBBQkNEMDA2MFc6IE1ha2UgezB9IHVuaXF1ZS4gV2hlbiBhbiBpZCBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIGEgZmlsZSwgUmVzb3VyY2VCdW5kbGUgd2lsbCB1c2UgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IG1lc3NhZ2UgaWQuCi1BQkNEMDA3MCA9IEFCQ0QwMDcwVzogezB9IG1heSBuZWVkIHRvIGJlIHVuaXF1ZS4gQ29udmVudGlvbmFsbHksIGEgbWVzc2FnZSBwcmVmaXggYXBwbGllcyB0byBvbmx5IG9uZSBlcnJvciBjb25kaXRpb24uCi0KLUFCQ0QwMDgwID0gQUJDRDAwODBFOiBGaXggdGhlIHN5bnRheCBlcnJvcjsgZWFjaCBsaW5lIG11c3QgZm9ybSBNRVNTQUdFX0lEID0gTUVTU0FHRS4KLUFCQ0QwMDkwID0gQUJDRDAwOTBXOiBDaGVjayB0aGUgcmVhZCBwZXJtaXNzaW9ucyBvZiBmaWxlIHswfS4gVGhlIFByb3BlcnRpZXNWYWxpZGF0b3IgZWl0aGVyIGNhbm5vdCByZWFkIG9yIGNhbm5vdCBmaW5kIHRoZSBmaWxlLgotCi1BQkNEMDExMCA9IEFCQ0QwMTEwSTogQWRkIGEgdGVybWluYXRpbmcgYXBvc3Ryb3BoZSBhdCBjb2x1bW4gezB9LiBUaGUgJ3snIGFuZCAnfScgY2hhcmFjdGVycyBtdXN0IGJlIGVuY2xvc2VkIGluIGFwb3N0cm9waGVzLgotCi1BQkNEMDEyMCA9IEFCQ0QwMTIwSTogVGVybWluYXRlIG1lc3NhZ2UgcHJlZml4IHswfSB3aXRoIGEgJyc6JycuIFRoZSBJQk0gc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCBtZXNzYWdlIHByZWZpeGVzIGVuZCB3aXRoIGEgY29sb24uCi1BQkNEMDEzMCA9IEFCQ0QwMTMwSTogUmVtb3ZlIHRoZSB3aGl0ZXNwYWNlIGJldHdlZW4gezB9IGFuZCB0aGUgJyc6JycuIFRoZSBJQk0gc3RhbmRhcmQgcmVxdWlyZXMgYW4gYWJzZW5jZSBvZiB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFuZCB0aGUgY29sb24uCi0KLSMgT3V0c2lkZSBXU0FELCBhcHBlbmQgdGhlIGxpbmUgbnVtYmVyIGFuZCBmaWxlIG5hbWUgdG8gdGhlIGVuZCBvZiB0aGUgbWVzc2FnZS4KLUxJTkVfTE9DID0gTGluZSB7MH0sIGZpbGUgezF9LgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvdGVzdC90ZXN0LnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvdGVzdC90ZXN0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYmM5ODIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Rlc3QvdGVzdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIwotIyBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSMgKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotIyBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotIyByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0jCi0jICBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0jICBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotIyAgQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotIyAgcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0jICB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSMgICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSMgIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0jICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSMgIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotIyAgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotIyAgaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotIwotCi0jIFRoaXMgZmlsZSBpcyB1c2VkIHRvIHRlc3QgdGhlIFByb3BlcnRpZXMgVmFsaWRhdG9yLgotIwotCi1NSVNNQVRDSEVEX0JSQUNFUyA9IFRoaXMgbGluZSBoYXMgJ3swfScgbWlzbWF0Y2hpbmcgYnJhY2VzLgotTUlTTUFUQ0hFRF9CUkFDRVNfMiA9IFRoaXMgbGluZSBoYXMgeyBhIG1pc21hdGNoaW5nIGJyYWNlLgotTUlTTUFUQ0hFRF9CUkFDRVNfMyA9IFRoaXMgbGluZSBoYXMgfSBhIG1pc21hdGNoaW5nIGJyYWNlLgotTUlTTUFUQ0hFRF9CUkFDRVNfT0tBWSA9IFRoaXMgbGluZSBoYXMgbm8gJ3snIG1pc21hdGNoaW5nIGJyYWNlcyAnfScuCi1NSVNNQVRDSEVEX0JSQUNFU19PS0FZMiA9IFRoaXMgbGluZSBhbHNvIGhhcyBubyBtaXNtYXRjaGluZyBicmFjZXMgezB9ICd7JyAnfScuCi0KLVRPT19NQU5ZX0FSR1VNRU5UUyA9IE1lc3NhZ2VGb3JtYXQgZm9ybWF0cyBvbmx5IDEwIHBhcmFtZXRlcnMgezB9IHsxfSB7Mn0gezN9IHs0fSB7NX0gezZ9IHs3fSB7OH0gezl9IHsxMH0uCi1UT09fTUFOWV9BUkdVTUVOVFNfMiA9IE1lc3NhZ2VGb3JtYXQgZm9ybWF0cyBvbmx5IDEwIHBhcmFtZXRlcnMgezEwfS4KLQotTkVHQVRJVkVfQVJHVU1FTlQgPSBUaGlzIGxpbmUgdXNlcyBhIG5lZ2F0aXZlIHstMX0gYXJndW1lbnQuCi1CID0gb2theQotUkVEVU5EQU5UX0FSR1VNRU5UID0gVGhpcyBsaW5lIHVzZXMgYSByZWR1bmRhbnQgezB9IHswfSBhcmd1bWVudC4KLU1JU1NFRF9QQVJNID0gVGhpcyBsaW5lIHVzZXMgezB9IGFuZCB7Mn0gYnV0IG5vdCAoMSkuCi1ORUVEU19ET1VCTEVfQVBPUyA9IFRoaXMgbGluZSB1c2VzIGEgc2luZ2xlIGFwb3N0cm9waGUgKCcpIGJ1dCBzaG91bGQgdXNlIHR3byB7MH0uCi1ORUVEU19TSU5HTEVfQVBPUyA9IFRoaXMgbGluZSB1c2VzIGEgZG91YmxlIGFwb3N0cm9waGUgKCcnKSBidXQgc2hvdWxkIHVzZSBvbmUuCi1BID0gb2theQotU1lNCi1EVVBMSUNBVEVfSUQgPSBUaGlzIGxpbmUgdXNlcyBhIGR1cGxpY2F0ZSBtZXNzYWdlIGlkLgotRFVQTElDQVRFX0lEID0gVGhpcyBsaW5lIGFsc28gdXNlcyBhIGR1cGxpY2F0ZSBtZXNzYWdlIGlkLgotRFVQTElDQVRFX1BSRUZJWCA9IEFBQUEwMDAwVzogVGhpcyBsaW5lIHVzZXMgYSBkdXBsaWNhdGUgbWVzc2FnZSBwcmVmaXguCi09IGpqagotCi1EVVBMSUNBVEVfUFJFRklYMiA9IEFBQUEwMDAwVzogVGhpcyBsaW5lIGFsc28gdXNlcyBhIGR1cGxpY2F0ZSBtZXNzYWdlIHByZWZpeC4KLVpfRFVQTElDQVRFID0gampqCi1aX0RVUExJQ0FURSA9IG1tbQotCi0jIFRoaXMgaXMgYSBjb21tZW50Ci1aX0RVUExJQ0FURSA9IG5ubgotQyA9IG9rYXkKLUYgPSBhIFwKLWIgXAotYwotRCA9IG9rYXkKLQotQ0FTRTEgPSBBQkNEMDAwMEU6IEJsYWggQmxhaCBCbGFoCi1DQVNFMiA9IEFCQ0QwMDAwRSAgQmxhaCBCbGFoIEJsYWgKLUNBU0UzID0gQUJDRDAwMDBFIDogQmxhaCBCbGFoIEJsYWgKLUNBU0U0ID0gQUJDRDAwMDBFICBCbGFoOkJsYWggQmxhaAotQ0FTRTUgPSBBQkNEMDAwMEUgOgotQ0FTRTYgPSBCbGFoIEJsYWggQmxhaCAoaS5lLiwgbm8gcHJlZml4KQotQ0FTRTcgPSBBQkNEMDAwMEU6IEJsYWgKLUNBU0U4ID0gQUJDRDAwMDBFICBCbGFoCi1DQVNFOSA9IEFCQ0QwMDAwRSA6IEJsYWgKLUNBU0UxMCA9IEFCQ0QwMDAwRSBCbGFoCi1DQVNFMTEgPSBBQkNEMDAwMEUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS90ZXN0L3Rlc3QyLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvdGVzdC90ZXN0Mi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGMwZjMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS90ZXN0L3Rlc3QyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jCi0jIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotIyAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0jIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0jIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSMKLSMgIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSMgIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0jICBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0jICBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSMgIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotIyAgIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotIyAgTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSMgIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotIyAgVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0jICBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0jICBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0jCi0KLSMKLSMgVGhpcyBmaWxlIGlzIHVzZWQgdG8gdGVzdCB0aGUgUHJvcGVydGllcyBWYWxpZGF0b3IuCi0jCi0KLUlEMSA9IFRoaXMgZmlsZSBoYXMgbm8gZXJyb3JzIGluIGl0LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS90dnRwbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3R2dHBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MjUwYTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3R2dHBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHBsdWdpbgotICAgaWQ9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24ucHJvcCIKLSAgIG5hbWU9IlByb3BlcnRpZXMgVmFsaWRhdG9yIgotICAgdmVyc2lvbj0iNS4xLjAiCi0gICBjbGFzcz0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5wcm9wZXJ0aWVzLndvcmtiZW5jaGltcGwuUHJvcGVydGllc1ZhbGlkYXRvclBsdWdpbiI+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIFdoZW4gdGVzdGluZyBUVlQgaW4gRUpCRGVwbG95LCBiZWNhdXNlIG9yZy5lY2xpcHNlLmhlbHAgaXNuJ3QgICAtLT4KLQk8IS0tIHBhY2thZ2VkIHdpdGggRUpCRGVwbG95LCB0aGlzIHBsdWdpbiBpcyBkZWFjdGl2YXRlZC4gSG93ZXZlciwgICAtLT4KLQk8IS0tIGJlY2F1c2UgdGhlIFRWVCBwbHVnaW4gZG9lc24ndCBzaGlwIHRoZSBkb2N1bWVudGF0aW9uLCBhbGwgICAgICAtLT4KLQk8IS0tIHJlZmVyZW5jZXMgdG8gdGhlIGhlbHAgY2FuIGJlIHJlbW92ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQkKLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0icnVudGltZS9wcm9wZXJ0aWVzVmFsaWRhdG9yLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InJ1bnRpbWUvcHJvcGVydGllc1ZhbEZTLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InJ1bnRpbWUvcHJvcGVydGllc1ZhbFdCLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InJ1bnRpbWUvZmlsZXN5c3RlbUZXSy5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICAKLSAgICA8cmVxdWlyZXM+Ci0gICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIgdmVyc2lvbj0iMi4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIgdmVyc2lvbj0iMi4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIgdmVyc2lvbj0iMi4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgIDxpbXBvcnQgcGx1Z2luPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uIiBleHBvcnQ9InRydWUiIHZlcnNpb249IjUuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgICA8aW1wb3J0IHBsdWdpbj0iY29tLmlibS5ldG9vbHMubG9nZ2luZy51dGlsIiB2ZXJzaW9uPSI1LjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgPC9yZXF1aXJlcz4KLQotICAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgICA8IS0tIFByb3BlcnRpZXMgVmFsaWRhdG9yIENvbnRyaWJ1dGlvbnMgICAgLS0+Ci0gICAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICAgIDxleHRlbnNpb24KLSAgICAgICBpZD0iUHJvcGVydGllc1ZhbGlkYXRvciIKLSAgICAgICBuYW1lPSJQcm9wZXJ0aWVzIFZhbGlkYXRvciIKLSAgICAgICBwb2ludD0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotICAgICAgIDx2YWxpZGF0b3I+Ci0gICAgICAgICAgIDxwcm9qZWN0TmF0dXJlIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIi8+Ci0gICAgICAgICAgIDxmaWx0ZXIgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIiBuYW1lRmlsdGVyPSIqLnByb3BlcnRpZXMiIGFjdGlvbj0iYWRkLCBjaGFuZ2UiLz4KLSAgICAgICAgICAgPHJ1biBjbGFzcz0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5wcm9wZXJ0aWVzLlByb3BlcnRpZXNWYWxpZGF0b3IiIGVuYWJsZWQ9ImZhbHNlIiBhc3luYz0idHJ1ZSIvPgotICAgICAgICAgICA8aGVscGVyIGNsYXNzPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnByb3BlcnRpZXMud29ya2JlbmNoaW1wbC5Qcm9wZXJ0aWVzSGVscGVyIi8+Ci0gICAgICAgPC92YWxpZGF0b3I+Ci0gICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MyN2E5Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImpVbml0V3JhcHBlci8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0ZXN0LyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InRlc3RGd2svIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODRjNWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXZhbGlkYXRpb250ZXN0LmphcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYTVjNDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM3MWJhMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLSNGcmkgRmViIDE1IDA1OjQzOjA4IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmFyZ3VtZW50UHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUuYXJndW1lbnRTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFByZWZpeGVzPV8KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5maWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29kZUNvbXBsZXRlLmxvY2FsUHJlZml4ZXM9Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb2RlQ29tcGxldGUubG9jYWxTdWZmaXhlcz0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFByZWZpeGVzPV8KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvZGVDb21wbGV0ZS5zdGF0aWNGaWVsZFN1ZmZpeGVzPQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGQ2YjljLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI0ZyaSBGZWIgMTUgMDU6NDM6MDggRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQudWkuZXhjZXB0aW9uLm5hbWU9ZQotb3JnLmVjbGlwc2UuamR0LnVpLmdldHRlcnNldHRlci51c2UuaXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmtleXdvcmR0aGlzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQudWkub3ZlcnJpZGVhbm5vdGF0aW9uPXRydWUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2NhZDIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24sCi0gb3JnLmp1bml0LAotIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZSwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MsCi0gb3JnLmVjbGlwc2UuamVtLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZSwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZSwKLSBvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLmFwaS50ZXN0LAotIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QsCi0gb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2ssCi0gb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yLAotIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnksCi0gb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLAotIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuanVuaXQsCi0gb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cAotQnVuZGxlLUNsYXNzUGF0aDogdmFsaWRhdGlvbnRlc3QuamFyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5OWRmMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiMDI2Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1zb3VyY2UudmFsaWRhdGlvbnRlc3QuamFyID0galVuaXRXcmFwcGVyLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdC8sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGd2svLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JzLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0ZXN0SW5wdXQvLFwKLSAgICAgICAgICAgICAgIHZhbGlkYXRpb250ZXN0LmphcixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotb3V0cHV0LnZhbGlkYXRpb250ZXN0LmphciA9IGJpbi8KLWphcnMuY29tcGlsZS5vcmRlciA9IHZhbGlkYXRpb250ZXN0Lmphcgotc291cmNlLnZhbGlkYXRpb250ZXN0LmphciA9IGpVbml0V3JhcHBlci8sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0RndrLwotICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxNDdkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1DT05UQUNUPXJ1dGhkYWx5QGNhLmlibS5jb20KLUNvbXBvbmVudFNob3J0TmFtZT1WYWxUZXN0Ci1Db21wb25lbnRGdWxsTmFtZT1WYWxpZGF0aW9uIEJWVCBQbHVnaW4KLUNvbXBvbmVudENvbXBldGVuY3k9QlZUCi1KYXZhQ29tcGlsZS4xPXNyY2phcgotQnVpbGRWZXJpZmljYXRpb24uMT1kaXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL3BhY2thZ2UueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC9wYWNrYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5MGQ4Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL3BhY2thZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi50ZXN0IiBkZWZhdWx0PSJwYWNrYWdpbmdQbHVnaW4iIGJhc2VkaXI9Ii4vLi4iPgotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWNrYWdlRGlyIiB2YWx1ZT0iIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGlyZWN0b3J5IiAgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi5pZCIgdmFsdWU9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24udGVzdCIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLnZlcnNpb24iICB2YWx1ZT0iIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJwYWNrYWdpbmdQbHVnaW4iIGRlcGVuZHM9ImluaXQiPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSIke3BsdWdpbi5pZH0iLz4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7cGFja2FnZURpcn0vcGx1Z2lucy8ke3BsdWdpbi5pZH1fJHtwbHVnaW4udmVyc2lvbn0iPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3BsdWdpbi5kaXJlY3Rvcnl9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJwbHVnaW4ueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0idGVzdHZhbGlkYXRpb24uYmF0Ii8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0idGVzdHZhbGlkYXRpb24uc2giLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJydW50aW1lL3Rlc3QuamFyIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icnVudGltZS9qVW5pdFdyYXBwZXIuamFyIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYnVpbGQvc291cmNlamFyLnR4dCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYnVpbGQvc291cmNlamFyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjliZDQ3My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL3NvdXJjZWphci50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXRlc3QKLWpVbml0V3JhcHBlcgotCi0KLQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL3dzQnVpbGQueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC93c0J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVkYjk1YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL3dzQnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IURPQ1RZUEUgcHJvamVjdCBbCi0JPCFFTlRJVFkgYmFzZUJ1aWxkIFNZU1RFTSAiZmlsZTouLi8uLi93c0J1aWxkRGVmLnhtbCI+Ci1dPgotCi08cHJvamVjdCBuYW1lPSJidWlsZFBsdWdpbiIgZGVmYXVsdD0iYnVpbGQiIGJhc2VkaXI9Ii4vLi4iPgotCi08IS0tIGluY2x1ZGUgdGhlIGNvbW1vbiB4bWwgYnVpbGQgZmlsZSAtLT4KLSZiYXNlQnVpbGQ7Ci0KLTwhLS0gY3VzdG9taXplIHRoZSBqYXIgY3JlYXRpb24gaGVyZSBmb3IgbXVsdGktamFyIGJ1aWxkcyAtLT4KLTx0YXJnZXQgbmFtZT0iYnVpbGQiIGRlcGVuZHM9InByZXBhcmUiIGlmPSJwbHVnaW4uaWQiPgotICAgIDxhbnRjYWxsIHRhcmdldD0iYnVpbGRqYXIiPgotICAgICAgICA8cGFyYW0gbmFtZT0iamFybmFtZSIgdmFsdWU9InRlc3QiLz4KLSAgICAgICAgPHBhcmFtIG5hbWU9ImphcmNsYXNzcGF0aCIgdmFsdWU9IiR7cGx1Z2luLmNsYXNzcGF0aH0iLz4KLSAgICA8L2FudGNhbGw+Ci0KLSAgICA8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkamFyIj4KLSAgICAgICAgPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSJqVW5pdFdyYXBwZXIiLz4KLSAgICAgICAgPHBhcmFtIG5hbWU9ImphcmNsYXNzcGF0aCIgdmFsdWU9IiR7cGx1Z2luLmNsYXNzcGF0aH07JHtwbHVnaW4uZGlyZWN0b3J5fS8ke3BsdWdpbi5saWJyYXJ5LmRpcmVjdG9yeX0vdGVzdC5qYXIiLz4KLSAgICA8L2FudGNhbGw+Ci0KLTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0F1dG9tYXRlZFZhbGlkYXRpb25CVlQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvQXV0b21hdGVkVmFsaWRhdGlvbkJWVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTU0OGNjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvQXV0b21hdGVkVmFsaWRhdGlvbkJWVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDksIDIwMDUKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuanVuaXQ7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLmFwaS50ZXN0LkFwaVRlc3RzU3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIEBhdXRob3IgamlhbGluCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkVmFsaWRhdGlvbkJWVCBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlRGlyZWN0b3J5ID0gbnVsbDsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAJVVJMIHVybCA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKTsKLSAgICAgICAgCUF1dG9tYXRlZFZhbGlkYXRpb25CVlQuYmFzZURpcmVjdG9yeSA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTCh1cmwpLmdldEZpbGUoKSArICJ2YWxpZGF0aW9uUmVzb3VyY2VzIiArIEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgCi0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVzaW5nIHdvcmtpbmcgZGlyZWN0b3J5IHNpbmNlIGEgd29ya3NwYWNlIFVSTCBjb3VsZCBub3QgYmUgbG9jYXRlZC4iKTsKLQkJfSAKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCB1bmltcGxlbWVudGVkTWV0aG9kczsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdW5pbXBsZW1lbnRlZE1ldGhvZHMgPSAwOwotICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgICAgICAgaWYgKHVuaW1wbGVtZW50ZWRNZXRob2RzID4gMCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkNhbGxzIHRvIHdhcm5VbmltcGw6ICIgKyB1bmltcGxlbWVudGVkTWV0aG9kcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQXV0b21hdGVkVmFsaWRhdGlvbkJWVCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSkgQXV0b21hdGVkVmFsaWRhdGlvbkJWVC5zdWl0ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1aXRlLnRlc3RDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIGFkZFRlc3Qoc3VpdGUudGVzdEF0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3Igb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdCIpOwotICAgICAgICAvL3N1aXRlLmFkZFRlc3QoQlZUU3VpdGUuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQXBpVGVzdHNTdWl0ZS5zdWl0ZSgpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvQlZUU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvQlZUU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3MzQ1NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0JWVFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuanVuaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5Lk9wZXJhdGlvblRlc3RjYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVmFsaWRhdG9yVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFZhbGlkYXRpb25VdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotCi0vKioKLSAqIFdyYXBzIHRoZSBleGlzdGluZyB2YWxpZGF0aW9uIGJ2dCBjb2RlIGluIGEgSlVuaXQgYXJ0aWZhY3QKLSAqIHNvIHRoYXQgdGhlIHRlc3RzIGNhbiBiZSBydW4gd2l0aGluIEpVbml0LiBJbnN0YW5jZXMgb2YgdGhpcwotICogY2xhc3Mgd3JhcCBhbGwgb2YgdGhlIFZhbGlkYXRvclN1aXRlIGluc3RhbmNlcyB0aGF0IG11c3QgYmUgcnVuLgotICovCi1wdWJsaWMgY2xhc3MgQlZUU3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCXByaXZhdGUgTWFwIF92YWxpZGF0b3JTdWl0ZXMgPSBudWxsOwotCQotCXB1YmxpYyBCVlRTdWl0ZSgpIHsKLQkJX3ZhbGlkYXRvclN1aXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWxvYWRWYWxpZGF0b3JTdWl0ZXMoKTsKLQkJbG9hZE9wZXJhdGlvblN1aXRlcygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZFZhbGlkYXRvclN1aXRlcygpIHsKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCi0JCVZhbGlkYXRvclRlc3RjYXNlW10gdG1kcyA9IEJWVFZhbGlkYXRpb25VdGlsaXR5LmdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IpOwotCQlmb3IoaW50IGk9MDsgaTx0bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZSB0bWQgPSB0bWRzW2ldOwotCi0JCQlpZih0bWQuaXNWaXNpYmxlKCkpIHsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSB0bWQuZ2V0VmFsaWRhdG9yTWV0YURhdGEoKTsKLQkJCQlWYWxpZGF0b3JTdWl0ZSB2cyA9IChWYWxpZGF0b3JTdWl0ZSlfdmFsaWRhdG9yU3VpdGVzLmdldCh2bWQpOwotCQkJCWlmKHZzID09IG51bGwpIHsKLQkJCQkJdnMgPSBuZXcgVmFsaWRhdG9yU3VpdGUodm1kKTsKLQkJCQl9Ci0JCQkJVmFsaWRhdG9yVGVzdCB2dCA9IG5ldyBWYWxpZGF0b3JUZXN0KHRtZCwgdnMpOwotCQkJCXZzLmFkZFRlc3QodnQpOwotCQkJCV92YWxpZGF0b3JTdWl0ZXMucHV0KHZtZCwgdnMpOwotCQkJfQotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IF92YWxpZGF0b3JTdWl0ZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlWYWxpZGF0b3JTdWl0ZSB2cyA9IChWYWxpZGF0b3JTdWl0ZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlhZGRUZXN0KHZzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZE9wZXJhdGlvblN1aXRlcygpIHsKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCi0JCU9wZXJhdGlvblRlc3RjYXNlW10gdG1kcyA9IEJWVFZhbGlkYXRpb25VdGlsaXR5LmdldE9wZXJhdGlvblRlc3RzKG1vbml0b3IpOwotCQlPcGVyYXRpb25TdWl0ZSBvcyA9IG5ldyBPcGVyYXRpb25TdWl0ZSgpOwotCQlmb3IoaW50IGk9MDsgaTx0bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPcGVyYXRpb25UZXN0Y2FzZSB0bWQgPSB0bWRzW2ldOwotCi0JCQlpZih0bWQuaXNWaXNpYmxlKCkpIHsKLQkJCQlPcGVyYXRpb25UZXN0IG90ID0gbmV3IE9wZXJhdGlvblRlc3QodG1kLCBvcyk7Ci0JCQkJb3MuYWRkVGVzdChvdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWFkZFRlc3Qob3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBCVlRTdWl0ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiVmFsaWRhdGlvbiBCVlQgU3VpdGUiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9CdWlsZEluZm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvQnVpbGRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZjA2ZDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9CdWlsZEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0OwotcHVibGljIGNsYXNzIEJ1aWxkSW5mbyB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICJMaWNlbnNlZCBNYXRlcmlhbHMgLS0gUHJvcGVydHkgb2YgSUJNXG4oYykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIDIwMDEsMjAwM1xuVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBmZ0J1aWxkTGV2ZWwgPSAiMjAwMzExMTJfMTkxNS1XQjIxMi1BRC1WNTExRC1XNSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTQUJ1aWxkTGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvSlVuaXRCdWZmZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvSlVuaXRCdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5ZmU2MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0pVbml0QnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDE2LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJ1ZmZlcmVkVGFza1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci0KLQotLyoqCi0gKiBXaGVuIHRoZSB0ZXN0cyBhcmUgcnVuIGFzIHBhcnQgb2YgSlVuaXQsIHJlZGlyZWN0IHRoZSBvdXRwdXQKLSAqIHRvIHRoZSBKVW5pdCB0ZXN0IGNhc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBKVW5pdEJ1ZmZlciBpbXBsZW1lbnRzIElCdWZmZXIgewotCXByaXZhdGUgU3RyaW5nIF9sb2dGaWxlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBCdWZmZXJlZFRhc2tTdGF0dXMgX3N0YXR1cyA9IG51bGw7Ci0JCi0JSlVuaXRCdWZmZXIoU3RyaW5nIGxvZ0ZpbGVOYW1lKSB7Ci0JCV9zdGF0dXMgPSBuZXcgQnVmZmVyZWRUYXNrU3RhdHVzKGdldExvZ0ZpbGVOYW1lKGxvZ0ZpbGVOYW1lKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJX3N0YXR1cy5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldExvZ0ZpbGVOYW1lKFN0cmluZyBsb2dGaWxlTmFtZSkgewotCQlpZihfbG9nRmlsZU5hbWUgPT0gbnVsbCkgewotCQkJbG9nRmlsZU5hbWUgPSBsb2dGaWxlTmFtZS5yZXBsYWNlKCcgJywgJ18nKTsKLQkJCUlQYXRoIHN0YXRlTG9jYXRpb24gPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKTsKLQkJCUZpbGUgbG9nID0gbmV3IEZpbGUoc3RhdGVMb2NhdGlvbi50b09TU3RyaW5nKCksIGxvZ0ZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJX2xvZ0ZpbGVOYW1lID0gbG9nLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0JCXJldHVybiBfbG9nRmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9nRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBfc3RhdHVzLmdldExvZ0ZpbGVOYW1lKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjY2xlYXIoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlfc3RhdHVzLmNsZWFyKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNkZWxpbmVhdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxpbmVhdGUoU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCV9zdGF0dXMuZGVsaW5lYXRlKHRhc2tOYW1lKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjZ2V0UHJvZ3Jlc3NNb25pdG9yKCkKLQkgKi8KLQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCXJldHVybiBfc3RhdHVzLmdldFByb2dyZXNzTW9uaXRvcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNyZXBvcnQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydCgpIHsKLQkJX3N0YXR1cy5yZXBvcnQoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI3dyaXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3N0YXR1cy53cml0ZShtZXNzYWdlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2FkZEVsYXBzZWRUaW1lKGphdmEubGFuZy5TdHJpbmcsIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWxhcHNlZFRpbWUoU3RyaW5nIHRhc2tOYW1lLCBsb25nIGVsYXBzZWRUaW1lKSB7Ci0JCV9zdGF0dXMuYWRkRWxhcHNlZFRpbWUodGFza05hbWUsIGVsYXBzZWRUaW1lKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2FkZEV4ZWN1dGlvblN0YXR1cyhqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRlc3RjYXNlTmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBpbnQgcGFzc09yRmFpbCwgSUJ1ZmZlciBidWZmZXIsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9zdGF0dXMuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3RjYXNlTmFtZSwgc3ViVGFza05hbWUsIHBhc3NPckZhaWwsIGJ1ZmZlciwgbWVzc2FnZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNhZGRHbG9iYWxFeGVjdXRpb25TdGF0dXMoamF2YS5sYW5nLlN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGVzdFBhc3NOYW1lLCBib29sZWFuIHBhc3MpIHsKLQkJX3N0YXR1cy5hZGRFeGVjdXRpb25TdGF0dXModGVzdFBhc3NOYW1lLCBwYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRlc3RQYXNzTmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBib29sZWFuIHBhc3MpIHsKLQkJX3N0YXR1cy5hZGRFeGVjdXRpb25TdGF0dXModGVzdFBhc3NOYW1lLCBzdWJUYXNrTmFtZSwgcGFzcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNpc1N1Y2Nlc3NmdWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VjY2Vzc2Z1bCgpIHsKLQkJcmV0dXJuIF9zdGF0dXMuaXNTdWNjZXNzZnVsKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNpc1N1Y2Nlc3NmdWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VjY2Vzc2Z1bChTdHJpbmcgdGVzdE5hbWUpIHsKLQkJcmV0dXJuIF9zdGF0dXMuaXNTdWNjZXNzZnVsKHRlc3ROYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvT3BlcmF0aW9uU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvT3BlcmF0aW9uU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZmN2QwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L09wZXJhdGlvblN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHdyYXAgYWxsIG9mIHRoZSBvcGVyYXRpb25zLCBpbiBwbHVnaW4ueG1sLAotICogZm9yIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIE9wZXJhdGlvblN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQlwcml2YXRlIEpVbml0QnVmZmVyIF9idWZmZXIgPSBudWxsOwotCi0JcHVibGljIE9wZXJhdGlvblN1aXRlKCkgewotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlZhbGlkYXRpb24gRnJhbWV3b3JrIFRlc3RzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBKVW5pdEJ1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCWlmKF9idWZmZXIgPT0gbnVsbCkgewotCQkJX2J1ZmZlciA9IG5ldyBKVW5pdEJ1ZmZlcih0b1N0cmluZygpICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLmxvZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gX2J1ZmZlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdCNydW4oanVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0JCXN1cGVyLnJ1bihyZXN1bHQpOwotCQlnZXRCdWZmZXIoKS5yZXBvcnQoKTsgLy8gcmVwb3J0IG9ubHkgYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBpbiB0aGlzIHN1aXRlIGhhdmUgZmluaXNoZWQKLQkJZ2V0QnVmZmVyKCkuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L09wZXJhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvT3BlcmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzBiNzZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvT3BlcmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5PcGVyYXRpb25UZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlRlc3RjYXNlVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWwuQlZUUnVubmVyOwotCi0KLS8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcnVuIGFuIElXb3Jrc3BhY2VSdW5uYWJsZSB0aGF0IHRlc3RzIHRoZQotICogdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgT3BlcmF0aW9uU3VpdGUgX3N1aXRlID0gbnVsbDsKLQlwcml2YXRlIE9wZXJhdGlvblRlc3RjYXNlIF90bWQgPSBudWxsOwotCi0JcHVibGljIE9wZXJhdGlvblRlc3QoT3BlcmF0aW9uVGVzdGNhc2UgdG1kLCBPcGVyYXRpb25TdWl0ZSBzdWl0ZSkgewotCQlzdXBlcih0bWQuZ2V0TmFtZSgpKTsgLy8gdGhlIG1ldGhvZCBuYW1lZCAidGVzdCIgcnVucyB0aGUgdGVzdC4KLQkJX3RtZCA9IHRtZDsKLQkJX3N1aXRlID0gc3VpdGU7Ci0JfQotCQotCXB1YmxpYyBKVW5pdEJ1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCXJldHVybiBfc3VpdGUuZ2V0QnVmZmVyKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBfdG1kLmdldE5hbWUoKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3J1blRlc3QoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBUZXN0Y2FzZVV0aWxpdHkuZmluZFByb2plY3QoX3RtZCk7Ci0JCQlpZigocHJvamVjdCA9PSBudWxsKSB8fCAhcHJvamVjdC5leGlzdHMoKSkgewotCQkJCS8vIEZpbGUgbmVlZHMgdG8gYmUgaW1wb3J0ZWQgKGkuZS4sIHNldCB1cCB0aGUgdGVzdCkuCi0JCQkJaWYoIUJWVFJ1bm5lci5zaW5nbGV0b24oKS5zZXR1cFRlc3RzKGdldEJ1ZmZlcigpLCBfdG1kLCBmYWxzZSkpIHsKLQkJCQkJZmFpbCgiQ291bGQgbm90IGltcG9ydCBpbnB1dCBmcm9tIGRpcmVjdG9yeSAiICsgVGVzdGNhc2VVdGlsaXR5LmdldElucHV0RGlyKF90bWQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlmYWlsKCJQcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIgaXMgbm90IGFjY2Vzc2libGUuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJCi0JCQlfdG1kLnJ1bihnZXRCdWZmZXIoKSwgcHJvamVjdCk7Ci0JCQlpZighZ2V0QnVmZmVyKCkuaXNTdWNjZXNzZnVsKF90bWQuZ2V0TmFtZSgpKSkgewotCQkJCWZhaWwoX3RtZC5nZXROYW1lKCkgKyAiIGZhaWxlZC4gUmVhZCB0aGUgbG9nIGZvciBkZXRhaWxzLiAiICsgZ2V0QnVmZmVyKCkuZ2V0TG9nRmlsZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIFdoZXRoZXIgdGhpcyB0ZXN0IGNhc2UgZmFpbHMgb3Igbm90LCBzZW5kIGl0cyByZXN1bHRzIHRvIHRoZSBsb2cuCi0JCQlnZXRCdWZmZXIoKS5kZWxpbmVhdGUoX3RtZC5nZXROYW1lKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9WYWxpZGF0b3JTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9WYWxpZGF0b3JTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmZlYTM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvVmFsaWRhdG9yU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLQotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB3cmFwIGFsbCBvZiB0aGUgPHRlc3Q+IGluc3RhbmNlcywKLSAqIGNvbnRyaWJ1dGVkIGluIHBsdWdpbi54bWwsIGZvciBvbmUgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yU3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCXByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGEgX3ZtZCA9IG51bGw7Ci0JcHJpdmF0ZSBKVW5pdEJ1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQotCXB1YmxpYyBWYWxpZGF0b3JTdWl0ZShWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJX3ZtZCA9IHZtZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIF92bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIEpVbml0QnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJaWYoX2J1ZmZlciA9PSBudWxsKSB7Ci0JCQlfYnVmZmVyID0gbmV3IEpVbml0QnVmZmVyKHRvU3RyaW5nKCkgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIubG9nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBfYnVmZmVyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0I3J1bihqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oVGVzdFJlc3VsdCByZXN1bHQpIHsKLQkJc3VwZXIucnVuKHJlc3VsdCk7Ci0JCWdldEJ1ZmZlcigpLnJlcG9ydCgpOyAvLyByZXBvcnQgb25seSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGluIHRoaXMgc3VpdGUgaGF2ZSBmaW5pc2hlZAotCQlnZXRCdWZmZXIoKS5jbGVhcigpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9WYWxpZGF0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L1ZhbGlkYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiZDBmYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L1ZhbGlkYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5UZXN0Y2FzZVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5WYWxpZGF0b3JUZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWwuQlZUUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdG9yTWFuYWdlcjsKLQotCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBvbmUgPHRlc3Q+LCBjb250cmlidXRlZCBpbgotICogcGx1Z2luLnhtbCwgZm9yIG9uZSB2YWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVmFsaWRhdG9yVGVzdGNhc2UgX3RtZCA9IG51bGw7Ci0JcHJpdmF0ZSBWYWxpZGF0b3JTdWl0ZSBfc3VpdGUgPSBudWxsOwotCi0JcHVibGljIFZhbGlkYXRvclRlc3QoVmFsaWRhdG9yVGVzdGNhc2UgdG1kLCBWYWxpZGF0b3JTdWl0ZSBzdWl0ZSkgewotCQlzdXBlcih0bWQuZ2V0TmFtZSgpKTsgLy8gdGhlIG1ldGhvZCBuYW1lZCAidGVzdCIgcnVucyB0aGUgdGVzdC4KLQkJX3RtZCA9IHRtZDsKLQkJX3N1aXRlID0gc3VpdGU7Ci0JfQotCQotCXB1YmxpYyBKVW5pdEJ1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCXJldHVybiBfc3VpdGUuZ2V0QnVmZmVyKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBfdG1kLmdldFByb2plY3ROYW1lKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3J1blRlc3QoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBUZXN0Y2FzZVV0aWxpdHkuZmluZFByb2plY3QoX3RtZCk7Ci0JCQlpZigocHJvamVjdCA9PSBudWxsKSB8fCAhcHJvamVjdC5leGlzdHMoKSkgewotCQkJCS8vIEZpbGUgbmVlZHMgdG8gYmUgaW1wb3J0ZWQgKGkuZS4sIHNldCB1cCB0aGUgdGVzdCkuCi0JCQkJaWYoIUJWVFJ1bm5lci5zaW5nbGV0b24oKS5zZXR1cFRlc3RzKGdldEJ1ZmZlcigpLCBfdG1kLCBmYWxzZSkpIHsKLQkJCQkJZmFpbCgiQ291bGQgbm90IGltcG9ydCBpbnB1dCBmcm9tIGRpcmVjdG9yeSAiICsgVGVzdGNhc2VVdGlsaXR5LmdldElucHV0RGlyKF90bWQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJaWYoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlmYWlsKCJQcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIgaXMgbm90IGFjY2Vzc2libGUuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJCi0JCQlfdG1kLnJ1bihnZXRCdWZmZXIoKSwgcHJvamVjdCk7Ci0JCQlpZighZ2V0QnVmZmVyKCkuaXNTdWNjZXNzZnVsKF90bWQuZ2V0TmFtZSgpKSkgewotCQkJCWZhaWwoX3RtZC5nZXROYW1lKCkgKyAiIGZhaWxlZC4gUmVhZCB0aGUgbG9nIGZvciBkZXRhaWxzLiAiICsgZ2V0QnVmZmVyKCkuZ2V0TG9nRmlsZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVZhbGlkYXRvck1hbmFnZXIgdm0gPSBWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKTsKLQkJCVZhbGlkYXRvck1hbmFnZXIuYWRkUHJvamVjdEJ1aWxkVmFsaWRhdGlvblN1cHBvcnQocHJvamVjdCk7Ci0JCQl2bS5lbmFibGVWYWxpZGF0b3IoIkNsYXNzcGF0aERlcGVuZGVuY3lWYWxpZGF0b3IiKTsKLQkJCXZtLmRpc2FibGVWYWxpZGF0b3IoIkVhclZhbGlkYXRvciIpOwotCQkJdm0uZW5hYmxlVmFsaWRhdG9yKCJXYXJWYWxpZGF0b3IiLCBwcm9qZWN0LCB0cnVlLCBmYWxzZSk7Ci0JCQl2bS5kaXNhYmxlVmFsaWRhdG9yKCJFSkJWYWxpZGF0b3IiLCBwcm9qZWN0LCB0cnVlLCB0cnVlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIFdoZXRoZXIgdGhpcyB0ZXN0IGNhc2UgZmFpbHMgb3Igbm90LCBzZW5kIGl0cyByZXN1bHRzIHRvIHRoZSBsb2cuCi0JCQlnZXRCdWZmZXIoKS5kZWxpbmVhdGUoX3RtZC5nZXROYW1lKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9wbHVnaW4ucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1N2RhNTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotQnVuZGxlLU5hbWUuMCA9IFRlc3RjYXNlcyBmb3IgVmFsaWRhdGlvbiBGcmFtZXdvcmsKLUJ1bmRsZS1WZW5kb3IuMCA9IEVjbGlwc2Uub3JnCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0MmMwOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIFZhbGlkYXRpb24gQ29udHJpYnV0aW9ucyAgIC0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gVmFsaWRhdGlvbiBleHRlbnNpb24gcG9pbnRzIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0idGVzdCIgbmFtZT0idmFsaWRhdG9yIHRlc3QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InRlc3RTZXR1cCIgbmFtZT0idGVzdFNldHVwIi8+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJvcFRlc3QiIG5hbWU9Im9wZXJhdGlvbiB0ZXN0Ii8+Ci0KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSAgICAgICAgICAgSlVuaXQgQlZUIFRlc3QgU3VpdGUgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci5zdWl0ZXMiPgotICAgICAgPHN1aXRlCi0gICAgICAgICAgICBuYW1lPSJWYWxpZGF0aW9uIEJWVCBTdWl0ZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0LkJWVFN1aXRlIj4KLSAgICAgIDwvc3VpdGU+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS0gYmF0Y2ggQlZUIC0tPgotICA8IS0tIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJidnRfYmF0Y2giCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+Ci0gICAgICA8YXBwbGljYXRpb24+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uQmF0Y2giPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2FwcGxpY2F0aW9uPgotICAgPC9leHRlbnNpb24+IC0tPgotICAgCi08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBCdWlsZGVyICh1c2VkIG9ubHkgZm9yIEJWVCB0ZXN0IGlucHV0KSAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iYnZ0YnVpbGRlciIKLSAgICAgICAgIG5hbWU9IlZhbGlkYXRpb24gQlZUIFRlc3QgQnVpbGRlciIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5idWlsZGVycyI+Ci0gICAgICA8YnVpbGRlcj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay5UZXN0T3BDb25zdHJCdWlsZGVyIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9idWlsZGVyPgotICAgPC9leHRlbnNpb24+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSAgICAgICAgICAgICAgICAgICBGV0sgVGVzdCBWYWxpZGF0b3JzICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIFRoZXNlIHZhbGlkYXRvcnMgbXVzdCBub3QgYmUgZW5hYmxlZCBieSBkZWZhdWx0IG9yIHNvbWUgICAgIC0tPgotPCEtLSBvdGhlciBCVlQgdGVzdCBjYXNlcyAoZS5nLiBqMmVlKSB3aWxsIGZhaWwgYmVjYXVzZSAgICAgICAgICAtLT4KLTwhLS0gbWVzc2FnZXMgd2lsbCBleGlzdCBpbiB0aGUgdGFzayBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSAKLSAgICAgICBUaGUgRldLVGVzdFZhbGlkYXRvciBzdXBwb3J0cyBmdWxsIHZhbGlkYXRpb24sIGFuZCBtYW51YWwgCi0gICAgICAgaW5jcmVtZW50YWwgYnVpbGQgdmFsaWRhdGlvbiwgYnV0IG5vdCBhdXRvbWF0aWMgaW5jcmVtZW50YWwgCi0gICAgICAgYnVpbGQgdmFsaWRhdGlvbi4gCi0gICAgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iRndrVGVzdFZhbGlkYXRvciIKLSAgICAgICAgIG5hbWU9IlZGIFRlc3QgVmFsaWRhdG9yIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+Ci0gICAgICA8dmFsaWRhdG9yPgotICAgICAgICAgPHByb2plY3ROYXR1cmUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIj4KLSAgICAgICAgIDwvcHJvamVjdE5hdHVyZT4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIG5hbWVGaWx0ZXI9IiouamF2YSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxoZWxwZXIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3IuRndrVGVzdEhlbHBlciI+Ci0gICAgICAgICA8L2hlbHBlcj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGVuYWJsZWQ9ImZhbHNlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvci5Gd2tUZXN0VmFsaWRhdG9yIgotICAgICAgICAgICAgICAgaW5jcmVtZW50YWw9ImZhbHNlIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS0gCi0gICAgICAgVGhlIEZXS05vQnVpbGRUZXN0VmFsaWRhdG9yIHN1cHBvcnRzIGZ1bGwgdmFsaWRhdGlvbiwgYW5kIGRvZXMgbm90Ci0gICAgICAgc3VwcG9ydCBhbnkgYnVpbGQgdmFsaWRhdGlvbi4gCi0gICAgLS0+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iRndrTm9CdWlsZFRlc3RWYWxpZGF0b3IiCi0gICAgICAgICBuYW1lPSJWRiBOb0J1aWxkIFRlc3QgVmFsaWRhdG9yIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+Ci0gICAgICA8dmFsaWRhdG9yPgotICAgICAgICAgPHByb2plY3ROYXR1cmUKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIj4KLSAgICAgICAgIDwvcHJvamVjdE5hdHVyZT4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLSAgICAgICAgICAgICAgIG5hbWVGaWx0ZXI9IiouamF2YSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxoZWxwZXIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3IuRndrTm9CdWlsZFRlc3RIZWxwZXIiPgotICAgICAgICAgPC9oZWxwZXI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBmdWxsQnVpbGQ9ImZhbHNlIgotICAgICAgICAgICAgICAgZW5hYmxlZD0iZmFsc2UiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yLkZ3a05vQnVpbGRUZXN0VmFsaWRhdG9yIgotICAgICAgICAgICAgICAgaW5jcmVtZW50YWw9ImZhbHNlIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC92YWxpZGF0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tIEZ3ayBUZXN0IFZhbGlkYXRvciBCVlQgdGVzdCBzZXR1cCAgIC0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJGd2tUZXN0VmFsaWRhdG9yQlZUX3Rlc3RTZXR1cCIKLSAgICAgICAgIG5hbWU9IkZ3ayBUZXN0IFZhbGlkYXRvciBCVlQgVGVzdFNldHVwIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QudGVzdFNldHVwIj4KLSAgICAgIDxpbXBvcnQKLSAgICAgICAgICAgIGlucHV0PSJGV0svQlZUL29wQ29uc3RyLmphciIKLSAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5KQVJJbXBvcnRPcGVyYXRpb24iPgotICAgICAgPC9pbXBvcnQ+Ci0gICA8L2V4dGVuc2lvbj4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tICAgICAgICAgICAgICAgVmlzaWJsZSBGcmFtZXdvcmsgQlZUIHRlc3RzICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJUZXN0T3BDb25zdHJ1Y3RvcnMiCi0gICAgICAgICBuYW1lPSJUZXN0IE9wZXJhdGlvbiBDb25zdHJ1Y3RvcnMiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5vcFRlc3QiPgotICAgICAgPG9wdGVzdAotICAgICAgICAgICAgaW5wdXQ9IkZXSy9CVlQvb3BDb25zdHIuamFyIgotICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay5UZXN0T3BDb25zdHJPcGVyYXRpb24iCi0gICAgICAgICAgICBwcm9qZWN0PSJvcENvbnN0ciIKLSAgICAgICAgICAgIHZpc2libGU9ImZhbHNlIj4KLSAgICAgIDwvb3B0ZXN0PgotICAgPC9leHRlbnNpb24+Ci0gICA8IS0tPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IlZBTEZXSzAyIgotICAgICAgICAgbmFtZT0iVkFMRldLMDIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5vcFRlc3QiPgotICAgICAgPG9wdGVzdAotICAgICAgICAgICAgaW5wdXQ9IkZXSy9CVlQvb3BDb25zdHIuamFyIgotICAgICAgICAgICAgb3BlcmF0aW9uPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay5WQUxGV0swMk9wZXJhdGlvbiIKLSAgICAgICAgICAgIHByb2plY3Q9Im9wQ29uc3RyIgotICAgICAgICAgICAgdmlzaWJsZT0iZmFsc2UiPgotICAgICAgPC9vcHRlc3Q+Ci0gICA8L2V4dGVuc2lvbj4tLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci08IS0tICAgICAgICAgICAgICAgRndrIFRlc3QgVmFsaWRhdG9yIEJWVCB0ZXN0cyAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBOb25lIG9mIHRoZXNlIHRlc3RzIGFyZSB2aXNpYmxlIG9uIHRoZSBUZXN0IENvbGxlY3RvciBtZW51ICAtLT4KLTwhLS0gSW5zdGVhZCwgdGhlc2UgYXJlIHVzZWQgYXMgcGFydCBvZiB0aGUgVkFMRldLMDIgYW5kICAgICAgICAgLS0+Ci08IS0tIFRlc3RPcENvbnN0ciB0ZXN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJGd2tUZXN0VmFsaWRhdG9yQlZUIgotICAgICAgICAgbmFtZT0iRndrIFRlc3QgVmFsaWRhdG9yIEJWVCBUZXN0cyIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnRlc3QiPgotICAgICAgPHRlc3QKLSAgICAgICAgICAgIGlucHV0PSJGV0svQlZUL29wQ29uc3RyLmphciIKLSAgICAgICAgICAgIHZhbGlkYXRvcj0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yLkZ3a1Rlc3RWYWxpZGF0b3IiCi0gICAgICAgICAgICBwcm9qZWN0PSJvcENvbnN0ciIKLSAgICAgICAgICAgIHZpc2libGU9ImZhbHNlIj4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9IklUZXN0LmphdmEiCi0gICAgICAgICAgICAgICB0ZXh0PSJUaGlzIGlzIGEgdGVzdCBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIHJlcG9ydGVkIGJ5IFZGIFRlc3QgVmFsaWRhdG9yLiBQbGVhc2UgaWdub3JlLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjEiCi0gICAgICAgICAgICAgICBwcmVmaXg9IiIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJUZXN0MS5qYXZhIgotICAgICAgICAgICAgICAgdGV4dD0iVGhpcyBpcyBhIHRlc3QgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCByZXBvcnRlZCBieSBWRiBUZXN0IFZhbGlkYXRvci4gUGxlYXNlIGlnbm9yZS4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxIgotICAgICAgICAgICAgICAgcHJlZml4PSIiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0idGVzdDIvSVRlc3QyLmphdmEiCi0gICAgICAgICAgICAgICB0ZXh0PSJUaGlzIGlzIGEgdGVzdCBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIHJlcG9ydGVkIGJ5IFZGIFRlc3QgVmFsaWRhdG9yLiBQbGVhc2UgaWdub3JlLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjEiCi0gICAgICAgICAgICAgICBwcmVmaXg9IiIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJ0ZXN0Mi9UZXN0Mi5qYXZhIgotICAgICAgICAgICAgICAgdGV4dD0iVGhpcyBpcyBhIHRlc3QgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLCByZXBvcnRlZCBieSBWRiBUZXN0IFZhbGlkYXRvci4gUGxlYXNlIGlnbm9yZS4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgPC90ZXN0PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0iRndrTm9CdWlsZFRlc3RWYWxpZGF0b3JCVlQiCi0gICAgICAgICBuYW1lPSJGd2sgTm9CdWlsZCBUZXN0IFZhbGlkYXRvciBCVlQgVGVzdHMiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC50ZXN0Ij4KLSAgICAgIDx0ZXN0Ci0gICAgICAgICAgICBpbnB1dD0iRldLL0JWVC9vcENvbnN0ci5qYXIiCi0gICAgICAgICAgICB2YWxpZGF0b3I9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvci5Gd2tOb0J1aWxkVGVzdFZhbGlkYXRvciIKLSAgICAgICAgICAgIHByb2plY3Q9Im9wQ29uc3RyIgotICAgICAgICAgICAgdmlzaWJsZT0iZmFsc2UiPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxIgotICAgICAgICAgICAgICAgcHJlZml4PSIiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0iSVRlc3QuamF2YSIKLSAgICAgICAgICAgICAgIHRleHQ9IlRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UgZm9yIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yaywgcmVwb3J0ZWQgYnkgVkYgTm9CdWlsZCBUZXN0IFZhbGlkYXRvci4gUGxlYXNlIGlnbm9yZS4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxIgotICAgICAgICAgICAgICAgcHJlZml4PSIiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0iVGVzdDEuamF2YSIKLSAgICAgICAgICAgICAgIHRleHQ9IlRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UgZm9yIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yaywgcmVwb3J0ZWQgYnkgVkYgTm9CdWlsZCBUZXN0IFZhbGlkYXRvci4gUGxlYXNlIGlnbm9yZS4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxIgotICAgICAgICAgICAgICAgcHJlZml4PSIiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0idGVzdDIvSVRlc3QyLmphdmEiCi0gICAgICAgICAgICAgICB0ZXh0PSJUaGlzIGlzIGEgdGVzdCBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIHJlcG9ydGVkIGJ5IFZGIE5vQnVpbGQgVGVzdCBWYWxpZGF0b3IuIFBsZWFzZSBpZ25vcmUuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InRlc3QyL1Rlc3QyLmphdmEiCi0gICAgICAgICAgICAgICB0ZXh0PSJUaGlzIGlzIGEgdGVzdCBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIHJlcG9ydGVkIGJ5IFZGIE5vQnVpbGQgVGVzdCBWYWxpZGF0b3IuIFBsZWFzZSBpZ25vcmUuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgIDwvdGVzdD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgaWQ9IlByb3BlcnRpZXNWYWxpZGF0b3JCVlQiCi0gICAgICAgICBuYW1lPSJQcm9wZXJ0aWVzIFZhbGlkYXRvciBCVlQgVGVzdHMiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC50ZXN0Ij4KLSAgICAgIDx0ZXN0Ci0gICAgICAgICAgICBpbnB1dD0iRldLL0JWVC9vcENvbnN0ci5qYXIiCi0gICAgICAgICAgICB2YWxpZGF0b3I9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5Qcm9wZXJ0aWVzVmFsaWRhdG9yIgotICAgICAgICAgICAgcHJvamVjdD0ib3BDb25zdHIiCi0gICAgICAgICAgICB2aXNpYmxlPSJmYWxzZSI+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjMiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDAwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDAwMEU6IE1hdGNoIHRoZSBicmFjZXMgaW4gdGhlIG1lc3NhZ2UuIFRoZXJlIGFyZSAwIHsgYW5kIDEgfS4gTWVzc2FnZUZvcm1hdCB3aWxsIHRocm93IGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiB0aGVyZSBhcmUgbWlzbWF0Y2hpbmcgYnJhY2VzLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjIiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDAwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDAwMEU6IE1hdGNoIHRoZSBicmFjZXMgaW4gdGhlIG1lc3NhZ2UuIFRoZXJlIGFyZSAxIHsgYW5kIDAgfS4gTWVzc2FnZUZvcm1hdCB3aWxsIHRocm93IGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiB0aGVyZSBhcmUgbWlzbWF0Y2hpbmcgYnJhY2VzLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjEiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDAwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDAwMEU6IE1hdGNoIHRoZSBicmFjZXMgaW4gdGhlIG1lc3NhZ2UuIFRoZXJlIGFyZSAwIHsgYW5kIDEgfS4gTWVzc2FnZUZvcm1hdCB3aWxsIHRocm93IGEgTnVsbFBvaW50ZXJFeGNlcHRpb24gd2hlbiB0aGVyZSBhcmUgbWlzbWF0Y2hpbmcgYnJhY2VzLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjEwIgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDAxMCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwMTBFOiBDaGFuZ2UgYXJndW1lbnQgKHstMX0pIHRvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA5IGluY2x1c2l2ZSBpbiB0aGUgbWVzc2FnZS4gTWVzc2FnZUZvcm1hdCBjYW5ub3QgcHJvY2VzcyBhbiBpbnRlZ2VyIHBhcmFtZXRlciB0aGF0IGlzIGxlc3MgdGhhbiAwLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjgiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDEwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDAxMFc6IENoYW5nZSBhcmd1bWVudCAoezEwfSkgdG8gYW4gaW50ZWdlciBiZXR3ZWVuIDAgYW5kIDkgaW5jbHVzaXZlIGluIHRoZSBtZXNzYWdlLiBNZXNzYWdlRm9ybWF0IGlnbm9yZXMgYW55IHBhcmFtZXRlcnMgbGFyZ2VyIHRoYW4gOS4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSI3IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDAxMCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwMTBXOiBDaGFuZ2UgYXJndW1lbnQgKHsxMH0pIHRvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA5IGluY2x1c2l2ZSBpbiB0aGUgbWVzc2FnZS4gTWVzc2FnZUZvcm1hdCBpZ25vcmVzIGFueSBwYXJhbWV0ZXJzIGxhcmdlciB0aGFuIDkuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMTIiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDIwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDAyMEk6IFJlbW92ZSByZWR1bmRhbnQgcGFyYW1ldGVyIHswfSBmcm9tIHRoZSBtZXNzYWdlLiBNYWtlIG1lc3NhZ2VzIHN1Y2NpbmN0LiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjEzIgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDAzMCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwMzBJOiBDaGVjayB0aGF0IGFyZ3VtZW50IHsxfSB3YXMgb21pdHRlZCBmcm9tIHRoZSBtZXNzYWdlIGRlbGliZXJhdGVseS4gSWYgaXQgd2FzIG9taXR0ZWQgYWNjaWRlbnRhbGx5LCBhbmQgdGhlIGNvZGUgZG9lcyBub3QgcHJvdmlkZSBlbm91Z2ggcGFyYW1ldGVycywgTWVzc2FnZUZvcm1hdCB3aWxsIHRocm93IGEgTnVsbFBvaW50ZXJFeGNlcHRpb24uIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iOCIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwMzAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDMwSTogQ2hlY2sgdGhhdCBhcmd1bWVudCB7MH0gd2FzIG9taXR0ZWQgZnJvbSB0aGUgbWVzc2FnZSBkZWxpYmVyYXRlbHkuIElmIGl0IHdhcyBvbWl0dGVkIGFjY2lkZW50YWxseSwgYW5kIHRoZSBjb2RlIGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIHBhcmFtZXRlcnMsIE1lc3NhZ2VGb3JtYXQgd2lsbCB0aHJvdyBhIE51bGxQb2ludGVyRXhjZXB0aW9uLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjE0IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA0MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNDBJOiBVc2UgdHdvIGFwb3N0cm9waGVzIGluIHRoZSBtZXNzYWdlIGF0IGNvbHVtbiA1Ny4gTWVzc2FnZUZvcm1hdCByZW1vdmVzIHNpbmdsZSBhcG9zdHJvcGhlczsgZm9yIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYW4gYXBvc3Ryb3BoZSwgdHdvIGFwb3N0cm9waGVzIG11c3QgZXhpc3QgaW4gdGhlIHN0cmluZy4gKEFuIGFwb3N0cm9waGUgaXMgYSByZXNlcnZlZCBjaGFyYWN0ZXIgb2YgTWVzc2FnZUZvcm1hdC4pIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMTUiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDUwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA1MEk6IFVzZSBvbmUgYXBvc3Ryb3BoZSBpbiB0aGUgbWVzc2FnZSBhdCBjb2x1bW4gNTcuIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc2VzIG9ubHkgbWVzc2FnZXMgd2l0aCBwYXJhbWV0ZXJzOyB3aXRob3V0IE1lc3NhZ2VGb3JtYXQsIHRoZSBleHRyYSBhcG9zdHJvcGhlIHdpbGwgbm90IGJlIHJlbW92ZWQuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMjUiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDYwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA2MFc6IE1ha2UgWl9EVVBMSUNBVEUgdW5pcXVlLiBXaGVuIGFuIGlkIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UgaW4gYSBmaWxlLCBSZXNvdXJjZUJ1bmRsZSB3aWxsIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgbWVzc2FnZSBpZC4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIyNCIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNjAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDYwVzogTWFrZSBaX0RVUExJQ0FURSB1bmlxdWUuIFdoZW4gYW4gaWQgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiBhIGZpbGUsIFJlc291cmNlQnVuZGxlIHdpbGwgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBtZXNzYWdlIGlkLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjE5IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA2MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNjBXOiBNYWtlIERVUExJQ0FURV9JRCB1bmlxdWUuIFdoZW4gYW4gaWQgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiBhIGZpbGUsIFJlc291cmNlQnVuZGxlIHdpbGwgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBtZXNzYWdlIGlkLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjE4IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA2MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNjBXOiBNYWtlIERVUExJQ0FURV9JRCB1bmlxdWUuIFdoZW4gYW4gaWQgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiBhIGZpbGUsIFJlc291cmNlQnVuZGxlIHdpbGwgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBtZXNzYWdlIGlkLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjI4IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA2MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNjBXOiBNYWtlIFpfRFVQTElDQVRFIHVuaXF1ZS4gV2hlbiBhbiBpZCBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIGEgZmlsZSwgUmVzb3VyY2VCdW5kbGUgd2lsbCB1c2UgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IG1lc3NhZ2UgaWQuIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iNDMiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDcwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA3MFc6IEFCQ0QwMDAwRSBtYXkgbmVlZCB0byBiZSB1bmlxdWUuIENvbnZlbnRpb25hbGx5LCBhIG1lc3NhZ2UgcHJlZml4IGFwcGxpZXMgdG8gb25seSBvbmUgZXJyb3IgY29uZGl0aW9uLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjQyIgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA3MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNzBXOiBBQkNEMDAwMEUgbWF5IG5lZWQgdG8gYmUgdW5pcXVlLiBDb252ZW50aW9uYWxseSwgYSBtZXNzYWdlIHByZWZpeCBhcHBsaWVzIHRvIG9ubHkgb25lIGVycm9yIGNvbmRpdGlvbi4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSI0MSIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNzAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDcwVzogQUJDRDAwMDBFIG1heSBuZWVkIHRvIGJlIHVuaXF1ZS4gQ29udmVudGlvbmFsbHksIGEgbWVzc2FnZSBwcmVmaXggYXBwbGllcyB0byBvbmx5IG9uZSBlcnJvciBjb25kaXRpb24uIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMzkiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDcwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA3MFc6IEFCQ0QwMDAwRSBtYXkgbmVlZCB0byBiZSB1bmlxdWUuIENvbnZlbnRpb25hbGx5LCBhIG1lc3NhZ2UgcHJlZml4IGFwcGxpZXMgdG8gb25seSBvbmUgZXJyb3IgY29uZGl0aW9uLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjM4IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA3MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNzBXOiBBQkNEMDAwMEUgbWF5IG5lZWQgdG8gYmUgdW5pcXVlLiBDb252ZW50aW9uYWxseSwgYSBtZXNzYWdlIHByZWZpeCBhcHBsaWVzIHRvIG9ubHkgb25lIGVycm9yIGNvbmRpdGlvbi4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIzNyIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNzAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDcwVzogQUJDRDAwMDBFIG1heSBuZWVkIHRvIGJlIHVuaXF1ZS4gQ29udmVudGlvbmFsbHksIGEgbWVzc2FnZSBwcmVmaXggYXBwbGllcyB0byBvbmx5IG9uZSBlcnJvciBjb25kaXRpb24uIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMzYiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDcwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA3MFc6IEFCQ0QwMDAwRSBtYXkgbmVlZCB0byBiZSB1bmlxdWUuIENvbnZlbnRpb25hbGx5LCBhIG1lc3NhZ2UgcHJlZml4IGFwcGxpZXMgdG8gb25seSBvbmUgZXJyb3IgY29uZGl0aW9uLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjQ1IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA3MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNzBXOiBBQkNEMDAwMEUgbWF5IG5lZWQgdG8gYmUgdW5pcXVlLiBDb252ZW50aW9uYWxseSwgYSBtZXNzYWdlIHByZWZpeCBhcHBsaWVzIHRvIG9ubHkgb25lIGVycm9yIGNvbmRpdGlvbi4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSI0NCIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNzAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDcwVzogQUJDRDAwMDBFIG1heSBuZWVkIHRvIGJlIHVuaXF1ZS4gQ29udmVudGlvbmFsbHksIGEgbWVzc2FnZSBwcmVmaXggYXBwbGllcyB0byBvbmx5IG9uZSBlcnJvciBjb25kaXRpb24uIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMzUiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDcwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA3MFc6IEFCQ0QwMDAwRSBtYXkgbmVlZCB0byBiZSB1bmlxdWUuIENvbnZlbnRpb25hbGx5LCBhIG1lc3NhZ2UgcHJlZml4IGFwcGxpZXMgdG8gb25seSBvbmUgZXJyb3IgY29uZGl0aW9uLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjIzIgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA3MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwNzBXOiBBQUFBMDAwMFcgbWF5IG5lZWQgdG8gYmUgdW5pcXVlLiBDb252ZW50aW9uYWxseSwgYSBtZXNzYWdlIHByZWZpeCBhcHBsaWVzIHRvIG9ubHkgb25lIGVycm9yIGNvbmRpdGlvbi4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIyMCIKLSAgICAgICAgICAgICAgIHByZWZpeD0iQUJDRDAwNzAiCi0gICAgICAgICAgICAgICByZXNvdXJjZT0icmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcyIKLSAgICAgICAgICAgICAgIHRleHQ9IkFCQ0QwMDcwVzogQUFBQTAwMDBXIG1heSBuZWVkIHRvIGJlIHVuaXF1ZS4gQ29udmVudGlvbmFsbHksIGEgbWVzc2FnZSBwcmVmaXggYXBwbGllcyB0byBvbmx5IG9uZSBlcnJvciBjb25kaXRpb24uIj4KLSAgICAgICAgIDwvbWVzc2FnZT4KLSAgICAgICAgIDxtZXNzYWdlCi0gICAgICAgICAgICAgICBsb2NhdGlvbj0iMjEiCi0gICAgICAgICAgICAgICBwcmVmaXg9IkFCQ0QwMDgwIgotICAgICAgICAgICAgICAgcmVzb3VyY2U9InJlc291cmNlcy90ZXN0LnByb3BlcnRpZXMiCi0gICAgICAgICAgICAgICB0ZXh0PSJBQkNEMDA4MEU6IEZpeCB0aGUgc3ludGF4IGVycm9yOyBlYWNoIGxpbmUgbXVzdCBmb3JtIE1FU1NBR0VfSUQgPSBNRVNTQUdFLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICAgICA8bWVzc2FnZQotICAgICAgICAgICAgICAgbG9jYXRpb249IjE3IgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDA4MCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAwODBFOiBGaXggdGhlIHN5bnRheCBlcnJvcjsgZWFjaCBsaW5lIG11c3QgZm9ybSBNRVNTQUdFX0lEID0gTUVTU0FHRS4iPgotICAgICAgICAgPC9tZXNzYWdlPgotICAgICAgICAgPG1lc3NhZ2UKLSAgICAgICAgICAgICAgIGxvY2F0aW9uPSIxIgotICAgICAgICAgICAgICAgcHJlZml4PSJBQkNEMDExMCIKLSAgICAgICAgICAgICAgIHJlc291cmNlPSJyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgdGV4dD0iQUJDRDAxMTBJOiBBZGQgYSB0ZXJtaW5hdGluZyBhcG9zdHJvcGhlIGF0IGNvbHVtbiAzNi4gVGhlIHsgYW5kIH0gY2hhcmFjdGVycyBtdXN0IGJlIGVuY2xvc2VkIGluIGFwb3N0cm9waGVzLiI+Ci0gICAgICAgICA8L21lc3NhZ2U+Ci0gICAgICA8L3Rlc3Q+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgCi0gICAKLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3QueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyYmE4Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQuIC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuICAgICAgICAgICAtLT4KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDwhLS0gPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi4iLz4gLS0+Ci0KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDwhLS0gU2V0IHRoZSBlbnZpcm9ubWVudCBwcm9wZXJ0aWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdCIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIgotICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4yLjAvbGlicmFyeS54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLVhteDcwME0iLz4KLQotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDwhLS0gVGhpcyB0YXJnZXQgaW5pdGlhbGl6ZXMgYWxsIG9mIHRoZSB0ZXN0cyB0aGF0IHdpbGwgcnVuLiAgICAgICAtLT4KLSAgPCEtLSBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIC0tPiAKLSAgPCEtLSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICA8dHN0YW1wLz4KLSAgICAgIDxkZWxldGU+Ci0gICAgICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZy4qLnhtbCIvPgotICAgICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBydW4uICAgICAgICAgICAgICAtLT4KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDx0YXJnZXQgbmFtZT0ic3VpdGUiPgotCTxwcm9wZXJ0eSBuYW1lPSJ3b3Jrc3BhY2UiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vanN0X2ZvbGRlciIvPgotCTxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+Ci0JPGFudCB0YXJnZXQ9InVpLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgCTxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICAJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuanVuaXQuQXV0b21hdGVkVmFsaWRhdGlvbkJWVCIvPgotICAgCSAgCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAJICAJPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iJHtleHRyYVZNYXJnc30iLz4KLQk8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAgLS0+Ci0gIDwhLS0gYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAgICAgICAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuICAgICAgICAgICAgICAgICAgIC0tPgotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0gICAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImluY2x1ZGVzIiB2YWx1ZT0ib3JnLioueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL2FwaS90ZXN0L0FwaVRlc3RzU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9hcGkvdGVzdC9BcGlUZXN0c1N1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MDY3ZTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL2FwaS90ZXN0L0FwaVRlc3RzU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uYXBpLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgQXBpVGVzdHNTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JCi0JIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpewotCSAgICAgICAgcmV0dXJuIG5ldyBBcGlUZXN0c1N1aXRlKCk7Ci0JICAgIH0KLQotCXB1YmxpYyBBcGlUZXN0c1N1aXRlKCkgewotCQlzdXBlcigpOwotCQlhZGRUZXN0KFZhbGlkYXRpb25SZWdpc3RyeUFwaVRlc3Quc3VpdGUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vYXBpL3Rlc3QvVmFsaWRhdGlvblJlZ2lzdHJ5QXBpVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL2FwaS90ZXN0L1ZhbGlkYXRpb25SZWdpc3RyeUFwaVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxOTdmOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vYXBpL3Rlc3QvVmFsaWRhdGlvblJlZ2lzdHJ5QXBpVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5hcGkudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5WYWxpZGF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0aW9uUmVnaXN0cnlBcGlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVmFsaWRhdGlvblJlZ2lzdHJ5QXBpVGVzdC5jbGFzcyk7Ci0JfSAKLQotCXB1YmxpYyBWYWxpZGF0aW9uUmVnaXN0cnlBcGlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBWYWxpZGF0aW9uUmVnaXN0cnlBcGlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0X2dldFZhbGlkYXRvcigpIHsKLQl0cnkgewotCQlWYWxpZGF0aW9uRmFjdG9yeSB2YWxGYWN0b3J5ID0gVmFsaWRhdGlvbkZhY3RvcnkuaW5zdGFuY2U7Ci0JCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gdmFsRmFjdG9yeS5nZXRWYWxpZGF0b3IoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi53b3JrYmVuY2gudmFsaWRhdGlvbi5VSUVqYlZhbGlkYXRvciIpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCh2YWxpZGF0b3IpOwotCSB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCSAgfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQlZUVmFsaWRhdGlvbkJhdGNoLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CVlRWYWxpZGF0aW9uQmF0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZkMjIwNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CVlRWYWxpZGF0aW9uQmF0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbGF0Zm9ybVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWwuQlZUVmFsaWRhdGlvblV0aWxpdHk7Ci0vKioKLSAqLwotcHVibGljIGNsYXNzIEJWVFZhbGlkYXRpb25CYXRjaCBpbXBsZW1lbnRzIElQbGF0Zm9ybVJ1bm5hYmxlIHsKLQlwcml2YXRlIFN0cmluZyBfZGlyID0gbnVsbDsgLy8gVGhlIHRlc3QgY2FzZXMgKC5lYXIsIC5qYXIpIGFyZSBpZGVudGlmaWVkIHRocm91Z2ggYSByZWxhdGl2ZSBkaXJlY3RvcnksIGFuZCB0aGlzIGlzIHRoZSBwYXJlbnQgb2YgdGhhdCByZWxhdGl2ZSBkaXJlY3RvcnkuCi0JcHJpdmF0ZSBib29sZWFuIF92ZXJib3NlID0gZmFsc2U7Ci0Jc3RhdGljIEJvb2xlYW4gX3Bhc3NlZCA9IG51bGw7Ci0JCi0JYm9vbGVhbiBpc1ZlcmJvc2UoKSB7Ci0JCXJldHVybiBfdmVyYm9zZTsKLQl9Ci0JCi0Jdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdikgewotCQlfdmVyYm9zZSA9IHY7Ci0JfQotCQotCVN0cmluZyBnZXREaXIoKSB7Ci0JCXJldHVybiBfZGlyOwotCX0KLQkKLQl2b2lkIHNldERpcihTdHJpbmcgZGlyKSB7Ci0JCV9kaXIgPSBkaXI7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwYXJzZVVzZXJTZXR0aW5ncyhPYmplY3QgYXJncykgewotCQlpZihhcmdzID09IG51bGwpIHsKLQkJCS8vIG5vdGhpbmcgdG8gc2V0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKGFyZ3MgaW5zdGFuY2VvZiBTdHJpbmdbXSkgewotCQkJU3RyaW5nW10gdXNlclNldHRpbmdzID0gKFN0cmluZ1tdKWFyZ3M7Ci0JCQlpZih1c2VyU2V0dGluZ3MubGVuZ3RoID09IDApIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWZvcihpbnQgaT0wOyBpPHVzZXJTZXR0aW5ncy5sZW5ndGg7IGkrKykgewotCQkJCWlmKHVzZXJTZXR0aW5nc1tpXS5lcXVhbHMoIi1kaXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXNldERpcih1c2VyU2V0dGluZ3NbaSsxXSk7Ci0JCQkJfQotCQkJCQotCQkJCWlmKHVzZXJTZXR0aW5nc1tpXS5lcXVhbHMoIi10cmFjZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc2V0VmVyYm9zZSh0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHR1cm4gb24gZnJhbWV3b3JrIHZhbGlkYXRpb24gbG9nZ2luZwotCQkJaWYoaXNWZXJib3NlKCkpIHsKLQkJCQlCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLnNldExldmVsKExldmVsLkZJTkVTVCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSB1c2VyJ3Mgc2V0dGluZ3MsIGltcG9ydCB0aGUgdGVzdCBjYXNlcywgYW5kIHJ1biB0aGUgdGVzdCBjYXNlcy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHJ1bihPYmplY3QgYXJncykgdGhyb3dzIEJWVFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlwYXJzZVVzZXJTZXR0aW5ncyhhcmdzKTsKLQotCQlJV29ya3NwYWNlUnVubmFibGUgcnVubmFibGUgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewkJCi0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKCJXb3Jrc3BhY2UgaXMgbG9jYXRlZCBhdDogIiArIEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJCQlDb25zb2xlQnVmZmVyIGJ1ZmZlciA9IG5ldyBDb25zb2xlQnVmZmVyKCk7Ci0JCQkJCUJWVFJ1bm5lci5zaW5nbGV0b24oKS5zZXR1cFRlc3RzKGJ1ZmZlciwgaXNWZXJib3NlKCkpOwotCQkJCQkKLQkJCQkJaW50IG51bVRlc3RzID0gQlZUVmFsaWRhdGlvblV0aWxpdHkubnVtVmFsaWRhdG9yVGVzdHMobW9uaXRvciwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKTsKLQkJCQkJaW50IG51bVBhc3NlZCA9IEJWVFJ1bm5lci5zaW5nbGV0b24oKS50ZXN0KGJ1ZmZlciwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpKTsKLQkJCQkJX3Bhc3NlZCA9ICgobnVtUGFzc2VkID09IG51bVRlc3RzKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UpOwotCQkJCX0KLQkJCQljYXRjaChCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRNZXNzYWdlKCkpOwotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJCi0JCXRyeSB7Ci0JCQlDb25zb2xlUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgQ29uc29sZVByb2dyZXNzTW9uaXRvcigpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihydW5uYWJsZSwgbW9uaXRvcik7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCXRocm93IG5ldyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uKGV4Yyk7Ci0JCX0KLQkJcmV0dXJuIF9wYXNzZWQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDgwOWQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0JWVFZhbGlkYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLQotcHVibGljIGNsYXNzIEJWVFZhbGlkYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCXByaXZhdGUgVGhyb3dhYmxlIF90YXJnZXQgPSBudWxsOwotCQotCXB1YmxpYyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uKFRocm93YWJsZSB0KSB7Ci0JCXNldFRhcmdldEV4Y2VwdGlvbih0KTsKLQl9Ci0JCi0JcHVibGljIEJWVFZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCQotCXB1YmxpYyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgdGFyZ2V0KSB7Ci0JCXN1cGVyKHMpOwotCQlzZXRUYXJnZXRFeGNlcHRpb24odGFyZ2V0KTsKLQl9Ci0JCi0JcHVibGljIFRocm93YWJsZSBnZXRUYXJnZXRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBfdGFyZ2V0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRFeGNlcHRpb24oVGhyb3dhYmxlIHRhcmdldCkgewotCQlfdGFyZ2V0ID0gdGFyZ2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0JWVFZhbGlkYXRpb25QbHVnaW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0JWVFZhbGlkYXRpb25QbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdkMjJlNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CVlRWYWxpZGF0aW9uUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5cmVuZGVyLkRlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0KLS8qKgotICogUGx1Z2luIGZvciBUVlQgdGVzdGluZy4KLSAqLwotcHVibGljIGNsYXNzIEJWVFZhbGlkYXRpb25QbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXByaXZhdGUgc3RhdGljIEJWVFZhbGlkYXRpb25QbHVnaW4gaW5zdCA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQlwcm90ZWN0ZWQgc3RhdGljIExvZ2dlciBsb2dnZXIgPSBudWxsOwotCi0JLyoqCi0JICogVmFsaWRhdGlvblRWVFBsdWdpbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBCVlRWYWxpZGF0aW9uUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpbnN0ID0gdGhpczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBCVlRWYWxpZGF0aW9uUGx1Z2luIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIGluc3Q7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSUQoKSB7Ci0JICAgIHJldHVybiBQTFVHSU5fSUQ7Ci0JfQotCQotCXB1YmxpYyBMb2dnZXIgZ2V0TXNnTG9nZ2VyKCkgewotCQlpZiAobG9nZ2VyID09IG51bGwpIHsKLQkJCWxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoZ2V0UGx1Z2luSUQoKSk7Ci0JCQlzZXRSZW5kZXJlcihsb2dnZXIpOwotCQl9Ci0JCXJldHVybiBsb2dnZXI7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBhTG9nZ2VyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVuZGVyZXIoTG9nZ2VyIGFMb2dnZXIpIHsKLQkJbmV3IERlZmF1bHRQbHVnaW5UcmFjZVJlbmRlcmVyKGFMb2dnZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZT0gZ2V0UGx1Z2luKCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlIT1udWxsID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW5SZXNvdXJjZSIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJaW5zdCA9IG51bGw7Ci0JCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKLQkJZ2V0TXNnTG9nZ2VyKCkubG9nKGUpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgbG9nKExldmVsIHNldmVyZSwgU3RyaW5nIG1zZykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0J1ZmZlcmVkVGFza1N0YXR1cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQnVmZmVyZWRUYXNrU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNTQ2ODYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQnVmZmVyZWRUYXNrU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlRlc3RjYXNlVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci0KLQotcHVibGljIGNsYXNzIEJ1ZmZlcmVkVGFza1N0YXR1cyBleHRlbmRzIFRhc2tTdGF0dXMgaW1wbGVtZW50cyBJQnVmZmVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdMSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIF9tb25pdG9yID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfbG9nRmlsZU5hbWUgPSBudWxsOwotCQotCXB1YmxpYyBCdWZmZXJlZFRhc2tTdGF0dXMoKSB7Ci0JfQotCQotCXB1YmxpYyBCdWZmZXJlZFRhc2tTdGF0dXMoU3RyaW5nIGxvZ0ZpbGVOYW1lKSB7Ci0JCXRoaXMobG9nRmlsZU5hbWUsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgQnVmZmVyZWRUYXNrU3RhdHVzKFN0cmluZyBsb2dGaWxlTmFtZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCV9idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKLQkJc2V0TG9nRmlsZU5hbWUobG9nRmlsZU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJc3VwZXIuY2xlYXIoKTsKLQkJX2J1ZmZlciA9IG51bGw7Ci0JCV9idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCV9tb25pdG9yLmRvbmUoKTsKLQkJX21vbml0b3IgPSBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9nRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBfbG9nRmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldExvZ0ZpbGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCV9sb2dGaWxlTmFtZSA9IG5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlyZXR1cm4gX2J1ZmZlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjZ2V0UHJvZ3Jlc3NNb25pdG9yKCkKLQkgKi8KLQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCWlmKF9tb25pdG9yID09IG51bGwpIHsKLQkJCV9tb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQotCQlyZXR1cm4gX21vbml0b3I7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG0pIHsKLQkJX21vbml0b3IgPSBtOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNyZXBvcnQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydCgpIHsKLQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JCV9idWZmZXIuYXBwZW5kKCI+Pj4+Pj4+Pj4+Pj4+Pj4+VEVTVCBTVUlURSBSRVNVTFRTPj4+Pj4+Pj4+Pj4+Pj4+PiIpOyAvLyROT04tTkxTLTEkCi0JCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQotCQlpZihnZXRFbGFwc2VkVGltZSgpLnNpemUoKSA+IDApIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0RWxhcHNlZFRpbWUoKS5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJbG9uZyB0b3RhbCA9IDA7Ci0JCQlfYnVmZmVyLmFwcGVuZCgiPj4+Pj4+Pj4+Pj4+Pj4+PkVMQVBTRUQgVElNRT4+Pj4+Pj4+Pj4+Pj4+Pj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlTdHJpbmcgdGFza05hbWUgPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlMb25nIGVsYXBzZWRUaW1lID0gKExvbmcpZ2V0RWxhcHNlZFRpbWUoKS5nZXQodGFza05hbWUpOwotCQkJCXRvdGFsICs9IGVsYXBzZWRUaW1lLmxvbmdWYWx1ZSgpOwotCQkJCV9idWZmZXIuYXBwZW5kKCJUb3RhbCBlbGFwc2VkIHRpbWUgb2YgdGFzayAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCV9idWZmZXIuYXBwZW5kKHRhc2tOYW1lKTsKLQkJCQlfYnVmZmVyLmFwcGVuZCgiIGlzICIpOyAvLyROT04tTkxTLTEkCi0JCQkJX2J1ZmZlci5hcHBlbmQoZWxhcHNlZFRpbWUpOwotCQkJCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCQkJfQotCQkJX2J1ZmZlci5hcHBlbmQoIlRvdGFsIHRpbWUgb2YgYWxsIHRhc2tzIGlzICIgKyB0b3RhbCArICIsIHdoaWNoIGlzICIgKyAodG90YWwvMTAwMC82MCkgKyAiIG1pbnV0ZXMuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJfQotCi0JCWludCB0b3ROdW1QYXNzID0gMDsKLQkJTWFwIHRhc2tTdGF0dXMgPSBnZXRUYXNrU3RhdHVzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGFza1N0YXR1cy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJX2J1ZmZlci5hcHBlbmQoIj4+Pj4+Pj4+Pj4+Pj4+Pj5QQVNTL0ZBSUwgU1VNTUFSWT4+Pj4+Pj4+Pj4+Pj4+Pj4iKTsgLy8kTk9OLU5MUy0xJAotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgdGFza05hbWUgPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLQkJCVRlc3RTdGF0dXMgdHMgPSAoVGVzdFN0YXR1cyl0YXNrU3RhdHVzLmdldCh0YXNrTmFtZSk7Ci0JCQlfYnVmZmVyLmFwcGVuZCh0cyk7Ci0JCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJCWlmKHRzLmlzU3VjY2Vzc2Z1bCgpKSB7Ci0JCQkJdG90TnVtUGFzcysrOwotCQkJfQotCQl9Ci0JCQotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JCV9idWZmZXIuYXBwZW5kKCJUb3RhbCBOdW1iZXIgT2YgVGVzdHM6ICIpOyAvLyROT04tTkxTLTEkCi0JCV9idWZmZXIuYXBwZW5kKG51bVRlc3RzKCkpOwotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJX2J1ZmZlci5hcHBlbmQoIk51bWJlciBQYXNzZWQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCV9idWZmZXIuYXBwZW5kKHRvdE51bVBhc3MpOwotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJCi0JCWlmKGdldExvZ0ZpbGVOYW1lKCkgIT0gbnVsbCkgewotCQkJX2J1ZmZlci5hcHBlbmQoIlRoaXMgcmVwb3J0IGlzIHN0b3JlZCBpbiB0aGUgZm9sbG93aW5nIGxvZyBmaWxlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJX2J1ZmZlci5hcHBlbmQoZ2V0TG9nRmlsZU5hbWUoKSk7Ci0JCi0JCQlUZXN0Y2FzZVV0aWxpdHkuZmx1c2goZ2V0TG9nRmlsZU5hbWUoKSwgX2J1ZmZlci50b1N0cmluZygpLCB0cnVlKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNkZWxpbmVhdGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGluZWF0ZShTdHJpbmcgdGVzdGNhc2VOYW1lKSB7Ci0JCVRhc2tTdGF0dXMuIFRlc3RTdGF0dXMgdHMgPSBnZXRUZXN0U3RhdHVzKHRlc3RjYXNlTmFtZSk7Ci0JCWlmKHRzID09IG51bGwpIHsKLQkJCS8vIG5vdGhpbmcgdG8gcmVwb3J0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIGVycm9yc0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZXJyb3JzQnVmZmVyLmFwcGVuZCh0cy5udW1GYWlsdXJlKCkpOwotCQllcnJvcnNCdWZmZXIuYXBwZW5kKCIgZXJyb3JzIHdlcmUgcmVwb3J0ZWQgYW5kICIpOyAvLyROT04tTkxTLTEkCi0JCWVycm9yc0J1ZmZlci5hcHBlbmQodHMubnVtV2FybmluZ3MoKSk7Ci0JCWVycm9yc0J1ZmZlci5hcHBlbmQoIiB3YXJuaW5ncyB3ZXJlIHJlcG9ydGVkLiBSZWFkICIpOyAvLyROT04tTkxTLTEkCi0JCWVycm9yc0J1ZmZlci5hcHBlbmQoZ2V0TG9nRmlsZU5hbWUoKSk7Ci0JCWVycm9yc0J1ZmZlci5hcHBlbmQoIiBmb3IgZGV0YWlscy4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZShlcnJvcnNCdWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI3dyaXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJLy8gQ2FuJ3Qgd3JpdGUgdG8gdGhlIEpVbml0IGxvZy4gQ2FuIG9ubHkgd3JpdGUgdG8gdGhlIGxvZyBieSBmYWlsaW5nIHRoZQotCQkvLyB0ZXN0IGNhc2Ugd2l0aCBhIG1lc3NhZ2U7IGluc3RlYWQsIHdyaXRlIHRvIHRoZSBidWZmZXIsIGFuZCBzZW5kIHRoaXMKLQkJLy8gaW5mb3JtYXRpb24gdG8gYSBsb2cgaW4gdGhlIHZhbGlkYXRpb24udGVzdCBwbHVnaW4ncyBzdGF0ZSBsb2NhdGlvbi4KLQkJX2J1ZmZlci5hcHBlbmQobWVzc2FnZSk7Ci0JCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0J1aWxkSW5mby5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQnVpbGRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMmM2ZWYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQnVpbGRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLXB1YmxpYyBjbGFzcyBCdWlsZEluZm8gewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiTGljZW5zZWQgTWF0ZXJpYWxzIC0tIFByb3BlcnR5IG9mIElCTVxuKGMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCAyMDAxLDIwMDNcblVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdCdWlsZExldmVsID0gIjIwMDMxMTEyXzE5MTUtV0IyMTItQUQtVjUxMUQtVzUiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBsZXZlbCgpIHsgcmV0dXJuIGZnQnVpbGRMZXZlbDsgfQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0FCdWlsZExldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9Db25zb2xlQnVmZmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9Db25zb2xlQnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOGJkY2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQ29uc29sZUJ1ZmZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlcjsKLQotCi0vKioKLSAqIFNlbmRzIHRoZSBUZXN0Q2FzZUdlbmVyYXRvck9wZXJhdGlvbiBvdXRwdXQgdG8gU3lzdGVtLm91dC4KLSAqLwotcHVibGljIGNsYXNzIENvbnNvbGVCdWZmZXIgaW1wbGVtZW50cyBJQnVmZmVyIHsKLQlwcml2YXRlIEJ1ZmZlcmVkVGFza1N0YXR1cyBfc3RhdHVzID0gbnVsbDsKLQkKLQlwdWJsaWMgQ29uc29sZUJ1ZmZlcigpIHsKLQkJX3N0YXR1cyA9IG5ldyBCdWZmZXJlZFRhc2tTdGF0dXMoKTsgLy8gbm8gbG9nIGZpbGUKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNyZXBvcnQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydCgpIHsKLQkJX3N0YXR1cy5yZXBvcnQoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKF9zdGF0dXMuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNjbGVhcigpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCV9zdGF0dXMuY2xlYXIoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMb2dGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIF9zdGF0dXMuZ2V0TG9nRmlsZU5hbWUoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjZGVsaW5lYXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZGVsaW5lYXRlKFN0cmluZyB0YXNrTmFtZSkgewotCQlfc3RhdHVzLmRlbGluZWF0ZSh0YXNrTmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI2dldFByb2dyZXNzTW9uaXRvcigpCi0JICovCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlyZXR1cm4gX3N0YXR1cy5nZXRQcm9ncmVzc01vbml0b3IoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjd3JpdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgbWVzc2FnZSkgewotCQlfc3RhdHVzLndyaXRlKG1lc3NhZ2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjYWRkRWxhcHNlZFRpbWUoamF2YS5sYW5nLlN0cmluZywgbG9uZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbGFwc2VkVGltZShTdHJpbmcgdGFza05hbWUsIGxvbmcgZWxhcHNlZFRpbWUpIHsKLQkJX3N0YXR1cy5hZGRFbGFwc2VkVGltZSh0YXNrTmFtZSwgZWxhcHNlZFRpbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjYWRkRXhlY3V0aW9uU3RhdHVzKGphdmEubGFuZy5TdHJpbmcsIGludCwgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyLCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGVzdGNhc2VOYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIGludCBwYXNzT3JGYWlsLCBJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3N0YXR1cy5hZGRFeGVjdXRpb25TdGF0dXModGVzdGNhc2VOYW1lLCBzdWJUYXNrTmFtZSwgcGFzc09yRmFpbCwgYnVmZmVyLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2FkZEdsb2JhbEV4ZWN1dGlvblN0YXR1cyhqYXZhLmxhbmcuU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0ZXN0UGFzc05hbWUsIGJvb2xlYW4gcGFzcykgewotCQlfc3RhdHVzLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0UGFzc05hbWUsIHBhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGVzdFBhc3NOYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIGJvb2xlYW4gcGFzcykgewotCQlfc3RhdHVzLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0UGFzc05hbWUsIHN1YlRhc2tOYW1lLCBwYXNzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2lzU3VjY2Vzc2Z1bCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsKCkgewotCQlyZXR1cm4gX3N0YXR1cy5pc1N1Y2Nlc3NmdWwoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2lzU3VjY2Vzc2Z1bCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsKFN0cmluZyB0ZXN0TmFtZSkgewotCQlyZXR1cm4gX3N0YXR1cy5pc1N1Y2Nlc3NmdWwodGVzdE5hbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNzZXRQcm9ncmVzc01vbml0b3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlfc3RhdHVzLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9Db25zb2xlUHJvZ3Jlc3NNb25pdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9Db25zb2xlUHJvZ3Jlc3NNb25pdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZDlmNmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQ29uc29sZVByb2dyZXNzTW9uaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogVGhpcyBwcm9ncmVzcyBtb25pdG9yIGRpcmVjdHMgYWxsIHRhc2sgaW5mb3JtYXRpb24gdG8gc3RkLm91dC4KLSAqLwotcHVibGljIGNsYXNzIENvbnNvbGVQcm9ncmVzc01vbml0b3IgaW1wbGVtZW50cyBJUHJvZ3Jlc3NNb25pdG9yIHsKLQlwcml2YXRlIGludCBfdG90YWxXb3JrID0gMDsKLQlwcml2YXRlIGludCBfd29ya0RvbmVTb0ZhciA9IDA7Ci0JcHJpdmF0ZSBib29sZWFuIF9jYW5jZWxSZXF1ZXN0ZWQgPSBmYWxzZTsKLQkKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjYmVnaW5UYXNrKFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luVGFzayhTdHJpbmcgbmFtZSwgaW50IHRvdGFsV29yaykgewotCQlfdG90YWxXb3JrID0gdG90YWxXb3JrOwotCQlyZXBvcnQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNkb25lKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb25lKCkgewotCQlpbnQgd29ya1JlbWFpbmluZyA9IF90b3RhbFdvcmsgLSBfd29ya0RvbmVTb0ZhcjsKLQkJd29ya2VkKHdvcmtSZW1haW5pbmcpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IjaW50ZXJuYWxXb3JrZWQoZG91YmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGludGVybmFsV29ya2VkKGRvdWJsZSB3b3JrKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNpc0NhbmNlbGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCQlyZXR1cm4gX2NhbmNlbFJlcXVlc3RlZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI3NldENhbmNlbGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FuY2VsZWQoYm9vbGVhbiB2YWx1ZSkgewotCQlfY2FuY2VsUmVxdWVzdGVkID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNzZXRUYXNrTmFtZShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFza05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmVwb3J0KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3Ijc3ViVGFzayhTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgewotCQlyZXBvcnQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciN3b3JrZWQoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdvcmtlZChpbnQgd29yaykgewotCQlfd29ya0RvbmVTb0ZhciArPSB3b3JrOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXBvcnQoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0lPcGVyYXRpb25SdW5uYWJsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvSU9wZXJhdGlvblJ1bm5hYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkN2I2NmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvSU9wZXJhdGlvblJ1bm5hYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotCi0KLS8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgaW50ZXJmYWNlIGFyZSBydW4gYXMgcGFydCBvZiB0aGUgVGVzdCBDb2xsZWN0b3IgQlZULgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElPcGVyYXRpb25SdW5uYWJsZSBleHRlbmRzIElXb3Jrc3BhY2VSdW5uYWJsZSB7Ci0JcHVibGljIHZvaWQgc2V0QnVmZmVyKElCdWZmZXIgYik7Ci0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwKTsKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB0ZXN0TmFtZSk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9UYXNrU3RhdHVzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9UYXNrU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTg5ZDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvVGFza1N0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXM7Ci0KLQotLyoqCi0gKiBBbGwgb2YgdGhlIElCdWZmZXIgaW5zdGFuY2VzIG5lZWQgdG8gYmUgYWJsZSB0byB0cmFjayBlbGFwc2VkIHRpbWUKLSAqIGFuZCBleGVjdXRpb24gc3RhdHVzLiBFYWNoIGJ1ZmZlciBjYW4gY3JlYXRlIGFuIGludGVybmFsIGluc3RhbmNlIG9mCi0gKiB0aGlzIGNsYXNzIHRvIHBlcmZvcm0gdGhvc2UgdGFza3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrU3RhdHVzIGltcGxlbWVudHMgSVRlc3RTdGF0dXMgewotCXByaXZhdGUgTWFwIF9lbGFwc2VkVGltZSA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgX3Rhc2tTdGF0dXMgPSBudWxsOwotCi0JcHVibGljIFRhc2tTdGF0dXMoKSB7Ci0JCV9lbGFwc2VkVGltZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCV90YXNrU3RhdHVzID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjYWRkRWxhcHNlZFRpbWUoU3RyaW5nLCBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsYXBzZWRUaW1lKFN0cmluZyB0YXNrTmFtZSwgbG9uZyBlbGFwc2VkVGltZSkgewotCQlMb25nIHRpbWUgPSAoTG9uZylfZWxhcHNlZFRpbWUuZ2V0KHRhc2tOYW1lKTsKLQkJaWYodGltZSA9PSBudWxsKSB7Ci0JCQl0aW1lID0gbmV3IExvbmcoZWxhcHNlZFRpbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJdGltZSA9IG5ldyBMb25nKHRpbWUubG9uZ1ZhbHVlKCkgKyBlbGFwc2VkVGltZSk7Ci0JCX0KLQkJX2VsYXBzZWRUaW1lLnB1dCh0YXNrTmFtZSwgdGltZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGFza05hbWUsIGJvb2xlYW4gcGFzcykgewotCQlhZGRFeGVjdXRpb25TdGF0dXModGFza05hbWUsIG51bGwsIHBhc3MpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRhc2tOYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIGJvb2xlYW4gcGFzcykgewotCQlpbnQgc3VjY2VzcyA9IChwYXNzKSA/IElUZXN0U3RhdHVzLlBBU1MgOiBJVGVzdFN0YXR1cy5GQUlMOwotCQlhZGRFeGVjdXRpb25TdGF0dXModGFza05hbWUsIHN1YlRhc2tOYW1lLCBzdWNjZXNzLCBudWxsLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIGludCBudW1UZXN0cygpIHsKLQkJcmV0dXJuIF90YXNrU3RhdHVzLnNpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcCBnZXRFbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIF9lbGFwc2VkVGltZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcCBnZXRUYXNrU3RhdHVzKCkgewotCQlyZXR1cm4gX3Rhc2tTdGF0dXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGVzdGNhc2VOYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIGludCBzZXZlcml0eSwgSUJ1ZmZlciBidWZmZXIsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCVRlc3RTdGF0dXMgdHMgPSBnZXRUZXN0U3RhdHVzKHRlc3RjYXNlTmFtZSk7Ci0JCWlmKHRzID09IG51bGwpIHsKLQkJCXRzID0gbmV3IFRlc3RTdGF0dXModGVzdGNhc2VOYW1lKTsKLQkJCV90YXNrU3RhdHVzLnB1dCh0ZXN0Y2FzZU5hbWUsIHRzKTsKLQkJfQotCQlpZihzdWJUYXNrTmFtZSA9PSBudWxsKSB7Ci0JCQl0cy5hZGRFeGVjdXRpb25TdGF0dXMoc2V2ZXJpdHkpOwotCQl9Ci0JCWVsc2UgewotCQkJdHMuYWRkRXhlY3V0aW9uU3RhdHVzKHN1YlRhc2tOYW1lLCBzZXZlcml0eSk7Ci0JCX0KLQotCQlpZihtZXNzYWdlICE9IG51bGwpIHsKLQkJCWJ1ZmZlci53cml0ZShtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgVGVzdFN0YXR1cyBnZXRUZXN0U3RhdHVzKFN0cmluZyB0ZXN0Y2FzZU5hbWUpIHsKLQkJcmV0dXJuIChUZXN0U3RhdHVzKV90YXNrU3RhdHVzLmdldCh0ZXN0Y2FzZU5hbWUpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjaXNTdWNjZXNzZnVsKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoKSB7Ci0JCWlmKF90YXNrU3RhdHVzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfdGFza1N0YXR1cy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyB0c05hbWUgPSAoU3RyaW5nKWl0ZXJhdG9yLm5leHQoKTsKLQkJCVRlc3RTdGF0dXMgdHMgPSAoVGVzdFN0YXR1cylfdGFza1N0YXR1cy5nZXQodHNOYW1lKTsKLQkJCWlmKHRzID09IG51bGwgfHwgIXRzLmlzU3VjY2Vzc2Z1bCgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsKFN0cmluZyB0ZXN0TmFtZSkgewotCQlpZihfdGFza1N0YXR1cy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCVRlc3RTdGF0dXMgdHMgPSAoVGVzdFN0YXR1cylfdGFza1N0YXR1cy5nZXQodGVzdE5hbWUpOwotCQlpZih0cyA9PSBudWxsIHx8ICF0cy5pc1N1Y2Nlc3NmdWwoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJX3Rhc2tTdGF0dXMuY2xlYXIoKTsKLQkJX2VsYXBzZWRUaW1lLmNsZWFyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBjbGFzcyBUZXN0Q291bnQgewotCQlwdWJsaWMgaW50IG51bVJhbiA9IDA7Ci0JCXB1YmxpYyBpbnQgbnVtV2FybiA9IDA7IC8vIE51bWJlciBvZiB3YXJuaW5nIG1lc3NhZ2VzIHJlcG9ydGVkIGZvciBhIHRlc3QgY2FzZS4KLQkJcHVibGljIGludCBudW1GYWlsID0gMDsgLy8gTnVtYmVyIG9mIGZhaWx1cmUgbWVzc2FnZXMgcmVwb3J0ZWQgZm9yIGEgdGVzdCBjYXNlLgotCQlwdWJsaWMgaW50IG51bVBhc3MgPSAwOyAvLyBOdW1iZXIgb2YgdGVzdCBjYXNlcyB0aGF0IHBhc3NlZC4KLQl9Ci0KLQkvKioKLQkgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB0cmFjayB0aGUgbnVtYmVyIG9mIHRlc3QgcnVucyBhbmQgdGhlIAotCSAqIG51bWJlciBvZiB0ZXN0IGNhc2VzIHRoYXQgcGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgVGVzdFN0YXR1cyBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwcml2YXRlIFN0cmluZyBfdGVzdGNhc2VOYW1lID0gbnVsbDsKLQkJcHJpdmF0ZSBNYXAgX3Rlc3RTdGF0dXMgPSBudWxsOwotCQkKLQkJLyoqCi0JCSAqIE5hbWUgbXVzdCBub3QgYmUgbnVsbC4KLQkJICovCi0JCXB1YmxpYyBUZXN0U3RhdHVzKFN0cmluZyBuYW1lKSB7Ci0JCQlfdGVzdGNhc2VOYW1lID0gbmFtZTsKLQkJCV90ZXN0U3RhdHVzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyBzdWJUYXNrTmFtZSwgaW50IHNldmVyaXR5KSB7Ci0JCQlUZXN0Q291bnQgc29GYXIgPSAoVGVzdENvdW50KV90ZXN0U3RhdHVzLmdldChzdWJUYXNrTmFtZSk7Ci0JCQlpZihzb0ZhciA9PSBudWxsKSB7Ci0JCQkJc29GYXIgPSBuZXcgVGVzdENvdW50KCk7Ci0JCQl9Ci0JCQlzb0Zhci5udW1SYW4rKzsKLQkJCXN3aXRjaChzZXZlcml0eSkgewotCQkJCWNhc2UoSVRlc3RTdGF0dXMuV0FSTik6IHsKLQkJCQkJc29GYXIubnVtV2FybisrOwotCQkJCQlzb0Zhci5udW1QYXNzKys7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQkKLQkJCQljYXNlKElUZXN0U3RhdHVzLkZBSUwpOiB7Ci0JCQkJCXNvRmFyLm51bUZhaWwrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCWNhc2UoSVRlc3RTdGF0dXMuUEFTUyk6IHsKLQkJCQkJc29GYXIubnVtUGFzcysrOwotCQkJCX0KLQkJCQkKLQkJCQlkZWZhdWx0OiB7Ci0JCQkJCS8vIGNoYW5nZSBub3RoaW5nCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJX3Rlc3RTdGF0dXMucHV0KHN1YlRhc2tOYW1lLCBzb0Zhcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhpbnQgc2V2ZXJpdHkpIHsKLQkJCWFkZEV4ZWN1dGlvblN0YXR1cyhudWxsLCBzZXZlcml0eSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGVzdGNhc2VOYW1lKCkgewotCQkJcmV0dXJuIF90ZXN0Y2FzZU5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgbnVtV2FybmluZ3MoKSB7Ci0JCQlpbnQgbnVtV2FybmluZ3MgPSAwOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfdGVzdFN0YXR1cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJVGVzdENvdW50IHRjID0gKFRlc3RDb3VudClpdGVyYXRvci5uZXh0KCk7Ci0JCQkJbnVtV2FybmluZ3MgKz0gdGMubnVtV2FybjsKLQkJCX0KLQkJCXJldHVybiBudW1XYXJuaW5nczsKLQkJfQotCQkKLQkJcHVibGljIGludCBudW1GYWlsdXJlKCkgewotCQkJaW50IG51bUZhaWwgPSAwOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfdGVzdFN0YXR1cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJVGVzdENvdW50IHRjID0gKFRlc3RDb3VudClpdGVyYXRvci5uZXh0KCk7Ci0JCQkJbnVtRmFpbCArPSB0Yy5udW1GYWlsOwotCQkJfQotCQkJcmV0dXJuIG51bUZhaWw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzU3VjY2Vzc2Z1bCgpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Rlc3RTdGF0dXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVRlc3RDb3VudCB0YyA9IChUZXN0Q291bnQpaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmKHRjLm51bUZhaWwgIT0gMCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlpbnQgdG90YWwgPSAwOwotCQkJaW50IHBhc3MgPSAwOwotCQkJaW50IGZhaWwgPSAwOwotCQkJaW50IHdhcm4gPSAwOwotCQkJCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IF90ZXN0U3RhdHVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlUZXN0Q291bnQgdGMgPSAoVGVzdENvdW50KWl0ZXJhdG9yLm5leHQoKTsKLQkJCQl0b3RhbCsrOwotCQkJCWZhaWwgKz0gdGMubnVtRmFpbDsKLQkJCQl3YXJuICs9IHRjLm51bVdhcm47Ci0JCQkJcGFzcyArPSB0Yy5udW1QYXNzOwotCQkJfQotCQkJCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRUZXN0Y2FzZU5hbWUoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCIgVG90YWw6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQodG90YWwpOwotCQkJYnVmZmVyLmFwcGVuZCgiIFtQYXNzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChwYXNzKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIiBGYWlsOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChmYWlsKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIiBXYXJuOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZCh3YXJuKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJCWlmKG8gaW5zdGFuY2VvZiBUZXN0U3RhdHVzKSB7Ci0JCQkJVGVzdFN0YXR1cyBzID0gKFRlc3RTdGF0dXMpbzsKLQkJCQlyZXR1cm4oX3Rlc3RjYXNlTmFtZS5lcXVhbHMocy5nZXRUZXN0Y2FzZU5hbWUoKSkpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gZ2V0VGVzdGNhc2VOYW1lKCkuaGFzaENvZGUoKTsKLQkJfQotCQkKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIGphdmEudXRpbC5Db21wYXJhdG9yI2NvbXBhcmUoamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJaWYoIShvMSBpbnN0YW5jZW9mIFRlc3RTdGF0dXMpICYmIChvMiBpbnN0YW5jZW9mIFRlc3RTdGF0dXMpKSB7Ci0JCQkJLy8gU2hvdWxkIG5ldmVyIGhhcHBlbiwgYnV0IGlmIGl0IGRvZXMsIHNheSB0aGF0IHRoZXNlIG5vbi1UZXN0U3RhdHVzIG9iamVjdHMgYXJlIGVxdWFsLgotCQkJCXJldHVybiAwOwotCQkJfQotCi0JCQlUZXN0U3RhdHVzIGEgPSAoVGVzdFN0YXR1cylvMTsKLQkJCVRlc3RTdGF0dXMgYiA9IChUZXN0U3RhdHVzKW8yOwotCQkJcmV0dXJuIGEuZ2V0VGVzdGNhc2VOYW1lKCkuY29tcGFyZVRvKGIuZ2V0VGVzdGNhc2VOYW1lKCkpOwkJCQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvVmFsaWRhdGlvblR5cGVFbnVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9WYWxpZGF0aW9uVHlwZUVudW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlMTBjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9WYWxpZGF0aW9uVHlwZUVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci0KLS8qKgotICogRW51bWVyYXRpb24gb2YgdGhlIHR5cGVzIG9mIHZhbGlkYXRpb25zIHRoYXQgY2FuIGJlIHJ1bi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25UeXBlRW51bSB7Ci0JcHJpdmF0ZSBWYWxpZGF0aW9uVHlwZUVudW0oKSB7Ci0JCS8vIERvIG5vdCBwZXJtaXQgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgdG8gYmUgY3JlYXRlZC4KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVOX1ZBTElEQVRJT04gPSAwOyAvLyBNYW51YWwgZnVsbCBpbnZvY2F0aW9uIG9mIGEgdmFsaWRhdGlvbiBieSBhIHVzZXIuIEFsbCB2YWxpZGF0b3JzIG11c3Qgc3VwcG9ydCB0aGlzIHR5cGUgb2YgdmFsaWRhdGlvbi4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGVUxMX1ZBTElEQVRJT04gPSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQ7IC8vIE1hbnVhbCBpbnZvY2F0aW9uIG9mIGEgZnVsbCBidWlsZCBieSBhIHVzZXIgdGhhdCB0cmlnZ2VycyBhIGZ1bGwgdmFsaWRhdGlvbi4gVmFsaWRhdG9ycyBjYW4sIGJ1dCBhcmUgbm90IHJlcXVpcmVkIHRvLCBzdXBwb3J0IHRoaXMgdHlwZSBvZiB2YWxpZGF0aW9uLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOQ1JFTUVOVEFMX1ZBTElEQVRJT04gPSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxEOyAvLyBNYW51YWwgaW52b2NhdGlvbiBvZiBhbiBpbmNyZW1lbnRhbCBidWlsZCBieSBhIHVzZXIgdGhhdCB0cmlnZ2VycyBhbiBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLiBWYWxpZGF0b3JzIGNhbiwgYnV0IGFyZSBub3QgcmVxdWlyZWQgdG8sIHN1cHBvcnQgdGhpcyB0eXBlIG9mIHZhbGlkYXRpb24uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVVUT19WQUxJREFUSU9OID0gSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5BVVRPX0JVSUxEOyAvLyBBdXRvbWF0aWMgaW52b2NhdGlvbiBvZiBhbiBpbmNyZW1lbnRhbCBidWlsZCB0aGF0IHRyaWdnZXJzIGFuIGluY3JlbWVudGFsIHZhbGlkYXRpb24uIFZhbGlkYXRvcnMgY2FuLCBidXQgYXJlIG5vdCByZXF1aXJlZCB0bywgc3VwcG9ydCB0aGlzIHR5cGUgb2YgdmFsaWRhdGlvbi4KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSVU5fVkFMSURBVElPTl9OQU1FID0gIlJVTl9WQUxJREFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTWU5DX05BTUUgPSAiQVNZTkMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DUkVNRU5UQUxfVkFMSURBVElPTl9OQU1FID0gIklOQ1JFTUVOVEFMX0JVSUxEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExfVkFMSURBVElPTl9OQU1FID0gIkZVTExfQlVJTEQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19WQUxJREFUSU9OX05BTUUgPSAiQVVUT19CVUlMRCI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9CVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L0JWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWU0ZGU5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L0JWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LklPcGVyYXRpb25SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JSW1wb3J0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLQotLyoqCi0gKiBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgaXMgYSBzaW5nbGV0b24gd2hvIHJlYWRzIHRoZSBwbHVnaW4gcmVnaXN0cnkKLSAqIGZvciBWYWxpZGF0b3IgZXh0ZW5zaW9ucy4gVGhlIHJlYWQgaXMgZG9uZSBvbmNlIChpbiB0aGUgY29uc3RydWN0b3IpLiAKLSAqIAotICogCi0gKiA8ZXh0ZW5zaW9uCi0gKgkJcG9pbnQgPSAiY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5mdnQudGVzdCIKLSAqCQlpZCA9ICJWYWxpZGF0b3JGVlQiCi0gKgkJbmFtZSA9ICJWYWxpZGF0b3IgRlZUIFRlc3QiPgotICoJCQk8dGVzdCBwcm9qZWN0PSJwcm9qZWN0TmFtZSIgCi0gKiAJCQkJICB2YWxpZGF0b3I9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uZWpiLkVKQlZhbGlkYXRvciIKLSAqIAkJCQkgIHZlcnNpb249IjEuMSI+Ci0gKgkJCQk8bWVzc2FnZSBpZD0iQ0hLSjI4MTYiIHJlc291cmNlPSJlamItamFyLnhtbCIgbG9jYXRpb249IjIxNiIvPgotICoJCQkJPG1lc3NhZ2UgaWQ9IkNIS0oyODE2IiByZXNvdXJjZT0iZWpiLWphci54bWwiIGxvY2F0aW9uPSIyMzciLz4KLSAqCQkJCTxtZXNzYWdlIGlkPSJDSEtKMjgxNiIgcmVzb3VyY2U9ImVqYi1qYXIueG1sIiBsb2NhdGlvbj0iMjU4Ii8+Ci0gKgkJCQk8bWVzc2FnZSBpZD0iQ0hLSjI4MTYiIHJlc291cmNlPSJlamItamFyLnhtbCIgbG9jYXRpb249IjI3OSIvPgotICoJCQkJPG1lc3NhZ2UgaWQ9IkNIS0oyODE2IiByZXNvdXJjZT0iZWpiLWphci54bWwiIGxvY2F0aW9uPSIzMDAiLz4KLSAqCQkJPC90ZXN0PgotICogCQkJLi4uIGFzIG1hbnkgPHRlc3Q+IGFzIG5lZWRlZAotICogPC9leHRlbnNpb24+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgaW1wbGVtZW50cyBSZWdpc3RyeUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIGluc3QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIE9wZXJhdGlvblRlc3RSZWFkZXIgX29wUmVhZGVyID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBUZXN0U2V0dXBSZWFkZXIgX3NldHVwUmVhZGVyID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBWYWxpZGF0aW9uVGVzdFJlYWRlciBfdmFsUmVhZGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSByZWdpc3RyeSBpcyByZWFkIG9uY2UgLSB3aGVuIHRoaXMgY2xhc3MgaXMgaW5zdGFudGlhdGVkLgotCSAqLwotCXByaXZhdGUgQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdmlzaWJsZSB0ZXN0IGNhc2VzIGZvciBhbGwgcHJvamVjdHMuCi0JICovCi0JcHVibGljIElUZXN0Y2FzZU1ldGFEYXRhW10gZ2V0VGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVNldCB0ZXN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCVZhbGlkYXRvclRlc3RjYXNlW10gdnRzID0gZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgKFN0cmluZyludWxsKTsKLQkJZm9yKGludCBqPTA7IGo8dnRzLmxlbmd0aDsgaisrKSB7Ci0JCQl0ZXN0cy5hZGQodnRzW2pdKTsKLQkJfQotCQkKLQkJT3BlcmF0aW9uVGVzdGNhc2VbXSBvdHMgPSBnZXRPcGVyYXRpb25UZXN0cyhtb25pdG9yLCAoU3RyaW5nKW51bGwpOwotCQlmb3IoaW50IGs9MDsgazxvdHMubGVuZ3RoOyBrKyspIHsKLQkJCXRlc3RzLmFkZChvdHNba10pOwotCQl9Ci0KLQkJSVRlc3RjYXNlTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgSVRlc3RjYXNlTWV0YURhdGFbdGVzdHMuc2l6ZSgpXTsKLQkJdGVzdHMudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIHZpc2libGUgdGVzdCBjYXNlcyBmb3IgYSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBJVGVzdGNhc2VNZXRhRGF0YVtdIGdldFRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3RbXSBwcm9qZWN0cykgewotCQlTZXQgdGVzdHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB2dHMgPSBnZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCBwcm9qZWN0KTsKLQkJCWZvcihpbnQgaj0wOyBqPHZ0cy5sZW5ndGg7IGorKykgewotCQkJCXRlc3RzLmFkZCh2dHNbal0pOwotCQkJfQotCQkJCi0JCQlPcGVyYXRpb25UZXN0Y2FzZVtdIG90cyA9IGdldE9wZXJhdGlvblRlc3RzKG1vbml0b3IsIHByb2plY3QpOwotCQkJZm9yKGludCBrPTA7IGs8b3RzLmxlbmd0aDsgaysrKSB7Ci0JCQkJdGVzdHMuYWRkKG90c1trXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlUZXN0Y2FzZU1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IElUZXN0Y2FzZU1ldGFEYXRhW3Rlc3RzLnNpemUoKV07Ci0JCXRlc3RzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHZhbGlkYXRvciB0ZXN0cyBmb3IgYSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldEFsbFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCVZhbGlkYXRpb25UZXN0UmVhZGVyIHJlYWRlciA9IGdldFZhbGlkYXRpb25UZXN0UmVhZGVyKCk7Ci0JCXJldHVybiByZWFkZXIuZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgcHJvamVjdC5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGVzdCBjYXNlcyBvZiB0aGUgbmFtZWQgdmFsaWRhdG9ycyBvbiB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKi8JCi0JcHVibGljIFZhbGlkYXRvclRlc3RjYXNlW10gZ2V0QWxsVmFsaWRhdG9yVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSB2YWxpZGF0b3JOYW1lcykgewotCQlTZXQgdGVzdFNldCA9IG5ldyBIYXNoU2V0KCk7CQkKLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0ZXN0cyA9IGdldEFsbFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIHByb2plY3QpOwotCQlmb3IoaW50IGk9MDsgaTx2YWxpZGF0b3JOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHZhbGlkYXRvciA9IHZhbGlkYXRvck5hbWVzW2ldOwotCQkJZm9yKGludCBqPTA7IGo8dGVzdHMubGVuZ3RoOyBqKyspIHsKLQkJCQlWYWxpZGF0b3JUZXN0Y2FzZSB0bWQgPSB0ZXN0c1tqXTsKLQkJCQlpZih0bWQuZ2V0VmFsaWRhdG9yQ2xhc3MoKS5lcXVhbHModmFsaWRhdG9yKSkgewotCQkJCQl0ZXN0U2V0LmFkZCh0bWQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCVZhbGlkYXRvclRlc3RjYXNlW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlW3Rlc3RTZXQuc2l6ZSgpXTsKLQkJdGVzdFNldC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbGwgb2YgdGhlIHZpc2libGUgdGVzdCBjYXNlcyB0aGF0IHJlZ2lzdGVyIG1lc3NhZ2VzIGFnYWluc3QgdGhpcyBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBWYWxpZGF0aW9uVGVzdFJlYWRlciBnZXRWYWxpZGF0aW9uVGVzdFJlYWRlcigpIHsKLQkJaWYoX3ZhbFJlYWRlciA9PSBudWxsKSB7Ci0JCQlfdmFsUmVhZGVyID0gbmV3IFZhbGlkYXRpb25UZXN0UmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF92YWxSZWFkZXI7Ci0JfQotCQotCXByaXZhdGUgT3BlcmF0aW9uVGVzdFJlYWRlciBnZXRPcGVyYXRpb25UZXN0UmVhZGVyKCkgewotCQlpZihfb3BSZWFkZXIgPT0gbnVsbCkgewotCQkJX29wUmVhZGVyID0gbmV3IE9wZXJhdGlvblRlc3RSZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gX29wUmVhZGVyOwotCX0KLQkKLQlwcml2YXRlIFRlc3RTZXR1cFJlYWRlciBnZXRUZXN0U2V0dXBSZWFkZXIoKSB7Ci0JCWlmIChfc2V0dXBSZWFkZXIgPT0gbnVsbCkgewotCQkJX3NldHVwUmVhZGVyID0gbmV3IFRlc3RTZXR1cFJlYWRlcigpOwotCQl9Ci0JCXJldHVybiBfc2V0dXBSZWFkZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGVzdCBjYXNlcyBuYW1lZCB0ZXN0TmFtZSwgb3IgaWYgdGVzdE5hbWUgaXMgbnVsbCwgcmV0dXJuIGFsbCB0ZXN0IGNhc2VzLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIHRlc3ROYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRpb25UZXN0UmVhZGVyKCkuZ2V0VmlzaWJsZVZhbGlkYXRvclRlc3RzKG1vbml0b3IsIHRlc3ROYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXN0IGNhc2VzIHRoYXQgcmVnaXN0ZXIgbWVzc2FnZXMgYWdhaW5zdCB0aGlzIHByb2plY3QuCi0JICovCi0JcHVibGljIE9wZXJhdGlvblRlc3RjYXNlW10gZ2V0T3BlcmF0aW9uVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldE9wZXJhdGlvblRlc3RzKG1vbml0b3IsIHByb2plY3QuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlc3QgY2FzZXMgbmFtZWQgdGVzdE5hbWUsIG9yIGlmIHRlc3ROYW1lIGlzIG51bGwsIHJldHVybiBhbGwgdGVzdCBjYXNlcy4KLQkgKi8KLQlwdWJsaWMgT3BlcmF0aW9uVGVzdGNhc2VbXSBnZXRPcGVyYXRpb25UZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRPcGVyYXRpb25UZXN0UmVhZGVyKCkuZ2V0T3BlcmF0aW9uVGVzdHMobW9uaXRvciwgdGVzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIElmIGZpbGVzIG5lZWQgdG8gYmUgaW1wb3J0ZWQsIGltcG9ydCB0aGVtIG5vdyAoaW50byBwcm9qZWN0cyB0aGF0IGFyZSBuYW1lZAotCSAqIHRoZSBzYW1lIGFzIHRoZSBmaWxlcy4pCi0JICogCi0JICogSWYgSVRlc3RjYXNlTWV0YURhdGEgaXMgbm90IG51bGwsIHJldHVybiB0aGUgVGVzdFNldHVwSW1wb3J0IGZvciB0aGF0IHBhcnRpY3VsYXIgdGVzdC4KLQkgKiBJZiBJVGVzdGNhc2VNZXRhRGF0YSBpcyBudWxsLCByZXR1cm4gYWxsIFRlc3RTZXR1cEltcG9ydC4KLQkgKi8KLQlwdWJsaWMgVGVzdFNldHVwSW1wb3J0W10gZ2V0VGVzdFNldHVwKElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgZGlyLCBJVGVzdGNhc2VNZXRhRGF0YSB0bWQsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlyZXR1cm4gZ2V0VGVzdFNldHVwUmVhZGVyKCkuZ2V0VGVzdFNldHVwKGJ1ZmZlciwgZGlyLCB0bWQsIHZlcmJvc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBWYWxpZGF0aW9uVFZUUmVnaXN0cnlSZWFkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgZ2V0UmVhZGVyKCkgewotCQlpZiAoaW5zdCA9PSBudWxsKSB7Ci0JCQlpbnN0ID0gbmV3IEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0OwotCX0KLQotCXByaXZhdGUgY2xhc3MgVmFsaWRhdGlvblRlc3RSZWFkZXIgewotCQlwcml2YXRlIE1hcCBfdmFsaWRhdG9yVGVzdHMgPSBudWxsOwotCQkKLQkJVmFsaWRhdGlvblRlc3RSZWFkZXIoKSB7Ci0JCX0KLQkJCi0JCXB1YmxpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldFZpc2libGVWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHZ0cyA9IGdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIHRlc3ROYW1lKTsKLQkJCVZhbGlkYXRvclRlc3RjYXNlW10gdGVtcCA9IG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVt2dHMubGVuZ3RoXTsKLQkJCWludCBjb3VudCA9IDA7Ci0JCQlmb3IoaW50IGk9MDsgaTx2dHMubGVuZ3RoOyBpKyspIHsKLQkJCQlWYWxpZGF0b3JUZXN0Y2FzZSB2dCA9IHZ0c1tpXTsKLQkJCQlpZih2dC5pc1Zpc2libGUoKSkgewotCQkJCQl0ZW1wW2NvdW50KytdID0gdnQ7Ci0JCQkJfQotCQkJfQotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yVGVzdGNhc2VbY291bnRdOwotCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIHRlc3ROYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJCWlmIChfdmFsaWRhdG9yVGVzdHMgPT0gbnVsbCkgewotCQkJCV92YWxpZGF0b3JUZXN0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJcmVhZFRlc3RjYXNlUmVnaXN0cnkobW9uaXRvcik7Ci0JCQl9Ci0JCi0JCQlDb2xsZWN0aW9uIHRtZHMgPSBudWxsOwotCQkJaWYgKHRlc3ROYW1lID09IG51bGwpIHsKLQkJCQl0bWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IF92YWxpZGF0b3JUZXN0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJdG1kcy5hZGRBbGwoKENvbGxlY3Rpb24pIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdG1kcyA9IChDb2xsZWN0aW9uKSBfdmFsaWRhdG9yVGVzdHMuZ2V0KHRlc3ROYW1lKTsKLQkJCX0KLQkJCWlmICgodG1kcyA9PSBudWxsKSB8fCAodG1kcy5zaXplKCkgPT0gMCkpIHsKLQkJCQlyZXR1cm4gbmV3IFZhbGlkYXRvclRlc3RjYXNlWzBdOwotCQkJfQotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yVGVzdGNhc2VbdG1kcy5zaXplKCldOwotCQkJdG1kcy50b0FycmF5KHJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlIGlmIGl0IGV4aXN0cy4gT3RoZXJ3aXNlLCByZXR1cm4gbnVsbC4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGdldFByb2plY3QoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QUk9KRUNUKTsKLQkJfQotCi0JCXByaXZhdGUgTWVzc2FnZU1ldGFEYXRhW10gZ2V0TWVzc2FnZXMoVmFsaWRhdG9yVGVzdGNhc2UgdG1kLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgdGVzdEVsZW1lbnQpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG1lc3NhZ2VzID0gdGVzdEVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX01FU1NBR0UpOwotCQkJaWYgKChtZXNzYWdlcyA9PSBudWxsKSB8fCAobWVzc2FnZXMubGVuZ3RoID09IDApKSB7Ci0JCQkJLy8gTm8gbWVzc2FnZXMgYXJlIGV4cGVjdGVkLgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlNZXNzYWdlTWV0YURhdGFbXSBtbWRMaXN0ID0gbmV3IE1lc3NhZ2VNZXRhRGF0YVttZXNzYWdlcy5sZW5ndGhdOwotCQkJaW50IGNvdW50ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldOwotCQkJCVN0cmluZyBwcmVmaXggPSBtZXNzYWdlLmdldEF0dHJpYnV0ZShBVFRfUFJFRklYKTsKLQkJCQlpZiAocHJlZml4ID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkV2ZXJ5IDxtZXNzYWdlPiBtdXN0IGhhdmUgYSBwcmVmaXguIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIG9wdGlvbmFsLgkJCQotCQkJCVN0cmluZyByZXNvdXJjZU5hbWUgPSBtZXNzYWdlLmdldEF0dHJpYnV0ZShBVFRfUkVTT1VSQ0UpOwotCQkJCVN0cmluZyBsb2NhdGlvbiA9IG1lc3NhZ2UuZ2V0QXR0cmlidXRlKEFUVF9MT0NBVElPTik7Ci0JCQkJU3RyaW5nIHRleHQgPSBtZXNzYWdlLmdldEF0dHJpYnV0ZShBVFRfVEVYVCk7Ci0JCQkJaW50IGxpbmVOdW1iZXIgPSAtMTsKLQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbnVsbDsKLQkJCQlpZiAoKGxvY2F0aW9uICE9IG51bGwpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsaW5lTnVtYmVyID0gSW50ZWdlci5wYXJzZUludChsb2NhdGlvbik7Ci0JCQkJCQltbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKHRtZCwgcHJlZml4LCByZXNvdXJjZU5hbWUsIGxpbmVOdW1iZXIsIHRleHQpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQkvLyBEb24ndCBuZWVkIHRvIGxvZyAtIHRoZSBsb2NhdGlvbiBqdXN0IGlzbid0IGEgbnVtYmVyLgotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKG1tZCA9PSBudWxsKSB7Ci0JCQkJCW1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEodG1kLCBwcmVmaXgsIHJlc291cmNlTmFtZSwgbG9jYXRpb24sIHRleHQpOwotCQkJCX0KLQotCQkJCW1tZExpc3RbY291bnQrK10gPSBtbWQ7Ci0JCQl9Ci0KLQkJCWlmIChjb3VudCA9PSBtbWRMaXN0Lmxlbmd0aCkgewotCQkJCXJldHVybiBtbWRMaXN0OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IE1lc3NhZ2VNZXRhRGF0YVtjb3VudF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShtbWRMaXN0LCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZFRlc3QoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJRXh0ZW5zaW9uIGV4dGVuc2lvbiwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gdGVzdEVsZW1lbnRzKSB7Ci0JCQltb25pdG9yLnN1YlRhc2soIlJlYWRpbmcgdGVzdCBjYXNlczsgcGxlYXNlIHdhaXQuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0RWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQltb25pdG9yLnN1YlRhc2soIlJlYWRpbmcgdGVzdCBjYXNlICIgKyAoaSArIDEpICsgIiBvZiAiICsgdGVzdEVsZW1lbnRzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCB0ZXN0ID0gdGVzdEVsZW1lbnRzW2ldOwotCi0JCQkJU3RyaW5nIHByb2plY3ROYW1lID0gZ2V0UHJvamVjdCh0ZXN0KTsKLQkJCQlpZiAocHJvamVjdE5hbWUgPT0gbnVsbCkgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiRXZlcnkgdGVzdCBtdXN0IG5hbWUgdGhlIHByb2plY3QgdGhhdCBpdCB2ZXJpZmllcy4gIiArIHRlc3QudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBnZXRWYWxpZGF0b3JNZXRhRGF0YSh0ZXN0KTsKLQkJCQlpZiAodm1kID09IG51bGwpIHsKLQkJCQkJLy8gYWxyZWFkeSBsb2dnZWQsIHNvIGp1c3QgcmVhZCB0aGUgbmV4dCB0ZXN0IGNhc2UuCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCVN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ2V0SW5wdXRGaWxlTmFtZSh0ZXN0KTsKLQkJCQlpZiAoaW5wdXRGaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJFdmVyeSB0ZXN0IG11c3QgbmFtZSB0aGUgZmlsZSB0byBiZSBpbXBvcnRlZCBhbmQgdGhlbiB0ZXN0ZWQuIiArIHRlc3QudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlib29sZWFuIHZpc2libGUgPSBnZXRWaXNpYmxlKHRlc3QpOwotCi0JCQkJVmFsaWRhdG9yVGVzdGNhc2UgdG1kID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlKHBsdWdpbklkLCBwcm9qZWN0TmFtZSwgdm1kLCBpbnB1dEZpbGVOYW1lLCB2aXNpYmxlKTsKLQkJCQl0bWQuc2V0TWVzc2FnZXMoZ2V0TWVzc2FnZXModG1kLCB0ZXN0KSk7Ci0KLQkJCQkvLyBOb3cgYWRkIHRoZSB0ZXN0IGNhc2UgdG8gdGhlIE1hcCwgd2l0aCB0aGUgcHJvamVjdCBuYW1lIGFzIHRoZSBrZXkgaW50byAKLQkJCQkvLyB0aGUgbWFwLgotCQkJCVNldCBwcmpUbWQgPSAoU2V0KSBfdmFsaWRhdG9yVGVzdHMuZ2V0KHByb2plY3ROYW1lKTsKLQkJCQlpZiAocHJqVG1kID09IG51bGwpIHsKLQkJCQkJcHJqVG1kID0gbmV3IEhhc2hTZXQoKTsKLQkJCQl9Ci0JCQkJcHJqVG1kLmFkZCh0bWQpOwotCQkJCV92YWxpZGF0b3JUZXN0cy5wdXQocHJvamVjdE5hbWUsIHByalRtZCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0cmlldmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgotCQkgKiBJZiBubyBzdWNoIGNsYXNzIGNhbiBiZSBmb3VuZCwgcmV0dXJuIG51bGwuCi0JCSAqLwotCQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIGdldFZhbGlkYXRvck1ldGFEYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlTdHJpbmcgdmFsaWRhdG9yQ2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVkFMSURBVE9SKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHZhbGlkYXRvckNsYXNzID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkNhbm5vdCBsb2NhdGUgdmFsaWRhdG9yIGF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvckNsYXNzKTsKLQkJCQlpZiAodm1kID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkNvdWxkIG5vdCBmaW5kIHZhbGlkYXRvciAiICsgdmFsaWRhdG9yQ2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHZtZDsKLQkJCX0KLQkJCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJUaHJvd2FibGUgY2F1Z2h0IHdoaWxlIHJldHJpZXZpbmcgSVZhbGlkYXRvciAiICsgdmFsaWRhdG9yQ2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlYWRzIHRoZSByZWdpc3RyeSB0byBmaW5kIHRoZSB0ZXN0IGNhc2VzIHRoYXQgaGF2ZSBiZWVuIGltcGxlbWVudGVkLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHJlYWRUZXN0Y2FzZVJlZ2lzdHJ5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJLy8gR2V0IHRoZSBleHRlbnNpb25zIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuCi0JCQlJRXh0ZW5zaW9uUG9pbnQgdmFsaWRhdG9yRVAgPSBnZXRUZXN0Y2FzZUV4dGVuc2lvblBvaW50KCk7Ci0JCQlpZiAodmFsaWRhdG9yRVAgPT0gbnVsbCkgewotCQkJCS8vIGVycm9yIGxvZ2dlZCBpbiBnZXRWYWxpZGF0b3JUVlRFeHRlbnNpb25Qb2ludAotCQkJCXJldHVybjsKLQkJCX0KLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gdmFsaWRhdG9yRVAuZ2V0RXh0ZW5zaW9ucygpOwotCi0JCQkvLyBmaW5kIGFsbCBydW50aW1lIGltcGxlbWVudGF0aW9ucwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcmVhZFRlc3RjYXNlRXh0ZW5zaW9uKG1vbml0b3IsIGV4dGVuc2lvbnNbaV0pOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlYWRzIG9uZSBleHRlbnNpb24gYnkgbG9vcGluZyB0aHJvdWdoIGl0cyBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHJlYWRUZXN0Y2FzZUV4dGVuc2lvbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWlmICgoZWxlbWVudHMgPT0gbnVsbCkgfHwgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiTm8gdGVzdHMgZm91bmQgZm9yICIgKyBleHRlbnNpb24uZ2V0TGFiZWwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJYWRkVGVzdChtb25pdG9yLCBleHRlbnNpb24sIGVsZW1lbnRzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBvcGVyYXRpb24gZXh0ZW5zaW9uIHBvaW50Ci0JCSAqLwotCQlwcml2YXRlIElFeHRlbnNpb25Qb2ludCBnZXRUZXN0Y2FzZUV4dGVuc2lvblBvaW50KCkgewotCQkJSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgVkFMSURBVE9SX1RFU1RDQVNFX0VYVF9QVF9JRCk7Ci0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgPT0gbnVsbCkgewotCQkJCS8vIElmIHRoaXMgaGFwcGVucyBpdCBtZWFucyB0aGF0IHNvbWVvbmUgcmVtb3ZlZCB0aGUgInZhbGlkYXRvciIgZXh0ZW5zaW9uIHBvaW50IGRlY2xhcmF0aW9uIAotCQkJCS8vIGZyb20gb3VyIHBsdWdpbi54bWwgZmlsZS4KLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgUExVR0lOX0lEICsgIi4iICsgVkFMSURBVE9SX1RFU1RDQVNFX0VYVF9QVF9JRCArICIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB2YWxpZGF0aW9uIFRWVCBwbHVnaW4ueG1sIGZpbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGV4dGVuc2lvblBvaW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCB3aGljaCBtdXN0IGJlIGltcG9ydGVkIGJlZm9yZSB0aGUgdGVzdCBjYXNlIGNhbiBiZSBydW4uCi0JCSAqIFJldHVybiBudWxsIGlmIG5vIGlucHV0IG5hbWUgaXMgc2V0LgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGdldFZpc2libGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgImdldFZpc2libGU6OklDb25maWd1cmF0aW9uRWxlbWVudCBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlTdHJpbmcgYXR0cmliID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1ZJU0lCTEUpOwotCQkJaWYgKGF0dHJpYiA9PSBudWxsKSB7Ci0JCQkJLy8gZGVmYXVsdCBpcyB2aXNpYmxlCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoYXR0cmliKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgd2hpY2ggbXVzdCBiZSBpbXBvcnRlZCBiZWZvcmUgdGhlIHRlc3QgY2FzZSBjYW4gYmUgcnVuLgotCQkgKiBSZXR1cm4gbnVsbCBpZiBubyBpbnB1dCBuYW1lIGlzIHNldC4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGdldElucHV0RmlsZU5hbWUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgImdldElucHV0RmlsZU5hbWU6OklDb25maWd1cmF0aW9uRWxlbWVudCBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSU5QVVQpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIE9wZXJhdGlvblRlc3RSZWFkZXIgewotCQlwcml2YXRlIE1hcCBfb3BlcmF0aW9uVGVzdHMgPSBudWxsOwotCi0JCU9wZXJhdGlvblRlc3RSZWFkZXIoKSB7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHRlc3QgY2FzZXMgbmFtZWQgdGVzdE5hbWUsIG9yIGlmIHRlc3ROYW1lIGlzIG51bGwsIHJldHVybiBhbGwgdGVzdCBjYXNlcy4KLQkJICovCi0JCXB1YmxpYyBPcGVyYXRpb25UZXN0Y2FzZVtdIGdldE9wZXJhdGlvblRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIHRlc3ROYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJCWlmIChfb3BlcmF0aW9uVGVzdHMgPT0gbnVsbCkgewotCQkJCV9vcGVyYXRpb25UZXN0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJcmVhZE9wZXJhdGlvblRlc3RjYXNlUmVnaXN0cnkobW9uaXRvcik7Ci0JCQl9Ci0KLQkJCUNvbGxlY3Rpb24gdG1kcyA9IG51bGw7Ci0JCQlpZiAodGVzdE5hbWUgPT0gbnVsbCkgewotCQkJCXRtZHMgPSBuZXcgSGFzaFNldCgpOwotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX29wZXJhdGlvblRlc3RzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQl0bWRzLmFkZEFsbCgoQ29sbGVjdGlvbikgaXRlcmF0b3IubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0bWRzID0gKENvbGxlY3Rpb24pIF9vcGVyYXRpb25UZXN0cy5nZXQodGVzdE5hbWUpOwotCQkJfQotCQkJaWYgKCh0bWRzID09IG51bGwpIHx8ICh0bWRzLnNpemUoKSA9PSAwKSkgewotCQkJCXJldHVybiBuZXcgT3BlcmF0aW9uVGVzdGNhc2VbMF07Ci0JCQl9Ci0JCQlPcGVyYXRpb25UZXN0Y2FzZVtdIHJlc3VsdCA9IG5ldyBPcGVyYXRpb25UZXN0Y2FzZVt0bWRzLnNpemUoKV07Ci0JCQl0bWRzLnRvQXJyYXkocmVzdWx0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIGlucHV0IHdoaWNoIG11c3QgYmUgaW1wb3J0ZWQgYmVmb3JlIHRoZSB0ZXN0IGNhc2UgY2FuIGJlIHJ1bi4KLQkJICogUmV0dXJuIG51bGwgaWYgbm8gaW5wdXQgbmFtZSBpcyBzZXQuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBnZXRJbnB1dEZpbGVOYW1lKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJnZXRJbnB1dEZpbGVOYW1lOjpJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lOUFVUKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRPcGVyYXRpb25UZXN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUV4dGVuc2lvbiBleHRlbnNpb24sIElDb25maWd1cmF0aW9uRWxlbWVudFtdIHRlc3RFbGVtZW50cykgewotCQkJbW9uaXRvci5zdWJUYXNrKCJSZWFkaW5nIHRlc3QgY2FzZXM7IHBsZWFzZSB3YWl0Li4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKCJSZWFkaW5nIHRlc3QgY2FzZSAiICsgKGkgKyAxKSArICIgb2YgIiArIHRlc3RFbGVtZW50cy5sZW5ndGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgdGVzdCA9IHRlc3RFbGVtZW50c1tpXTsKLQotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGdldFByb2plY3QodGVzdCk7Ci0JCQkJaWYgKHByb2plY3ROYW1lID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkV2ZXJ5IHRlc3QgbXVzdCBuYW1lIHRoZSBwcm9qZWN0IHRoYXQgaXQgdmVyaWZpZXMuICIgKyB0ZXN0LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJSU9wZXJhdGlvblJ1bm5hYmxlIG9wID0gZ2V0T3BlcmF0aW9uKHRlc3QpOwotCQkJCWlmIChvcCA9PSBudWxsKSB7Ci0JCQkJCS8vIGFscmVhZHkgbG9nZ2VkLCBzbyBqdXN0IHJlYWQgdGhlIG5leHQgdGVzdCBjYXNlLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdldElucHV0RmlsZU5hbWUodGVzdCk7Ci0JCQkJaWYgKGlucHV0RmlsZU5hbWUgPT0gbnVsbCkgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiRXZlcnkgdGVzdCBtdXN0IG5hbWUgdGhlIGZpbGUgdG8gYmUgaW1wb3J0ZWQgYW5kIHRoZW4gdGVzdGVkLiIgKyB0ZXN0LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIGlkID0gZXh0ZW5zaW9uLmdldExhYmVsKCk7Ci0KLQkJCQlPcGVyYXRpb25UZXN0Y2FzZSB0bWQgPSBuZXcgT3BlcmF0aW9uVGVzdGNhc2UocGx1Z2luSWQsIHByb2plY3ROYW1lLCBpZCwgaW5wdXRGaWxlTmFtZSwgb3ApOwotCi0JCQkJLy8gTm93IGFkZCB0aGUgdGVzdCBjYXNlIHRvIHRoZSBNYXAsIHdpdGggdGhlIHByb2plY3QgbmFtZSBhcyB0aGUga2V5IGludG8gCi0JCQkJLy8gdGhlIG1hcC4KLQkJCQlTZXQgcHJqVG1kID0gKFNldCkgX29wZXJhdGlvblRlc3RzLmdldChwcm9qZWN0TmFtZSk7Ci0JCQkJaWYgKHByalRtZCA9PSBudWxsKSB7Ci0JCQkJCXByalRtZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJfQotCQkJCXByalRtZC5hZGQodG1kKTsKLQkJCQlfb3BlcmF0aW9uVGVzdHMucHV0KHByb2plY3ROYW1lLCBwcmpUbWQpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlYWRzIG9uZSBleHRlbnNpb24gYnkgbG9vcGluZyB0aHJvdWdoIGl0cyBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHJlYWRPcGVyYXRpb25UZXN0Y2FzZUV4dGVuc2lvbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWlmICgoZWxlbWVudHMgPT0gbnVsbCkgfHwgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiTm8gdGVzdHMgZm91bmQgZm9yICIgKyBleHRlbnNpb24uZ2V0TGFiZWwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJYWRkT3BlcmF0aW9uVGVzdChtb25pdG9yLCBleHRlbnNpb24sIGVsZW1lbnRzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZWFkcyB0aGUgcmVnaXN0cnkgdG8gZmluZCB0aGUgdGVzdCBjYXNlcyB0aGF0IGhhdmUgYmVlbiBpbXBsZW1lbnRlZC4KLQkJICovCi0JCXByaXZhdGUgdm9pZCByZWFkT3BlcmF0aW9uVGVzdGNhc2VSZWdpc3RyeShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCS8vIEdldCB0aGUgZXh0ZW5zaW9ucyB0aGF0IGhhdmUgYmVlbiByZWdpc3RlcmVkLgotCQkJSUV4dGVuc2lvblBvaW50IG9wRVAgPSBnZXRPcGVyYXRpb25UZXN0Y2FzZUV4dGVuc2lvblBvaW50KCk7Ci0JCQlpZiAob3BFUCA9PSBudWxsKSB7Ci0JCQkJLy8gZXJyb3IgbG9nZ2VkIGluIGdldFZhbGlkYXRvclRWVEV4dGVuc2lvblBvaW50Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBvcEVQLmdldEV4dGVuc2lvbnMoKTsKLQotCQkJLy8gZmluZCBhbGwgcnVudGltZSBpbXBsZW1lbnRhdGlvbnMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCXJlYWRPcGVyYXRpb25UZXN0Y2FzZUV4dGVuc2lvbihtb25pdG9yLCBleHRlbnNpb25zW2ldKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSBpZiBpdCBleGlzdHMuIE90aGVyd2lzZSwgcmV0dXJuIG51bGwuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBnZXRQcm9qZWN0KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJPSkVDVCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgVGVzdENhc2UgZXh0ZW5zaW9uIHBvaW50Ci0JCSAqLwotCQlwcml2YXRlIElFeHRlbnNpb25Qb2ludCBnZXRPcGVyYXRpb25UZXN0Y2FzZUV4dGVuc2lvblBvaW50KCkgewotCQkJSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgVkFMSURBVE9SX09QRVJBVElPTl9URVNUQ0FTRV9FWFRfUFRfSUQpOwotCQkJaWYgKGV4dGVuc2lvblBvaW50ID09IG51bGwpIHsKLQkJCQkvLyBJZiB0aGlzIGhhcHBlbnMgaXQgbWVhbnMgdGhhdCBzb21lb25lIHJlbW92ZWQgdGhlICJvcHRlc3QiIGV4dGVuc2lvbiBwb2ludCBkZWNsYXJhdGlvbiAKLQkJCQkvLyBmcm9tIG91ciBwbHVnaW4ueG1sIGZpbGUuCi0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIFBMVUdJTl9JRCArICIuIiArIFZBTElEQVRPUl9PUEVSQVRJT05fVEVTVENBU0VfRVhUX1BUX0lEICsgIiBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHZhbGlkYXRpb24gVFZUIHBsdWdpbi54bWwgZmlsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZXh0ZW5zaW9uUG9pbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0cmlldmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgotCQkgKiBJZiBubyBzdWNoIGNsYXNzIGNhbiBiZSBmb3VuZCwgcmV0dXJuIG51bGwuCi0JCSAqLwotCQlwcml2YXRlIElPcGVyYXRpb25SdW5uYWJsZSBnZXRPcGVyYXRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIklDb25maWd1cmF0aW9uRWxlbWVudCBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCVN0cmluZyBvcENsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX09QRVJBVElPTik7Ci0JCQl0cnkgewotCQkJCWlmIChvcENsYXNzID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkNhbm5vdCBsb2NhdGUgb3BlcmF0aW9uIGF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlJT3BlcmF0aW9uUnVubmFibGUgb3AgPSAoSU9wZXJhdGlvblJ1bm5hYmxlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX09QRVJBVElPTik7Ci0JCQkJaWYgKG9wID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkNvdWxkIG5vdCBmaW5kIG9wZXJhdGlvbiAiICsgb3BDbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gb3A7Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiVGhyb3dhYmxlIGNhdWdodCB3aGlsZSByZXRyaWV2aW5nIElWYWxpZGF0b3IgIiArIG9wQ2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRlc3RTZXR1cFJlYWRlciB7Ci0JCXByaXZhdGUgVGVzdFNldHVwSW1wb3J0W10gX3Rlc3RTZXR1cCA9IG51bGw7Ci0KLQkJVGVzdFNldHVwUmVhZGVyKCkgewotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIGlucHV0IHdoaWNoIG11c3QgYmUgaW1wb3J0ZWQgYmVmb3JlIHRoZSB0ZXN0IGNhc2UgY2FuIGJlIHJ1bi4KLQkJICogUmV0dXJuIG51bGwgaWYgbm8gaW5wdXQgbmFtZSBpcyBzZXQuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBnZXRJbnB1dEZpbGVOYW1lKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJnZXRJbnB1dEZpbGVOYW1lOjpJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lOUFVUKTsKLQkJfQotCi0JCS8qKgotCQkgKiBJZiBmaWxlcyBuZWVkIHRvIGJlIGltcG9ydGVkLCBpbXBvcnQgdGhlbSBub3cgKGludG8gcHJvamVjdHMgdGhhdCBhcmUgbmFtZWQKLQkJICogdGhlIHNhbWUgYXMgdGhlIGZpbGVzLikKLQkJICogCi0JCSAqIElmIElUZXN0Y2FzZU1ldGFEYXRhIGlzIG5vdCBudWxsLCByZXR1cm4gdGhlIFRlc3RTZXR1cEltcG9ydCBmb3IgdGhhdCBwYXJ0aWN1bGFyIHRlc3QuCi0JCSAqIElmIElUZXN0Y2FzZU1ldGFEYXRhIGlzIG51bGwsIHJldHVybiBhbGwgVGVzdFNldHVwSW1wb3J0LgotCQkgKi8KLQkJcHVibGljIFRlc3RTZXR1cEltcG9ydFtdIGdldFRlc3RTZXR1cChJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGRpciwgSVRlc3RjYXNlTWV0YURhdGEgdG1kLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJCWlmIChfdGVzdFNldHVwID09IG51bGwpIHsKLQkJCQlyZWFkU2V0dXBSZWdpc3RyeShidWZmZXIsIHZlcmJvc2UpOwotCQkJfQotCQkJaWYgKHRtZCAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBfdGVzdFNldHVwLmxlbmd0aDsgaisrKSB7Ci0JCQkJCVRlc3RTZXR1cEltcG9ydCB0c2kgPSBfdGVzdFNldHVwW2pdOwotCQkJCQlpZiAodHNpLmdldEZpbGVOYW1lKCkuZW5kc1dpdGgodG1kLmdldElucHV0RmlsZU5hbWUoKSkpIHsKLQkJCQkJCXJldHVybiBuZXcgVGVzdFNldHVwSW1wb3J0W10geyB0c2kgfTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IFRlc3RTZXR1cEltcG9ydFswXTsKLQkJCX0KLQkJCXJldHVybiBfdGVzdFNldHVwOwotCQl9Ci0JCi0JCXByaXZhdGUgdm9pZCBhZGRTZXR1cChJQnVmZmVyIGJ1ZmZlciwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gaW1wb3J0RWxlbWVudHMsIGJvb2xlYW4gdmVyYm9zZSkgewotCQkJaWYgKChpbXBvcnRFbGVtZW50cyA9PSBudWxsKSB8fCAoaW1wb3J0RWxlbWVudHMubGVuZ3RoID09IDApKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gIk5vIHRlc3Qgc2V0dXAgZm91bmQiOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIG1lc3NhZ2UpOwotCQkJCQlidWZmZXIud3JpdGUobWVzc2FnZSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJVGVzdFNldHVwSW1wb3J0W10gdGVtcCA9IG5ldyBUZXN0U2V0dXBJbXBvcnRbaW1wb3J0RWxlbWVudHMubGVuZ3RoXTsKLQkJCWludCBjb3VudCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGltcG9ydEVsZW1lbnQgPSBpbXBvcnRFbGVtZW50c1tpXTsKLQkJCQlTdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdldElucHV0RmlsZU5hbWUoaW1wb3J0RWxlbWVudCk7Ci0JCQkJaWYgKGlucHV0RmlsZU5hbWUgPT0gbnVsbCkgewotCQkJCQkvLyBBbHJlYWR5IGxvZ2dlZCBpbiBnZXRJbnB1dEZpbGVOYW1lCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCUlJbXBvcnRPcGVyYXRpb24gb3AgPSBnZXRJbXBvcnRPcGVyYXRpb24oYnVmZmVyLCBpbXBvcnRFbGVtZW50KTsKLQkJCQlpZiAob3AgPT0gbnVsbCkgewotCQkJCQlidWZmZXIud3JpdGUoIkltcG9ydCBvcGVyYXRpb24gY2Fubm90IGJlIGZvdW5kLiBJZ25vcmluZyBpbXBvcnQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVRlc3RTZXR1cEltcG9ydCB0cyA9IG5ldyBUZXN0U2V0dXBJbXBvcnQob3AsIGlucHV0RmlsZU5hbWUpOwotCQkJCXRlbXBbY291bnQrK10gPSB0czsKLQkJCX0KLQotCQkJaWYgKF90ZXN0U2V0dXAgPT0gbnVsbCkgewotCQkJCWlmIChjb3VudCA9PSB0ZW1wLmxlbmd0aCkgewotCQkJCQlfdGVzdFNldHVwID0gdGVtcDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCV90ZXN0U2V0dXAgPSBuZXcgVGVzdFNldHVwSW1wb3J0W2NvdW50XTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBfdGVzdFNldHVwLCAwLCBjb3VudCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJVGVzdFNldHVwSW1wb3J0W10gbmV3VGVzdFNldHVwID0gbmV3IFRlc3RTZXR1cEltcG9ydFtfdGVzdFNldHVwLmxlbmd0aCArIGNvdW50XTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KF90ZXN0U2V0dXAsIDAsIG5ld1Rlc3RTZXR1cCwgMCwgX3Rlc3RTZXR1cC5sZW5ndGgpOwotCQkJCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgbmV3VGVzdFNldHVwLCBfdGVzdFNldHVwLmxlbmd0aCwgY291bnQpOwotCQkJCV90ZXN0U2V0dXAgPSBuZXdUZXN0U2V0dXA7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmVhZHMgb25lIGV4dGVuc2lvbiBieSBsb29waW5nIHRocm91Z2ggaXRzIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgcmVhZFNldHVwRXh0ZW5zaW9uKElCdWZmZXIgYnVmZmVyLCBJRXh0ZW5zaW9uIGV4dGVuc2lvbiwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWFkZFNldHVwKGJ1ZmZlciwgZWxlbWVudHMsIHZlcmJvc2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIFRlc3RDYXNlU2V0dXAgZXh0ZW5zaW9uIHBvaW50Ci0JCSAqLwotCQlwcml2YXRlIElFeHRlbnNpb25Qb2ludCBnZXRTZXR1cEV4dGVuc2lvblBvaW50KCkgewotCQkJSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgVkFMSURBVE9SX1NFVFVQX0VYVF9QVF9JRCk7Ci0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgPT0gbnVsbCkgewotCQkJCS8vIElmIHRoaXMgaGFwcGVucyBpdCBtZWFucyB0aGF0IHNvbWVvbmUgcmVtb3ZlZCB0aGUgInZhbGlkYXRvciIgZXh0ZW5zaW9uIHBvaW50IGRlY2xhcmF0aW9uIAotCQkJCS8vIGZyb20gb3VyIHBsdWdpbi54bWwgZmlsZS4KLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgUExVR0lOX0lEICsgIi4iICsgVkFMSURBVE9SX1NFVFVQX0VYVF9QVF9JRCArICIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB2YWxpZGF0aW9uIFRWVCBwbHVnaW4ueG1sIGZpbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGV4dGVuc2lvblBvaW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlYWRzIHRoZSByZWdpc3RyeSB0byBmaW5kIHRoZSB0ZXN0IHNldHVwIHRoYXQgbXVzdCBiZSBwZXJmb3JtZWQuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgcmVhZFNldHVwUmVnaXN0cnkoSUJ1ZmZlciBidWZmZXIsIGJvb2xlYW4gdmVyYm9zZSkgewotCQkJLy8gR2V0IHRoZSBleHRlbnNpb25zIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuCi0JCQlJRXh0ZW5zaW9uUG9pbnQgdmFsaWRhdG9yRVAgPSBnZXRTZXR1cEV4dGVuc2lvblBvaW50KCk7Ci0JCQlpZiAodmFsaWRhdG9yRVAgPT0gbnVsbCkgewotCQkJCS8vIGVycm9yIGxvZ2dlZCBpbiBnZXRWYWxpZGF0b3JUVlRFeHRlbnNpb25Qb2ludAotCQkJCWJ1ZmZlci53cml0ZSgiRXh0ZW5zaW9uIHBvaW50IGlzIG1pc3NpbmcuIENhbm5vdCBpbXBvcnQgdGVzdCBjYXNlcy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gdmFsaWRhdG9yRVAuZ2V0RXh0ZW5zaW9ucygpOwotCQkJaWYgKGV4dGVuc2lvbnMubGVuZ3RoID09IDApIHsKLQkJCQlidWZmZXIud3JpdGUoIk5vIGV4dGVuc2lvbnMgZm91bmQuIENhbm5vdCBpbXBvcnQgdGVzdCBjYXNlcy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gZmluZCBhbGwgcnVudGltZSBpbXBsZW1lbnRhdGlvbnMKLQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJSZWFkaW5nIHNldHVwIDxpbXBvcnQ+IGV4dGVuc2lvbnM7IHBsZWFzZSB3YWl0Li4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJSZWFkaW5nIHNldHVwIDxpbXBvcnQ+ICIgKyAoaSArIDEpICsgIiBvZiAiICsgZXh0ZW5zaW9ucy5sZW5ndGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZWFkU2V0dXBFeHRlbnNpb24oYnVmZmVyLCBleHRlbnNpb25zW2ldLCB2ZXJib3NlKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIG9wZXJhdGlvbiB3aGljaCBpcyB1c2VkIHRvIGltcG9ydCB0aGUgaW5wdXQuCi0JCSAqLwotCQlwcml2YXRlIElJbXBvcnRPcGVyYXRpb24gZ2V0SW1wb3J0T3BlcmF0aW9uKElCdWZmZXIgYnVmZmVyLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgbWVzc2FnZSk7Ci0JCQkJCWJ1ZmZlci53cml0ZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVN0cmluZyBvcENsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX09QRVJBVElPTik7Ci0JCQl0cnkgewotCQkJCWlmIChvcENsYXNzID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiQmVjYXVzZSB0aGVyZSBpcyBubyBvcGVyYXRpb24gYXR0cmlidXRlLCBhc3N1bWluZyB0aGF0IHRoZSBpbnB1dCBpcyBhIHdvcmtzcGFjZS4iOyAvLyROT04tTkxTLTEkCi0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBtZXNzYWdlKTsKLQkJCQkJCWJ1ZmZlci53cml0ZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlPYmplY3QgdGVtcCA9IGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfT1BFUkFUSU9OKTsKLQkJCQlpZiAodGVtcCA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gIm9wZXJhdGlvbiAiICsgb3BDbGFzcyArICIgY2Fubm90IGJlIGNyZWF0ZWQuIElnbm9yaW5nIHRoZSB0ZXN0IGNhc2UuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBtZXNzYWdlKTsKLQkJCQkJCWJ1ZmZlci53cml0ZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodGVtcCBpbnN0YW5jZW9mIElJbXBvcnRPcGVyYXRpb24pIHsKLQkJCQkJcmV0dXJuIChJSW1wb3J0T3BlcmF0aW9uKSB0ZW1wOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAib3BlcmF0aW9uIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgSUltcG9ydE9wZXJhdGlvbi4gSWdub3JpbmcgdGhlIHRlc3QgY2FzZS4iOyAvLyROT04tTkxTLTEkCi0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBtZXNzYWdlKTsKLQkJCQkJCWJ1ZmZlci53cml0ZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJUaHJvd2FibGUgY2F1Z2h0IHdoaWxlIHJldHJpZXZpbmcgSUltcG9ydE9wZXJhdGlvbiAiICsgb3BDbGFzcyArICIgSWdub3JpbmcgdGhlIHRlc3QgY2FzZS4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgbWVzc2FnZSk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJCWJ1ZmZlci53cml0ZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9CdWlsZEluZm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L0J1aWxkSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTRhN2E2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L0J1aWxkSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnk7Ci1wdWJsaWMgY2xhc3MgQnVpbGRJbmZvIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIkxpY2Vuc2VkIE1hdGVyaWFscyAtLSBQcm9wZXJ0eSBvZiBJQk1cbihjKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiwgMjAwMSwyMDAzXG5VUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGZnQnVpbGRMZXZlbCA9ICIyMDAzMTExMl8xOTE1LVdCMjEyLUFELVY1MTFELVc1IjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NBQnVpbGRMZXZlbCgpIHsgcmV0dXJuIGZnQnVpbGRMZXZlbDsgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvSVRlc3RjYXNlTWV0YURhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L0lUZXN0Y2FzZU1ldGFEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NTg0NjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvSVRlc3RjYXNlTWV0YURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlcjsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSB0ZXN0IGNhc2UgdGhhdCBlaXRoZXIgc2hvdWxkIGJlIHJ1bgotICogYXMgcGFydCBvZiB0aGUgVmFsaWRhdGlvbiBCVlQgU3VpdGUsIG9yIHRoYXQgaXMgcGFydCBvZiBhIHRlc3QKLSAqIGNhc2UgdGhhdCBpcyBydW4gYnkgdGhlIFZhbGlkYXRpb24gQlZUIFN1aXRlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUZXN0Y2FzZU1ldGFEYXRhIHsKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHRlc3QgY2FzZSBzaG91bGQgYmUgc2hvd24gYXMgYSB0ZXN0IG9uIAotCSAqIHRoZSB0ZXN0IGNvbGxlY3RvciBtZW51LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvamVjdCB0aGF0IHRoaXMgdGVzdCBjYXNlIGlzIGRlc2lnbmVkIHRvIHJ1biBvbi4KLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aGF0IHRoaXMgdGVzdCBjYXNlIGlzIGRlc2lnbmVkIAotCSAqIHRvIHJ1biBvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpZCBvZiB0aGUgcGx1Z2luIHRoYXQgZGVjbGFyZWQgdGhpcyB0ZXN0IGNhc2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWNsYXJpbmdQbHVnaW5JZCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHRlc3QgY2FzZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBtdXN0IGJlIGltcG9ydGVkIGZvciB0aGlzIHRlc3QgY2FzZQotCSAqIHRvIHJ1biBvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElucHV0RmlsZU5hbWUoKTsKLQkKLQkvKioKLQkgKiBJbXBvcnQgdGhlIGZpbGUsIGlmIG5lY2Vzc2FyeSwgYW5kIHJ1biB0aGlzIHRlc3QuIFRoZSB0ZXN0IGNhc2UKLQkgKiByZXBvcnRzIHdoZXRoZXIgb3Igbm90IHRoZSB0ZXN0IHBhc3NlcyB0byB0aGUgSVRlc3RCdWZmZXIuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0KTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L01lc3NhZ2VNZXRhRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvTWVzc2FnZU1ldGFEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2M2JiYWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvTWVzc2FnZU1ldGFEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLQotCi0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlTWV0YURhdGEgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTkVOT19VTlNFVCA9IC0xOwotCXByaXZhdGUgU3RyaW5nIF9tZXNzYWdlUHJlZml4ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfcmVzb3VyY2UgPSBudWxsOwotCXByaXZhdGUgaW50IF9saW5lTnVtYmVyID0gTElORU5PX1VOU0VUOwotCXByaXZhdGUgU3RyaW5nIF9sb2NhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX3RleHQgPSBudWxsOyAvLyBXaGVuIHRoaXMgdGVzdCBjYXNlIHdhcyBnZW5lcmF0ZWQsIHdoYXQgd2FzIHRoZSB0ZXh0IG9mIHRoZSBtYXJrZXI/IFRoaXMgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHdoZW4gbWVzc2FnZSBwcmVmaXhlcyBjaGFuZ2U7IHRoZSB0ZXN0IGNhc2Ugd2lsbCBmYWlsIGJlY2F1c2UgdGhlIHByZWZpeCBkb2Vzbid0IG1hdGNoLCBidXQgaXQncyBlYXN5IHRvIHNlZSB0aGF0IHRoZSBvbGQgcHJlZml4IHRlc3RlZCB0aGUgc2FtZSB0aGluZyBhcyB0aGUgbmV3IHByZWZpeC4KLQlwcml2YXRlIFZhbGlkYXRvclRlc3RjYXNlIF90bWQgPSBudWxsOyAvLyBwb2ludGVyIGJhY2sgdG8gdGhlIHRlc3RjYXNlIHBhcmVudAotCQotCXB1YmxpYyBNZXNzYWdlTWV0YURhdGEoVmFsaWRhdG9yVGVzdGNhc2UgdG1kLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgcmVzb3VyY2UsIGludCBsaW5lTnVtYmVyLCBTdHJpbmcgdGV4dCkgewotCQl0aGlzKHRtZCwgcHJlZml4LCByZXNvdXJjZSwgdGV4dCk7Ci0JCV9saW5lTnVtYmVyID0gbGluZU51bWJlcjsKLQl9Ci0JCi0JcHVibGljIE1lc3NhZ2VNZXRhRGF0YShWYWxpZGF0b3JUZXN0Y2FzZSB0bWQsIFN0cmluZyBwcmVmaXgsIFN0cmluZyByZXNvdXJjZSwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgdGV4dCkgewotCQl0aGlzKHRtZCwgcHJlZml4LCByZXNvdXJjZSwgdGV4dCk7Ci0JCV9sb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQkKLQlwdWJsaWMgTWVzc2FnZU1ldGFEYXRhKFZhbGlkYXRvclRlc3RjYXNlIHRtZCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHJlc291cmNlLCBTdHJpbmcgdGV4dCkgewotCQlfdG1kID0gdG1kOwotCQlfbWVzc2FnZVByZWZpeCA9IHByZWZpeDsKLQkJX3Jlc291cmNlID0gcmVzb3VyY2U7Ci0JCV90ZXh0ID0gKHRleHQgPT0gbnVsbCkgPyAiIiA6IHRleHQ7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRvclRlc3RjYXNlIGdldFZhbGlkYXRvclRlc3RjYXNlKCkgewotCQlyZXR1cm4gX3RtZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlUHJlZml4KCkgewotCQlyZXR1cm4gX21lc3NhZ2VQcmVmaXg7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBfcmVzb3VyY2U7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIF9saW5lTnVtYmVyOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gX2xvY2F0aW9uOwotCX0KLQkKLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGEgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gZ2V0VmFsaWRhdG9yVGVzdGNhc2UoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBfdGV4dDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMaW5lTnVtYmVyKCkgewotCQlyZXR1cm4gKF9saW5lTnVtYmVyICE9IExJTkVOT19VTlNFVCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBpc1NldChfbG9jYXRpb24pOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlc291cmNlKCkgewotCQlyZXR1cm4gaXNTZXQoX3Jlc291cmNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzU2V0KFN0cmluZyB2YWx1ZSkgewotCQlpZih2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKHZhbHVlLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L01lc3NhZ2VVdGlsaXR5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9NZXNzYWdlVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmVhZWVhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L01lc3NhZ2VVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLlByb3BlcnR5TGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZVV0aWxpdHkgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfVEVTVENBU0VfTUVTU0FHRV9URU1QTEFURV8gPSAiPG1lc3NhZ2UgcHJlZml4PVwiezB9XCIgcmVzb3VyY2U9XCJ7MX1cIiBsb2NhdGlvbj1cInsyfVwiIHRleHQ9XCJ7M31cIi8+IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfVEVTVENBU0VfTUFSS0VSX1RFTVBMQVRFXyA9ICAiPG1hcmtlciBwcmVmaXg9XCJ7MH1cIiByZXNvdXJjZT1cInsxfVwiIGxvY2F0aW9uPVwiezJ9XCIgdGV4dD1cInszfVwiLz4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZUNvbXBhcmF0b3IgX21lc3NhZ2VDb21wYXJhdG9yID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBNZXNzYWdlSWRDb21wYXJhdG9yIF9tZXNzYWdlSWRDb21wYXJhdG9yID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBNZXNzYWdlUHJlZml4Q29tcGFyYXRvciBfbWVzc2FnZVByZWZpeENvbXBhcmF0b3IgPSBudWxsOwotCQotCXByaXZhdGUgTWVzc2FnZVV0aWxpdHkoKSB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE1lc3NhZ2VNZXRhRGF0YSBtbWQpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gKG1tZC5pc1NldExpbmVOdW1iZXIoKSkgPyBTdHJpbmcudmFsdWVPZihtbWQuZ2V0TGluZU51bWJlcigpKSA6IG1tZC5nZXRMb2NhdGlvbigpOwotCQlyZXR1cm4gdG9TdHJpbmcobW1kLmdldE1lc3NhZ2VQcmVmaXgoKSwgbW1kLmdldFJlc291cmNlKCksIGxvY2F0aW9uLCBtbWQuZ2V0VGV4dCgpLCBfVEVTVENBU0VfTUVTU0FHRV9URU1QTEFURV8pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhJTWFya2VyIG1hcmtlcikgewotCQlJbnRlZ2VyIGxpbmVOdW1iZXIgPSBNZXNzYWdlVXRpbGl0eS5nZXRMaW5lTnVtYmVyKG1hcmtlcik7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IChsaW5lTnVtYmVyID09IG51bGwpID8gKGxvY2F0aW9uID0gTWVzc2FnZVV0aWxpdHkuZ2V0TG9jYXRpb24obWFya2VyKSkgOiAobG9jYXRpb24gPSBsaW5lTnVtYmVyLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gdG9TdHJpbmcoZ2V0TWVzc2FnZVByZWZpeChtYXJrZXIpLCBnZXRSZXNvdXJjZShtYXJrZXIpLCBsb2NhdGlvbiwgZ2V0TWVzc2FnZShtYXJrZXIpLCBfVEVTVENBU0VfTUFSS0VSX1RFTVBMQVRFXyk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgZm1zc2dQcmVmaXgsIFN0cmluZyBmcmVzb3VyY2UsIFN0cmluZyBmbG9jYXRpb24sIFN0cmluZyBmdGV4dCwgU3RyaW5nIHRlbXBsYXRlKSB7Ci0JCVN0cmluZyBtc3NnUHJlZml4ID0gKGZtc3NnUHJlZml4ID09IG51bGwpID8gIiIgOiBmbXNzZ1ByZWZpeDsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVzb3VyY2UgPSAoZnJlc291cmNlID09IG51bGwpID8gIiIgOiBmcmVzb3VyY2U7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxvY2F0aW9uID0gKGZsb2NhdGlvbiA9PSBudWxsKSA/ICIiIDogZmxvY2F0aW9uOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0ZXh0ID0gKGZ0ZXh0ID09IG51bGwpID8gIiIgOiBmdGV4dDsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQodGVtcGxhdGUsIG5ldyBTdHJpbmdbXXttc3NnUHJlZml4LCByZXNvdXJjZSwgbG9jYXRpb24sIHRleHR9KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvamVjdChJTWFya2VyIG1hcmtlcikgewotCQlyZXR1cm4gbWFya2VyLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQl9Ci0JCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZShJTWFya2VyIG1hcmtlcikgewotCQlyZXR1cm4gbWFya2VyLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCk7Ci0JfQotCQotCi0JLy8gQmFzZWQgb24gdGhlIGxhc3QgbGV0dGVyIG9mIHRoZSBtZXNzYWdlIHByZWZpeCwgd2hhdCBzZXZlcml0eQotCS8vIHNob3VsZCB0aGlzIG1hcmtlciBiZT8KLQlwdWJsaWMgc3RhdGljIEludGVnZXIgZ2V0U2V2ZXJpdHkoSU1hcmtlciBtYXJrZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSAoU3RyaW5nKW1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKTsKLQkJaWYobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJU3RyaW5nW10gdG9rZW5zID0gcGFyc2UobWVzc2FnZSk7Ci0JCVN0cmluZyBzZXZlcml0eSA9IHRva2Vuc1sxXTsKLQkJSW50ZWdlciByZXN1bHQ7Ci0JCWlmKHNldmVyaXR5LmVxdWFscygiRSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCA9IG5ldyBJbnRlZ2VyKElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQl9Ci0JCWVsc2UgaWYoc2V2ZXJpdHkuZXF1YWxzKCJXIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ID0gbmV3IEludGVnZXIoSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKTsKLQkJfQotCQllbHNlIGlmKHNldmVyaXR5LmVxdWFscygiSSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCA9IG5ldyBJbnRlZ2VyKElNYXJrZXIuU0VWRVJJVFlfSU5GTyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoSU1hcmtlciBtYXJrZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU3RyaW5nKW1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VQcmVmaXgoSU1hcmtlciBtYXJrZXIpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBnZXRNZXNzYWdlKG1hcmtlcik7Ci0JCWlmKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIHRva2VucyA9IHBhcnNlKG1lc3NhZ2UpOwotCQlyZXR1cm4gdG9rZW5zWzBdOwotCX0KLQkKLQkvLyBUaGlzIG1ldGhvZCBpcyBuZWVkZWQgZm9yIHRoZSBmdXp6eSBjb21wYXJlLiBOZWVkIHRvIAotCS8vIHN0cmlwIHRoZSAiLmphdmEiIG9yICIuY2xhc3MiIGV4dGVuc2lvbiBvZmYgb2YgdGhlIHJlc291cmNlCi0JLy8gbmFtZSBzbyB0aGF0IHRoZSBjbGFzcyBuYW1lIGNhbiBiZSBzZWFyY2hlZCBmb3IgaW4gdGhlIG1hcmtlcidzCi0JLy8gbG9jYXRpb24gdGV4dC4KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZShNZXNzYWdlTWV0YURhdGEgbW1kKSB7Ci0JCVN0cmluZyByZXNvdXJjZSA9IG1tZC5nZXRSZXNvdXJjZSgpOwotCQlpbnQgaW5kZXggPSByZXNvdXJjZS5pbmRleE9mKCIuamF2YSIpOyAvLyROT04tTkxTLTEkCi0JCWlmKGluZGV4ID4gLTEpIHsKLQkJCXJldHVybiByZXNvdXJjZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9Ci0JCQotCQlpbmRleCA9IHJlc291cmNlLmluZGV4T2YoIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCWlmKGluZGV4ID4gLTEpIHsKLQkJCXJldHVybiByZXNvdXJjZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yTWV0YURhdGEgZ2V0VmFsaWRhdG9yKElNYXJrZXIgbWFya2VyKSB7Ci0JCVN0cmluZyB2YWxpZGF0b3JDbGFzcyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRWYWxpZGF0b3IobWFya2VyKTsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvckNsYXNzKTsKLQkJcmV0dXJuIHZtZDsKLQl9Ci0JCi0JLyoqCi0JICogUGFyc2UgdGhlIG1lc3NhZ2UgdmFsdWUsIHRvIGV4dHJhY3QgdGhlIHVuaXF1ZSBlcnJvciBpZCwgaWYgYW55LgotCSAqIFN0cmluZ1swXSBpcyB0aGUgbWVzc2FnZSBwcmVmaXgsIFN0cmluZyBbMV0gaXMgdGhlIGVycm9yIGNoYXIsIFN0cmluZ1syXSBpcyB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIGFmdGVyIHRoZSAnOicKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHBhcnNlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nW117IiIsICIiLCAiIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihtZXNzYWdlKTsKLQkJaW50IG51bVRva2VucyA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQlpZiAobnVtVG9rZW5zID09IDApIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nW117IiIsICIiLCBtZXNzYWdlfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZXJyb3JJZCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWJvb2xlYW4gaXNFcnJvckluZGV4ID0gZmFsc2U7Ci0KLQkJCWludCBlcnJvcklkSW5kZXggPSBlcnJvcklkLmluZGV4T2YoJzonKTsKLQkJCWlmIChlcnJvcklkSW5kZXggPiAwKSB7Ci0JCQkJU3RyaW5nIHRlbXBTdHJpbmcgPSBlcnJvcklkLnN1YnN0cmluZygwLCBlcnJvcklkSW5kZXgpOwotCQkJCWNoYXJbXSB0ZW1wID0gdGVtcFN0cmluZy50b0NoYXJBcnJheSgpOwotCQkJCWlmICh0ZW1wLmxlbmd0aCA9PSA5KSB7IC8vIE11c3QgYmUgb2YgdGhlIGZvcm0gQUJDRDEyMzRFLCB3aGljaCBpcyA5IGNoYXIgbG9uZwotCi0JCQkJCWlzRXJyb3JJbmRleCA9IENoYXJhY3Rlci5pc0xldHRlcih0ZW1wWzBdKTsKLQkJCQkJaXNFcnJvckluZGV4ID0gaXNFcnJvckluZGV4ICYmIENoYXJhY3Rlci5pc0xldHRlcih0ZW1wWzFdKTsKLQkJCQkJaXNFcnJvckluZGV4ID0gaXNFcnJvckluZGV4ICYmIENoYXJhY3Rlci5pc0xldHRlcih0ZW1wWzJdKTsKLQkJCQkJaXNFcnJvckluZGV4ID0gaXNFcnJvckluZGV4ICYmIENoYXJhY3Rlci5pc0xldHRlcih0ZW1wWzNdKTsKLQkJCQkJaXNFcnJvckluZGV4ID0gaXNFcnJvckluZGV4ICYmIENoYXJhY3Rlci5pc0RpZ2l0KHRlbXBbNF0pOwotCQkJCQlpc0Vycm9ySW5kZXggPSBpc0Vycm9ySW5kZXggJiYgQ2hhcmFjdGVyLmlzRGlnaXQodGVtcFs1XSk7Ci0JCQkJCWlzRXJyb3JJbmRleCA9IGlzRXJyb3JJbmRleCAmJiBDaGFyYWN0ZXIuaXNEaWdpdCh0ZW1wWzZdKTsKLQkJCQkJaXNFcnJvckluZGV4ID0gaXNFcnJvckluZGV4ICYmIENoYXJhY3Rlci5pc0RpZ2l0KHRlbXBbN10pOwotCQkJCQlpc0Vycm9ySW5kZXggPSBpc0Vycm9ySW5kZXggJiYgQ2hhcmFjdGVyLmlzTGV0dGVyKHRlbXBbOF0pOwotCi0JCQkJCWlmIChpc0Vycm9ySW5kZXgpIHsKLQkJCQkJCVN0cmluZyBzaG9ydE1lc3NhZ2U7Ci0JCQkJCQlpZiAobnVtVG9rZW5zID4gMSkgewotCQkJCQkJCXNob3J0TWVzc2FnZSA9IG1lc3NhZ2Uuc3Vic3RyaW5nKGVycm9ySWRJbmRleCArIDEsIG1lc3NhZ2UubGVuZ3RoKCkpLmludGVybigpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJc2hvcnRNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuZXcgU3RyaW5nW117dGVtcFN0cmluZy5zdWJzdHJpbmcoMCwgOCksIG5ldyBTdHJpbmcobmV3IGNoYXJbXXt0ZW1wWzhdfSksIHNob3J0TWVzc2FnZX07Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghaXNFcnJvckluZGV4KSB7Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiIiwgIiIsIG1lc3NhZ2V9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiIiwgIiIsIG1lc3NhZ2V9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEludGVnZXIgZ2V0TGluZU51bWJlcihJTWFya2VyIG1hcmtlcikgewotCQl0cnkgewotCQkJcmV0dXJuIChJbnRlZ2VyKW1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUik7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3QoSU1hcmtlciBtYXJrZXIpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyB0YXJnZXRPYmplY3QgPSAoU3RyaW5nKW1hcmtlci5nZXRBdHRyaWJ1dGUoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WQUxJREFUSU9OX01BUktFUl9UQVJHRVRPQkpFQ1QpOwotCQkJaWYoKHRhcmdldE9iamVjdCAhPSBudWxsKSAmJiAodGFyZ2V0T2JqZWN0LmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBFbXB0eSBzdHJpbmcgbWVhbnMgdGhhdCB0aGVyZSB3YXMgbm8gdGFyZ2V0IG9iamVjdC4KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiB0YXJnZXRPYmplY3Q7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTb3J0IGZpcnN0IG9uIHZhbGlkYXRvciwgCi0JICogdGhlbiBwcm9qZWN0LCAKLQkgKiB0aGVuIG1lc3NhZ2UgcHJlZml4LAotCSAqIHRoZW4gbG9jYXRpb24sCi0JICogdGhlbiByZXNvdXJjZS4gKFRoZSByZXNvdXJjZSBtYXkgYmUgZGlmZmVyZW50IGluIGJhdGNoIGFuZCBVSSwgc28gY29tcGFyZSBsb2NhdGlvbiAmIHJlc291cmNlIGF0IHRoZSBzYW1lIHRpbWUuKQotCSAqIAotCSAqIEBwYXJhbSB2ZXJib3NlIElmIHRydWUsIHZlcmJvc2Ugb3V0cHV0IHdoaWxlIGNvbXBhcmluZyBsaXN0cy4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIGdldE1lc3NhZ2VDb21wYXJhdG9yKGZpbmFsIElCdWZmZXIgYnVmZmVyLCBmaW5hbCBib29sZWFuIHZlcmJvc2UpIHsKLQkJaWYoX21lc3NhZ2VDb21wYXJhdG9yID09IG51bGwpIHsKLQkJCV9tZXNzYWdlQ29tcGFyYXRvciA9IG5ldyBNZXNzYWdlVXRpbGl0eSgpLiBuZXcgTWVzc2FnZUNvbXBhcmF0b3IoKTsKLQkJfQotCQlfbWVzc2FnZUNvbXBhcmF0b3Iuc2V0VmVyYm9zZSh2ZXJib3NlKTsKLQkJX21lc3NhZ2VDb21wYXJhdG9yLnNldEJ1ZmZlcihidWZmZXIpOwotCQlyZXR1cm4gX21lc3NhZ2VDb21wYXJhdG9yOwotCX0KLQkKLQkvKioKLQkgKiBTb3J0IGZpcnN0IG9uIHRoZSB2ZXJzaW9uLCB0aGVuIG9uIHRoZSBtZXNzYWdlIHByZWZpeC4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIGdldE1lc3NhZ2VJZENvbXBhcmF0b3IoZmluYWwgSUJ1ZmZlciBidWZmZXIsIGZpbmFsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlpZihfbWVzc2FnZUlkQ29tcGFyYXRvciA9PSBudWxsKSB7Ci0JCQlfbWVzc2FnZUlkQ29tcGFyYXRvciA9IG5ldyBNZXNzYWdlVXRpbGl0eSgpLiBuZXcgTWVzc2FnZUlkQ29tcGFyYXRvcigpOwotCQl9Ci0JCV9tZXNzYWdlSWRDb21wYXJhdG9yLnNldFZlcmJvc2UodmVyYm9zZSk7Ci0JCV9tZXNzYWdlSWRDb21wYXJhdG9yLnNldEJ1ZmZlcihidWZmZXIpOwotCQlyZXR1cm4gX21lc3NhZ2VJZENvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYXRpb24oSU1hcmtlciBtYXJrZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU3RyaW5nKW1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTik7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgTWVzc2FnZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQkJcHJpdmF0ZSBib29sZWFuIF92ZXJib3NlID0gZmFsc2U7Ci0JCXByaXZhdGUgSUJ1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzVmVyYm9zZSgpIHsKLQkJCXJldHVybiBfdmVyYm9zZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHYpIHsKLQkJCV92ZXJib3NlID0gdjsKLQkJfQotCQkKLQkJcHVibGljIElCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQkJcmV0dXJuIF9idWZmZXI7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldEJ1ZmZlcihJQnVmZmVyIGIpIHsKLQkJCV9idWZmZXIgPSBiOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlpZigoYSA9PSBudWxsKSAmJiAoYiA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJCi0JCQkKLQkJCS8vIFNvcnQgZmlyc3Qgb24gdGhlIG1lc3NhZ2UgcHJlZml4LCB0aGVuIG9uIHRoZSBsb2NhdGlvbiwgdGhlbiBwcm9qZWN0LCB0aGVuIHJlc291cmNlCi0JCQlpZigoYSBpbnN0YW5jZW9mIFN0cmluZykgJiYgKGIgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJcmV0dXJuIGNvbXBhcmUoKFN0cmluZylhLCAoU3RyaW5nKWIpOwotCQkJfQotCQkJZWxzZSBpZiAoKGEgaW5zdGFuY2VvZiBJTWFya2VyKSAmJiAoYiBpbnN0YW5jZW9mIElNYXJrZXIpKSB7Ci0JCQkJSU1hcmtlciBhTSA9IChJTWFya2VyKWE7Ci0JCQkJSU1hcmtlciBiTSA9IChJTWFya2VyKWI7Ci0JCQkJaW50IHJlc3VsdCA9IGNvbXBhcmUoYU0sIGJNKTsKLQkJCQlpZihpc1ZlcmJvc2UoKSkgewotCQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiY29tcGFyZSgiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcoYU0pICsgIiwgIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKGJNKSArICIgPSAiICsgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWVsc2UgaWYgKChhIGluc3RhbmNlb2YgSU1hcmtlcikgJiYgKGIgaW5zdGFuY2VvZiBNZXNzYWdlTWV0YURhdGEpKSB7Ci0JCQkJSU1hcmtlciBhTSA9IChJTWFya2VyKWE7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IChNZXNzYWdlTWV0YURhdGEpYjsKLQkJCQlpbnQgcmVzdWx0ID0gY29tcGFyZShhTSwgbW1kKTsKLQkJCQlpZihpc1ZlcmJvc2UoKSkgewotCQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiY29tcGFyZSgiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcoYU0pICsgIiwgIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1tZCkgKyAiID0gIiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQllbHNlIGlmKChhIGluc3RhbmNlb2YgTWVzc2FnZU1ldGFEYXRhKSAmJiAoYiBpbnN0YW5jZW9mIElNYXJrZXIpKSB7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IChNZXNzYWdlTWV0YURhdGEpYTsKLQkJCQlJTWFya2VyIGJNID0gKElNYXJrZXIpYjsKLQkJCQlpbnQgcmVzdWx0ID0gY29tcGFyZShtbWQsIGJNKTsKLQkJCQlpZihpc1ZlcmJvc2UoKSkgewotCQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiY29tcGFyZSgiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcobW1kKSArICIsICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhiTSkgKyAiID0gIiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQkJCQkJCQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQllbHNlIGlmKChhIGluc3RhbmNlb2YgTWVzc2FnZU1ldGFEYXRhKSAmJiAoYiBpbnN0YW5jZW9mIE1lc3NhZ2VNZXRhRGF0YSkpIHsKLQkJCQlNZXNzYWdlTWV0YURhdGEgYU1NRCA9IChNZXNzYWdlTWV0YURhdGEpYTsKLQkJCQlNZXNzYWdlTWV0YURhdGEgYk1NRCA9IChNZXNzYWdlTWV0YURhdGEpYjsKLQkJCQlpbnQgcmVzdWx0ID0gY29tcGFyZShhTU1ELCBiTU1EKTsKLQkJCQlpZihpc1ZlcmJvc2UoKSkgewotCQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiY29tcGFyZSgiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcoYU1NRCkgKyAiLCAiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcoYk1NRCkgKyAiID0gIiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQkKLQkJCS8vIGVsc2UgcHV0IGl0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QKLQkJCXJldHVybiAxOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIGFTdHIsIFN0cmluZyBiU3RyKSB7Ci0JCQlpZigoYVN0ciA9PSBudWxsKSAmJiAoYlN0ciA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhU3RyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCWVsc2UgaWYoYlN0ciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJcmV0dXJuIGFTdHIuY29tcGFyZVRvKGJTdHIpOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoaW50IGFJbnQsIGludCBiSW50KSB7Ci0JCQlyZXR1cm4gYUludCAtIGJJbnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZShWYWxpZGF0b3JNZXRhRGF0YSBhVk1ELCBWYWxpZGF0b3JNZXRhRGF0YSBiVk1EKSB7Ci0JCQlpZigoYVZNRCA9PSBudWxsKSAmJiAoYlZNRCA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhVk1EID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCWVsc2UgaWYoYlZNRCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJcmV0dXJuIGNvbXBhcmUoYVZNRC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCksIGJWTUQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShJTWFya2VyIGFNYXJrZXIsIElNYXJrZXIgYk1hcmtlcikgewotCQkJaWYoKGFNYXJrZXIgPT0gbnVsbCkgJiYgKGJNYXJrZXIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYU1hcmtlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKGJNYXJrZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCQotCQkJaW50IHZhbENtcCA9IGNvbXBhcmUoZ2V0VmFsaWRhdG9yKGFNYXJrZXIpLCBnZXRWYWxpZGF0b3IoYk1hcmtlcikpOwotCQkJaWYodmFsQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gdmFsQ21wOwotCQkJfQotCi0JCQlpbnQgcHJqQ21wID0gY29tcGFyZShnZXRQcm9qZWN0KGFNYXJrZXIpLCBnZXRQcm9qZWN0KGJNYXJrZXIpKTsKLQkJCWlmKHByakNtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHByakNtcDsKLQkJCX0KLQkJCQotCQkJaW50IGlkQ21wID0gY29tcGFyZShnZXRNZXNzYWdlUHJlZml4KGFNYXJrZXIpLCBnZXRNZXNzYWdlUHJlZml4KGJNYXJrZXIpKTsKLQkJCWlmKGlkQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gaWRDbXA7Ci0JCQl9Ci0KLQkJCWludCBjbXAgPSBjb21wYXJlUmVzb3VyY2VBbmRMb2NhdGlvbihhTWFya2VyLCBiTWFya2VyKTsKLQkJCXJldHVybiBjbXA7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZShJTWFya2VyIG1hcmtlciwgTWVzc2FnZU1ldGFEYXRhIG1tZCkgewotCQkJaWYoKG1hcmtlciA9PSBudWxsKSAmJiAobW1kID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKG1hcmtlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKG1tZCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQlpbnQgdmFsQ21wID0gY29tcGFyZShnZXRWYWxpZGF0b3IobWFya2VyKSwgbW1kLmdldFZhbGlkYXRvcigpKTsKLQkJCWlmKHZhbENtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHZhbENtcDsKLQkJCX0KLQotCQkJaW50IHByakNtcCA9IGNvbXBhcmUoZ2V0UHJvamVjdChtYXJrZXIpLCBtbWQuZ2V0VmFsaWRhdG9yVGVzdGNhc2UoKS5nZXRQcm9qZWN0TmFtZSgpKTsKLQkJCWlmKHByakNtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHByakNtcDsKLQkJCX0KLQkJCQotCQkJaW50IGlkQ21wID0gY29tcGFyZShnZXRNZXNzYWdlUHJlZml4KG1hcmtlciksIG1tZC5nZXRNZXNzYWdlUHJlZml4KCkpOwotCQkJaWYoaWRDbXAgIT0gMCkgewotCQkJCXJldHVybiBpZENtcDsKLQkJCX0KLQotCQkJaW50IGNtcCA9IGNvbXBhcmVSZXNvdXJjZUFuZExvY2F0aW9uKG1hcmtlciwgbW1kKTsKLQkJCXJldHVybiBjbXA7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZShNZXNzYWdlTWV0YURhdGEgbW1kLCBJTWFya2VyIG1hcmtlcikgewotCQkJaWYoKG1tZCA9PSBudWxsKSAmJiAobWFya2VyID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKG1tZCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKG1hcmtlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQlpbnQgdmFsQ21wID0gY29tcGFyZShtbWQuZ2V0VmFsaWRhdG9yKCksIGdldFZhbGlkYXRvcihtYXJrZXIpKTsKLQkJCWlmKHZhbENtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHZhbENtcDsKLQkJCX0KLQotCQkJaW50IHByakNtcCA9IGNvbXBhcmUobW1kLmdldFZhbGlkYXRvclRlc3RjYXNlKCkuZ2V0UHJvamVjdE5hbWUoKSwgZ2V0UHJvamVjdChtYXJrZXIpKTsKLQkJCWlmKHByakNtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHByakNtcDsKLQkJCX0KLQotCQkJaW50IGlkQ21wID0gY29tcGFyZShtbWQuZ2V0TWVzc2FnZVByZWZpeCgpLCBnZXRNZXNzYWdlUHJlZml4KG1hcmtlcikpOwotCQkJaWYoaWRDbXAgIT0gMCkgewotCQkJCXJldHVybiBpZENtcDsKLQkJCX0KLQotCQkJaW50IGNtcCA9IGNvbXBhcmVSZXNvdXJjZUFuZExvY2F0aW9uKG1tZCwgbWFya2VyKTsKLQkJCXJldHVybiBjbXA7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZShNZXNzYWdlTWV0YURhdGEgYU1NRCwgTWVzc2FnZU1ldGFEYXRhIGJNTUQpIHsKLQkJCWlmKChhTU1EID09IG51bGwpICYmIChiTU1EID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKGFNTUQgPT0gbnVsbCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJZWxzZSBpZihiTU1EID09IG51bGwpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQkKLQkJCWludCB2YWxDbXAgPSBjb21wYXJlKGFNTUQuZ2V0VmFsaWRhdG9yKCksIGJNTUQuZ2V0VmFsaWRhdG9yKCkpOwotCQkJaWYodmFsQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gdmFsQ21wOwotCQkJfQotCi0JCQlpbnQgcHJqQ21wID0gY29tcGFyZShhTU1ELmdldFZhbGlkYXRvclRlc3RjYXNlKCkuZ2V0UHJvamVjdE5hbWUoKSwgYk1NRC5nZXRWYWxpZGF0b3JUZXN0Y2FzZSgpLmdldFByb2plY3ROYW1lKCkpOwotCQkJaWYocHJqQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gcHJqQ21wOwotCQkJfQotCQkJCi0JCQlpbnQgaWRDbXAgPSBjb21wYXJlKGFNTUQuZ2V0TWVzc2FnZVByZWZpeCgpLCBiTU1ELmdldE1lc3NhZ2VQcmVmaXgoKSk7Ci0JCQlpZihpZENtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIGlkQ21wOwotCQkJfQotCi0JCQlpbnQgY21wID0gY29tcGFyZVJlc291cmNlQW5kTG9jYXRpb24oYU1NRCwgYk1NRCk7Ci0JCQlyZXR1cm4gY21wOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmVSZXNvdXJjZUFuZExvY2F0aW9uKElNYXJrZXIgYU1hcmtlciwgSU1hcmtlciBiTWFya2VyKSB7Ci0JCQlpbnQgcmVzQ21wID0gY29tcGFyZShnZXRSZXNvdXJjZShhTWFya2VyKSwgZ2V0UmVzb3VyY2UoYk1hcmtlcikpOwotCQkJaWYocmVzQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gcmVzQ21wOwotCQkJfQotCQkJCi0JCQlJbnRlZ2VyIGFMaW5lTm8gPSBnZXRMaW5lTnVtYmVyKGFNYXJrZXIpOwotCQkJSW50ZWdlciBiTGluZU5vID0gZ2V0TGluZU51bWJlcihiTWFya2VyKTsKLQkJCWlmKChhTGluZU5vICE9IG51bGwpICYmIChiTGluZU5vIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gY29tcGFyZShhTGluZU5vLCBiTGluZU5vKTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIGFMb2NhdGlvbiA9IGdldExvY2F0aW9uKGFNYXJrZXIpOwotCQkJU3RyaW5nIGJMb2NhdGlvbiA9IGdldExvY2F0aW9uKGJNYXJrZXIpOwotCQkJaWYoKGFMb2NhdGlvbiAhPSBudWxsKSAmJiAoYkxvY2F0aW9uICE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuIGNvbXBhcmUoYUxvY2F0aW9uLCBiTG9jYXRpb24pOwotCQkJfQotCQkJCi0JCQkvLyBJZiBvbmUgaGFzIGEgbGluZSBudW1iZXIgYW5kIHRoZSBvdGhlciBoYXMgYSB0ZXh0IGxvY2F0aW9uLCBjYW4ndCBjb21wYXJlCi0JCQkvLyB0aGUgbG9jYXRpb24sIHNvIGp1c3QgYXNzdW1lIHRoYXQgdGhleSdyZSBlcXVhbC4KLQkJCXJldHVybiByZXNDbXA7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZVJlc291cmNlQW5kTG9jYXRpb24oSU1hcmtlciBtYXJrZXIsIE1lc3NhZ2VNZXRhRGF0YSBtbWQpIHsKLQkJCWludCByZXNDbXAgPSBjb21wYXJlKGdldFJlc291cmNlKG1hcmtlciksIG1tZC5nZXRSZXNvdXJjZSgpKTsKLQkJCWlmKHJlc0NtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHJlc0NtcDsKLQkJCX0KLQkJCQotCQkJaWYobW1kLmlzU2V0TGluZU51bWJlcigpKSB7Ci0JCQkJSW50ZWdlciBhTGluZU5vID0gZ2V0TGluZU51bWJlcihtYXJrZXIpOwotCQkJCWludCBiTGluZU5vID0gbW1kLmdldExpbmVOdW1iZXIoKTsKLQkJCQlpZihhTGluZU5vICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGNvbXBhcmUoYUxpbmVOby5pbnRWYWx1ZSgpLCBiTGluZU5vKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmKG1tZC5pc1NldExvY2F0aW9uKCkpIHsKLQkJCQlTdHJpbmcgYUxvY2F0aW9uID0gZ2V0TG9jYXRpb24obWFya2VyKTsKLQkJCQlTdHJpbmcgYkxvY2F0aW9uID0gbW1kLmdldExvY2F0aW9uKCk7Ci0JCQkJaWYoKGFMb2NhdGlvbiAhPSBudWxsKSAmJiAoYkxvY2F0aW9uICE9IG51bGwpKSB7Ci0JCQkJCXJldHVybiBjb21wYXJlKGFMb2NhdGlvbiwgYkxvY2F0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIElmIG9uZSBoYXMgYSBsaW5lIG51bWJlciBhbmQgdGhlIG90aGVyIGhhcyBhIHRleHQgbG9jYXRpb24sIGNhbid0IGNvbXBhcmUKLQkJCS8vIHRoZSBsb2NhdGlvbiwgc28ganVzdCBhc3N1bWUgdGhhdCB0aGV5J3JlIGVxdWFsLgotCQkJcmV0dXJuIHJlc0NtcDsKLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlUmVzb3VyY2VBbmRMb2NhdGlvbihNZXNzYWdlTWV0YURhdGEgbW1kLCBJTWFya2VyIG1hcmtlcikgewotCQkJaW50IHJlc0NtcCA9IGNvbXBhcmUobW1kLmdldFJlc291cmNlKCksIGdldFJlc291cmNlKG1hcmtlcikpOwotCQkJaWYocmVzQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gcmVzQ21wOwotCQkJfQotCi0JCQlpZihtbWQuaXNTZXRMaW5lTnVtYmVyKCkpIHsKLQkJCQlpbnQgYUxpbmVObyA9IG1tZC5nZXRMaW5lTnVtYmVyKCk7Ci0JCQkJSW50ZWdlciBiTGluZU5vID0gZ2V0TGluZU51bWJlcihtYXJrZXIpOwotCQkJCWlmKGJMaW5lTm8hPSBudWxsKSB7Ci0JCQkJCXJldHVybiBjb21wYXJlKGFMaW5lTm8sIGJMaW5lTm8uaW50VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZihtbWQuaXNTZXRMb2NhdGlvbigpKSB7Ci0JCQkJU3RyaW5nIGFMb2NhdGlvbiA9IG1tZC5nZXRMb2NhdGlvbigpOwotCQkJCVN0cmluZyBiTG9jYXRpb24gPSBnZXRMb2NhdGlvbihtYXJrZXIpOwotCQkJCWlmKChhTG9jYXRpb24gIT0gbnVsbCkgJiYgKGJMb2NhdGlvbiAhPSBudWxsKSkgewotCQkJCQlyZXR1cm4gY29tcGFyZShhTG9jYXRpb24sIGJMb2NhdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBJZiBvbmUgaGFzIGEgbGluZSBudW1iZXIgYW5kIHRoZSBvdGhlciBoYXMgYSB0ZXh0IGxvY2F0aW9uLCBjYW4ndCBjb21wYXJlCi0JCQkvLyB0aGUgbG9jYXRpb24sIHNvIGp1c3QgYXNzdW1lIHRoYXQgdGhleSdyZSBlcXVhbC4KLQkJCXJldHVybiByZXNDbXA7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZVJlc291cmNlQW5kTG9jYXRpb24oTWVzc2FnZU1ldGFEYXRhIGFNTUQsIE1lc3NhZ2VNZXRhRGF0YSBiTU1EKSB7Ci0JCQlpbnQgcmVzQ21wID0gY29tcGFyZShhTU1ELmdldFJlc291cmNlKCksIGJNTUQuZ2V0UmVzb3VyY2UoKSk7Ci0JCQlpZihyZXNDbXAgIT0gMCkgewotCQkJCXJldHVybiByZXNDbXA7Ci0JCQl9Ci0KLQkJCWlmKGFNTUQuaXNTZXRMaW5lTnVtYmVyKCkgJiYgYk1NRC5pc1NldExpbmVOdW1iZXIoKSkgewotCQkJCWludCBhTGluZU5vID0gYU1NRC5nZXRMaW5lTnVtYmVyKCk7Ci0JCQkJaW50IGJMaW5lTm8gPSBiTU1ELmdldExpbmVOdW1iZXIoKTsKLQkJCQlyZXR1cm4gY29tcGFyZShhTGluZU5vLCBiTGluZU5vKTsKLQkJCX0KLQotCQkJaWYoYU1NRC5pc1NldExvY2F0aW9uKCkgJiYgYk1NRC5pc1NldExvY2F0aW9uKCkpIHsKLQkJCQlTdHJpbmcgYUxvY2F0aW9uID0gYU1NRC5nZXRMb2NhdGlvbigpOwotCQkJCVN0cmluZyBiTG9jYXRpb24gPSBiTU1ELmdldExvY2F0aW9uKCk7Ci0JCQkJaWYoKGFMb2NhdGlvbiAhPSBudWxsKSAmJiAoYkxvY2F0aW9uICE9IG51bGwpKSB7Ci0JCQkJCXJldHVybiBjb21wYXJlKGFMb2NhdGlvbiwgYkxvY2F0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIElmIG9uZSBoYXMgYSBsaW5lIG51bWJlciBhbmQgdGhlIG90aGVyIGhhcyBhIHRleHQgbG9jYXRpb24sIGNhbid0IGNvbXBhcmUKLQkJCS8vIHRoZSBsb2NhdGlvbiwgc28ganVzdCBhc3N1bWUgdGhhdCB0aGV5J3JlIGVxdWFsLgotCQkJcmV0dXJuIHJlc0NtcDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yIGdldE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yKCkgewotCQlpZihfbWVzc2FnZVByZWZpeENvbXBhcmF0b3IgPT0gbnVsbCkgewotCQkJX21lc3NhZ2VQcmVmaXhDb21wYXJhdG9yID0gbmV3IE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIF9tZXNzYWdlUHJlZml4Q29tcGFyYXRvcjsKLQl9Ci0JCi0Jc3RhdGljIGNsYXNzIE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCVN0cmluZyBhUHJlZml4ID0gbnVsbDsKLQkJCVN0cmluZyBiUHJlZml4ID0gbnVsbDsKLQkJCWlmKGEgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpIHsKLQkJCQlhUHJlZml4ID0gKChQcm9wZXJ0eUxpbmUpYSkuZ2V0TWVzc2FnZVByZWZpeCgpOwotCQkJfQotCQkJZWxzZSBpZihhIGluc3RhbmNlb2YgTWVzc2FnZU1ldGFEYXRhKSB7Ci0JCQkJYVByZWZpeCA9ICgoTWVzc2FnZU1ldGFEYXRhKWEpLmdldE1lc3NhZ2VQcmVmaXgoKTsKLQkJCX0KLQkJCQotCQkJaWYoYiBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkgewotCQkJCWJQcmVmaXggPSAoKFByb3BlcnR5TGluZSliKS5nZXRNZXNzYWdlUHJlZml4KCk7Ci0JCQl9Ci0JCQllbHNlIGlmKGIgaW5zdGFuY2VvZiBNZXNzYWdlTWV0YURhdGEpIHsKLQkJCQliUHJlZml4ID0gKChNZXNzYWdlTWV0YURhdGEpYikuZ2V0TWVzc2FnZVByZWZpeCgpOwotCQkJfQotCi0JCQlpZihhUHJlZml4Lmxlbmd0aCgpID09IDkpIHsKLQkJCQlhUHJlZml4ID0gYVByZWZpeC5zdWJzdHJpbmcoMCwgOSk7Ci0JCQl9Ci0JCQkKLQkJCWlmKGJQcmVmaXgubGVuZ3RoKCkgPT0gOSkgewotCQkJCWJQcmVmaXggPSBiUHJlZml4LnN1YnN0cmluZygwLCA5KTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGFQcmVmaXguY29tcGFyZVRvKGJQcmVmaXgpOwotCQl9Ci0JfQotCQkKLQljbGFzcyBNZXNzYWdlSWRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBfdmVyYm9zZSA9IGZhbHNlOwotCQlwcml2YXRlIElCdWZmZXIgX2J1ZmZlciA9IG51bGw7Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZlcmJvc2UoKSB7Ci0JCQlyZXR1cm4gX3ZlcmJvc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2KSB7Ci0JCQlfdmVyYm9zZSA9IHY7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJQnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJCXJldHVybiBfYnVmZmVyOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRCdWZmZXIoSUJ1ZmZlciBiKSB7Ci0JCQlfYnVmZmVyID0gYjsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWQoSU1hcmtlciBtYXJrZXIpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpbWFya2VyLmdldEF0dHJpYnV0ZShDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZBTElEQVRJT05fTUFSS0VSX01FU1NBR0VJRCk7Ci0JCQl9Ci0JCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIGFTdHIsIFN0cmluZyBiU3RyKSB7Ci0JCQlpZigoYVN0ciA9PSBudWxsKSAmJiAoYlN0ciA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhU3RyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCWVsc2UgaWYoYlN0ciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJcmV0dXJuIGFTdHIuY29tcGFyZVRvKGJTdHIpOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlpZigoYSA9PSBudWxsKSAmJiAoYiA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJCi0JCQkKLQkJCS8vIFNvcnQgZmlyc3Qgb24gdGhlIHZlcnNpb24sIHRoZW4gb24gdGhlIG1lc3NhZ2UgcHJlZml4Ci0JCQlpZigoYSBpbnN0YW5jZW9mIFN0cmluZykgJiYgKGIgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJU3RyaW5nIGFTdHIgPSAoU3RyaW5nKWE7Ci0JCQkJU3RyaW5nIGJTdHIgPSAoU3RyaW5nKWI7Ci0JCQkJcmV0dXJuIGNvbXBhcmUoYVN0ciwgYlN0cik7Ci0JCQl9Ci0JCQllbHNlIGlmICgoYSBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkgJiYgKGIgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpKSB7Ci0JCQkJUHJvcGVydHlMaW5lIGFNID0gKFByb3BlcnR5TGluZSlhOwotCQkJCVByb3BlcnR5TGluZSBiTSA9IChQcm9wZXJ0eUxpbmUpYjsKLQkJCQkKLQkJCQlyZXR1cm4gY29tcGFyZShhTS5nZXRNZXNzYWdlSWQoKSwgYk0uZ2V0TWVzc2FnZUlkKCkpOwotCQkJfQotCQkJZWxzZSBpZiAoKGEgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpICYmIChiIGluc3RhbmNlb2YgSU1hcmtlcikpIHsKLQkJCQlQcm9wZXJ0eUxpbmUgYU0gPSAoUHJvcGVydHlMaW5lKWE7Ci0JCQkJSU1hcmtlciBiTSA9IChJTWFya2VyKWI7Ci0JCQkJCi0JCQkJcmV0dXJuIGNvbXBhcmUoYU0uZ2V0TWVzc2FnZUlkKCksIGdldE1lc3NhZ2VJZChiTSkpOwotCQkJfQotCQkJZWxzZSBpZigoYSBpbnN0YW5jZW9mIElNYXJrZXIpICYmIChiIGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSkgewotCQkJCUlNYXJrZXIgYU0gPSAoSU1hcmtlcilhOwotCQkJCVByb3BlcnR5TGluZSBiTSA9IChQcm9wZXJ0eUxpbmUpYjsKLQkJCQkKLQkJCQlyZXR1cm4gY29tcGFyZShnZXRNZXNzYWdlSWQoYU0pLCBiTS5nZXRNZXNzYWdlSWQoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmKChhIGluc3RhbmNlb2YgSU1hcmtlcikgJiYgKGIgaW5zdGFuY2VvZiBJTWFya2VyKSkgewotCQkJCUlNYXJrZXIgYU0gPSAoSU1hcmtlcilhOwotCQkJCUlNYXJrZXIgYk0gPSAoSU1hcmtlciliOwotCi0JCQkJcmV0dXJuIGNvbXBhcmUoZ2V0TWVzc2FnZUlkKGFNKSwgZ2V0TWVzc2FnZUlkKGJNKSk7Ci0JCQl9Ci0JCQkKLQkJCS8vIGVsc2UgcHV0IGl0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QKLQkJCXJldHVybiAxOwotCQl9Ci0JfTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L09wZXJhdGlvblRlc3RjYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9PcGVyYXRpb25UZXN0Y2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWNjNDRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L09wZXJhdGlvblRlc3RjYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LklPcGVyYXRpb25SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci0KLS8qKgotICogSW5zdGVhZCBvZiB0ZXN0aW5nIGEgdmFsaWRhdG9yLCBhbiBvcGVyYXRpb24gdGVzdCBjYXNlIHRlc3RzIHRoZSAKLSAqIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uVGVzdGNhc2UgaW1wbGVtZW50cyBJVGVzdGNhc2VNZXRhRGF0YSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX3BsdWdpbklkID0gbnVsbDsgLy8gVGhlIHBsdWdpbiBpZCB0aGF0IGhhcyBjb250cmlidXRlZCB0aGlzIHRlc3QgY2FzZS4KLQlwcml2YXRlIFN0cmluZyBfcHJvamVjdE5hbWUgPSBudWxsOyAvLyB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aGF0IHRoaXMgdGVzdCBjYXNlIHRlc3RzCi0JcHJpdmF0ZSBTdHJpbmcgX2lucHV0RmlsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9vcE5hbWUgPSBudWxsOyAvLyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0JcHJpdmF0ZSBJT3BlcmF0aW9uUnVubmFibGUgX3J1bm5hYmxlID0gbnVsbDsKLQotCXB1YmxpYyBPcGVyYXRpb25UZXN0Y2FzZShTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIG9wTmFtZSwgU3RyaW5nIGlucHV0RmlsZU5hbWUsIElPcGVyYXRpb25SdW5uYWJsZSBydW5uYWJsZSkgewotCQlfcGx1Z2luSWQgPSBwbHVnaW5JZDsKLQkJX3Byb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0JCV9pbnB1dEZpbGVOYW1lID0gaW5wdXRGaWxlTmFtZTsKLQkJX29wTmFtZSA9IG9wTmFtZTsKLQkJX3J1bm5hYmxlID0gcnVubmFibGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIF9vcE5hbWU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7IC8vIGZyYW1ld29yayB0ZXN0IGNhc2VzIGFyZSBhbHdheXMgdmlzaWJsZSBvbiB0aGUgdGVzdCBjb2xsZWN0b3IgbWVudQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlY2xhcmluZ1BsdWdpbklkKCkgewotCQlyZXR1cm4gX3BsdWdpbklkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gX3Byb2plY3ROYW1lOwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFRlc3RjYXNlVXRpbGl0eS5maW5kUHJvamVjdCh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEZpbGVOYW1lKCkgewotCQlyZXR1cm4gX2lucHV0RmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBJT3BlcmF0aW9uUnVubmFibGUgZ2V0UnVubmFibGUoKSB7Ci0JCXJldHVybiBfcnVubmFibGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuSVRlc3RjYXNlTWV0YURhdGEjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIsIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJZ2V0UnVubmFibGUoKS5zZXRCdWZmZXIoYnVmZmVyKTsKLQkJCWdldFJ1bm5hYmxlKCkuc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJCWdldFJ1bm5hYmxlKCkuc2V0TmFtZShnZXROYW1lKCkpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihnZXRSdW5uYWJsZSgpLCBidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9SZWdpc3RyeUNvbnN0YW50cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvUmVnaXN0cnlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0MDMyZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9SZWdpc3RyeUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5OwotCi0vKioKLSAqIFZhbGlkYXRpb24gY29uc3RhbnRzIG5lZWRlZCB0byBkZWNsYXJlIGFuIGV4dGVuc2lvbiBwb2ludCwgYW5kCi0gKiB0byBpbXBsZW1lbnQgYW4gZXh0ZW5zaW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlZ2lzdHJ5Q29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9URVNUQ0FTRV9FWFRfUFRfSUQgPSAidGVzdCI7IC8vIGV4dGVuc2lvbiBwb2ludCBkZWNsYXJhdGlvbiBvZiB0aGUgdmFsaWRhdG9yIHRlc3QgY2FzZSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX1NFVFVQX0VYVF9QVF9JRCA9ICJ0ZXN0U2V0dXAiOyAvLyBleHRlbnNpb24gcG9pbnQgZGVjbGFyYXRpb24gb2YgdGhlIHRlc3QgY2FzZSBzZXR1cCBtZWNoYW5pc20gKGkuZS4sIGltcG9ydCB0aGUgRUFSIG9yIEpBUikgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9PUEVSQVRJT05fVEVTVENBU0VfRVhUX1BUX0lEID0gIm9wVGVzdCI7IC8vIGV4dGVuc2lvbiBwb2ludCBkZWNsYXJhdGlvbiBvZiB0aGUgb3BlcmF0aW9uIHRlc3QgY2FzZSAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEb3VibGUgRUpCMjAgPSBuZXcgRG91YmxlKDIuMCk7IC8vIEVKQiAyLjAgaW5wdXQgb3IgMS4zIEVBUgotCXB1YmxpYyBzdGF0aWMgZmluYWwgRG91YmxlIEVKQjExID0gbmV3IERvdWJsZSgxLjEpOyAvLyBFSkIgMS4xIGlucHV0IG9yIDEuMiBFQVIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERvdWJsZSBFSkIgPSBudWxsOyAvLyBjb21tb24gRUpCIGxldmVsLCBzdWNoIGFzIHJlZmxlY3Rpb24gZXJyb3JzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCMjBfTVNTRyA9ICJlamIyMCI7IC8vIGluIGEgLnByb3BlcnRpZXMgbGluZSwgaWYgdGhlIG1lc3NhZ2UgaWQgY29udGFpbnMgdGhpcyBzdHJpbmcsIGl0J3MgYW4gRUpCIDIuMCBydWxlIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkIxMV9NU1NHID0gImVqYjExIjsgLy8gaW4gYSAucHJvcGVydGllcyBsaW5lLCBpZiB0aGUgbWVzc2FnZSBpZCBjb250YWlucyB0aGlzIHN0cmluZywgaXQncyBhbiBFSkIgMS4xIHJ1bGUgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9NU1NHID0gbnVsbDsgLy8gaW4gYSAucHJvcGVydGllcyBmaWxlLCBpZiB0aGUgbWVzc2FnZSBpcyBuZWl0aGVyIEVKQjIwIG5vciBFSkIxMSwgdGhlIHJ1bGUgaXMgY3Jvc3Mtc3BlY3MuIChlLmcuIHJlZmxlY3Rpb24gZXJyb3JzKSAvLyROT04tTkxTLTEkCi0JCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9WQUxJREFUT1IgPSAidmFsaWRhdG9yIjsgLy8gdGhlIHZhbGlkYXRvciAgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BMVUdJTiA9ICJwbHVnaW4iOyAvLyBpZGVudGlmaWVzIHRoZSBwbHVnaW4gd2hpY2ggaGFzIHRoZSBjbGFzcyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVEVTVCA9ICJ0ZXN0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lNUE9SVCA9ICJpbXBvcnQiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfT1BFUkFUSU9OID0gIm9wZXJhdGlvbiI7IC8vIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgSUltcG9ydE9wZXJhdGlvbiB3aGljaCBpcyB1c2VkIHRvIGltcG9ydCB0aGUgaW5wdXQgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lOUFVUID0gImlucHV0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vIHRoZSB2ZXJzaW9uIG9mIHRoZSBpbnB1dCwgZS5nLiBFSkIgMS4xIHZzLiBFSkIgMi4wIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19NRVNTQUdFID0gIm1lc3NhZ2UiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUFJFRklYID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9TRVZFUklUWSA9ICJzZXZlcml0eSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QUk9KRUNUID0gInByb2plY3QiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUkVTT1VSQ0UgPSAicmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTE9DQVRJT04gPSAibG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1ZJU0lCTEUgPSAidmlzaWJsZSI7IC8vIElzIHRoaXMgdGVzdCB2aXNpYmxlIG9uIHRoZSBUZXN0IENvbGxlY3RvciBtZW51PyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9UZXN0U2V0dXBJbXBvcnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1Rlc3RTZXR1cEltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzg1OWVhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1Rlc3RTZXR1cEltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklJbXBvcnRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci0KLS8qKgotICogVGhpcyBjbGFzcyBob2xkcyB0aGUgbWV0YWRhdGEgbmVlZGVkIHRvIGltcG9ydCBhbiAuZWFyIG9yCi0gKiBhIC5qYXIgZmlsZSB0byBzZXQgdXAgYSB0ZXN0IGNhc2UgaW4gYmF0Y2ggbW9kZS4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RTZXR1cEltcG9ydCB7Ci0JcHJpdmF0ZSBTdHJpbmcgX2ZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIElJbXBvcnRPcGVyYXRpb24gX2ltcG9ydE9wZXJhdGlvbiA9IG51bGw7Ci0KLQlwdWJsaWMgVGVzdFNldHVwSW1wb3J0KElJbXBvcnRPcGVyYXRpb24gb3AsIFN0cmluZyBmaWxlTmFtZSkgewotCQlfaW1wb3J0T3BlcmF0aW9uID0gb3A7Ci0JCV9maWxlTmFtZSA9IGZpbGVOYW1lOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldElucHV0RmlsZShTdHJpbmcgZGlyKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGRpciwgZ2V0RmlsZU5hbWUoKSk7Ci0JCWlmKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkZpbGUgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIG11c3QgZXhpc3QgYW5kIGhhdmUgcmVhZCBhY2Nlc3MuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBmaWxlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotCQlyZXR1cm4gX2ZpbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgSUltcG9ydE9wZXJhdGlvbiBnZXRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBfaW1wb3J0T3BlcmF0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB3YXMgZm91bmQgYW5kIGltcG9ydGVkIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbXBvcnRGaWxlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIGRpcikgewotCQlpbnQgZXhlY3V0aW9uTWFwID0gMHgwOwotCQlib29sZWFuIGltcG9ydGVkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCUZpbGUgZmlsZSA9IGdldElucHV0RmlsZShkaXIpOwotCQkJZXhlY3V0aW9uTWFwIHw9IDB4MTsKLQkJCXRyeSB7Ci0JCQkJSUltcG9ydE9wZXJhdGlvbiBvcCA9IGdldE9wZXJhdGlvbigpOwotCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDI7Ci0JCQkJaW1wb3J0ZWQgPSBvcC5ydW4obW9uaXRvciwgZmlsZSk7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4NDsKLQkJCX0KLQkJCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlleGVjdXRpb25NYXAgfD0gMHg4OwotCQkJCWltcG9ydGVkID0gZmFsc2U7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZXhjKTsKLQkJCX0KLQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDEwOwotCQkJCWltcG9ydGVkID0gZmFsc2U7Ci0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZXhjKTsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCQlleGVjdXRpb25NYXAgfD0gMHgyMDsKLQkJCQlpbXBvcnRlZCA9IGZhbHNlOwotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZighaW1wb3J0ZWQpIHsKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmxvZ01lc3NhZ2UoSVN0YXR1cy5FUlJPUiwgCi0JCQkJCQkiVGVzdFNldHVwIGZvciAiICsgZGlyICsgIiB3YXMgdW5zdWNjZXNzZnVsLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCQotCQl9Ci0JCXJldHVybiBpbXBvcnRlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9UZXN0Y2FzZU1ldGFEYXRhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9UZXN0Y2FzZU1ldGFEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZjJjNTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVGVzdGNhc2VNZXRhRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0Y2FzZU1ldGFEYXRhIHsKLQlwcml2YXRlIFN0cmluZyBfcGx1Z2luSWQgPSBudWxsOyAvLyBUaGUgcGx1Z2luIGlkIHRoYXQgaGFzIGNvbnRyaWJ1dGVkIHRoaXMgdGVzdCBjYXNlLgotCXByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGEgX3ZtZCA9IG51bGw7Ci0JcHJpdmF0ZSBNZXNzYWdlTWV0YURhdGFbXSBfbWVzc2FnZXMgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9wcm9qZWN0ID0gbnVsbDsgLy8gdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgdGhhdCB0aGlzIHRlc3QgY2FzZSB0ZXN0cwotCXByaXZhdGUgU3RyaW5nW10gX3Jlc291cmNlTmFtZXMgPSBudWxsOyAvLyB0aGUgcmVzb3VyY2VzIGxpc3RlZCBpbiB0aGUgTWVzc2FnZU1ldGFEYXRhIG9mIHRoaXMgdGVzdCBjYXNlLgotCXByaXZhdGUgU3RyaW5nIF9pbnB1dEZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfbmFtZSA9IG51bGw7IC8vIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLQkKLQlwdWJsaWMgVGVzdGNhc2VNZXRhRGF0YShTdHJpbmcgcGx1Z2luTmFtZSwgU3RyaW5nIHByb2plY3QsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgU3RyaW5nIGlucHV0RmlsZU5hbWUpIHsKLQkJX3BsdWdpbklkID0gcGx1Z2luTmFtZTsKLQkJX3Byb2plY3QgPSBwcm9qZWN0OwotCQlfdm1kID0gdm1kOwotCQlfaW5wdXRGaWxlTmFtZSA9IGlucHV0RmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyaW5nUGx1Z2luSWQoKSB7Ci0JCXJldHVybiBfcGx1Z2luSWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0OwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3QgZmluZFByb2plY3QoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoX3Byb2plY3QpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElucHV0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBfaW5wdXRGaWxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXROdW1NZXNzYWdlcygpIHsKLQkJcmV0dXJuIGdldE1lc3NhZ2VzKCkuc2l6ZSgpOwotCX0KLQkKLQkvLyBUaGUgbWVzc2FnZXMgbmVlZCB0byBiZSBzdG9yZWQgaW4gYSBsaXN0IGluc3RlYWQgb2YgYW4gYXJyYXkgYmVjYXVzZQotCS8vIHRoZSBsaXN0IGlzIHNvcnRlZCBiZWZvcmUgc2VhcmNoaW5nICYgZGlzcGxheWluZy4KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpIHsKLQkJTGlzdCBjb3B5ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IoaW50IGk9MDsgaTxfbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCWNvcHkuYWRkKF9tZXNzYWdlc1tpXSk7Ci0JCX0KLQkJCi0JCXJldHVybiBjb3B5OwotCX0KLQkKLQkvLyBSZXR1cm4gdGhlIHJlc291cmNlcyBpbiB0aGlzIHByb2plY3QgZm9yIHdoaWNoIHRoZXJlIGlzIGEgbWVzc2FnZSBpbiB0aGlzIHRlc3QgY2FzZS4KLQkvLyBObyByZXNvdXJjZSBpbnN0YW5jZSB3aWxsIGJlIGluIHRoZSByZXNvdXJjZSBtb3JlIHRoYW4gb25jZS4KLQlwdWJsaWMgSVJlc291cmNlW10gZ2V0UmVzb3VyY2VzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU2V0IHRlbXAgPSBuZXcgSGFzaFNldCgpOyAvLyB1c2UgYSBzZXQgaW4gY2FzZSB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIG1lc3NhZ2UgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgcmVzb3VyY2UgKGRvbid0IHdhbnQgZHVwbGljYXRlcyBpbiB0aGUgbGlzdCkuCi0JCVN0cmluZ1tdIHJlc291cmNlTmFtZXMgPSBnZXRSZXNvdXJjZU5hbWVzKCk7Ci0JCWZvcihpbnQgaT0wOyBpPHJlc291cmNlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyByZXNvdXJjZU5hbWUgPSByZXNvdXJjZU5hbWVzW2ldOwotCQkJSVJlc291cmNlIHJlc291cmNlID0gcHJvamVjdC5maW5kTWVtYmVyKHJlc291cmNlTmFtZSk7Ci0JCQlpZihyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJLy8gcmVzb3VyY2UgZXhpc3RzCi0JCQkJdGVtcC5hZGQocmVzb3VyY2UpOwotCQkJfQotCQl9Ci0JCQotCQlJUmVzb3VyY2VbXSByZXN1bHQgPSBuZXcgSVJlc291cmNlW3RlbXAuc2l6ZSgpXTsKLQkJdGVtcC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRSZXNvdXJjZU5hbWVzKCkgewotCQlpZihfcmVzb3VyY2VOYW1lcyA9PSBudWxsKSB7Ci0JCQlfcmVzb3VyY2VOYW1lcyA9IG5ldyBTdHJpbmdbX21lc3NhZ2VzLmxlbmd0aF07Ci0JCQlmb3IoaW50IGk9MDsgaTxfbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlfcmVzb3VyY2VOYW1lc1tpXSA9IF9tZXNzYWdlc1tpXS5nZXRSZXNvdXJjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBfcmVzb3VyY2VOYW1lczsKLQl9Ci0JCi0JLyoqCi0JICogV2hlbiBhbiBlbXB0eSBUTUQgaXMgdXNlZCB0byB0ZXN0IGFuIG9wZXJhdGlvbiwgYW5kIHRoZSBvcGVyYXRpb24gbmVlZHMgdGhlIElSZXNvdXJjZVtdCi0JICogYWZmZWN0ZWQgYnkgdGhlIFRNRCB0byBrbm93IHdoZXRoZXIgb3Igbm90IHRoZSBvcGVyYXRpb24gcGFzc2VzIChpLmUuLCBvbmUgb2YgdGhlIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbgotCSAqIGNvbnN0cnVjdG9ycyB0YWtlcyBhbiBJUmVzb3VyY2VbXSwgYW5kIHRoZSBJUmVzb3VyY2VbXSBtdXN0IG5vdCBiZSBlbXB0eSBvciBudWxsKSwgdGhlbgotCSAqIHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSAicmVzb3VyY2VzIiBhZmZlY3RlZCBieSB0aGUgdGVzdCBjYXNlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlTmFtZXMoU3RyaW5nW10gcmVzb3VyY2VOYW1lcykgewotCQlfcmVzb3VyY2VOYW1lcyA9IHJlc291cmNlTmFtZXM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2VzKE1lc3NhZ2VNZXRhRGF0YVtdIG1lc3NhZ2VzKSB7Ci0JCS8vIElmIG1lc3NhZ2VzIGFyZSBudWxsLCB0aGF0IG1lYW5zIHRoYXQgdGhlIHRlc3QgY2FzZSBleHBlY3RzIG5vIHZhbGlkYXRpb24gZXJyb3JzLgotCQlfbWVzc2FnZXMgPSAoKG1lc3NhZ2VzID09IG51bGwpID8gbmV3IE1lc3NhZ2VNZXRhRGF0YVswXSA6IG1lc3NhZ2VzKTsKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhIGdldFZhbGlkYXRvck1ldGFEYXRhKCkgewotCQlyZXR1cm4gX3ZtZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JDbGFzcygpIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYoX25hbWUgPT0gbnVsbCkgewotCQkJX25hbWUgPSBfdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkgKyAiOjoiICsgZ2V0UHJvamVjdCgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIF9uYW1lOwotCX0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dERpcigpIHsKLQkJLy8gSWYgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgdGVzdGNhc2UgaW5wdXQgaXNuJ3Qgc3BlY2lmaWVkLCAKLQkJLy8gYXNzdW1lIHRoYXQgdGhlIGlucHV0IGlzIGluIGEgc3ViZGlyZWN0b3J5LCBuYW1lZCAidGVzdElucHV0IiwKLQkJLy8gb2YgdGhlIHRlc3RjYXNlJ3MgcGx1Z2luLgotCQlJUGx1Z2luUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpOwotCQlJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0UGx1Z2luRGVzY3JpcHRvcihnZXREZWNsYXJpbmdQbHVnaW5JZCgpKTsKLQkJaWYoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkvLyBCZWNhdXNlIFBsYXRmb3JtLmFzTG9jYWxVUkwgdGhyb3dzIGFuIElPRXhjZXB0aW9uIGlmIHRoZSBVUkwgcmVzb2x2ZXMKLQkJCS8vIHRvIGEgZGlyZWN0b3J5LCBmaW5kIHRoZSBwbHVnaW4ueG1sIGZpbGUgYW5kIHRoZW4gc3RyaXAgb2ZmIHRoZSBmaWxlIG5hbWUgCi0JCQkvLyB0byBmaW5kIHRoZSB0ZXN0SW5wdXQgZGlyZWN0b3J5LgotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgcGx1Z2luWG1sUGF0aCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwobmV3IFVSTChkZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKSwgInBsdWdpbi54bWwiKSkuZ2V0UGF0aCgpOyAvLyROT04tTkxTLTEkCi0JCQkJRmlsZSBwbHVnaW5YbWwgPSBuZXcgRmlsZShwbHVnaW5YbWxQYXRoKTsKLQkJCQlpZihwbHVnaW5YbWwuZXhpc3RzKCkpIHsKLQkJCQkJRmlsZSBpbnB1dERpciA9IG5ldyBGaWxlKHBsdWdpblhtbC5nZXRQYXJlbnQoKSwgInRlc3RJbnB1dCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChpbnB1dERpci5leGlzdHMoKSAmJiBpbnB1dERpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQlyZXR1cm4gaW5wdXREaXIuZ2V0UGF0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBleGMpIHsKLQkJCSAgICBMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuZ2V0TGV2ZWwoKSA9PSBMZXZlbC5TRVZFUkUpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIFNob3VsZCBuZXZlciBnZXQgaGVyZSwgYnV0IGlmIHdlIGRvLCBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgCi0JCS8vIGRpcmVjdG9yeSBpcyB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1Rlc3RjYXNlVXRpbGl0eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVGVzdGNhc2VVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZDU4ZTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVGVzdGNhc2VVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRoYXQgY29udGFpbnMgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgdGVzdCBjYXNlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RjYXNlVXRpbGl0eSB7Ci0JLyoqCi0JICogTG9hZCB0aGUgcHJvamVjdCB0aGF0IHRoaXMgdGVzdCBjYXNlIGlzIHN1cHBvc2VkIHRvIHJ1biBvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9qZWN0IGZpbmRQcm9qZWN0KElUZXN0Y2FzZU1ldGFEYXRhIHRtZCkgewotCQlpZih0bWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QodG1kLmdldFByb2plY3ROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBpbnB1dCBmb3IgdGhpcyB0ZXN0IGNhc2UgY2FuIGJlIGxvY2F0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW5wdXREaXIoSVRlc3RjYXNlTWV0YURhdGEgdG1kKSB7Ci0JCS8vIElmIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHRlc3RjYXNlIGlucHV0IGlzbid0IHNwZWNpZmllZCwgCi0JCS8vIGFzc3VtZSB0aGF0IHRoZSBpbnB1dCBpcyBpbiBhIHN1YmRpcmVjdG9yeSwgbmFtZWQgInRlc3RJbnB1dCIsCi0JCS8vIG9mIHRoZSB0ZXN0Y2FzZSdzIHBsdWdpbi4KLQkJSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLQkJSVBsdWdpbkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldFBsdWdpbkRlc2NyaXB0b3IodG1kLmdldERlY2xhcmluZ1BsdWdpbklkKCkpOwotCQlpZihkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCS8vIEJlY2F1c2UgUGxhdGZvcm0uYXNMb2NhbFVSTCB0aHJvd3MgYW4gSU9FeGNlcHRpb24gaWYgdGhlIFVSTCByZXNvbHZlcwotCQkJLy8gdG8gYSBkaXJlY3RvcnksIGZpbmQgdGhlIHBsdWdpbi54bWwgZmlsZSBhbmQgdGhlbiBzdHJpcCBvZmYgdGhlIGZpbGUgbmFtZSAKLQkJCS8vIHRvIGZpbmQgdGhlIHRlc3RJbnB1dCBkaXJlY3RvcnkuCi0JCQl0cnkgewotCQkJCVN0cmluZyBwbHVnaW5YbWxQYXRoID0gUGxhdGZvcm0uYXNMb2NhbFVSTChuZXcgVVJMKGRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpLCAicGx1Z2luLnhtbCIpKS5nZXRQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlGaWxlIHBsdWdpblhtbCA9IG5ldyBGaWxlKHBsdWdpblhtbFBhdGgpOwotCQkJCWlmKHBsdWdpblhtbC5leGlzdHMoKSkgewotCQkJCQlGaWxlIGlucHV0RGlyID0gbmV3IEZpbGUocGx1Z2luWG1sLmdldFBhcmVudCgpLCAidGVzdElucHV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGlucHV0RGlyLmV4aXN0cygpICYmIGlucHV0RGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCXJldHVybiBpbnB1dERpci5nZXRQYXRoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUsIGJ1dCBpZiB3ZSBkbywgYXNzdW1lIHRoYXQgdGhlIGlucHV0IAotCQkvLyBkaXJlY3RvcnkgaXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogbG9nRmlsZU5hbWUgbXVzdCBwb2ludCB0byBhIGZ1bGx5LXF1YWxpZmllZCBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmbHVzaChTdHJpbmcgbG9nRmlsZU5hbWUsIFN0cmluZyBidWZmZXIsIGJvb2xlYW4gYXBwZW5kKSB7Ci0JCXRyeSB7Ci0JCQlGaWxlV3JpdGVyIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKGxvZ0ZpbGVOYW1lLCBhcHBlbmQpOwotCQkJd3JpdGVyLndyaXRlKGJ1ZmZlcik7IC8vIFdyaXRlIHRoZSBlbnRpcmUgcmVwb3J0IHRvIHRoZSBzdGF0ZSBsb2cuCi0JCQl3cml0ZXIuY2xvc2UoKTsKLQkJfQotCQljYXRjaChJT0V4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVmFsaWRhdG9yVGVzdGNhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1ZhbGlkYXRvclRlc3RjYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMzBkNTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVmFsaWRhdG9yVGVzdGNhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5WYWxpZGF0aW9uVHlwZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuR2xvYmFsQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UYXNrTGlzdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVlRocmVhZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yVGVzdGNhc2UgaW1wbGVtZW50cyBJVGVzdGNhc2VNZXRhRGF0YSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX3BsdWdpbklkID0gbnVsbDsgLy8gVGhlIHBsdWdpbiBpZCB0aGF0IGhhcyBjb250cmlidXRlZCB0aGlzIHRlc3QgY2FzZS4KLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIF92bWQgPSBudWxsOwotCXByaXZhdGUgTWVzc2FnZU1ldGFEYXRhW10gX21lc3NhZ2VzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfcHJvamVjdE5hbWUgPSBudWxsOyAvLyB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aGF0IHRoaXMgdGVzdCBjYXNlIHRlc3RzCi0JcHJpdmF0ZSBTdHJpbmdbXSBfcmVzb3VyY2VOYW1lcyA9IG51bGw7IC8vIHRoZSByZXNvdXJjZXMgbGlzdGVkIGluIHRoZSBNZXNzYWdlTWV0YURhdGEgb2YgdGhpcyB0ZXN0IGNhc2UuCi0JcHJpdmF0ZSBTdHJpbmcgX2lucHV0RmlsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9uYW1lID0gbnVsbDsgLy8gdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotCXByaXZhdGUgYm9vbGVhbiBfdmlzaWJsZSA9IHRydWU7IC8vIElzIHRoaXMgdGVzdCBjYXNlIHZpc2libGUgb24gdGhlIFRlc3QgQ29sbGVjdG9yIG1lbnUKLQkKLQlwdWJsaWMgVmFsaWRhdG9yVGVzdGNhc2UoU3RyaW5nIHBsdWdpbk5hbWUsIFN0cmluZyBwcm9qZWN0LCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIFN0cmluZyBpbnB1dEZpbGVOYW1lLCBib29sZWFuIHZpc2libGUpIHsKLQkJX3BsdWdpbklkID0gcGx1Z2luTmFtZTsKLQkJX3Byb2plY3ROYW1lID0gcHJvamVjdDsKLQkJX3ZtZCA9IHZtZDsKLQkJX2lucHV0RmlsZU5hbWUgPSBpbnB1dEZpbGVOYW1lOwotCQlfdmlzaWJsZSA9IHZpc2libGU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLQkJcmV0dXJuIF92aXNpYmxlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlY2xhcmluZ1BsdWdpbklkKCkgewotCQlyZXR1cm4gX3BsdWdpbklkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gX3Byb2plY3ROYW1lOwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFRlc3RjYXNlVXRpbGl0eS5maW5kUHJvamVjdCh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEZpbGVOYW1lKCkgewotCQlyZXR1cm4gX2lucHV0RmlsZU5hbWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzCi0JICovCi0JcHVibGljIGludCBnZXROdW1NZXNzYWdlcygpIHsKLQkJcmV0dXJuIGdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTikuc2l6ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCBzaG91bGQgYmUgcmVwb3J0ZWQgZm9yIHRoZSBnaXZlbiBidWlsZAotCSAqIHR5cGUuIChlLmcuIGlmIHRoZSB2YWxpZGF0b3IgZG9lcyBub3Qgc3VwcG9ydCBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLAotCSAqIHRoZW4gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIGxpc3Qgb2YgZXhwZWN0ZWQgbWVzc2FnZXMsIHJldHVybiBhbiBlbXB0eSAKLQkgKiBsaXN0LikKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcyhpbnQgYnVpbGRUeXBlKSB7Ci0JCS8vIFRoZSBtZXNzYWdlcyBuZWVkIHRvIGJlIHN0b3JlZCBpbiBhIGxpc3QgaW5zdGVhZCBvZiBhbiBhcnJheSBiZWNhdXNlCi0JCS8vIHRoZSBsaXN0IGlzIHNvcnRlZCBiZWZvcmUgc2VhcmNoaW5nICYgZGlzcGxheWluZy4KLQkJc3dpdGNoKGJ1aWxkVHlwZSkgewotCQkJY2FzZShWYWxpZGF0aW9uVHlwZUVudW0uQVVUT19WQUxJREFUSU9OKToKLQkJCWNhc2UoVmFsaWRhdGlvblR5cGVFbnVtLklOQ1JFTUVOVEFMX1ZBTElEQVRJT04pOiB7Ci0JCQkJaWYoIWdldFZhbGlkYXRvck1ldGFEYXRhKCkuaXNJbmNyZW1lbnRhbCgpKSB7Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJCX0KLQkJCQkvLyBPdGhlcndpc2UsIHJldHVybiB0aGUgZGVmYXVsdCBjb3B5IGJlbG93LgotCQkJCWJyZWFrOwotCQkJfQotCi0JCQljYXNlKFZhbGlkYXRpb25UeXBlRW51bS5GVUxMX1ZBTElEQVRJT04pOiB7Ci0JCQkJaWYoIWdldFZhbGlkYXRvck1ldGFEYXRhKCkuaXNGdWxsQnVpbGQoKSkgewotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCQl9Ci0JCQkJLy8gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGRlZmF1bHQgY29weSBiZWxvdy4KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJY2FzZShWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT04pOgotCQkJZGVmYXVsdDogewotCQkJCS8vIFJldHVybiB0aGUgZGVmYXVsdCBjb3B5IGJlbG93LgotCQkJfQotCQkJCi0JCX0KLQkJCi0JCUxpc3QgY29weSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yKGludCBpPTA7IGk8X21lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb3B5LmFkZChfbWVzc2FnZXNbaV0pOwotCQl9Ci0JCQotCQlyZXR1cm4gY29weTsKLQl9Ci0JCi0JLy8gUmV0dXJuIHRoZSByZXNvdXJjZXMgaW4gdGhpcyBwcm9qZWN0IGZvciB3aGljaCB0aGVyZSBpcyBhIG1lc3NhZ2UgaW4gdGhpcyB0ZXN0IGNhc2UuCi0JLy8gTm8gcmVzb3VyY2UgaW5zdGFuY2Ugd2lsbCBiZSBpbiB0aGUgcmVzb3VyY2UgbW9yZSB0aGFuIG9uY2UuCi0JcHVibGljIElSZXNvdXJjZVtdIGdldFJlc291cmNlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVNldCB0ZW1wID0gbmV3IEhhc2hTZXQoKTsgLy8gdXNlIGEgc2V0IGluIGNhc2UgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBtZXNzYWdlIHJlZ2lzdGVyZWQgYWdhaW5zdCBhIHJlc291cmNlIChkb24ndCB3YW50IGR1cGxpY2F0ZXMgaW4gdGhlIGxpc3QpLgotCQlTdHJpbmdbXSByZXNvdXJjZU5hbWVzID0gZ2V0UmVzb3VyY2VOYW1lcygpOwotCQlmb3IoaW50IGk9MDsgaTxyZXNvdXJjZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lc1tpXTsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHByb2plY3QuZmluZE1lbWJlcihyZXNvdXJjZU5hbWUpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCS8vIHJlc291cmNlIGV4aXN0cwotCQkJCXRlbXAuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQkKLQkJSVJlc291cmNlW10gcmVzdWx0ID0gbmV3IElSZXNvdXJjZVt0ZW1wLnNpemUoKV07Ci0JCXRlbXAudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VOYW1lcygpIHsKLQkJaWYoX3Jlc291cmNlTmFtZXMgPT0gbnVsbCkgewotCQkJX3Jlc291cmNlTmFtZXMgPSBuZXcgU3RyaW5nW19tZXNzYWdlcy5sZW5ndGhdOwotCQkJZm9yKGludCBpPTA7IGk8X21lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJX3Jlc291cmNlTmFtZXNbaV0gPSBfbWVzc2FnZXNbaV0uZ2V0UmVzb3VyY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gX3Jlc291cmNlTmFtZXM7Ci0JfQotCQotCS8qKgotCSAqIFdoZW4gYW4gZW1wdHkgVE1EIGlzIHVzZWQgdG8gdGVzdCBhbiBvcGVyYXRpb24sIGFuZCB0aGUgb3BlcmF0aW9uIG5lZWRzIHRoZSBJUmVzb3VyY2VbXQotCSAqIGFmZmVjdGVkIGJ5IHRoZSBUTUQgdG8ga25vdyB3aGV0aGVyIG9yIG5vdCB0aGUgb3BlcmF0aW9uIHBhc3NlcyAoaS5lLiwgb25lIG9mIHRoZSBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24KLQkgKiBjb25zdHJ1Y3RvcnMgdGFrZXMgYW4gSVJlc291cmNlW10sIGFuZCB0aGUgSVJlc291cmNlW10gbXVzdCBub3QgYmUgZW1wdHkgb3IgbnVsbCksIHRoZW4KLQkgKiB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCB0aGUgInJlc291cmNlcyIgYWZmZWN0ZWQgYnkgdGhlIHRlc3QgY2FzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU5hbWVzKFN0cmluZ1tdIHJlc291cmNlTmFtZXMpIHsKLQkJX3Jlc291cmNlTmFtZXMgPSByZXNvdXJjZU5hbWVzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlcyhNZXNzYWdlTWV0YURhdGFbXSBtZXNzYWdlcykgewotCQkvLyBJZiBtZXNzYWdlcyBhcmUgbnVsbCwgdGhhdCBtZWFucyB0aGF0IHRoZSB0ZXN0IGNhc2UgZXhwZWN0cyBubyB2YWxpZGF0aW9uIGVycm9ycy4KLQkJX21lc3NhZ2VzID0gKChtZXNzYWdlcyA9PSBudWxsKSA/IG5ldyBNZXNzYWdlTWV0YURhdGFbMF0gOiBtZXNzYWdlcyk7Ci0JfQotCQotCXB1YmxpYyBWYWxpZGF0b3JNZXRhRGF0YSBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpIHsKLQkJcmV0dXJuIF92bWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmKF9uYW1lID09IG51bGwpIHsKLQkJCV9uYW1lID0gX3ZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpICsgIjo6IiArIGdldFByb2plY3ROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gX25hbWU7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBydW4oSUJ1ZmZlciBidWZmZXIsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJU3RyaW5nIHN0YXR1cyA9ICI+Pj4+PlJVTiBWQUxJREFUSU9OIFRFU1QgUEFTUyBbIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIl0+Pj4+PiI7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkJCQotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhzdGF0dXMpOwotCQlidWZmZXIud3JpdGUoc3RhdHVzKTsKLQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksIFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTl9OQU1FLCB2YWxpZGF0ZShidWZmZXIsIHByb2plY3QsIFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTiwgVmFsaWRhdGlvblR5cGVFbnVtLlJVTl9WQUxJREFUSU9OX05BTUUpKTsKLQkJc3RhdHVzID0gIj4+Pj4+RU5EIFJVTiBWQUxJREFUSU9OIFRFU1QgUEFTUyBbIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIl0+Pj4+PiI7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhzdGF0dXMpOwotCQlidWZmZXIud3JpdGUoc3RhdHVzKTsKLQkJCi0JCXN0YXR1cyA9ICI+Pj4+PkZVTEwgQlVJTEQgVEVTVCBQQVNTIFsiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiXT4+Pj4+IjsJCQkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhzdGF0dXMpOwotCQlidWZmZXIud3JpdGUoc3RhdHVzKTsKLQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksIFZhbGlkYXRpb25UeXBlRW51bS5GVUxMX1ZBTElEQVRJT05fTkFNRSwgdmFsaWRhdGUoYnVmZmVyLCBwcm9qZWN0LCBWYWxpZGF0aW9uVHlwZUVudW0uRlVMTF9WQUxJREFUSU9OLCBWYWxpZGF0aW9uVHlwZUVudW0uRlVMTF9WQUxJREFUSU9OX05BTUUpKTsKLQkJc3RhdHVzID0gIj4+Pj4+RU5EIEZVTEwgQlVJTEQgVEVTVCBQQVNTIFsiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiXT4+Pj4+IjsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKHN0YXR1cyk7Ci0JCWJ1ZmZlci53cml0ZShzdGF0dXMpOwotCQkKLQkJc3RhdHVzID0gIj4+Pj4+SU5DUkVNRU5UQUwgQlVJTEQgVEVTVCBQQVNTIFsiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiXT4+Pj4+IjsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKHN0YXR1cyk7Ci0JCWJ1ZmZlci53cml0ZShzdGF0dXMpOwotCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgVmFsaWRhdGlvblR5cGVFbnVtLklOQ1JFTUVOVEFMX1ZBTElEQVRJT05fTkFNRSwgdmFsaWRhdGUoYnVmZmVyLCBwcm9qZWN0LCBWYWxpZGF0aW9uVHlwZUVudW0uSU5DUkVNRU5UQUxfVkFMSURBVElPTiwgVmFsaWRhdGlvblR5cGVFbnVtLklOQ1JFTUVOVEFMX1ZBTElEQVRJT05fTkFNRSkpOwotCQlzdGF0dXMgPSAiPj4+Pj5FTkQgSU5DUkVNRU5UQUwgQlVJTEQgVEVTVCBQQVNTIFsiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiXT4+Pj4+IjsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKHN0YXR1cyk7Ci0JCWJ1ZmZlci53cml0ZShzdGF0dXMpOwotCQkKLQkJc3RhdHVzID0gIj4+Pj4+QVVUTyBCVUlMRCBURVNUIFBBU1MgWyIgKyBwcm9qZWN0LmdldE5hbWUoKSArICJdPj4+Pj4iOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soc3RhdHVzKTsKLQkJYnVmZmVyLndyaXRlKHN0YXR1cyk7Ci0JCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCBWYWxpZGF0aW9uVHlwZUVudW0uQVVUT19WQUxJREFUSU9OX05BTUUsIHZhbGlkYXRlKGJ1ZmZlciwgcHJvamVjdCwgVmFsaWRhdGlvblR5cGVFbnVtLkFVVE9fVkFMSURBVElPTiwgVmFsaWRhdGlvblR5cGVFbnVtLkFVVE9fVkFMSURBVElPTl9OQU1FKSk7Ci0JCXN0YXR1cyA9ICI+Pj4+PkVORCBBVVRPIEJVSUxEIFRFU1QgUEFTUyBbIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIl0+Pj4+PiI7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhzdGF0dXMpOwotCQlidWZmZXIud3JpdGUoc3RhdHVzKTsKLQkJCi0JCWlmKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuaXNBc3luYygpKSB7Ci0JCQlzdGF0dXMgPSAiPj4+Pj5BU1lOQ0hST05PVVMgVkFMSURBVElPTiBURVNUIFBBU1MgWyIgKyBwcm9qZWN0LmdldE5hbWUoKSArICJdPj4+Pj4iOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKHN0YXR1cyk7Ci0JCQlidWZmZXIud3JpdGUoc3RhdHVzKTsKLQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCBWYWxpZGF0aW9uVHlwZUVudW0uQVNZTkNfTkFNRSwgYXN5bmNWYWxpZGF0ZShidWZmZXIsIHByb2plY3QsIFZhbGlkYXRpb25UeXBlRW51bS5BU1lOQ19OQU1FKSk7Ci0JCQlzdGF0dXMgPSAiPj4+Pj5FTkQgQVNZTkNIUk9OT1VTIFZBTElEQVRJT04gVEVTVCBQQVNTIFsiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiXT4+Pj4+IjsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhzdGF0dXMpOwotCQkJYnVmZmVyLndyaXRlKHN0YXR1cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBCeSBkZWZhdWx0LCAicGFzcyIgdGhlIGFzeW5jaHJvdXMgdGVzdHMgb2YgYW55IHZhbGlkYXRvciB0aGF0IGNhbm5vdCBydW4gYXN5bmNocm9ub3VzIHRlc3RzLgotCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksIFZhbGlkYXRpb25UeXBlRW51bS5BU1lOQ19OQU1FLCB0cnVlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGUoSUJ1ZmZlciBidWZmZXIsIElQcm9qZWN0IHByb2plY3QsIGludCB2YWxpZGF0aW9uVHlwZUVudW0sIFN0cmluZyB0YXNrTmFtZSkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWJvb2xlYW4gcGFzc2VkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXBhc3NlZCA9IEJWVFJ1bm5lci5zaW5nbGV0b24oKS50ZXN0KGJ1ZmZlciwgcHJvamVjdCwgdGhpcywgdmFsaWRhdGlvblR5cGVFbnVtKTsKLQkJfQotCQljYXRjaChCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJYnVmZmVyLmFkZEVsYXBzZWRUaW1lKHRhc2tOYW1lLCAoZW5kIC0gc3RhcnQpKTsKLQkJCWJ1ZmZlci53cml0ZSgiVG90YWwgdGltZSBmb3IgdmFsaWRhdG9yICIgKyBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkgKyAiIG9mIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIiBpbiAiICsgdGFza05hbWUgKyAiIG1vZGUgd2FzICIgKyAoZW5kIC0gc3RhcnQpICsgIiBtaWxsaXNlY29uZHMuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQl9Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBhc3luY1ZhbGlkYXRlKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgc3ViVGFza05hbWUpIHsKLQkJYm9vbGVhbiBwYXNzZWQgPSB0cnVlOwotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWxvbmcgZW5kID0gMDsKLQkJdHJ5IHsKLQkJCUdsb2JhbENvbmZpZ3VyYXRpb24gZ2NvbmYgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkJLy9ib29sZWFuIGRpc2FibGVWYWxpZGF0aW9uID0gZ2NvbmYubnVtYmVyT2ZFbmFibGVkVmFsaWRhdG9ycygpPT0wOwotCQkJLy9ib29sZWFuIGF1dG9WYWxpZGF0ZSA9IGdjb25mLmlzQXV0b1ZhbGlkYXRlKCk7Ci0JCQkvL2Jvb2xlYW4gYnVpbGRWYWxpZGF0ZSA9IGdjb25mLmlzQnVpbGRWYWxpZGF0ZSgpOwotCQkJdHJ5IHsKLQkJCQkvL2djb25mLnNldEF1dG9WYWxpZGF0ZShmYWxzZSk7Ci0JCQkJLy8gVHVybiBvZmYgYXV0by12YWxpZGF0ZSBzbyB0aGF0IHRoZSBwcm9qZWN0IGlzbid0IHZhbGlkYXRlZCBhdXRvbWF0aWNhbGx5LgotCQkJCS8vZ2NvbmYuc2V0QXV0b1ZhbGlkYXRlKGZhbHNlKTsKLQkJCQkvL2djb25mLnNldEJ1aWxkVmFsaWRhdGUoZmFsc2UpOwotCQkJCWdjb25mLnBhc3NpdmF0ZSgpOwotCQkJCQotCQkJCS8vIFR3byB0ZXN0czogCi0JCQkJLy8gICAxLiBSdW4gdmFsaWRhdGlvbiBvbiBjb3BpZXMgb2YgdGhlIG9yaWdpbmFsIHByb2plY3Q6ICJwcm9qZWN0TmFtZS5mb3JrIiBhbmQgInByb2plY3ROYW1lLm5vRm9yayIKLQkJCQkvLyAgICAgIENvbXBhcmUgdGhlIG1hcmtlcnMgb2YgdGhlIGNvcGllcyB0byB0aGUgRlZUIFRlc3RjYXNlTWV0YURhdGEsIGFuZCB0aGUgdmFsaWRhdG9yIHBhc3NlcyBpZiB0aGUgCi0JCQkJLy8JCXJlc3VsdHMgb2YgZWFjaCBjb3B5IG1hdGNoZXMgdGhlIFRlc3RjYXNlTWV0YURhdGEuCi0JCQkJLy8gICAyLiBSdW4gdmFsaWRhdGlvbiBvbiBjb3BpZXMsIGJ1dCB0aGlzIHRpbWUgaW50cm9kdWNlIGNoYW5nZXMgZHVyaW5nIHRoZSB2YWxpZGF0aW9uLgotCQkJCS8vCQlFeHRyYWN0IHRoZSBuYW1lcyBvZiByZXNvdXJjZXMgZnJvbSB0aGUgdGVzdGNhc2UgbWV0YWRhdGEsIGZpbmQgdGhvc2UgcmVzb3VyY2VzLCBhbmQKLQkJCQkvLwkJYWRkL2RlbGV0ZS9yZW5hbWUvbW92ZS9jbG9zZS9jaGFuZ2UgdGhlbS4KLQkJCQkKLQkJCQlib29sZWFuIHBhc3MxID0gdmFsaWRhdGVBbmRDb21wYXJlKGJ1ZmZlciwgcHJvamVjdCwgc3ViVGFza05hbWUpOwotCQkJCWJvb2xlYW4gcGFzczIgPSB2YWxpZGF0ZUNoYW5nZUFuZENvbXBhcmUoYnVmZmVyLCBwcm9qZWN0LCBJRmlsZURlbHRhLkNIQU5HRUQsIHN1YlRhc2tOYW1lKTsKLQkJCQlib29sZWFuIHBhc3MzID0gdmFsaWRhdGVDaGFuZ2VBbmRDb21wYXJlKGJ1ZmZlciwgcHJvamVjdCwgSUZpbGVEZWx0YS5ERUxFVEVELCBzdWJUYXNrTmFtZSk7Ci0JCQkJcGFzc2VkID0gKHBhc3MxICYmIHBhc3MyICYmIHBhc3MzKTsKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJLy8gQ291bGRuJ3QgY3JlYXRlIGNvcHkuSnVzdCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IHRlc3QuCi0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy9nY29uZi5zZXRBdXRvVmFsaWRhdGUoYXV0b1ZhbGlkYXRlKTsKLQkJCQkvL2djb25mLnNldEJ1aWxkVmFsaWRhdGUoYnVpbGRWYWxpZGF0ZSk7Ci0JCQkJZ2NvbmYucGFzc2l2YXRlKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlidWZmZXIuYWRkRWxhcHNlZFRpbWUoVmFsaWRhdGlvblR5cGVFbnVtLkFTWU5DX05BTUUsIChlbmQgLSBzdGFydCkpOwotCQkJYnVmZmVyLndyaXRlKCJUb3RhbCB0aW1lIGZvciB2YWxpZGF0b3IgIiArIGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSArICIgb2YgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIGluIGFzeW5jaHJvbm91cyBtb2RlIHdhcyAiICsgKGVuZCAtIHN0YXJ0KSArICIgbWlsbGlzZWNvbmRzLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkKLQkJfQotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQotCS8qKgotCSAqIFJ1biB2YWxpZGF0aW9uLCB1c2luZyBzZXZlcmFsIG9wZXJhdGlvbnMgKGJvdGggZm9ya2VkIGFuZCBub3QgZm9ya2VkKSwgb24gdGhlIElQcm9qZWN0LgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSByZXN1bHQsIGFmdGVyIHRoZSBsYXN0IG9wZXJhdGlvbiBpcyBjb21wbGV0ZSwgaXMgdGhlIGV4cGVjdGVkIHJlc3VsdC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVBbmRDb21wYXJlKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgc3ViVGFza05hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gTm93IGNvbXBhcmUgdGhlIElQcm9qZWN0J3MgcmVzdWx0IHRvIHRoZSBleHBlY3RlZCBUZXN0Y2FzZU1ldGFEYXRhIHJlc3VsdC4KLQkJLy8gVmFsaWRhdGUKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG5vRm9ya09wID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB0cnVlLCBmYWxzZSk7Ci0JCW5vRm9ya09wLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJbm9Gb3JrT3AucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB0cnVlLCB0cnVlKTsKLQkJZm9ya09wLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJZm9ya09wLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG5vRm9ya09wMiA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdHJ1ZSwgZmFsc2UpOwotCQlub0ZvcmtPcDIuc2V0VmFsaWRhdG9ycyhnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvck5hbWVzKCkpOwotCQlub0ZvcmtPcDIucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIGZvcmtPcDIgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHRydWUsIHRydWUpOwotCQlmb3JrT3AyLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJZm9ya09wMi5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBmb3JrT3AzID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB0cnVlLCB0cnVlKTsKLQkJZm9ya09wMy5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCWZvcmtPcDMucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQkvLyBXYWl0IHVudGlsIGFsbCBvZiB0aGUgdGhyZWFkcyBoYXZlIGNvbXBsZXRlLgotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiV2FpdGluZyBmb3IgYWxsIGZvcmtlZCB0aHJlYWRzIHRvIGZpbmlzaC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlKCFWVGhyZWFkTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNEb25lKCkgJiYgIWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHt9Ci0JCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJBbGwgdGhyZWFkcyBhcmUgY29tcGxldGUuIEJlZ2lubmluZyB0aGUgY29tcGFyaXNvbi4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gQ29tcGFyZQotCQlJTWFya2VyW10gbWFya2VycyA9IFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwgZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gQlZUUnVubmVyLnNpbmdsZXRvbigpLnZlcmlmeShidWZmZXIsIGdldE5hbWUoKSwgc3ViVGFza05hbWUsIHByb2plY3QsIGdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTiksIG1hcmtlcnMpOyAKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVDaGFuZ2VBbmRDb21wYXJlKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0LCBpbnQgaWZpbGVEZWx0YVR5cGUsIFN0cmluZyBzdWJUYXNrTmFtZSkgdGhyb3dzIEJWVFZhbGlkYXRpb25FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlib29sZWFuIHBhc3NlZCA9IHRydWU7Ci0JCQotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbXXtnZXRWYWxpZGF0b3JNZXRhRGF0YSgpfTsKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBub0ZvcmtPcE9yaWcgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHRydWUsIGZhbHNlKTsKLQkJbm9Gb3JrT3BPcmlnLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJbm9Gb3JrT3BPcmlnLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBub0ZvcmtPcENoYW5nZWQgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHZtZHMsIGdldFJlc291cmNlcyhwcm9qZWN0KSwgaWZpbGVEZWx0YVR5cGUsIGZhbHNlLCBmYWxzZSk7IC8vIGZhbHNlID0gZG8gbm90IGZvcmNlIGlmIHRoZXJlJ3Mgbm8gZGVsdGFzIHRvIHZhbGlkYXRlCi0JCW5vRm9ya09wQ2hhbmdlZC5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wT3JpZyA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWZvcmtPcE9yaWcuc2V0VmFsaWRhdG9ycyhnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvck5hbWVzKCkpOwotCQlmb3JrT3BPcmlnLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBmb3JrT3BDaGFuZ2VkID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB2bWRzLCAgZ2V0UmVzb3VyY2VzKHByb2plY3QpLCBpZmlsZURlbHRhVHlwZSwgZmFsc2UsIHRydWUpOyAvLyBmYWxzZSA9IGRvIG5vdCBmb3JjZSBpZiB0aGVyZSdzIG5vIGRlbHRhcyB0byB2YWxpZGF0ZQotCQlmb3JrT3BDaGFuZ2VkLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG5vRm9ya09wMk9yaWcgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHRydWUsIGZhbHNlKTsKLQkJbm9Gb3JrT3AyT3JpZy5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCW5vRm9ya09wMk9yaWcucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG5vRm9ya09wMkNoYW5nZWQgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHZtZHMsICBnZXRSZXNvdXJjZXMocHJvamVjdCksIGlmaWxlRGVsdGFUeXBlLCBmYWxzZSwgZmFsc2UpOyAvLyBmYWxzZSA9IGRvIG5vdCBmb3JjZSBpZiB0aGVyZSdzIG5vIGRlbHRhcyB0byB2YWxpZGF0ZQotCQlub0ZvcmtPcDJDaGFuZ2VkLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBmb3JrT3AyT3JpZyA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWZvcmtPcDJPcmlnLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJZm9ya09wMk9yaWcucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wMkNoYW5nZWQgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHZtZHMsICBnZXRSZXNvdXJjZXMocHJvamVjdCksIGlmaWxlRGVsdGFUeXBlLCBmYWxzZSwgdHJ1ZSk7IC8vIGZhbHNlID0gZG8gbm90IGZvcmNlIGlmIHRoZXJlJ3Mgbm8gZGVsdGFzIHRvIHZhbGlkYXRlCi0JCWZvcmtPcDJDaGFuZ2VkLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBmb3JrT3AzT3JpZyA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWZvcmtPcDNPcmlnLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJZm9ya09wM09yaWcucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wM0NoYW5nZWQgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHZtZHMsIGdldFJlc291cmNlcyhwcm9qZWN0KSwgaWZpbGVEZWx0YVR5cGUsIGZhbHNlLCB0cnVlKTsgLy8gZmFsc2UgPSBkbyBub3QgZm9yY2UgaWYgdGhlcmUncyBubyBkZWx0YXMgdG8gdmFsaWRhdGUKLQkJZm9ya09wM0NoYW5nZWQucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQkvLyBXYWl0IHVudGlsIGFsbCBvZiB0aGUgdGhyZWFkcyBoYXZlIGNvbXBsZXRlLgotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiV2FpdGluZyBmb3IgYWxsIGZvcmtlZCB0aHJlYWRzIHRvIGZpbmlzaC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlKCFWVGhyZWFkTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNEb25lKCkgJiYgIWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHt9Ci0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJDb21wYXJpc29uIGNhbmNlbGxlZC4gUGVyZm9ybWluZyBjbGVhbnVwLiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soIkFsbCB0aHJlYWRzIGFyZSBjb21wbGV0ZS4gQmVnaW5uaW5nIHRoZSBjb21wYXJpc29uLiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBDb21wYXJlCi0JCUlNYXJrZXJbXSBtYXJrZXJzID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvck5hbWVzKCkpOwotCi0JCS8vIE5vdyBjb21wYXJlIHRoZSBJUHJvamVjdCdzIHJlc3VsdCB0byB0aGUgZXhwZWN0ZWQgVGVzdGNhc2VNZXRhRGF0YSByZXN1bHQuCi0JCS8vIERvbid0IHdyaXRlIF9wYXNzZWQgPSBfcGFzc2VkICYmIGdldC4uLgotCQkvLyBXaGVuIHRoZSBfcGFzc2VkID09IGZhbHNlLCB0aGVuIGphdmEgZGlkbid0IGJvdGhlciBydW5uaW5nIHRoZSB0ZXN0LgotCQlwYXNzZWQgPSBCVlRSdW5uZXIuc2luZ2xldG9uKCkudmVyaWZ5KGJ1ZmZlciwgZ2V0TmFtZSgpLCBzdWJUYXNrTmFtZSwgcHJvamVjdCwgZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLlJVTl9WQUxJREFUSU9OKSwgbWFya2Vycyk7Ci0JCQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZGVsZXRlTWFya2VycyhtYXJrZXJzKTsKLQkKLQkJcmV0dXJuIHBhc3NlZDsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9CVlRSdW5uZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvQlZUUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTA1ODAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9CVlRSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5WYWxpZGF0aW9uVHlwZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5CVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5JVGVzdGNhc2VNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5Lk1lc3NhZ2VNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5Lk1lc3NhZ2VVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuT3BlcmF0aW9uVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5UZXN0U2V0dXBJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5UZXN0Y2FzZVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5WYWxpZGF0b3JUZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JbnRlcm5hbFZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVGFza0xpc3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZUaHJlYWRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuT25lVmFsaWRhdG9yT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdGlvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCVlRSdW5uZXIgewotCXByaXZhdGUgc3RhdGljIEJWVFJ1bm5lciBfaW5zdCA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IF9leHRyYSA9IG51bGw7IC8vIFRoZSBleHRyYSBtYXJrZXJzIHJlcG9ydGVkIChzdG9yZWQgaW4gYSBsaXN0IHRvIG1ha2UgcmVhZGluZyBlYXNpZXIpLgotCXByaXZhdGUgTGlzdCBfbWlzc2luZyA9IG51bGw7IC8vIFRoZSBtaXNzaW5nIE1NRCB0aGF0IHdlcmUgc3VwcG9zZWQgdG8gYmUgcmVwb3J0ZWQgKHN0b3JlZCBpbiBhIGxpc3QgdG8gbWFrZSByZWFkaW5nIGVhc2llcikuCi0KLQlwdWJsaWMgc3RhdGljIEJWVFJ1bm5lciBzaW5nbGV0b24oKSB7Ci0JCWlmKF9pbnN0ID09IG51bGwpIHsKLQkJCV9pbnN0ID0gbmV3IEJWVFJ1bm5lcigpOwotCQl9Ci0JCXJldHVybiBfaW5zdDsKLQl9Ci0JCi0JcHJpdmF0ZSBCVlRSdW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCV9leHRyYSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJX21pc3NpbmcgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1ZlcmJvc2UoKSB7Ci0JCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuRklORVNUKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgY2hhciBnZXRTZXZlcml0eUNoYXIoSW50ZWdlciBzZXZlcml0eSkgewotCQlpZihzZXZlcml0eSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gJz8nOwotCQl9Ci0JCQotCQlzd2l0Y2goc2V2ZXJpdHkuaW50VmFsdWUoKSkgewotCQkJY2FzZShJTWFya2VyLlNFVkVSSVRZX0VSUk9SKTogewotCQkJCXJldHVybiAnRSc7Ci0JCQl9Ci0JCQkKLQkJCWNhc2UoSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKTogewotCQkJCXJldHVybiAnVyc7Ci0JCQl9Ci0JCQkKLQkJCWNhc2UoSU1hcmtlci5TRVZFUklUWV9JTkZPKTogewotCQkJCXJldHVybiAnSSc7Ci0JCQl9Ci0JCQkKLQkJCWRlZmF1bHQ6IHsKLQkJCQlyZXR1cm4gJz8nOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gZ2V0TmFtZXMoSVByb2plY3RbXSBwcm9qZWN0cykgewotCQlpZihwcm9qZWN0cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJfQotCQlTdHJpbmdbXSBuYW1lcyA9IG5ldyBTdHJpbmdbcHJvamVjdHMubGVuZ3RoXTsKLQkJZm9yKGludCBpPTA7IGk8cHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCW5hbWVzW2ldID0gcHJvamVjdC5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWJ1ZyhJQnVmZmVyIGJ1ZmZlciwgSU1hcmtlcltdIG1lc3NhZ2VzKSB7Ci0JCWlmKG1lc3NhZ2VzID09IG51bGwpIHsKLQkJCWJ1ZmZlci53cml0ZSgiTm90aGluZyB0byBkZWJ1ZyBiZWNhdXNlIG5vdGhpbmcgd2FzIHJlcG9ydGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJZm9yKGludCBpPTA7IGk8bWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlNYXJrZXIgbWFya2VyID0gbWVzc2FnZXNbaV07Ci0JCQlidWZmZXIud3JpdGUoTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcobWFya2VyKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXREZWJ1Z01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmKGlzVmVyYm9zZSgpKSB7Ci0JCQlyZXR1cm4gbW9uaXRvcjsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOyAvLyBpZiB2ZXJib3NlIGlzIHRydWUsIHNob3cgcHJvZ3Jlc3MgbWVzc2FnZXMgZm9yIHRoZSBjcmVhdGlvbiAmIHZhbGlkYXRpb24gb2YgdGhlIHByb2plY3QuIE90aGVyd2lzZSBzaG93IG9ubHkgdGhlIEJWVCBzdGF0dXMuCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogV2hlbiBpbnZva2luZyB0aGUgdGVzdCBmcm9tIHRoZSBVSSwgdGhlIGlucHV0IGhhcyBhbHJlYWR5IGJlZW4gaW1wb3J0ZWQsIHNvIGp1c3QgdGVzdCBpdC4KLQkgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdCBpcyBkZXJpdmVkIGZyb20gdGhlIG5hbWUgb2YgdGhlIHByb2plY3QuCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdGVzdHMgdGhhdCBwYXNzZWQuCi0JICovCQotCXB1YmxpYyBpbnQgdGVzdChJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3RbXSBwcm9qZWN0cykgdGhyb3dzIEJWVFZhbGlkYXRpb25FeGNlcHRpb24gewkKLQkJU3RyaW5nW10gdGVzdE5hbWVzID0gZ2V0TmFtZXMocHJvamVjdHMpOwotCQlCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpOwotCQkKLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmJlZ2luVGFzaygiUnVubmluZyBCVlQgdGVzdHMiLCBwcm9qZWN0cy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWludCB0b3RhbFRlc3RzID0gMDsKLQkJaW50IHRvdGFsUGFzc2VkID0gMDsKLQkJZm9yKGludCBpPTA7IGk8cHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJUZXN0aW5nIHByb2plY3QgIiArIChpKzEpICsgIiBvZiAiICsgcHJvamVjdHMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRlc3RzID0gcmVhZGVyLmdldFZhbGlkYXRvclRlc3RzKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSwgdGVzdE5hbWVzW2ldKTsKLQkJCWlmKCh0ZXN0cyA9PSBudWxsKSB8fCAodGVzdHMubGVuZ3RoID09IDApKSB7Ci0JCQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soIlRoZXJlIGFyZSBubyB0ZXN0cyB0byBydW4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJaW50IG51bVRlc3RzUGFzc2VkID0gMDsKLQkJCWZvcihpbnQgaj0wOyBqPHRlc3RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJVmFsaWRhdG9yVGVzdGNhc2UgdG1kID0gdGVzdHNbal07Ci0JCQkJaWYodGVzdChidWZmZXIsIHByb2plY3QsIHRtZCwgVmFsaWRhdGlvblR5cGVFbnVtLlJVTl9WQUxJREFUSU9OKSkgewotCQkJCQludW1UZXN0c1Bhc3NlZCsrOwotCQkJCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiVGVzdCAiICsgKGorMSkgKyAiIG9mICIgKyB0ZXN0cy5sZW5ndGggKyAiIHBhc3NlZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJUZXN0ICIgKyAoaisxKSArICIgb2YgIiArIHRlc3RzLmxlbmd0aCArICIgZmFpbGVkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkud29ya2VkKDEpOwotCQkJfQotCQkJCi0JCQl0b3RhbFRlc3RzICs9IHRlc3RzLmxlbmd0aDsKLQkJCXRvdGFsUGFzc2VkICs9IG51bVRlc3RzUGFzc2VkOwotCQkJCi0JCQlidWZmZXIud3JpdGUobnVtVGVzdHNQYXNzZWQgKyAiIG9mICIgKyB0ZXN0cy5sZW5ndGggKyAiIHRlc3RzIHBhc3NlZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJYnVmZmVyLndyaXRlKCJcbj4+Pj4+Pj4+Pj5URVNUIFJFU1VMVFM+Pj4+Pj4+Pj4+Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLndyaXRlKHRvdGFsUGFzc2VkICsgIiBvZiAiICsgdG90YWxUZXN0cyArICIgdGVzdHMgcGFzc2VkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmRvbmUoKTsKLQkJCi0JCXJldHVybiB0b3RhbFBhc3NlZDsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgVmFsaWRhdGlvbk9wZXJhdGlvbiBvbiB0aGUgSVByb2plY3QsIGludm9rZSB0aGUgb3BlcmF0aW9uLCBhbmQgdmVyaWZ5IHRoYXQgdGhlCi0JICogcmVzdWx0aW5nIElNYXJrZXJzIG1hdGNoIHRoZSBleHBlY3RlZCBtZXNzYWdlcyBpbiB0aGUgdG1kLgotCSAqLwkKLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0b3JUZXN0Y2FzZSB0bWQsIGludCB2YWxpZGF0aW9uRW51bVR5cGUpIHRocm93cyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJc3dpdGNoKHZhbGlkYXRpb25FbnVtVHlwZSkgewotCQkJY2FzZShWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT04pOiB7Ci0JCQkJcmV0dXJuIHRlc3QoYnVmZmVyLCB0bWQuZ2V0TmFtZSgpLCBWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT05fTkFNRSwgdG1kLmdldE1lc3NhZ2VzKHZhbGlkYXRpb25FbnVtVHlwZSksIG5ldyBPbmVWYWxpZGF0b3JPcGVyYXRpb24ocHJvamVjdCwgdG1kLmdldFZhbGlkYXRvckNsYXNzKCksIHRydWUsIGZhbHNlKSwgSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRWYWxpZGF0b3JOYW1lcyhuZXcgVmFsaWRhdG9yTWV0YURhdGFbXXt0bWQuZ2V0VmFsaWRhdG9yTWV0YURhdGEoKX0pKTsgLy8gdHJ1ZT1mb3JjZSwgZmFsc2U9bm8gZm9yCi0JCQl9Ci0JCQkKLQkJCWNhc2UoVmFsaWRhdGlvblR5cGVFbnVtLkZVTExfVkFMSURBVElPTik6IHsKLQkJCQlyZXR1cm4gYnVpbGQoYnVmZmVyLCBwcm9qZWN0LCB0bWQsIHZhbGlkYXRpb25FbnVtVHlwZSwgVmFsaWRhdGlvblR5cGVFbnVtLkZVTExfVkFMSURBVElPTl9OQU1FKTsKLQkJCX0KLQkJCQotCQkJY2FzZShWYWxpZGF0aW9uVHlwZUVudW0uSU5DUkVNRU5UQUxfVkFMSURBVElPTik6IHsKLQkJCQlyZXR1cm4gYnVpbGQoYnVmZmVyLCBwcm9qZWN0LCB0bWQsIHZhbGlkYXRpb25FbnVtVHlwZSwgVmFsaWRhdGlvblR5cGVFbnVtLklOQ1JFTUVOVEFMX1ZBTElEQVRJT05fTkFNRSk7Ci0JCQl9Ci0JCQkKLQkJCWNhc2UoVmFsaWRhdGlvblR5cGVFbnVtLkFVVE9fVkFMSURBVElPTik6IHsKLQkJCQlyZXR1cm4gYnVpbGQoYnVmZmVyLCBwcm9qZWN0LCB0bWQsIHZhbGlkYXRpb25FbnVtVHlwZSwgVmFsaWRhdGlvblR5cGVFbnVtLkFVVE9fVkFMSURBVElPTl9OQU1FKTsKLQkJCX0KLQkJCQotCQkJZGVmYXVsdDogewotCQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXModG1kLmdldE5hbWUoKSwgbnVsbCwgSVRlc3RTdGF0dXMuRkFJTCwgYnVmZmVyLCAiVW5yZWNvZ25pemVkIHZhbGlkYXRpb24gb3B0aW9uOiIgKyB2YWxpZGF0aW9uRW51bVR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBidWlsZChJQnVmZmVyIGJ1ZmZlciwgZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgVmFsaWRhdG9yVGVzdGNhc2UgdG1kLCBmaW5hbCBpbnQgdmFsaWRhdGlvbkVudW1UeXBlLCBTdHJpbmcgc3ViVGFza05hbWUpIHRocm93cyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUlQcm9ncmVzc01vbml0b3IgbnVsbE1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bigKLQkJCW5ldyBJV29ya3NwYWNlUnVubmFibGUoKXsKLQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJUmVzb3VyY2VbXSByZXNvdXJjZXMgPSB0bWQuZ2V0UmVzb3VyY2VzKHByb2plY3QpOwotCQkJCQkJZm9yKGludCBpPTA7IGk8cmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJSVJlc291cmNlIHJlcyA9IHJlc291cmNlc1tpXTsKLQkJCQkJCQlyZXMudG91Y2gobW9uaXRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCQlsb2dnZXIud3JpdGUoZXhjKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0sIG51bGxNb25pdG9yKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShleGMpOwotCQkJfQotCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyh0bWQuZ2V0TmFtZSgpLCBzdWJUYXNrTmFtZSwgSVRlc3RTdGF0dXMuRkFJTCwgYnVmZmVyLCAiQ29yZUV4Y2VwdGlvbiBjYXVnaHQ7IHN0YWNrIHRyYWNlIGluIExvZ2dpbmdVdGlsLmxvZyIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gRG8gbm90IGJ1aWxkIHVzaW5nIG9ubHkgdGhlIHZhbGlkYXRpb24gYnVpbGRlciBiZWNhdXNlIHNvbWUgdmFsaWRhdG9ycwotCQkJLy8gKGkuZS4sIHRoZSBFSkIgVmFsaWRhdG9yKSBkZXBlbmQgb24gdGhlIG91dHB1dCBvZiBvdGhlciBidWlsZGVycyAKLQkJCS8vIChpLmUuLCB0aGUgSmF2YSBCdWlsZGVyKS4KLQkJCXByb2plY3QuYnVpbGQodmFsaWRhdGlvbkVudW1UeXBlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShleGMpOwotCQkJfQotCQkJYnVmZmVyLndyaXRlKCJDb3JlRXhjZXB0aW9uIGNhdWdodDsgc3RhY2sgdHJhY2UgaW4gTG9nZ2luZ1V0aWwubG9nIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUlNYXJrZXJbXSBtZXNzYWdlcyA9IFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwgSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRWYWxpZGF0b3JOYW1lcyhuZXcgVmFsaWRhdG9yTWV0YURhdGFbXXt0bWQuZ2V0VmFsaWRhdG9yTWV0YURhdGEoKX0pKTsKLQkJcmV0dXJuIHZlcmlmeShidWZmZXIsIHRtZC5nZXROYW1lKCksIHN1YlRhc2tOYW1lLCBwcm9qZWN0LCB0bWQuZ2V0TWVzc2FnZXModmFsaWRhdGlvbkVudW1UeXBlKSwgbWVzc2FnZXMpOwotCX0KLQkKLQkvKioKLQkgKiBSdW4gdGhlIGdpdmVuIFZhbGlkYXRpb25PcGVyYXRpb24gYW5kIGVuc3VyZSB0aGF0IHRoZSByZXN1bHRzIG1hdGNoIHRoZSByZXN1bHRzIG9mIHRoZSBnaXZlbiB0ZXN0IGNhc2UuCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHJlc3VsdHMgbWF0Y2ggYW5kIGZhbHNlIGlmIHRoZXkgZG9uJ3QuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgcHVibGljIGJlY2F1c2UgaXQncyBuZWVkZWQgZm9yIHRoZSBUZXN0T3BDb25zdHIgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHRlc3QoSUJ1ZmZlciBidWZmZXIsIFN0cmluZyB0ZXN0TmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBMaXN0IGV4cGVjdGVkTWVzc2FnZXMsIFZhbGlkYXRpb25PcGVyYXRpb24gb3AsIFN0cmluZ1tdIHZhbGlkYXRvck5hbWVzKSB0aHJvd3MgQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCUlQcm9ncmVzc01vbml0b3IgZGVidWdNb25pdG9yID0gZ2V0RGVidWdNb25pdG9yKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWJvb2xlYW4gcGFzc2VkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCQotCQkJaWYob3AgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5XQVJOSU5HKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuV0FSTklORywgIkNhbm5vdCBydW4gdGVzdHMgYmVjYXVzZSB0aGUgT3BlcmF0aW9uIGlzIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0cnkgewotCQkJCQkJLy9WYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5zZXROb01lc3NhZ2VMaW1pdChvcC5nZXRQcm9qZWN0KCkpOwotCQkJCQkKLQkJCQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ob3AsIGRlYnVnTW9uaXRvcik7IAotCQkJCQkJCi0JCQkJCQlpZihvcC5pc0ZvcmsoKSkgewotCQkJCQkJCS8vIFdhaXQgdW50aWwgYWxsIGZvcmtlZCB0aHJlYWRzIGFyZSBjb21wbGV0ZQotCQkJCQkJCXdoaWxlKCFWVGhyZWFkTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNEb25lKCkpe307Ci0JCQkJCQl9Ci0JCQkKLQkJCQkJCS8vIExvYWQgdGhlIGVuYWJsZWQgdmFsaWRhdG9ycyBmcm9tIHRoZSB0ZXN0LCBub3QgdGhlIG9wZXJhdGlvbiwKLQkJCQkJCS8vIGJlY2F1c2UgdGhlIHRlc3QgaGFzIHRoZSBtZXNzYWdlcyBmb3IgYSBzaW5nbGUgdmFsaWRhdG9yLCBhbmQKLQkJCQkJCS8vIGlmIHRoZSBtZXNzYWdlcyBmcm9tIGFsbCBlbmFibGVkIHZhbGlkYXRvcnMgYXJlIHJldHJpZXZlZCwKLQkJCQkJCS8vIHRoZW4gImV4dHJhIiBtZXNzYWdlcywgcmVwb3J0ZWQgYnkgdmFsaWRhdG9ycyB3aG9zZSBtZXNzYWdlcwotCQkJCQkJLy8gYXJlbid0IGV4cGVjdGVkIGJ5IHRoZSB0ZXN0LCBmYWlsIHRoZSB0ZXN0IGNhc2UuIAotCQkJCQkJSU1hcmtlcltdIG1lc3NhZ2VzID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhvcC5nZXRQcm9qZWN0KCksIHZhbGlkYXRvck5hbWVzKTsKLQkJCQkJCXBhc3NlZCA9IHZlcmlmeShidWZmZXIsIHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgb3AuZ2V0UHJvamVjdCgpLCBleHBlY3RlZE1lc3NhZ2VzLCBtZXNzYWdlcyk7Ci0JCQkJfQotCQkJCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCQl9Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXBhc3NlZCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2V0dXBUZXN0cyhJQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCVZhbGlkYXRvclRlc3RjYXNlW10gdnRzID0gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvclRlc3RzKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSwgKFN0cmluZyludWxsKTsKLQkJT3BlcmF0aW9uVGVzdGNhc2VbXSBvdHMgPSBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0T3BlcmF0aW9uVGVzdHMoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLCAoU3RyaW5nKW51bGwpOwotCQlib29sZWFuIHN1Y2Nlc3NmdWwgPSB0cnVlOwotCQlmb3IoaW50IGk9MDsgaTx2dHMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvclRlc3RjYXNlIHZ0ZXN0ID0gdnRzW2ldOwotCQkJc3VjY2Vzc2Z1bCA9IHNldHVwVGVzdHMoYnVmZmVyLCB2dGVzdCwgZmFsc2UpICYmIHN1Y2Nlc3NmdWw7Ci0JCX0KLQkJCi0JCWZvcihpbnQgaj0wOyBqPG90cy5sZW5ndGg7IGorKykgewotCQkJT3BlcmF0aW9uVGVzdGNhc2Ugb3Rlc3QgPSBvdHNbal07Ci0JCQlzdWNjZXNzZnVsID0gc2V0dXBUZXN0cyhidWZmZXIsIG90ZXN0LCBmYWxzZSkgJiYgc3VjY2Vzc2Z1bDsKLQkJfQotCQkKLQkJcmV0dXJuIHN1Y2Nlc3NmdWw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFsbCBvZiB0aGUgdGVzdCBjYXNlcycgaW5wdXQgd2VyZSBmb3VuZCBhbmQgaW1wb3J0ZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2V0dXBUZXN0cyhJQnVmZmVyIGJ1ZmZlciwgSVRlc3RjYXNlTWV0YURhdGEgdG1kLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJaW50IGV4ZWN1dGlvbk1hcCA9IDB4MDsKLQkJYm9vbGVhbiBpbXBvcnRlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpOwotCQotCQkJLy8gRWFjaCBpbXBvcnQgb3BlcmF0aW9uIGRlbGV0ZXMgYW55IHByb2plY3QgYmVmb3JlIGl0IHJlLWltcG9ydHMgaXQuCi0JCQlTdHJpbmcgZGlyID0gVGVzdGNhc2VVdGlsaXR5LmdldElucHV0RGlyKHRtZCk7Ci0JCQlUZXN0U2V0dXBJbXBvcnRbXSBzZXR1cCA9IHJlYWRlci5nZXRUZXN0U2V0dXAoYnVmZmVyLCBkaXIsIHRtZCwgdmVyYm9zZSk7Ci0JCQlpZigoc2V0dXAgPT0gbnVsbCkgfHwgKHNldHVwLmxlbmd0aCA9PSAwKSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gIkNhbm5vdCBpbXBvcnQgaW5wdXQgdGhhdCBkb2VzIG5vdCBleGlzdC4gQ2hlY2sgdGhhdCBkaXJlY3RvcnkgIiArIGRpciArICIgZXhpc3RzLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlidWZmZXIud3JpdGUobWVzc2FnZSk7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4MTsKLQkJCQlpbXBvcnRlZCA9IGZhbHNlOwotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkubG9nTWVzc2FnZShJU3RhdHVzLkVSUk9SLCBtZXNzYWdlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5iZWdpblRhc2soIkltcG9ydGluZyBmaWxlczsgcGxlYXNlIHdhaXQuLi4iLCBzZXR1cC5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yKGludCBpPTA7IGk8c2V0dXAubGVuZ3RoOyBpKyspIHsKLQkJCQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soIkltcG9ydGluZyBmaWxlICIgKyAoaSsxKSArICIgb2YgIiArIHNldHVwLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpZighc2V0dXBbaV0uaW1wb3J0RmlsZShidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCksIGRpcikpIHsKLQkJCQkJCS8vIE9uZSBvZiB0aGUgaW5wdXQgZmlsZXMgY291bGRuJ3QgYmUgaW1wb3J0ZWQuCi0JCQkJCQlleGVjdXRpb25NYXAgfD0gMHgyOwotCQkJCQkJaW1wb3J0ZWQgPSBmYWxzZTsKLQkJCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkubG9nTWVzc2FnZShJU3RhdHVzLkVSUk9SLCAiSW1wb3J0IGZhaWxlZCBmb3IgZGlyICIgKyBkaXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkud29ya2VkKDEpOwotCQkJCX0KLQkJCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuZG9uZSgpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYoIWltcG9ydGVkKSB7Ci0JCQkJU3RyaW5nIHRtZE5hbWUgPSAodG1kID09IG51bGwpID8gIj8iIDogdG1kLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkubG9nTWVzc2FnZShJU3RhdHVzLkVSUk9SLCAKLQkJCQkJIlRlc3Qgc2V0dXAgZm9yICIgKyB0bWROYW1lICsgIiB3YXMgdW5zdWNjZXNzZnVsLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1wb3J0ZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGV4cGVjdGVkIG1lc3NhZ2VzICh0bWRNbWRMaXN0KSBtYXRjaGVzIHRoZSByZXBvcnRlZCBtZXNzYWdlcyAobWwyKS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb21wYXJlKElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgdGVzdE5hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgTGlzdCB0bWRNbWRMaXN0LCBJTWFya2VyW10gbWwyKSB7Ci0JCS8vIENvbnZlcnQgb25lIG9mIHRoZSBhcnJheXMgaW50byBhIGxpc3Qgc28gdGhhdCBpdCBjYW4gYmUgc29ydGVkLgotCQlpbnQgbnVtTWF0Y2hlZCA9IDA7Ci0JCUxpc3QgbW1kTGlzdCA9IG5ldyBBcnJheUxpc3QodG1kTW1kTGlzdCk7IC8vIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIHRtZCdzIGV4cGVjdGVkIG91dHB1dCBzbyB0aGF0IHRoZSB0bWQncyBvdXRwdXQgcmVtYWlucyBpbnRhY3QKLQkJaW50IG51bUV4cGVjdGVkID0gbW1kTGlzdC5zaXplKCk7Ci0JCWludCBudW1SZXBvcnRlZCA9IG1sMi5sZW5ndGg7Ci0JCWJvb2xlYW4gcGFzc2VkID0gdHJ1ZTsKLQkKLQotCQl0cnkgewkJCi0JCQlDb2xsZWN0aW9ucy5zb3J0KG1tZExpc3QsIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2VDb21wYXJhdG9yKGJ1ZmZlciwgaXNWZXJib3NlKCkpKTsKLQkKLQkJCXRyeSB7Ci0JCQkJZm9yKGludCBpPTA7IGk8bWwyLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gbWwyW2ldOwotCQkJCQlNZXNzYWdlTWV0YURhdGEgbWF0Y2hpbmcgPSBnZXRNYXRjaGluZ01ldGFEYXRhKGJ1ZmZlciwgbW1kTGlzdCwgbWFya2VyKTsKLQkJCQkJaWYobWF0Y2hpbmcgPT0gbnVsbCkgewotCQkJCQkJX2V4dHJhLmFkZChtYXJrZXIpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBFdmVyeSB0aW1lIGEgbW1kIGlzIG1hdGNoZWQgdG8gYSBtYXJrZXIsIHJlbW92ZSB0aGUgbW1kCi0JCQkJCQkvLyBmcm9tIHRoZSBsaXN0IHNvIHRoYXQgbW1kcyB3aXRob3V0IGEgbWFya2VyIGNhbiBiZSBmbGFnZ2VkLgotCQkJCQkJbW1kTGlzdC5yZW1vdmUobWF0Y2hpbmcpOwotCQkJCQkJbnVtTWF0Y2hlZCsrOwotCQkJCQl9Ci0JCQkJfQotCQotCQkJCWlmKG1tZExpc3Quc2l6ZSgpICE9IDApIHsKLQkJCQkJX21pc3NpbmcuYWRkQWxsKG1tZExpc3QpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXBhc3NlZCA9IHBhc3NlZCAmJiAoKF9taXNzaW5nLnNpemUoKSA9PSAwKSAmJiAoX2V4dHJhLnNpemUoKSA9PSAwKSk7Ci0JCQkJCi0JCQkJLy8gUmVwb3J0IHRoZSBtaXNzaW5nIG1hcmtlcnMgYWZ0ZXIgdGhlIE1NRCBsaXN0IGlzIHNvcnRlZAotCQkJCUNvbGxlY3Rpb25zLnNvcnQoX21pc3NpbmcsIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2VDb21wYXJhdG9yKGJ1ZmZlciwgaXNWZXJib3NlKCkpKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IF9taXNzaW5nLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSAoTWVzc2FnZU1ldGFEYXRhKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0TmFtZSwgc3ViVGFza05hbWUsIElUZXN0U3RhdHVzLkZBSUwsIGJ1ZmZlciwgIkVSUk9SW21pc3NpbmcgbWVzc2FnZV06ICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtbWQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQkKLQkJCQkvLyBSZXBvcnQgdGhlIGV4dHJhIG1hcmtlcnMgYWZ0ZXIgdGhleSdyZSBzb3J0ZWQuCi0JCQkJQ29sbGVjdGlvbnMuc29ydChfZXh0cmEsIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2VDb21wYXJhdG9yKGJ1ZmZlciwgaXNWZXJib3NlKCkpKTsKLQkJCQlpdGVyYXRvciA9IF9leHRyYS5pdGVyYXRvcigpOwotCQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlJTWFya2VyIG1hcmtlciA9IChJTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0TmFtZSwgc3ViVGFza05hbWUsIElUZXN0U3RhdHVzLkZBSUwsIGJ1ZmZlciwgIkVSUk9SW2V4dHJhIG1lc3NhZ2VdOiAiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcobWFya2VyKSArICIsIFRleHQgaXM6IFwiIiArIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2UobWFya2VyKSArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCi0JCQkJaWYobnVtRXhwZWN0ZWQgIT0gbnVtUmVwb3J0ZWQpIHsKLQkJCQkJYnVmZmVyLndyaXRlKCJXcm9uZyBudW1iZXIgb2YgbWVzc2FnZXMgcmVwb3J0ZWQuIEV4cGVjdGVkICIgKyBudW1FeHBlY3RlZCArICIgYW5kIGdvdCAiICsgbnVtUmVwb3J0ZWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCi0JCQkJYnVmZmVyLndyaXRlKCJOdW1iZXIgb2YgZXh0cmEgbWVzc2FnZXM6ICIgKyBfZXh0cmEuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci53cml0ZSgiTnVtYmVyIG9mIG1pc3NpbmcgbWVzc2FnZXM6ICIgKyBfbWlzc2luZy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLndyaXRlKCJOdW1iZXIgb2YgbWF0Y2hlZCBtZXNzYWdlczogIiArIG51bU1hdGNoZWQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQltbWRMaXN0LmNsZWFyKCk7Ci0JCQlfZXh0cmEuY2xlYXIoKTsgLy8gQ2xlYXIgdGhlIGxpc3Qgb2YgZXh0cmEgbWFya2VycyAoc3RvcmVkIGluIGEgbGlzdCB0byBtYWtlIHJlYWRpbmcgZWFzaWVyKS4KLQkJCV9taXNzaW5nLmNsZWFyKCk7IC8vIENsZWFyIHRoZSBsaXN0IG9mIG1pc3NpbmcgbWFya2VycyAoc3RvcmVkIGluIGEgbGlzdCB0byBtYWtlIHJlYWRpbmcgZWFzaWVyKS4KLQkJfQotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2ZXJpZnkoSUJ1ZmZlciBidWZmZXIsIFN0cmluZyB0ZXN0TmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBJUHJvamVjdCBwcm9qZWN0LCBMaXN0IG1tZExpc3RPcmlnLCBJTWFya2VyW10gbWVzc2FnZXMpIHsKLQkJYnVmZmVyLndyaXRlKCJUZXN0IGNhc2U6ICIgKyB0ZXN0TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbnQgbnVtTWF0Y2hlZCA9IDA7Ci0JCWludCBudW1FeHBlY3RlZCA9IDA7Ci0JCWludCBudW1SZXBvcnRlZCA9IDA7Ci0JCWJvb2xlYW4gcGFzc2VkID0gdHJ1ZTsKLQkJTGlzdCBtbWRMaXN0ID0gbmV3IEFycmF5TGlzdChtbWRMaXN0T3JpZyk7IC8vIE5lZWQgdG8gbW9kaWZ5IHRoZSBsaXN0LCBidXQgZG8gbm90IHdhbnQgdG8gbW9kaWZ5IHRoZSBvcmlnaW5hbCwgc28gY3JlYXRlIGEgY29weS4KLQkJdHJ5IHsKLQkJCS8vIEZpcnN0LCBjaGVjayB0aGF0IHRoZSBudW1iZXIgb2YgbWVzc2FnZXMgbWF0Y2guCi0JCQlpZihtZXNzYWdlcyA9PSBudWxsKSB7Ci0JCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLklORk8pKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5JTkZPLCAiTm8gbWVzc2FnZXMgd2VyZSByZXBvcnRlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gcGFzc2VkOwotCQkJfQotCQkJCi0JCQludW1FeHBlY3RlZCA9IG1tZExpc3Quc2l6ZSgpOwotCQkJbnVtUmVwb3J0ZWQgPSBtZXNzYWdlcy5sZW5ndGg7Ci0JCQkKLQkJCUNvbGxlY3Rpb25zLnNvcnQobW1kTGlzdCwgTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZUNvbXBhcmF0b3IoYnVmZmVyLCBpc1ZlcmJvc2UoKSkpOwotCi0JCQlmb3IoaW50IGk9MDsgaTxtZXNzYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCUlNYXJrZXIgbWFya2VyID0gbWVzc2FnZXNbaV07Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IGdldE1hdGNoaW5nTWV0YURhdGEoYnVmZmVyLCBtbWRMaXN0LCBtYXJrZXIpOwotCQotCQkJCWlmKG1tZCA9PSBudWxsKSB7Ci0JCQkJCV9leHRyYS5hZGQobWFya2VyKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBFdmVyeSB0aW1lIGEgbW1kIGlzIG1hdGNoZWQgdG8gYSBtYXJrZXIsIHJlbW92ZSB0aGUgbW1kCi0JCQkJCS8vIGZyb20gdGhlIGxpc3Qgc28gdGhhdCBtbWRzIHdpdGhvdXQgYSBtYXJrZXIgY2FuIGJlIGZsYWdnZWQuCi0JCQkJCW1tZExpc3QucmVtb3ZlKG1tZCk7Ci0JCQkJCWlmKGlzVmVyYm9zZSgpKSB7Ci0JCQkJCQlidWZmZXIud3JpdGUoIm1hdGNoZWQgIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1hcmtlcikgKyAiIHRvICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtbWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJbnVtTWF0Y2hlZCsrOwotCQkJCX0KLQkJCQkKLQkJCQkvLyBDaGVjayBzZXZlcml0eQotCQkJCXRyeSB7Ci0JCQkJCS8vIEZhaWwgYSB0ZXN0IGNhc2UgYmFzZWQgb24gc2V2ZXJpdHkgbWlzbWF0Y2ggYmVjYXVzZSBFSkIgZGVwbG95Ci0JCQkJCS8vIHJlbGllcyBvbiB0aGUgc2V2ZXJpdHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IGRlcGxveW1lbnQKLQkJCQkJLy8gY2FuIGNvbnRpbnVlPwotCQkJCQl2ZXJpZnlTZXZlcml0eShidWZmZXIsIHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgbW1kLCBtYXJrZXIpOwotCQkJCX0KLQkJCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZSk7Ci0JCQkJCX0KLQkJCQkJYnVmZmVyLndyaXRlKCJFUlJPUltUZXN0Y2FzZTo6IiArIHRlc3ROYW1lICsgIl0uIENvcmVFeGNlcHRpb24gY2F1Z2h0IHdoaWxlIHZlcmlmeWluZyBzZXZlcml0eSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCS8vIENoZWNrIHJlc291cmNlCi0JCQkJdHJ5IHsKLQkJCQkJLy8gRG9uJ3QgZmFpbCBhIHRlc3QgY2FzZSBiYXNlZCBvbiByZXNvdXJjZSwgYmVjYXVzZSB0aGUgImxvY2F0aW9uIiBjb2x1bW4gd2lsbAotCQkJCQkvLyB1bmlxdWVseSBpZGVudGlmeSB0aGUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UsIGFueXdheS4gU2hvdWxkIHN0aWxsIGxldCB0aGUgCi0JCQkJCS8vIHVzZXIga25vdywgdGhvdWdoLgotCQkJCQl2ZXJpZnlSZXNvdXJjZShidWZmZXIsIHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgbW1kLCBtYXJrZXIpOwotCQkJCX0KLQkJCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJCWJ1ZmZlci53cml0ZSgiRVJST1JbVGVzdGNhc2U6OiIgKyB0ZXN0TmFtZSArICJdLiBDb3JlRXhjZXB0aW9uIGNhdWdodCB3aGlsZSB2ZXJpZnlpbmcgcmVzb3VyY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZSk7Ci0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCQotCQkJCS8vIENoZWNrIGxvY2F0aW9uCi0JCQkJdHJ5IHsKLQkJCQkJLy8gRG9uJ3QgZmFpbCBhIHRlc3QgY2FzZSBiYXNlZCBvbiBsb2NhdGlvbiwgYmVjYXVzZSB0aGUgbGluZSBudW1iZXIgY2FsY3VsYXRpb24KLQkJCQkJLy8gaXMgZGlmZmVyZW50IGluIFVJICYgYmF0Y2gsIGFuZCB0aGUgdGVzdCBjYXNlcyBhcmUgYmFzZWQgb24gVUkgdGVzdCByZXN1bHRzLgotCQkJCQkvLyBTaG91bGQgc3RpbGwgYWxlcnQgdGhlIHVzZXIsIHRob3VnaC4KLQkJCQkJdmVyaWZ5TG9jYXRpb24oYnVmZmVyLCB0ZXN0TmFtZSwgc3ViVGFza05hbWUsICBtbWQsIG1hcmtlcik7Ci0JCQkJfQotCQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlKTsKLQkJCQkJfQotCQkJCQlidWZmZXIud3JpdGUoIkVSUk9SW1Rlc3RjYXNlOjoiICsgdGVzdE5hbWUgKyAiXS4gQ29yZUV4Y2VwdGlvbiBjYXVnaHQgd2hpbGUgdmVyaWZ5aW5nIGxpbmUgbnVtYmVyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKG1tZExpc3Quc2l6ZSgpICE9IDApIHsKLQkJCQlfbWlzc2luZy5hZGRBbGwobW1kTGlzdCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCQlwYXNzZWQgPSBmYWxzZTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKCEoKF9taXNzaW5nLnNpemUoKSA9PSAwKSAmJiAoX2V4dHJhLnNpemUoKSA9PSAwKSkpIHsKLQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCX0KLQkJCQotCQkJaWYocGFzc2VkKSB7Ci0JCQkJYnVmZmVyLndyaXRlKCJQQVNTW1Rlc3RjYXNlOjoiICsgdGVzdE5hbWUgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgdHJ1ZSk7IC8vIElmIGZhaWwsIHdpbGwgYmUgcmVwb3J0ZWQgaW4gdGhlIGV4dHJhICYgbWlzc2luZyBiZWxvdy4KLQkJCX0KLQkJCWVsc2UgewotCQkJCWJ1ZmZlci53cml0ZSgiRkFJTFtUZXN0Y2FzZTo6IiArIHRlc3ROYW1lICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkvLyBObyBwb2ludCBpbiBsaXN0aW5nIHRoZSBtbWRMaXN0IGJlY2F1c2UgaXQncyBlbXB0eSBieSB0aGUgdGltZSB0aGUgZmluYWxseSBibG9jayBpcyByZWFjaGVkCi0JCQkJaWYoaXNWZXJib3NlKCkpIHsKLQkJCQkJYnVmZmVyLndyaXRlKCJMaXN0IG9mIG1hcmtlcnMgcmVwb3J0ZWQ6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGVidWcoYnVmZmVyLCBtZXNzYWdlcyk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBSZXBvcnQgdGhlIG1pc3NpbmcgbWFya2VycyBhZnRlciB0aGUgTU1EIGxpc3QgaXMgc29ydGVkCi0JCQlDb2xsZWN0aW9ucy5zb3J0KF9taXNzaW5nLCBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlQ29tcGFyYXRvcihidWZmZXIsIGlzVmVyYm9zZSgpKSk7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IF9taXNzaW5nLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gKE1lc3NhZ2VNZXRhRGF0YSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0TmFtZSwgc3ViVGFza05hbWUsIElUZXN0U3RhdHVzLkZBSUwsIGJ1ZmZlciwgIkVSUk9SW21pc3NpbmcgbWVzc2FnZV06ICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtbWQpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQkvLyBSZXBvcnQgdGhlIGV4dHJhIG1hcmtlcnMgYWZ0ZXIgdGhleSdyZSBzb3J0ZWQuCi0JCQlDb2xsZWN0aW9ucy5zb3J0KF9leHRyYSwgTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZUNvbXBhcmF0b3IoYnVmZmVyLCBpc1ZlcmJvc2UoKSkpOwotCQkJaXRlcmF0b3IgPSBfZXh0cmEuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXModGVzdE5hbWUsIHN1YlRhc2tOYW1lLCBJVGVzdFN0YXR1cy5GQUlMLCBidWZmZXIsICJFUlJPUltleHRyYSBtZXNzYWdlXTogIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1hcmtlcikgKyAiLCBUZXh0IGlzOiBcIiIgKyBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlKG1hcmtlcikgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkKLQkJCWlmKG51bUV4cGVjdGVkICE9IG51bVJlcG9ydGVkKSB7Ci0JCQkJYnVmZmVyLndyaXRlKCJXcm9uZyBudW1iZXIgb2YgbWVzc2FnZXMgcmVwb3J0ZWQuIEV4cGVjdGVkICIgKyBudW1FeHBlY3RlZCArICIgYW5kIGdvdCAiICsgbnVtUmVwb3J0ZWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJYnVmZmVyLndyaXRlKCJOdW1iZXIgb2YgZXh0cmEgbWVzc2FnZXM6ICIgKyBfZXh0cmEuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLndyaXRlKCJOdW1iZXIgb2YgbWlzc2luZyBtZXNzYWdlczogIiArIF9taXNzaW5nLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci53cml0ZSgiTnVtYmVyIG9mIG1hdGNoZWQgbWVzc2FnZXM6ICIgKyBudW1NYXRjaGVkKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLndyaXRlKCJFbmQgb2YgdGVzdCBjYXNlOiAiICsgdGVzdE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQlfZXh0cmEuY2xlYXIoKTsgLy8gQ2xlYXIgdGhlIGxpc3Qgb2YgZXh0cmEgbWFya2VycyAoc3RvcmVkIGluIGEgbGlzdCB0byBtYWtlIHJlYWRpbmcgZWFzaWVyKS4KLQkJCV9taXNzaW5nLmNsZWFyKCk7IC8vIENsZWFyIHRoZSBsaXN0IG9mIG1pc3NpbmcgbWFya2VycyAoc3RvcmVkIGluIGEgbGlzdCB0byBtYWtlIHJlYWRpbmcgZWFzaWVyKS4KLQkJfQotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwcml2YXRlIGludCB2ZXJpZnlTZXZlcml0eShJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHRlc3ROYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIE1lc3NhZ2VNZXRhRGF0YSBtbWQsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIElmIHByZWZpeFNldmVyaXR5IGlzIG51bGwsIG1hcmtlciBoYXMgbm8gcHJlZml4LCB0aGVyZWZvcmUgaXQgaGFzIG5vIHNldmVyaXR5Ci0JCUludGVnZXIgcHJlZml4U2V2ZXJpdHkgPSBNZXNzYWdlVXRpbGl0eS5nZXRTZXZlcml0eShtYXJrZXIpOwotCQlpZihwcmVmaXhTZXZlcml0eSAhPSBudWxsKSB7Ci0JCQlJbnRlZ2VyIHNldmVyaXR5ID0gKEludGVnZXIpbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKTsgLy8gSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HLCBJTWFya2VyLlNFVkVSSVRZX0lORk8KLQkJCWJvb2xlYW4gc2V2ZXJpdHlFcXVhbCA9IHRydWU7Ci0JCQlpZigoc2V2ZXJpdHkgPT0gbnVsbCkgJiYgKHByZWZpeFNldmVyaXR5ID09IG51bGwpKSB7Ci0JCQkJc2V2ZXJpdHlFcXVhbCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmKHNldmVyaXR5ID09IG51bGwpIHsKLQkJCQlzZXZlcml0eUVxdWFsID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIGlmKHByZWZpeFNldmVyaXR5ID09IG51bGwpIHsKLQkJCQlzZXZlcml0eUVxdWFsID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXZlcml0eUVxdWFsID0gc2V2ZXJpdHkuZXF1YWxzKHByZWZpeFNldmVyaXR5KTsKLQkJCX0KLQkJCQotCQkJaWYoIXNldmVyaXR5RXF1YWwpIHsKLQkJCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgSVRlc3RTdGF0dXMuV0FSTiwgYnVmZmVyLCAiV0FSTklOR1ttaXNtYXRjaGluZyBzZXZlcml0eV06IGV4cGVjdGVkICIgKyBnZXRTZXZlcml0eUNoYXIocHJlZml4U2V2ZXJpdHkpICsgIiwgZ290ICIgKyBnZXRTZXZlcml0eUNoYXIoc2V2ZXJpdHkpICsgIiBvbiBtYXJrZXIgIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1hcmtlcikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCXJldHVybiBJVGVzdFN0YXR1cy5XQVJOOwotCQkJfQotCQl9Ci0JCQkKLQkJcmV0dXJuIElUZXN0U3RhdHVzLlBBU1M7Ci0JfQotCQotCXByaXZhdGUgaW50IHZlcmlmeVJlc291cmNlKElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgdGVzdE5hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgTWVzc2FnZU1ldGFEYXRhIG1tZCwgSU1hcmtlciBtYXJrZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHJlc291cmNlID0gTWVzc2FnZVV0aWxpdHkuZ2V0UmVzb3VyY2UobWFya2VyKTsKLQkJaWYoIXJlc291cmNlLmVxdWFscyhtbWQuZ2V0UmVzb3VyY2UoKSkpIHsKLQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXModGVzdE5hbWUsIHN1YlRhc2tOYW1lLCBJVGVzdFN0YXR1cy5XQVJOLCBidWZmZXIsICJJTkZPW3dyb25nIHJlc291cmNlXTogZXhwZWN0ZWQgIiArIG1tZC5nZXRSZXNvdXJjZSgpICsgIiwgZ290ICIgKyByZXNvdXJjZSArICIgb24gbWFya2VyICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtYXJrZXIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXJldHVybiBJVGVzdFN0YXR1cy5XQVJOOwotCQl9Ci0JCXJldHVybiBJVGVzdFN0YXR1cy5QQVNTOwotCX0KLQkKLQlwcml2YXRlIGludCB2ZXJpZnlMb2NhdGlvbihJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHRlc3ROYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIE1lc3NhZ2VNZXRhRGF0YSBtbWQsIElNYXJrZXIgbWFya2VyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIEVpdGhlciBjb21wYXJlIHR3byBsaW5lIG51bWJlcnMgb3IgdHdvIHRleHQgbG9jYXRpb25zLCBidXQgbm90IGEgbGluZSBudW1iZXIgdG8gYSB0ZXh0IGxvY2F0aW9uLgotCQlpZihtbWQuaXNTZXRMaW5lTnVtYmVyKCkpIHsKLQkJCUludGVnZXIgbGluZU51bWJlciA9IE1lc3NhZ2VVdGlsaXR5LmdldExpbmVOdW1iZXIobWFya2VyKTsKLQkJCWlmKGxpbmVOdW1iZXIgPT0gbnVsbCkgewotCQkJCS8vIE1hcmtlciBoYXMgYSB0ZXh0IGxvY2F0aW9uLCBub3QgYSBsaW5lIG51bWJlci4KLQkJCQlyZXR1cm4gSVRlc3RTdGF0dXMuUEFTUzsKLQkJCX0KLQkJCQotCQkJaWYobGluZU51bWJlci5pbnRWYWx1ZSgpICE9IG1tZC5nZXRMaW5lTnVtYmVyKCkpIHsKLQkJCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgSVRlc3RTdGF0dXMuV0FSTiwgYnVmZmVyLCAiSU5GT1t3cm9uZyBsb2NhdGlvbl06IGV4cGVjdGVkICIgKyBtbWQuZ2V0TGluZU51bWJlcigpICsgIiwgZ290ICIgKyBsaW5lTnVtYmVyICsgIiBvbiBtYXJrZXIgIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1hcmtlcikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCXJldHVybiBJVGVzdFN0YXR1cy5XQVJOOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYobW1kLmlzU2V0TG9jYXRpb24oKSkgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gTWVzc2FnZVV0aWxpdHkuZ2V0TG9jYXRpb24obWFya2VyKTsKLQkJCWlmKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCQkvLyBtYXJrZXIgaGFzIGEgbGluZSBudW1iZXIsIG5vdCBhIHRleHQgbG9jYXRpb24KLQkJCQlyZXR1cm4gSVRlc3RTdGF0dXMuUEFTUzsKLQkJCX0KLQkJCQotCQkJaWYoIShtbWQuZ2V0TG9jYXRpb24oKS5lcXVhbHMobG9jYXRpb24pKSkgewotCQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXModGVzdE5hbWUsIHN1YlRhc2tOYW1lLCBJVGVzdFN0YXR1cy5XQVJOLCBidWZmZXIsICJJTkZPW3dyb25nIGxvY2F0aW9uXTogZXhwZWN0ZWQgIiArIG1tZC5nZXRMb2NhdGlvbigpICsgIiwgZ290ICIgKyBsb2NhdGlvbiArICIgb24gbWFya2VyICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtYXJrZXIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlyZXR1cm4gSVRlc3RTdGF0dXMuV0FSTjsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIElUZXN0U3RhdHVzLlBBU1M7Ci0JfQotCQotCQotCXByaXZhdGUgTWVzc2FnZU1ldGFEYXRhIGdldE1hdGNoaW5nTWV0YURhdGEoSUJ1ZmZlciBidWZmZXIsIExpc3QgbW1kTGlzdCwgSU1hcmtlciBtYXJrZXIpIHsKLQkJaW50IHJlc3VsdCA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaChtbWRMaXN0LCBtYXJrZXIsIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2VDb21wYXJhdG9yKGJ1ZmZlciwgaXNWZXJib3NlKCkpKTsKLQkJaWYocmVzdWx0IDwgMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChNZXNzYWdlTWV0YURhdGEpbW1kTGlzdC5nZXQocmVzdWx0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9CVlRWYWxpZGF0aW9uVXRpbGl0eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9CVlRWYWxpZGF0aW9uVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWZmMGVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvQlZUVmFsaWRhdGlvblV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKgotICogKGMpIENvcHlyaWdodCAyMDAxIE15Q29ycG9yYXRpb24uCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LkJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LklUZXN0Y2FzZU1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuT3BlcmF0aW9uVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5UZXN0Y2FzZVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5WYWxpZGF0b3JUZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLQotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCVlRWYWxpZGF0aW9uVXRpbGl0eSB7Ci0JcHJpdmF0ZSBCVlRWYWxpZGF0aW9uVXRpbGl0eSgpIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JNZXRhRGF0YSBnZXRWYWxpZGF0b3JNZXRhRGF0YShJTWFya2VyIG1hcmtlcikgewotCQlTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXZhbGlkYXRvckNsYXNzTmFtZSA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WQUxJREFUSU9OX01BUktFUl9PV05FUikudG9TdHJpbmcoKTsKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2YWxpZGF0b3JDbGFzc05hbWUpOwotCQkJcmV0dXJuIHZtZDsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsJCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0cnkgewotCQkJSU1hcmtlcltdIGFsbE1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZBTElEQVRJT05fTUFSS0VSLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsgLy8gZmFsc2UgbWVhbnMgb25seSBjb25zaWRlciBQUk9CTEVNX01BUktFUiwgbm90IHZhcmlhbnRzIG9mIFBST0JMRU1fTUFSS0VSLiBTaW5jZSBhZGRUYXNrIG9ubHkgYWRkcyBQUk9CTEVNX01BUktFUiwgd2UgZG9uJ3QgbmVlZCB0byBjb25zaWRlciBpdHMgc3VidHlwZXMuCi0JCQlyZXR1cm4gYWxsTWFya2VyczsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxWYWxpZGF0aW9uTWFya2VycygpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpOwotCQlJTWFya2VyW10gbWFya2VycyA9IGdldFZhbGlkYXRpb25UYXNrcyhyb290KTsKLQkJaWYobWFya2VycyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXdvcmtzcGFjZS5kZWxldGVNYXJrZXJzKG1hcmtlcnMpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZShGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCWludCBleHRJbmRleCA9IGZpbGVOYW1lLmluZGV4T2YoJy4nKTsKLQkJaWYoZXh0SW5kZXggPiAwKSB7Ci0JCQlyZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGV4dEluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBmaWxlTmFtZTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFF1YWxpZmllZExvZ05hbWUoU3RyaW5nIGxvZ0ZpbGVOYW1lKSB7Ci0JCVN0cmluZyBkaXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCUZpbGUgZGlyV2l0aEZpbGUgPSBuZXcgRmlsZShkaXIsIGxvZ0ZpbGVOYW1lKTsKLQkJcmV0dXJuIGRpcldpdGhGaWxlLnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RbXSBnZXRQcm9qZWN0cyhJVGVzdGNhc2VNZXRhRGF0YVtdIHRtZHMpIHsKLQkJTGlzdCBzb3J0ZWRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IoaW50IGk9MDsgaTx0bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwID0gVGVzdGNhc2VVdGlsaXR5LmZpbmRQcm9qZWN0KHRtZHNbaV0pOwotCQkJaWYoKHAgIT0gbnVsbCkgJiYgKHAuZXhpc3RzKCkpICYmIChwLmlzT3BlbigpKSAmJiAhc29ydGVkTGlzdC5jb250YWlucyhwKSkgewotCQkJCXNvcnRlZExpc3QuYWRkKHApOwotCQkJfQotCQl9Ci0JCUNvbGxlY3Rpb25zLnNvcnQoc29ydGVkTGlzdCwgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKXsKLQkJCQlpZigoYSA9PSBudWxsKSAmJiAoYiA9PSBudWxsKSkgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJZWxzZSBpZihhID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfQotCQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkKLQkJCQlpZigoYSBpbnN0YW5jZW9mIElQcm9qZWN0KSAmJiAoYiBpbnN0YW5jZW9mIElQcm9qZWN0KSkgewotCQkJCQlyZXR1cm4gKChJUHJvamVjdClhKS5nZXROYW1lKCkuY29tcGFyZVRvKCgoSVByb2plY3QpYikuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIC0xOyAvLyBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZS4uLmJvdGggT2JqZWN0cyBzaG91bGQgYWx3YXlzIGJlIElQcm9qZWN0cwotCQkJfQotCQl9KTsKLQkJSVByb2plY3RbXSByZXN1bHQgPSBuZXcgSVByb2plY3Rbc29ydGVkTGlzdC5zaXplKCldOwotCQlzb3J0ZWRMaXN0LnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElUZXN0Y2FzZU1ldGFEYXRhW10gZ2V0VGVzdHMoSVRlc3RjYXNlTWV0YURhdGFbXSB0bWRzLCBJUHJvamVjdCBwKSB7Ci0JCUlUZXN0Y2FzZU1ldGFEYXRhW10gdGVtcCA9IG5ldyBJVGVzdGNhc2VNZXRhRGF0YVt0bWRzLmxlbmd0aF07Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvcihpbnQgaT0wOyBpPHRtZHMubGVuZ3RoOyBpKyspIHsKLQkJCUlUZXN0Y2FzZU1ldGFEYXRhIHRtZCA9IHRtZHNbaV07Ci0JCQlpZih0bWQuZ2V0UHJvamVjdE5hbWUoKS5lcXVhbHMocC5nZXROYW1lKCkpKSB7Ci0JCQkJdGVtcFtjb3VudCsrXSA9IHRtZDsKLQkJCX0KLQkJfQotCQkKLQkJSVRlc3RjYXNlTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgSVRlc3RjYXNlTWV0YURhdGFbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRlbXAsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIHZhbGlkYXRvciB0ZXN0cy4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBpbnQgbnVtVmFsaWRhdG9yVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdFtdIHByb2plY3RzKSB0aHJvd3MgQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CQotCQlCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpOwotCQkKLQkJaW50IHRvdGFsVGVzdHMgPSAwOwotCQlmb3IoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0ZXN0cyA9IHJlYWRlci5nZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCBwcm9qZWN0KTsKLQkJCWlmKCh0ZXN0cyA9PSBudWxsKSB8fCAodGVzdHMubGVuZ3RoID09IDApKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCXRvdGFsVGVzdHMgKz0gdGVzdHMubGVuZ3RoOwotCQl9Ci0JCQotCQlyZXR1cm4gdG90YWxUZXN0czsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBwdWJsaWMgKHZpc2libGUpIHRlc3QgY2FzZXMgZm9yIGEgcGFydGljdWxhciBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0W10gcHJvamVjdHMpIHsKLQkJU2V0IHRlc3RTZXQgPSBuZXcgSGFzaFNldCgpOwkJCi0JCWZvcihpbnQgaT0wOyBpPHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRlc3RzID0gZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgcHJvamVjdCk7Ci0JCQlpZih0ZXN0cy5sZW5ndGggPT0gMCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlmb3IoaW50IGo9MDsgajx0ZXN0cy5sZW5ndGg7IGorKykgewotCQkJCVZhbGlkYXRvclRlc3RjYXNlIHZ0ID0gdGVzdHNbal07Ci0JCQkJdGVzdFNldC5hZGQodnQpOwotCQkJfQotCQl9Ci0JCQotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVt0ZXN0U2V0LnNpemUoKV07Ci0JCXRlc3RTZXQudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdmlzaWJsZSB2YWxpZGF0b3IgdGVzdCBjYXNlcyBmb3IgYSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKTsKLQotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRlc3RzID0gcmVhZGVyLmdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIHByb2plY3QpOwotCQlpZih0ZXN0cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFZhbGlkYXRvclRlc3RjYXNlWzBdOwotCQl9Ci0JCQotCQlyZXR1cm4gdGVzdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBvZiB0aGUgdGVzdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBPcGVyYXRpb25UZXN0Y2FzZVtdIGdldE9wZXJhdGlvblRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldE9wZXJhdGlvblRlc3RzKG1vbml0b3IsIChTdHJpbmcpbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgT3BlcmF0aW9uVGVzdGNhc2VbXSBnZXRPcGVyYXRpb25UZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIHJlYWRlciA9IEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKTsKLQotCQlPcGVyYXRpb25UZXN0Y2FzZVtdIHRlc3RzID0gcmVhZGVyLmdldE9wZXJhdGlvblRlc3RzKG1vbml0b3IsIHByb2plY3QpOwotCQlpZih0ZXN0cyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IE9wZXJhdGlvblRlc3RjYXNlWzBdOwotCQl9Ci0JCQotCQlyZXR1cm4gdGVzdHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBvZiB0aGUgdGVzdHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIChTdHJpbmcpbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbGwgb2YgdGhlIHRlc3RzLCB2aXNpYmxlIGFuZCBpbnZpc2libGUsIG93bmVkIGJ5IHRoZSB2YWxpZGF0b3IgbWV0YWRhdGEuCi0JICovCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCVZhbGlkYXRvclRlc3RjYXNlW10gYWxsVGVzdHMgPSBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgKFN0cmluZyludWxsKTsKLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0ZW1wID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlW2FsbFRlc3RzLmxlbmd0aF07Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvcihpbnQgaT0wOyBpPGFsbFRlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZSB0ZXN0dm1kID0gYWxsVGVzdHNbaV07Ci0JCQlpZih2bWQuZXF1YWxzKHRlc3R2bWQuZ2V0VmFsaWRhdG9yTWV0YURhdGEoKSkpIHsKLQkJCQl0ZW1wW2NvdW50KytdID0gdGVzdHZtZDsKLQkJCX0KLQkJfQotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHJlc3VsdCA9IG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVtjb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRWYWxpZGF0b3JzVGhhdEhhdmVUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0ZXN0cyA9IGdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IpOwotCQlTZXQgdGVtcCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvcihpbnQgaT0wOyBpPHRlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZSB2dCA9IHRlc3RzW2ldOwotCQkJdGVtcC5hZGQodnQuZ2V0VmFsaWRhdG9yTWV0YURhdGEoKSk7Ci0JCX0KLQkJCi0JCVZhbGlkYXRvck1ldGFEYXRhW10gdm1kcyA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVt0ZW1wLnNpemUoKV07Ci0JCXRlbXAudG9BcnJheSh2bWRzKTsKLQkJcmV0dXJuIHZtZHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9CdWlsZEluZm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvQnVpbGRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNjEyYWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9CdWlsZEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWw7Ci1wdWJsaWMgY2xhc3MgQnVpbGRJbmZvIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIkxpY2Vuc2VkIE1hdGVyaWFscyAtLSBQcm9wZXJ0eSBvZiBJQk1cbihjKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiwgMjAwMSwyMDAzXG5VUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGZnQnVpbGRMZXZlbCA9ICIyMDAzMTExMl8xOTE1LVdCMjEyLUFELVY1MTFELVc1IjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NBQnVpbGRMZXZlbCgpIHsgcmV0dXJuIGZnQnVpbGRMZXZlbDsgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9SdW5UZXN0c09wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9SdW5UZXN0c09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjJiMDMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvUnVuVGVzdHNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5JVGVzdGNhc2VNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci0KLQotLyoqCi0gKiBSdW4gdGhlIEJWVCBvZiB0aGUgdmFsaWRhdG9yOiBhIGZ1bGwgdGVzdCwgYW4gaW5jcmVtZW50YWwgdGVzdCwKLSAqIGFuZCBhbiBhc3luY2hyb25vdXMgdGVzdCwgaWYgYXBwbGljYWJsZS4KLSAqIAotICogVGhpcyBjbGFzcyBtdXN0IE5PVCBiZSB3cmFwcGVkIGluIGFuIElXb3Jrc3BhY2VSdW5uYWJsZSBvciAKLSAqIHRoZXJlIHdpbGwgYmUgZGVhZGxvY2sgZHVyaW5nIHRoZSBhc3luY2hyb25vdXMgdmFsaWRhdGlvbiB0ZXN0IQotICogKFJlYWQgdGhlIGNvbW1lbnQgYWJvdmUgVlRocmVhZE1hbmFnZXI6OmlzRG9uZSgpIGZvciBkZXRhaWxzLikKLSAqLwotcHVibGljIGNsYXNzIFJ1blRlc3RzT3BlcmF0aW9uIHsKLQlwcml2YXRlIHN0YXRpYyBSdW5UZXN0c09wZXJhdGlvbiBfaW5zdCA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBSdW5UZXN0c09wZXJhdGlvbigpIHsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSdW5UZXN0c09wZXJhdGlvbiBzaW5nbGV0b24oKSB7Ci0JCWlmKF9pbnN0ID09IG51bGwpIHsKLQkJCV9pbnN0ID0gbmV3IFJ1blRlc3RzT3BlcmF0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0OwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZSNydW4oSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUJ1ZmZlciBidWZmZXIsIElUZXN0Y2FzZU1ldGFEYXRhW10gYWxsVG1kcykgewotCQlJUHJvamVjdFtdIHByb2plY3RzID0gQlZUVmFsaWRhdGlvblV0aWxpdHkuZ2V0UHJvamVjdHMoYWxsVG1kcyk7Ci0JCWZvcihpbnQgaT0wOyBpPHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQlJVGVzdGNhc2VNZXRhRGF0YVtdIHRtZHMgPSBCVlRWYWxpZGF0aW9uVXRpbGl0eS5nZXRUZXN0cyhhbGxUbWRzLCBwcm9qZWN0KTsKLQkJCQotCQkJZm9yKGludCBqPTA7IGo8dG1kcy5sZW5ndGg7IGorKykgewotCQkJCUlUZXN0Y2FzZU1ldGFEYXRhIHRtZCA9IHRtZHNbal07Ci0JCQkJdG1kLnJ1bihidWZmZXIsIHByb2plY3QpOwotCQkJfQotCQl9Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9BSW1wb3J0T3BlcmF0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9BSW1wb3J0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTI4YjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvQUltcG9ydE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWwuQlZUVmFsaWRhdGlvblV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvbkZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyB0aGF0IHByb3ZpZGVzIHNvbWUgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgdG8gY3JlYXRlCi0gKiBhIHByb2plY3QgYW5kIHBvcHVsYXRlIGl0IHdpdGggdGhlIGNvbnRlbnRzIG9mIGEgZmlsZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFJbXBvcnRPcGVyYXRpb24gaW1wbGVtZW50cyBJSW1wb3J0T3BlcmF0aW9uIHsKLQlwcml2YXRlIHZvaWQgcHJlUnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5zdXNwZW5kQWxsVmFsaWRhdGlvbih0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBvc3RSdW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVZhbGlkYXRpb25GcmFtZXdvcmsuZ2V0RGVmYXVsdCgpLnN1c3BlbmRBbGxWYWxpZGF0aW9uKGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlT2xkUHJvamVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQkvLyBkZWxldGUgYW55IGV4aXN0aW5nIHByb2plY3Qgb2YgdGhpcyBuYW1lCi0JCUlQcm9qZWN0IGV4aXN0aW5nUHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCWlmIChleGlzdGluZ1Byb2plY3QuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJZXhpc3RpbmdQcm9qZWN0LmRlbGV0ZSh0cnVlLCBudWxsKTsgLy8gbnVsbD1ubyBwcm9ncmVzcyBtb24gKGRvbid0IHNjYXJlIHVzZXJzKQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZXhjKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBGaWxlIGZpbGUpIHsKLQkJYm9vbGVhbiBpbXBvcnRlZCA9IHRydWU7Ci0JCWludCBleGVjdXRpb25NYXAgPSAweDA7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJaWYobW9uaXRvciA9PSBudWxsKSB7Ci0JCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQl9Ci0JCQkKLQkJCXByZVJ1bihtb25pdG9yKTsKLQkJCQotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBCVlRWYWxpZGF0aW9uVXRpbGl0eS5nZXRQcm9qZWN0TmFtZShmaWxlKTsKLQkJCQlkZWxldGVPbGRQcm9qZWN0KG1vbml0b3IsIHByb2plY3ROYW1lKTsKLQkJCQlwcm9qZWN0ID0gY3JlYXRlTmV3UHJvamVjdChtb25pdG9yLCBwcm9qZWN0TmFtZSwgZmlsZSk7Ci0JCQkJCi0JCQkJaWYoKHByb2plY3QgPT0gbnVsbCkgfHwgKCFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSkgewotCQkJCQlleGVjdXRpb25NYXAgfD0gMHgxOwotCQkJCQlpbXBvcnRlZCA9IGZhbHNlOwotCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJDYW5ub3QgaW1wb3J0IGZpbGUgYmVjYXVzZSBJUHJvamVjdCBpcyBudWxsIG9yIG5vdCBhY2Nlc3NpYmxlLiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbW9uaXRvci5zdWJUYXNrKG1lc3NhZ2UpOwotCQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmxvZ01lc3NhZ2UoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSk7Ci0JCQkJfQotCQkJCWVsc2UgewkJCQkKLQkJCQkJaW1wb3J0ZWQgPSBpbXBvcnRGaWxlKG1vbml0b3IsIHByb2plY3QsIGZpbGUpOwotCQkJCQlleGVjdXRpb25NYXAgfD0gMHgyOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4NDsKLQkJCQlpbXBvcnRlZCA9IGZhbHNlOwotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlwb3N0UnVuKG1vbml0b3IpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYoIWltcG9ydGVkKSB7Ci0JCQkJU3RyaW5nIHByb2plY3ROYW1lID0gKHByb2plY3QgPT0gbnVsbCkgPyBmaWxlLmdldE5hbWUoKSA6IHByb2plY3QuZ2V0TmFtZSgpOwotCQkJCVZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkubG9nTWVzc2FnZShJU3RhdHVzLkVSUk9SLCAKLQkJCQkJIkFJbXBvcnRPcGVyYXRpb24gZm9yICIgKyBwcm9qZWN0TmFtZSArICIgd2FzIHVuc3VjY2Vzc2Z1bC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltcG9ydGVkOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVByb2plY3QgY3JlYXRlTmV3UHJvamVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyBwcm9qZWN0TmFtZSwgRmlsZSBpbnB1dEZpbGUpOwotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBmaWxlIHdhcyBpbXBvcnRlZCBzdWNjZXNzZnVsbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaW1wb3J0RmlsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIEZpbGUgZmlsZSk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9CdWlsZEluZm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0J1aWxkSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDVkY2JlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0J1aWxkSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXA7Ci1wdWJsaWMgY2xhc3MgQnVpbGRJbmZvIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIkxpY2Vuc2VkIE1hdGVyaWFscyAtLSBQcm9wZXJ0eSBvZiBJQk1cbihjKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiwgMjAwMSwyMDAzXG5VUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGZnQnVpbGRMZXZlbCA9ICIyMDAzMTExMl8xOTE1LVdCMjEyLUFELVY1MTFELVc1IjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NBQnVpbGRMZXZlbCgpIHsgcmV0dXJuIGZnQnVpbGRMZXZlbDsgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvQ2hlY2tGb3JVbnRlc3RlZFByb3BlcnRpZXNPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0NoZWNrRm9yVW50ZXN0ZWRQcm9wZXJ0aWVzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YzcyMzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvQ2hlY2tGb3JVbnRlc3RlZFByb3BlcnRpZXNPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXA7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLlByb3BlcnR5TGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUud29ya2JlbmNoaW1wbC5QbHVnaW5Qcm9wZXJ0eUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuVmFsaWRhdGlvblR5cGVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuTWVzc2FnZVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5WYWxpZGF0b3JUZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWwuQlZUVmFsaWRhdGlvblV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci0vKioKLSAqIEdlbmVyYXRlIGEgRlZUIHRlc3QgY2FzZSBmb3IgZXZlcnkgRUpCIFZhbGlkYXRvciB2YWxpZGF0aW9uIG1hcmtlciBvbiBlYWNoCi0gKiBzZWxlY3RlZCBwcm9qZWN0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2hlY2tGb3JVbnRlc3RlZFByb3BlcnRpZXNPcGVyYXRpb24gaW1wbGVtZW50cyBJV29ya3NwYWNlUnVubmFibGUgewotCXByaXZhdGUgVmFsaWRhdG9yTWV0YURhdGEgX3ZtZCA9IG51bGw7Ci0JcHJpdmF0ZSBJQnVmZmVyIF9idWZmZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9yZXNvdXJjZUJ1bmRsZU5hbWUgPSBudWxsOwotCXB1YmxpYyBDaGVja0ZvclVudGVzdGVkUHJvcGVydGllc09wZXJhdGlvbihJQnVmZmVyIGJ1ZmZlciwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBTdHJpbmcgcmVzb3VyY2VCdW5kbGVOYW1lKSB7Ci0JCXNldFZhbGlkYXRvck1ldGFEYXRhKHZtZCk7Ci0JCXNldEJ1ZmZlcihidWZmZXIpOwotCQlzZXRSZXNvdXJjZUJ1bmRsZU5hbWUocmVzb3VyY2VCdW5kbGVOYW1lKTsKLQl9Ci0JcHVibGljIElCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlyZXR1cm4gX2J1ZmZlcjsKLQl9Ci0Jdm9pZCBzZXRCdWZmZXIoSUJ1ZmZlciBiKSB7Ci0JCV9idWZmZXIgPSBiOwotCX0KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGEgZ2V0VmFsaWRhdG9yTWV0YURhdGEoKSB7Ci0JCXJldHVybiBfdm1kOwotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRQbHVnaW5JZChWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJdHJ5IHsKLQkJCS8vIFRPRE8gUmVtb3ZlIHRoaXMgaGFjayBvbmNlIGEgZ2V0dGVyIGhhcyBiZWVuIGFkZGVkIHRvIFZhbGlkYXRvck1ldGFEYXRhIGZvciBpdHMgcGx1Z2luSWQuCi0JCQlpZiAodm1kICE9IG51bGwpIHsKLQkJCQlDbGFzc0xvYWRlciBjbCA9IHZtZC5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0JCQkJSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLQkJCQlJUGx1Z2luRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gcmVnaXN0cnkuZ2V0UGx1Z2luRGVzY3JpcHRvcnMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlQbHVnaW5EZXNjcmlwdG9yIGRlc2MgPSBkZXNjcmlwdG9yc1tpXTsKLQkJCQkJaWYgKGRlc2MuZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKS5lcXVhbHMoY2wpKSB7Ci0JCQkJCQlyZXR1cm4gZGVzYy5nZXRVbmlxdWVJZGVudGlmaWVyKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZXhjKSB7Ci0JCQlCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQl2b2lkIHNldFZhbGlkYXRvck1ldGFEYXRhKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlfdm1kID0gdm1kOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpIHsKLQkJcmV0dXJuIF9yZXNvdXJjZUJ1bmRsZU5hbWU7Ci0JfQotCXZvaWQgc2V0UmVzb3VyY2VCdW5kbGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCV9yZXNvdXJjZUJ1bmRsZU5hbWUgPSBuYW1lOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZSNydW4oSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3QgcExpbmVzID0gbnVsbDsKLQkJTGlzdCB1bnRlc3RlZExpbmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRlc3RlZExpbmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpOwotCQkvLyBBc3N1bWUgdGhhdCB0aGUgQlZUIHRlc3RzIHdlcmUgcnVuIG9uIHRoZSBwcm9qZWN0cyBiZWZvcmUgdGhpcyBtZW51Ci0JCS8vIGFjdGlvbiB3YXMgY2xpY2tlZC4KLQkJLy8gTG9hZCBhbmQgcGFyc2UgdGhlIC5wcm9wZXJ0aWVzIGZpbGUgdG8ga25vdyB3aGF0IG1lc3NhZ2UgaWRzIHRvIGxvb2sKLQkJLy8gZm9yLgotCQlTdHJpbmcgcHJvcEZpbGVOYW1lID0gZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCk7Ci0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IGdldFZhbGlkYXRvck1ldGFEYXRhKCk7Ci0JCW1vbml0b3Iuc3ViVGFzaygiQXR0ZW1wdGluZyB0byBsb2FkIGZpbGU6ICIgKyBwcm9wRmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwbHVnaW5JZCA9IGdldFBsdWdpbklkKHZtZCk7Ci0JCWlmIChwbHVnaW5JZCA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbXNnID0gIkNhbm5vdCBsb2FkIHBsdWdpbiBpZCBmb3IgdmFsaWRhdG9yICIgKyB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKTsvLyROT04tTkxTLTEkCQotCQkJbW9uaXRvci5zdWJUYXNrKG1zZyk7IAkJCi0JCQlCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmxvZyhMZXZlbC5TRVZFUkUsIG1zZyk7IAotCQkJcmV0dXJuOwotCQl9Ci0JCVBsdWdpblByb3BlcnR5RmlsZSBwRmlsZSA9IG5ldyBQbHVnaW5Qcm9wZXJ0eUZpbGUocGx1Z2luSWQsIHByb3BGaWxlTmFtZSk7Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCQltb25pdG9yLnN1YlRhc2soIlBhcnNpbmcuIik7IC8vJE5PTi1OTFMtMSQKLQkJcExpbmVzID0gcEZpbGUuZ2V0UHJvcGVydHlMaW5lcygpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHBMaW5lcywgY29tcGFyYXRvcik7IC8vIGZhbHNlID0gbm8gdmVyYm9zZSBvdXRwdXQKLQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCW1vbml0b3Iuc3ViVGFzaygiTG9hZGluZyB0ZXN0IG1lc3NhZ2VzLiIpOyAvLyROT04tTkxTLTEkCi0JCVZhbGlkYXRvclRlc3RjYXNlW10gdG1kcyA9IEJWVFZhbGlkYXRpb25VdGlsaXR5LmdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIHZtZCk7Ci0JCWZvciAoaW50IGsgPSAwOyBrIDwgdG1kcy5sZW5ndGg7IGsrKykgewotCQkJVmFsaWRhdG9yVGVzdGNhc2UgdG1kID0gdG1kc1trXTsKLQkJCUxpc3QgbXNzZyA9IHRtZC5nZXRNZXNzYWdlcyhWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT04pOwotCQkJdGVzdGVkTGluZXMuYWRkQWxsKG1zc2cpOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnNvcnQodGVzdGVkTGluZXMsIGNvbXBhcmF0b3IpOwotCQltb25pdG9yLnN1YlRhc2soIkNvbXBhcmluZy4iKTsgLy8kTk9OLU5MUy0xJAotCQlJdGVyYXRvciBpdGVyYXRvciA9IHBMaW5lcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJaW50IGluZGV4ID0gQ29sbGVjdGlvbnMuYmluYXJ5U2VhcmNoKHRlc3RlZExpbmVzLCBsaW5lLCBjb21wYXJhdG9yKTsKLQkJCWlmIChpbmRleCA8IDApIHsKLQkJCQkvLyBub3QgZm91bmQuCi0JCQkJdW50ZXN0ZWRMaW5lcy5hZGQobGluZSk7Ci0JCQl9Ci0JCX0KLQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCS8vIG5vdyBzZWUgaWYgdGhlIGxpc3Qgb2YgdW50ZXN0ZWQgbGluZXMgaGFzIGVudHJpZXMuCi0JCUNvbGxlY3Rpb25zLnNvcnQodW50ZXN0ZWRMaW5lcywgY29tcGFyYXRvcik7Ci0JCUl0ZXJhdG9yIHVudGVzdGVkaXRlcmF0b3IgPSB1bnRlc3RlZExpbmVzLml0ZXJhdG9yKCk7Ci0JCWlmICh1bnRlc3RlZGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJZ2V0QnVmZmVyKCkud3JpdGUoIkxpc3Qgb2YgbWVzc2FnZXMgd2hpY2ggYXJlIG5vdCB0ZXN0ZWQgKCIgKyB1bnRlc3RlZExpbmVzLnNpemUoKSArICIgb2YgIiArIHBMaW5lcy5zaXplKCkgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9IGVsc2UgewotCQkJZ2V0QnVmZmVyKCkud3JpdGUoIkFsbCBtZXNzYWdlcyBhcmUgdGVzdGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJd2hpbGUgKHVudGVzdGVkaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpdW50ZXN0ZWRpdGVyYXRvci5uZXh0KCk7Ci0JCQlnZXRCdWZmZXIoKS53cml0ZShsaW5lLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXVudGVzdGVkTGluZXMuY2xlYXIoKTsgLy8gY2xlYXIgdGhlIGxpc3QgZm9yIHRoZSBuZXh0IHByb2plY3QKLQkJdGVzdGVkTGluZXMuY2xlYXIoKTsKLQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvSUJ1ZmZlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvSUJ1ZmZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDBiYzgxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0lCdWZmZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIElmIGluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIHJlcG9ydGVkIHRvIHRoZSB1c2VyLCBidXQgdGhhdCBpbmZvcm1hdGlvbiBpcyBsb25nLAotICogYW5kIHRoZSB1c2VyIG5lZWRzIHRvIHNlZSBpdCBhbGwgYXQgdGhlIHNhbWUgdGltZSAoZS5nLiwgdGVzdCBjYXNlIHJlc3VsdHMpLAotICogdGhlbiB0aGUgaW5mb3JtYXRpb24gaXMgcmVwb3J0ZWQgdG8gaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgY2xhc3MuIAotICogSW1wbGVtZW50YXRpb25zIGNhbiBjaG9vc2UgdG8gcmVwb3J0IHRoZSBpbmZvcm1hdGlvbiBpbW1lZGlhdGVseSAKLSAqIChlLmcuLCB0byBTeXN0ZW0ub3V0KSwgb3IgY2FuIGFwcGVuZCBlYWNoIG1lc3NhZ2UsIGFuZCByZXBvcnQgdGhlIG1lc3NhZ2UKLSAqIG9ubHkgb25jZSBldmVyeXRoaW5nIGlzIGNvbXBsZXRlLiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQnVmZmVyIGV4dGVuZHMgSVRlc3RTdGF0dXMgewotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB0aGF0IGlzIHVzZWQgZm9yIHJlcG9ydGluZyBwcm9ncmVzcwotCSAqIHN0YXR1cyBhcyB0aGUgbG9uZy1ydW5uaW5nIHByb2Nlc3MgZXhlY3V0ZXMuCi0JICovCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCi0JLyoqCi0JICogRGlzcGxheSB0aGUgbWVzc2FnZSB0byB0aGUgdXNlcjsgdGhlIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiBtYXkgCi0JICogZGlzcGxheSB0aGUgbWVzc2FnZSBpbW1lZGlhdGVseSwgb3IgbWF5IGRpc3BsYXkgdGhlIG1lc3NhZ2Ugb25seQotCSAqIHdoZW4gcmVwb3J0KCkgaXMgY2FsbGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBtZXNzYWdlKTsKLQkKLQkvKioKLQkgKiBCZXR3ZWVuIG9uZSB0YXNrIGFuZCB0aGUgbmV4dCwgdXN1YWxseSBiZXR3ZWVuIHRlc3QgY2FzZXMsIGFkZCBhIGRlbGluZWF0aW5nCi0JICogbWFyayB0byBzaG93IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBlYWNoIHRhc2sgY2xlYXJseS4gVGhlIHBhcmFtZXRlciAKLQkgKiBwYXNzZWQgaW4sIHRhc2tOYW1lLCBpcyB0aGUgbmFtZSBvZiB0aGUgdGFzayB0aGF0IGlzIGVuZGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxpbmVhdGUoU3RyaW5nIHRhc2tOYW1lKTsKLQkJCi0JLyoqCi0JICogSWYgaW5mb3JtYXRpb24gd2FzIG5vdCByZXBvcnRlZCBpbW1lZGlhdGVseSwgY2FsbGluZyB0aGlzIG1ldGhvZAotCSAqIGZvcmNlcyB0aGUgYnVmZmVyIHRvIGJlIHJlcG9ydGVkIHRvIHRoZSB1c2VyLiBUaGUgY29udGVudHMgb2YgdGhlCi0JICogYnVmZmVyIGFyZSBub3QgY2xlYXJlZDsgYSBzdWJzZXFlbnQgY2FsbCB0byB0aGlzIG1ldGhvZCB3aWxsIAotCSAqIHJlcGVhdCB3aGF0IGhhcyBiZWVuIHJlcG9ydGVkIGJlZm9yZS4gQW55IGNhbGxzIHRvIGVsYXBzZWRUaW1lCi0JICogd2lsbCBiZSByZXBvcnRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoKTsKLQkKLQkvKioKLQkgKiBDbGVhciBhbnkgc3RvcmVkIG1lc3NhZ2VzIGZyb20gdGhlIGJ1ZmZlciwgYnV0IG5vdCBhbnkgZWxhcHNlZFRpbWUgCi0JICogbnVtYmVycyBmcm9tIHRoZSBzdG9yZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGxvZyBmaWxlLCBvciBudWxsIGlmIG5vbmUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2dGaWxlTmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvSUltcG9ydE9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvSUltcG9ydE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWQwZDA1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0lJbXBvcnRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICogQWxsIHZhbGlkYXRpb24gRlZUIHRlc3RzIG11c3QgcHJvdmlkZSBhbiBJSW1wb3J0T3BlcmF0aW9uIGltcGxlbWVudGF0aW9uCi0gKiB0byBpbXBvcnQgdGhlIGlucHV0IGZpbGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUltcG9ydE9wZXJhdGlvbiB7Ci0JLyoqCi0JICogUnVucyB0aGlzIG9wZXJhdGlvbiB3aXRob3V0IGZvcmNpbmcgYSBVSSBkZXBlbmRlbmN5LiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZQotCSAqIHdhcyBmb3VuZCBhbmQgaW1wb3J0ZWQgc3VjY2Vzc2Z1bGx5LgotCSAqCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIHRvIGRpc3BsYXkgcHJvZ3Jlc3MgYW5kIHJlY2VpdmUKLQkgKiAgIHJlcXVlc3RzIGZvciBjYW5jZWxhdGlvbgotCSAqIEBwYXJhbSBpbnB1dEZpbGUgdGhlIGZpbGUgd2hpY2ggbmVlZHMgdG8gYmUgaW1wb3J0ZWQgaW50byB0aGUgd29ya2JlbmNoCi0JICogQGV4Y2VwdGlvbiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGlmIHRoZSBydW4gbWV0aG9kIG11c3QgcHJvcGFnYXRlIGEgY2hlY2tlZCBleGNlcHRpb24sCi0JICogCWl0IHNob3VsZCB3cmFwIGl0IGluc2lkZSBhbiA8Y29kZT5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uPC9jb2RlPjsgcnVudGltZSBleGNlcHRpb25zIGFyZSBhdXRvbWF0aWNhbGx5Ci0JICogIHdyYXBwZWQgaW4gYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT4gYnkgdGhlIGNhbGxpbmcgY29udGV4dAotCSAqIEBleGNlcHRpb24gSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIG9wZXJhdGlvbiBkZXRlY3RzIGEgcmVxdWVzdCB0byBjYW5jZWwsIAotCSAqICB1c2luZyA8Y29kZT5JUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTwvY29kZT4sIGl0IHNob3VsZCBleGl0IGJ5IHRocm93aW5nIAotCSAqICA8Y29kZT5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjwvY29kZT4KLQkgKgotCSAqIEBzZWUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgRmlsZSBpbnB1dEZpbGUpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0lUZXN0U3RhdHVzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9JVGVzdFN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTJiOTM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0lUZXN0U3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXA7Ci0KLS8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgaW50ZXJmYWNlIHRyYWNrIHRoZSBleGVjdXRpb24gb2YgYSB0ZXN0IGNhc2UsCi0gKiBhbmQgYXJlIHVzZWQgdG8gcmVwb3J0IGEgc3VtbWFyeSBvZiB0aGUgZXhlY3V0aW9uIG9mIGFsbCBvZiB0aGUKLSAqIHRlc3QgY2FzZXMgYXQgdGhlIGVuZCBvZiBhIHNldCBvZiB0ZXN0IHJ1bnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRlc3RTdGF0dXMgewotCXB1YmxpYyBmaW5hbCBpbnQgUEFTUyA9IDA7Ci0JcHVibGljIGZpbmFsIGludCBXQVJOID0gMTsKLQlwdWJsaWMgZmluYWwgaW50IEZBSUwgPSAyOwotCQotCS8qKgotCSAqIFRvIHRyYWNrIGhvdyBsb25nIGEgdGFzayB0YWtlcywgY2FsbCB0aGlzIG1ldGhvZCB3aXRoIGEgdW5pcXVlIG5hbWUKLQkgKiBvZiB0aGUgdGFzay4gSWYgdGhlIHRhc2sgYWxyZWFkeSBleGlzdHMsIHRoZSBlbGFwc2VkVGltZSBpcyBhZGRlZAotCSAqIHRvIHRoZSBleGlzdGluZyB0aW1lLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsYXBzZWRUaW1lKFN0cmluZyB0YXNrTmFtZSwgbG9uZyBlbGFwc2VkVGltZSk7Ci0JCi0JLyoqCi0JICogSWYgcGFzcyBpcyB0cnVlLCBQQVNTIGlzIHVzZWQ7IGlmIHBhc3MgaXMgZmFsc2UsIEZBSUwgaXMgdXNlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRlc3RQYXNzTmFtZSwgYm9vbGVhbiBwYXNzKTsKLQkKLQkvKioKLQkgKiBJZiBwYXNzIGlzIHRydWUsIFBBU1MgaXMgdXNlZDsgaWYgcGFzcyBpcyBmYWxzZSwgRkFJTCBpcyB1c2VkLgotCSAqIFdoaWxlIHN0aWxsIGNvbnNpZGVyZWQgcGFydCBvZiB0ZXN0IGNhc2UgInRlc3RQYXNzTmFtZSIsIHRoaXMgCi0JICogc3BsaXRzIHRoaXMgcGFydCBvZiB0aGUgdGVzdCBjYXNlIGludG8gYSBzZWN0aW9uIG5hbWVkICJzdWJUYXNrTmFtZSIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0ZXN0UGFzc05hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgYm9vbGVhbiBwYXNzKTsKLQkKLQkvKioKLQkgKiBBcyBlYWNoIHRlc3QgaXMgZXhlY3V0ZWQsIHRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gdHJhY2sgaG93IG1hbnkgb2YgdGhhdAotCSAqIHR5cGUgb2YgdGVzdCBwYXNzIG9yIGZhaWwuIHBhc3NPckZhaWwgY2FuIGJlIG9uZSBvZiB0aHJlZSB2YWx1ZXM6IFBBU1MsIFdBUk4sIG9yIEZBSUwuCi0JICogSWYgdmFsdWUgaXMgUEFTUywgdGhlbiB0aGUgdGVzdCBjYXNlIHBhc3NlcywgYW5kIG5vIG1lc3NhZ2UgbmVlZHMgdG8gYmUgZGlzcGxheWVkIHRvIHRoZSB1c2VyLgotCSAqIElmIHZhbHVlIGlzIFdBUk4sIHRoZW4gdGhlIHRlc3QgY2FzZSBwYXNzZXMsIGFuZCBhIHdhcm5pbmcgbWVzc2FnZSBtdXN0IGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4KLQkgKiBJZiB2YWx1ZSBpcyBGQUlMLCB0aGVuIHRoZSB0ZXN0IGNhc2UgZmFpbHMsIGFuZCBhIGZhaWx1cmUgbWVzc2FnZSBtdXN0IGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRlc3RjYXNlTmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBpbnQgcGFzc09yRmFpbCwgSUJ1ZmZlciBidWZmZXIsIFN0cmluZyBtZXNzYWdlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhbGwgb2YgdGhlIHRlc3QgY2FzZXMgcnVuIHNvIGZhciBoYXZlIHBhc3NlZDsgb3RoZXJ3aXNlCi0JICogcmV0dXJuIGZhbHNlLiBJZiBubyB0ZXN0IGNhc2VzIGhhdmUgcnVuLCByZXR1cm4gdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhIHBhcnRpY3VsYXIgdGVzdCBjYXNlIHBhc3NlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoU3RyaW5nIHRlc3ROYW1lKTsKLQkKLQkvKioKLQkgKiBSZXNldCBhbGwgdmFyaWFibGVzIHRvIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHByZXBhcmUgdGhpcyB0ZXN0IHN0YXR1cyBmb3IgcmV1c2UuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0pBUkltcG9ydE9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvSkFSSW1wb3J0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmODY4NzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvSkFSSW1wb3J0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvck1hbmFnZXI7Ci0KLS8qKgotICogQ3JlYXRlIGEgSmF2YSBwcm9qZWN0IGJ5IGltcG9ydGluZyBhIEpBUiBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgSkFSSW1wb3J0T3BlcmF0aW9uIGV4dGVuZHMgQUltcG9ydE9wZXJhdGlvbiB7Ci0JLy8gTW9zdCBvZiB0aGUgY29kZSBpbiB0aGlzIGNsYXNzIHdhcyBzdG9sZW4gZnJvbSB0aGUgSkRULiBTZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuYnVpbGRwYXRocy5CdWlsZFBhdGhzQmxvY2suCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVByb2plY3QoSVByb2plY3QgcHJvamVjdCwgSVBhdGggbG9jYXRpb25QYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvcj0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQkJCQkKLQotCQkvLyBjcmVhdGUgdGhlIHByb2plY3QKLQkJdHJ5IHsKLQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzYz0gcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5uZXdQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdC5nZXROYW1lKCkpOwotCQkJCWlmIChQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmVxdWFscyhsb2NhdGlvblBhdGgpKSB7Ci0JCQkJCWxvY2F0aW9uUGF0aD0gbnVsbDsKLQkJCQl9Ci0JCQkJZGVzYy5zZXRMb2NhdGlvbihsb2NhdGlvblBhdGgpOwotCQkJCXByb2plY3QuY3JlYXRlKGRlc2MsIG1vbml0b3IpOwotCQkJCW1vbml0b3I9IG51bGw7Ci0JCQl9Ci0JCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQlwcm9qZWN0Lm9wZW4obW9uaXRvcik7Ci0JCQkJbW9uaXRvcj0gbnVsbDsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRKYXZhTmF0dXJlKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIXByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKLQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQlTdHJpbmdbXSBwcmV2TmF0dXJlcz0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCQlTdHJpbmdbXSBuZXdOYXR1cmVzPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJCW5ld05hdHVyZXNbcHJldk5hdHVyZXMubGVuZ3RoXT0gSmF2YUNvcmUuTkFUVVJFX0lEOwotCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbW9uaXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29uZmlndXJlUHJvamVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCS8vIFNldCB0aGUgY2xhc3NwYXRoIHRvIHRoZSBkZWZhdWx0LgotCQkJSUphdmFQcm9qZWN0IGpwID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJanAuc2V0UmF3Q2xhc3NwYXRoKG51bGwsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNykpOwkJCi0KLQkJCS8vIE5vdyBhZGQgcnQuamFyIHRvIGl0Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBleGlzdGluZ0NsYXNzcGF0aCA9IGpwLmdldFJhd0NsYXNzcGF0aCgpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2V4aXN0aW5nQ2xhc3NwYXRoLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShleGlzdGluZ0NsYXNzcGF0aCwgMCwgY2xhc3NwYXRoLCAwLCBleGlzdGluZ0NsYXNzcGF0aC5sZW5ndGgpOwotCQkJSUNsYXNzcGF0aEVudHJ5IHJ0SmFyID0gSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShuZXcgUGF0aCgiSlJFX0xJQiIpLCBuZXcgUGF0aCgiSlJFX1NSQyIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQljbGFzc3BhdGhbZXhpc3RpbmdDbGFzc3BhdGgubGVuZ3RoXSA9IHJ0SmFyOwotCQkJanAuc2V0UmF3Q2xhc3NwYXRoKGNsYXNzcGF0aCwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA3KSk7Ci0JCQkKLQkJCS8vIEVuYWJsZSB0aGlzIGphdmEgcHJvamVjdCB3aXRoIHRoZSBWYWxpZGF0aW9uIEJ1aWxkZXIgc28gdGhhdCBhdXRvbWF0aWMgdmFsaWRhdGlvbiAKLQkJCS8vIGNhbiBydW4gb24gaXQuCi0JCQlWYWxpZGF0b3JNYW5hZ2VyLmFkZFByb2plY3RCdWlsZFZhbGlkYXRpb25TdXBwb3J0KHByb2plY3QpOwotCQl9Ci0JCWNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBleGMpIHsKLQkJCUJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuaGFuZGxlRXhjZXB0aW9uKGV4Yyk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLkFJbXBvcnRPcGVyYXRpb24jY3JlYXRlTmV3UHJvamVjdChJUHJvZ3Jlc3NNb25pdG9yLCBTdHJpbmcsIEZpbGUpCi0JICovCi0JcHJvdGVjdGVkIElQcm9qZWN0IGNyZWF0ZU5ld1Byb2plY3QoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgcHJvamVjdE5hbWUsIEZpbGUgaW5wdXRGaWxlKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQl0cnkgewotCQkJY3JlYXRlUHJvamVjdChwcm9qZWN0LCBudWxsLCBtb25pdG9yKTsKLQkJCWFkZEphdmFOYXR1cmUocHJvamVjdCwgbW9uaXRvcik7Ci0JCQljb25maWd1cmVQcm9qZWN0KG1vbml0b3IsIHByb2plY3QpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGb2xkZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBwYXRobmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRm9sZGVyIGZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKHBhdGhuYW1lKTsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBmb2xkZXIuZ2V0UGFyZW50KCk7Ci0JCWlmKCFjb250YWluZXIuZXhpc3RzKCkpIHsKLQkJCWNyZWF0ZUZvbGRlcihtb25pdG9yLCBwcm9qZWN0LCBjb250YWluZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKLQkJfQotCQlpZighZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkvLyBEb24ndCBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMuCi0JCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG1vbml0b3IpOyAvLyB0cnVlPWZvcmNlLCB0cnVlPWxvY2FsCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIElQYXRoIHBhdGhuYW1lLCBJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZpbGUgbmZpbGUgPSBwcm9qZWN0LmdldEZpbGUocGF0aG5hbWUpOwotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IG5maWxlLmdldFBhcmVudCgpOwotCQlpZighY29udGFpbmVyLmV4aXN0cygpKSB7Ci0JCQljcmVhdGVGb2xkZXIobW9uaXRvciwgcHJvamVjdCwgY29udGFpbmVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSk7Ci0JCX0KLQkJaWYoIW5maWxlLmV4aXN0cygpKSB7Ci0JCQkvLyBEb24ndCBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMuCi0JCQluZmlsZS5jcmVhdGUoc3RyZWFtLCB0cnVlLCBtb25pdG9yKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuQUltcG9ydE9wZXJhdGlvbiNpbXBvcnRGaWxlKElQcm9ncmVzc01vbml0b3IsIElQcm9qZWN0LCBGaWxlKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGltcG9ydEZpbGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBGaWxlIGZpbGUpIHsKLQkJLy8gSW1wb3J0IHRoZSBmaWxlIAotCQl0cnkgewotCQkJWmlwRmlsZSB6aXBGaWxlID0gbmV3IFppcEZpbGUoZmlsZSk7Ci0JCQlFbnVtZXJhdGlvbiB6aXBFbnRyaWVzID0gemlwRmlsZS5lbnRyaWVzKCk7Ci0JCQl3aGlsZSh6aXBFbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJWmlwRW50cnkgemlwRW50cnkgPSAoWmlwRW50cnkpemlwRW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCUlQYXRoIHBhdGhuYW1lID0gbmV3IFBhdGgoemlwRW50cnkuZ2V0TmFtZSgpKTsKLQkJCQlpZih6aXBFbnRyeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCWNyZWF0ZUZvbGRlcihtb25pdG9yLCBwcm9qZWN0LCBwYXRobmFtZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljcmVhdGVGaWxlKG1vbml0b3IsIHByb2plY3QsIHBhdGhuYW1lLCB6aXBGaWxlLmdldElucHV0U3RyZWFtKHppcEVudHJ5KSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJY2F0Y2goSU9FeGNlcHRpb24gZXhjKSB7Ci0JCQlCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmhhbmRsZUV4Y2VwdGlvbihleGMpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9UZXN0Q2FzZUdlbmVyYXRvck9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvVGVzdENhc2VHZW5lcmF0b3JPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYTJlMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9UZXN0Q2FzZUdlbmVyYXRvck9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuTWVzc2FnZVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVGFza0xpc3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogR2VuZXJhdGUgYW4gRlZUIHRlc3QgY2FzZSwgZm9yIGEgc2VsZWN0ZWQgSVByb2plY3Qgb3IgSVByb2plY3RzLCB0bwotICogYmUgcGFzdGVkIGludG8gcGx1Z2luLnhtbC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RDYXNlR2VuZXJhdG9yT3BlcmF0aW9uIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgX1RFU1RDQVNFX1RFTVBMQVRFXyA9ICJcdFx0XHQ8dGVzdCBcblx0XHRcdFx0cHJvamVjdD1cInswfVwiXG5cdFx0XHRcdGlucHV0PVwiXCJcblx0XHRcdFx0dmFsaWRhdG9yPVwiezF9XCI+XG57Mn1cdFx0XHQ8L3Rlc3Q+XG4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9URVNUQ0FTRV9NRVNTQUdFX1RFTVBMQVRFXyA9ICJcdFx0XHRcdDxtZXNzYWdlIHByZWZpeD1cInswfVwiIHJlc291cmNlPVwiezF9XCIgbG9jYXRpb249XCJ7Mn1cIiB0ZXh0PVwiezN9XCIvPlxuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgTWFwIF92bWRCdWZmZXIgPSBudWxsOyAvLyBtYXAgd2hlcmUgdGhlIFZhbGlkYXRvck1ldGFEYXRhIGlzIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSBpcyBhIFN0cmluZ0J1ZmZlcgotCXByaXZhdGUgSVByb2plY3RbXSBfcHJvamVjdHMgPSBudWxsOwotCXByaXZhdGUgSUJ1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQkKLQlwdWJsaWMgVGVzdENhc2VHZW5lcmF0b3JPcGVyYXRpb24oSVByb2plY3RbXSBwcm9qZWN0cywgSUJ1ZmZlciBidWZmZXIpIHsKLQkJc2V0UHJvamVjdHMocHJvamVjdHMpOwotCQlzZXRCdWZmZXIoYnVmZmVyKTsKLQkJX3ZtZEJ1ZmZlciA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgYnVmZmVyIHdoZXJlIHRoZSB0ZXN0IGNhc2UgZ2VuZXJhdGVkIG91dHB1dCB3aWxsIGJlIHNlbnQuCi0JICovCi0JcHVibGljIElCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlyZXR1cm4gX2J1ZmZlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QnVmZmVyKElCdWZmZXIgYikgewotCQlfYnVmZmVyID0gYjsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0W10gZ2V0UHJvamVjdHMoKSB7Ci0JCXJldHVybiBfcHJvamVjdHM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb2plY3RzKElQcm9qZWN0W10gcHJvamVjdHMpIHsKLQkJX3Byb2plY3RzID0gcHJvamVjdHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGUjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgYXJnMCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJZ2VuZXJhdGUoZ2V0UHJvamVjdHMoKSk7Ci0JCX0KLQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5oYW5kbGVFeGNlcHRpb24oZXhjKTsKLQkJCWdldEJ1ZmZlcigpLndyaXRlKCJBIFRocm93YWJsZSB3YXMgY2F1Z2h0OyBjb3VsZCBub3QgZ2VuZXJhdGUgdGhlIHRlc3QgY2FzZS4gQ2hlY2sgdGhlIExvZ2dpbmdVdGlsLmxvZyBmaWxlIGZvciBkZXRhaWxzLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlfdm1kQnVmZmVyLmNsZWFyKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGUoSVByb2plY3RbXSBwcm9qZWN0cykgewotCQkvLyBGaXJzdCwgbG9hZCBhbGwgb2YgdGhlIHZhbGlkYXRpb24gbWFya2VycyBmcm9tIHRoZSBzZWxlY3RlZCBwcm9qZWN0cywgCi0JCS8vIGFuZCBncm91cCB0aGVtIGJ5IHRoZSB2YWxpZGF0b3IuCi0JCWZvcihpbnQgaT0wOyBpPHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQlJTWFya2VyW10gbWFya2VycyA9IFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwgSU1lc3NhZ2UuQUxMX01FU1NBR0VTKTsKLQkJCWlmKChtYXJrZXJzID09IG51bGwpIHx8IChtYXJrZXJzLmxlbmd0aCA9PSAwKSl7Ci0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoIkNhbm5vdCBnZW5lcmF0ZSBhIHRlc3QgY2FzZSBmb3IgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIHVudGlsIFwiUnVuIFZhbGlkYXRpb25cIiBoYXMgYmVlbiBydW4uIEVuYWJsZSBvbmx5IHRoZSB2YWxpZGF0b3Igd2hvc2UgdGVzdCBjYXNlIGlzIHRvIGJlIGdlbmVyYXRlZCwgcmlnaHQtY2xpY2ssIGFuZCBcIlJ1biBWYWxpZGF0aW9uXCIuIE9uY2UgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMgaGF2ZSBiZWVuIHJlcG9ydGVkLCBhIHRlc3QgY2FzZSBjYW4gYmUgZ2VuZXJhdGVkIGZyb20gdGhvc2UgbWVzc2FnZXMuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQkvLyBBIHRlc3QgY2FzZSA9IG9uZSB2YWxpZGF0b3Igb24gb25lIHByb2plY3QgPT4gd2hhdCBtYXJrZXJzCi0JCQlMaXN0IG1hcmtlckxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IoaW50IGo9MDsgajxtYXJrZXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJbWFya2VyTGlzdC5hZGQobWFya2Vyc1tqXSk7Ci0JCQl9Ci0JCQkKLQkJCS8vIFNvcnQgdGhlIG1hcmtlcnMgYnkgdmFsaWRhdG9yLCBwcm9qZWN0LCBwcmVmaXgsIGxvY2F0aW9uICYgcmVzb3VyY2UKLQkJCUNvbGxlY3Rpb25zLnNvcnQobWFya2VyTGlzdCwgTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZUNvbXBhcmF0b3IoZ2V0QnVmZmVyKCksIGZhbHNlKSk7Ci0KLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbWFya2VyTGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcilpdGVyYXRvci5uZXh0KCk7CQkJCi0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gTWVzc2FnZVV0aWxpdHkuZ2V0VmFsaWRhdG9yKG1hcmtlcik7Ci0JCQkJaWYodm1kICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nQnVmZmVyIG1lc3NhZ2VCdWZmZXIgPSBnZXRCdWZmZXIodm1kKTsKLQkJCQkJU3RyaW5nIG1lc3NhZ2VJZCA9IE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2VQcmVmaXgobWFya2VyKTsKLQkJCQkJU3RyaW5nIHJlc291cmNlID0gTWVzc2FnZVV0aWxpdHkuZ2V0UmVzb3VyY2UobWFya2VyKTsKLQkJCQkJSW50ZWdlciBsaW5lTnVtYmVyID0gTWVzc2FnZVV0aWxpdHkuZ2V0TGluZU51bWJlcihtYXJrZXIpOwotCQkJCQlTdHJpbmcgbG9jYXRpb24gPSAobGluZU51bWJlciA9PSBudWxsKSA/IChsb2NhdGlvbiA9IE1lc3NhZ2VVdGlsaXR5LmdldExvY2F0aW9uKG1hcmtlcikpIDogKGxvY2F0aW9uID0gbGluZU51bWJlci50b1N0cmluZygpKTsKLQkJCQkJU3RyaW5nIHRleHQgPSBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlKG1hcmtlcik7IC8vIEVtaXQgdGhlIHRleHQgb2YgdGhlIG1lc3NhZ2Ugc28gdGhhdCwgaWYgdGhlIG1lc3NhZ2UgcHJlZml4ZXMgYXJlIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZSwgaXQncyBlYXN5IHRvIHNlZSB0aGF0IHRoZSBzYW1lIHRlc3QgaXMgcnVuIHdpdGggYSBkaWZmZXJlbnQgcHJlZml4LCBhbmQgdGhhdCB0aGUgdGVzdCBkaWRuJ3QgcmVhbGx5IGZhaWwuCi0JCQkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoJzwnLCAnWycpOyAvLyByZW1vdmUgdGhlIFhNTCByZXNlcnZlZCBjaGFyYWN0ZXJzLgotCQkJCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKCc+JywgJ10nKTsKLQkJCQkJdGV4dCA9IHRleHQucmVwbGFjZSgnIicsICdcJycpOwotCQkJCQltZXNzYWdlQnVmZmVyLmFwcGVuZChNZXNzYWdlRm9ybWF0LmZvcm1hdChfVEVTVENBU0VfTUVTU0FHRV9URU1QTEFURV8sIG5ldyBTdHJpbmdbXXttZXNzYWdlSWQsIHJlc291cmNlLCBsb2NhdGlvbiwgdGV4dH0pKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWl0ZXJhdG9yID0gX3ZtZEJ1ZmZlci5rZXlTZXQoKS5pdGVyYXRvcigpOyAvLyBpdGVyYXRlIG92ZXIgdGhlIHZtZHMKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IChTdHJpbmdCdWZmZXIpX3ZtZEJ1ZmZlci5nZXQodm1kKTsKLQkJCQlTdHJpbmcgdGVzdGNhc2VUZW1wbGF0ZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KF9URVNUQ0FTRV9URU1QTEFURV8sIG5ldyBTdHJpbmdbXXtwcm9qZWN0LmdldE5hbWUoKSwgdm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKSwgYnVmZmVyLnRvU3RyaW5nKCl9KTsKLQkJCQkKLQkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0Y2FzZVRlbXBsYXRlKTsKLQkJCQkKLQkJCQlidWZmZXIuZGVsZXRlKDAsIGJ1ZmZlci5sZW5ndGgoKSk7IC8vIGNsZWFyIHRoZSBidWZmZXIgZm9yIHRoZSBuZXh0IHByb2plY3QKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBnZXRCdWZmZXIoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSAoU3RyaW5nQnVmZmVyKV92bWRCdWZmZXIuZ2V0KHZtZCk7Ci0JCWlmKGJ1ZmZlciA9PSBudWxsKSB7Ci0JCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlfdm1kQnVmZmVyLnB1dCh2bWQsIGJ1ZmZlcik7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9CdWlsZEluZm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9CdWlsZEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2ZDI5YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svQnVpbGRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2s7Ci1wdWJsaWMgY2xhc3MgQnVpbGRJbmZvIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIkxpY2Vuc2VkIE1hdGVyaWFscyAtLSBQcm9wZXJ0eSBvZiBJQk1cbihjKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiwgMjAwMSwyMDAzXG5VUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGZnQnVpbGRMZXZlbCA9ICIyMDAzMTExMl8xOTE1LVdCMjEyLUFELVY1MTFELVc1IjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NBQnVpbGRMZXZlbCgpIHsgcmV0dXJuIGZnQnVpbGRMZXZlbDsgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL1Rlc3RPcENvbnN0ckJ1aWxkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9UZXN0T3BDb25zdHJCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MjUwYTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL1Rlc3RPcENvbnN0ckJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0T3BDb25zdHJCdWlsZGVyIGV4dGVuZHMgSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERFUl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay5idnRidWlsZGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSVJlc291cmNlRGVsdGEgX2RlbHRhID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBUZXN0T3BDb25zdHJCdWlsZGVyIF9pbnN0ID0gbnVsbDsKLQkKLQlwdWJsaWMgVGVzdE9wQ29uc3RyQnVpbGRlcigpIHsKLQkJX2luc3QgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ldmVudHMuSW50ZXJuYWxCdWlsZGVyI2J1aWxkKGludCwgamF2YS51dGlsLk1hcCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJvdGVjdGVkIElQcm9qZWN0W10gYnVpbGQoaW50IGtpbmQsIE1hcCBhcmdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gTm90aGluZyB0byBkbzsgdGhpcyBjbGFzcyBleGlzdHMgb25seSBzbyB0aGF0IGFuIElSZXNvdXJjZURlbHRhIGNhbiBiZSBjb25zdHJ1Y3RlZC4KLQkJX2RlbHRhID0gZ2V0RGVsdGEoZ2V0UHJvamVjdCgpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZURlbHRhIGdldERlbHRhKCkgewotCQlyZXR1cm4gX2RlbHRhOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3RPcENvbnN0ckJ1aWxkZXIgc2luZ2xldG9uKCkgewotCQlyZXR1cm4gX2luc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL1Rlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3NjdiOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3IuSkRUVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlZhbGlkYXRvclRlc3RjYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNvbnN0cnVjdHMgdGhlIGlucHV0IGZvciB0aGUgVGVzdE9wQ29uc3RyT3BlcmF0aW9uLiBCZWNhdXNlCi0gKiBUZXN0T3BDb25zdHJPcGVyYXRpb24gaXMgbm90IGludm9rZWQgYXMgcGFydCBvZiBhIGJ1aWxkLCB3aGVuIGl0cyBJUmVzb3VyY2VzCi0gKiBhcmUgdG91Y2hlZCwgYSBidWlsZCBpcyBpbnZva2VkIGFmdGVyIGVhY2ggdG91Y2gsIGFuZCB0aGF0IG1lYW5zIHRoYXQgdGhlCi0gKiBJUmVzb3VyY2VEZWx0YSB0aGF0J3MgY29uc3RydWN0ZWQgaGFzIG9ubHkgb25lIElSZXNvdXJjZSBpbiBpdCBpbnN0ZWFkCi0gKiBvZiB0aGUgZ3JvdXAgb2YgY2hhbmdlZCBJUmVzb3VyY2UgaW5zdGFuY2VzLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24gaW1wbGVtZW50cyBJV29ya3NwYWNlUnVubmFibGUgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZXS19OT0JVSUxEX1RFU1RfVkFMSURBVE9SX0NMQVNTID0gIm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvci5Gd2tOb0J1aWxkVGVzdFZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGV0tfVEVTVF9WQUxJREFUT1JfQ0xBU1MgPSAib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yLkZ3a1Rlc3RWYWxpZGF0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19WQUxJREFUT1JfQ0xBU1MgPSAib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uc2FtcGxlLlByb3BlcnRpZXNWYWxpZGF0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBJUHJvamVjdCBfcHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBJQnVmZmVyIF9idWZmZXIgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIElDb21tYW5kIF9idWlsZGVyQ29tbWFuZCA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBJUmVzb3VyY2VEZWx0YSBfY2hhbmdlZERlbHRhID0gbnVsbDsKLQlwcml2YXRlIElSZXNvdXJjZURlbHRhIF9lbXB0eURlbHRhID0gbnVsbDsKLQlwcml2YXRlIEphdmFIZWxwZXJzW10gX2NoYW5nZWRDbGFzc2VzID0gbnVsbDsKLQkKLQkvKioKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqLwotCXB1YmxpYyBUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbihJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3QgcHJvamVjdCkgewotCQlzZXRQcm9qZWN0KHByb2plY3QpOwotCQlzZXRCdWZmZXIoYnVmZmVyKTsKLQl9Ci0KLQlwdWJsaWMgSUJ1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCXJldHVybiBfYnVmZmVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRCdWZmZXIoSUJ1ZmZlciBiKSB7Ci0JCV9idWZmZXIgPSBiOwotCX0KLQkJCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBfcHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwKSB7Ci0JCV9wcm9qZWN0ID0gcDsKLQl9Ci0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgdm9pZCBkZWJ1ZyhmaW5hbCBJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHRpdGxlLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQl0cnkgewotCQkJYnVmZmVyLndyaXRlKHRpdGxlKTsKLQkJCWRlbHRhLmFjY2VwdChuZXcgSVJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIHN1YmRlbHRhKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJCWlmIChzdWJkZWx0YSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gc3ViZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJYnVmZmVyLndyaXRlKCJyZXNvdXJjZSBpczogIiArIHJlc291cmNlLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiB0cnVlOyAvLyB2aXNpdCB0aGUgc3ViZGVsdGEncyBjaGlsZHJlbgotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gSVJlc291cmNlIHRoYXQgaXMgbm90IHZhbGlkYXRlZCBieSB0aGUgRndrIFRlc3QgVmFsaWRhdG9yICh0aGlzCi0JICogcmVzb3VyY2UgaXMgdXNlZCBmb3IgdGhlIGNhc2Ugd2hlcmUgYSByZXNvdXJjZSBpcyBjaGFuZ2VkLCBhbmQgYSBidWlsZAotCSAqIGlzIGludm9rZWQsIGJ1dCB0aGUgRndrIFRlc3QgdmFsaWRhdG9yIGRvZXMgbm90IHZhbGlkYXRlIHRoYXQgcmVzb3VyY2UgYW5kCi0JICogc2hvdWxkIG5vdCBiZSBsYXVuY2hlZC4pCi0JICovCQotCXB1YmxpYyBzdGF0aWMgSVJlc291cmNlW10gZ2V0RW1wdHlSZXNvdXJjZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzID0gbmV3IElSZXNvdXJjZVtdewotCQkJcHJvamVjdC5nZXRGaWxlKCIuY2xhc3NwYXRoIiksIC8vJE5PTi1OTFMtMSQKLQkJfTsKLQkJcmV0dXJuIGNoYW5nZWRSZXNvdXJjZXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0b3VjaChJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCWZvcihpbnQgaT0wOyBpPGNoYW5nZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlSZXNvdXJjZSByZXMgPSBjaGFuZ2VkUmVzb3VyY2VzW2ldOwotCQkJdHJ5IHsKLQkJCQlyZXMudG91Y2gobnVsbCk7IC8vIG51bGwgSVByb2dyZXNzTW9uaXRvcgotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQkvLyBPaCB3ZWxsLi4uZGlydHkgdGhlIG5leHQgZmlsZS4KLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIElSZXNvdXJjZURlbHRhIGdldERlbHRhKElQcm9qZWN0IHByb2plY3QsIElSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMpIHsKLQkJdHJ5IHsKLQkJCXRvdWNoKHByb2plY3QsIGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJcHJvamVjdC5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLklOQ1JFTUVOVEFMX0JVSUxELCBUZXN0T3BDb25zdHJCdWlsZGVyLkJVSUxERVJfSUQsIF9idWlsZGVyQ29tbWFuZC5nZXRBcmd1bWVudHMoKSwgbnVsbCk7IC8vIG51bGwgSVByb2dyZXNzTW9uaXRvcgotCQkJcmV0dXJuIFRlc3RPcENvbnN0ckJ1aWxkZXIuc2luZ2xldG9uKCkuZ2V0RGVsdGEoKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEJ1aWxkZXIoSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBkb0FkZCkgewotCQlpZihkb0FkZCkgewotCQkJLy8gQWRkIHRoZSBidWlsZGVyIHRvIHRoZSBwcm9qZWN0Ci0JCQl0cnkgewotCQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJSUNvbW1hbmRbXSBvbGRDb21tYW5kcyA9IGRlc2NyaXB0aW9uLmdldEJ1aWxkU3BlYygpOwotCQkJCUlDb21tYW5kW10gbmV3Q29tbWFuZHMgPSBuZXcgSUNvbW1hbmRbb2xkQ29tbWFuZHMubGVuZ3RoICsgMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShvbGRDb21tYW5kcywgMCwgbmV3Q29tbWFuZHMsIDAsIG9sZENvbW1hbmRzLmxlbmd0aCk7Ci0JCQkJX2J1aWxkZXJDb21tYW5kID0gZGVzY3JpcHRpb24ubmV3Q29tbWFuZCgpOwotCQkJCV9idWlsZGVyQ29tbWFuZC5zZXRCdWlsZGVyTmFtZShUZXN0T3BDb25zdHJCdWlsZGVyLkJVSUxERVJfSUQpOwotCQkJCW5ld0NvbW1hbmRzW29sZENvbW1hbmRzLmxlbmd0aF0gPSBfYnVpbGRlckNvbW1hbmQ7Ci0JCQkJZGVzY3JpcHRpb24uc2V0QnVpbGRTcGVjKG5ld0NvbW1hbmRzKTsKLQotCQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIFJlbW92ZSB0aGUgYnVpbGRlcgotCQkJdHJ5IHsKLQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJCUlDb21tYW5kW10gb2xkQ29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKLQkJCQlJQ29tbWFuZFtdIG5ld0NvbW1hbmRzID0gbmV3IElDb21tYW5kW29sZENvbW1hbmRzLmxlbmd0aCAtIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkQ29tbWFuZHMsIDAsIG5ld0NvbW1hbmRzLCAwLCBuZXdDb21tYW5kcy5sZW5ndGgpOwotCQkJCWRlc2NyaXB0aW9uLnNldEJ1aWxkU3BlYyhuZXdDb21tYW5kcyk7Ci0JCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJYWRkQnVpbGRlcihnZXRQcm9qZWN0KCksIHRydWUpOwotCQkJCi0JCQkvLyBGaXJzdCwgYnVpbGQgdGhlIHByb2plY3Qgc28gdGhhdCB0aGUgc3Vic2VxdWVudCBidWlsZHMgYXJlbid0IHN0YXJ0ZWQgd2l0aCBhIG51bGwgZGVsdGEuCi0JCQlnZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgVGVzdE9wQ29uc3RyQnVpbGRlci5CVUlMREVSX0lELCBfYnVpbGRlckNvbW1hbmQuZ2V0QXJndW1lbnRzKCksIG51bGwpOyAvLyBudWxsIElQcm9ncmVzc01vbml0b3IKLQkJCQotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0bWRzID0gSkRUVXRpbGl0eS5nZXRWRlRlc3RzKG1vbml0b3IsIGdldFByb2plY3QoKSk7Ci0JCQlpZigodG1kcyA9PSBudWxsKSB8fCAodG1kcy5sZW5ndGggPT0gMCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIFRoZW4gY2FsY3VsYXRlIHRoZSBkZWx0YXMKLQkJCUlSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMgPSBnZXRDaGFuZ2VkUmVzb3VyY2VzKGdldFByb2plY3QoKSwgdG1kcyk7Ci0JCQlfZW1wdHlEZWx0YSA9IGdldERlbHRhKGdldFByb2plY3QoKSwgZ2V0RW1wdHlSZXNvdXJjZXMoZ2V0UHJvamVjdCgpKSk7Ci0JCQlfY2hhbmdlZERlbHRhID0gZ2V0RGVsdGEoZ2V0UHJvamVjdCgpLCBjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCQotCQkJLy8gVGhlbiByZXN0b3JlIHRoZSBwcm9qZWN0J3MgYnVpbGQgY29tbWFuZHMgYmFjayB0byB3aGF0IHRoZXkgd2VyZS4KLQkJCWFkZEJ1aWxkZXIoZ2V0UHJvamVjdCgpLCBmYWxzZSk7Ci0KLQkJCV9jaGFuZ2VkQ2xhc3NlcyA9IGdldENoYW5nZWRDbGFzc2VzKGNoYW5nZWRSZXNvdXJjZXMpOwotCQl9Ci0JCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQl9Ci0JfQotCQotCXB1YmxpYyBJUmVzb3VyY2VEZWx0YSBnZXRDaGFuZ2VkRGVsdGEoKSB7Ci0JCXJldHVybiBfY2hhbmdlZERlbHRhOwotCX0KLQkKLQlwdWJsaWMgSVJlc291cmNlRGVsdGEgZ2V0RW1wdHlEZWx0YSgpIHsKLQkJcmV0dXJuIF9lbXB0eURlbHRhOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElSZXNvdXJjZVtdIGdldENoYW5nZWRSZXNvdXJjZXMoSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdG9yVGVzdGNhc2VbXSB0bWRzKSB7Ci0JCVNldCB0ZW1wID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yKGludCBpPTA7IGk8dG1kcy5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yVGVzdGNhc2UgdG1kID0gdG1kc1tpXTsKLQkJCUlSZXNvdXJjZVtdIHJlcyA9IHRtZC5nZXRSZXNvdXJjZXMocHJvamVjdCk7Ci0JCQlmb3IoaW50IGo9MDsgajxyZXMubGVuZ3RoOyBqKyspIHsKLQkJCQl0ZW1wLmFkZChyZXNbal0pOwotCQkJfQotCQl9Ci0JCUlSZXNvdXJjZVtdIHJlc3VsdCA9IG5ldyBJUmVzb3VyY2VbdGVtcC5zaXplKCldOwotCQl0ZW1wLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIEphdmFIZWxwZXJzW10gZ2V0Q2hhbmdlZENsYXNzZXMoSVJlc291cmNlW10gcmVzb3VyY2VzKSB7Ci0JCWlmKF9jaGFuZ2VkQ2xhc3NlcyA9PSBudWxsKSB7Ci0JCQlpZihyZXNvdXJjZXMgPT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgSmF2YUhlbHBlcnNbMF07Ci0JCQl9Ci0JCQkKLQkJCUphdmFIZWxwZXJzW10gcmVzdWx0ID0gbmV3IEphdmFIZWxwZXJzW3Jlc291cmNlcy5sZW5ndGhdOwotCQkJaW50IGNvdW50ID0gMDsKLQkJCWZvcihpbnQgaT0wOyBpPHJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlc1tpXTsKLQkJCQlpZigocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgJiYgKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHMoImphdmEiKSB8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJjbGFzcyIpKSkgeyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJCUphdmFIZWxwZXJzIGggPSBKRFRVdGlsaXR5LmdldEphdmFIZWxwZXJzKChJRmlsZSlyZXNvdXJjZSk7Ci0JCQkJCWlmKGggIT0gbnVsbCkgewotCQkJCQkJcmVzdWx0W2NvdW50KytdID0gaDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYoY291bnQgIT0gcmVzb3VyY2VzLmxlbmd0aCkgewotCQkJCUphdmFIZWxwZXJzW10gdGVtcCA9IG5ldyBKYXZhSGVscGVyc1tjb3VudF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIHRlbXAsIDAsIGNvdW50KTsKLQkJCQlyZXR1cm4gdGVtcDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF9jaGFuZ2VkQ2xhc3NlczsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9UZXN0T3BDb25zdHJPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9UZXN0T3BDb25zdHJPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc4MThjNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVGVzdE9wQ29uc3RyT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LklPcGVyYXRpb25SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LlZhbGlkYXRpb25UeXBlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3IuSkRUVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlZhbGlkYXRvclRlc3RjYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbC5CVlRSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkdsb2JhbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRhc2tMaXN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkFsbFZhbGlkYXRvcnNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5FbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JUnVsZUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuT25lVmFsaWRhdG9yT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdGlvbk9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvclN1YnNldE9wZXJhdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHRlc3RzIGV2ZXJ5IGNvbnN0cnVjdG9yIGF2YWlsYWJsZSBpbiB0aGUgVmFsaWRhdGlvbk9wZXJhdGlvbgotICogaGllcmFyY2h5IGFuZCBlbnN1cmVzIHRoYXQgYW4gb3BlcmF0aW9uLCBjcmVhdGVkIHdpdGggdGhhdCBjb25zdHJ1Y3RvciwgCi0gKiByZXN1bHRzIGluIHRoZSBleHBlY3RlZCB2YWxpZGF0aW9uIElNYXJrZXJzLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdE9wQ29uc3RyT3BlcmF0aW9uIGltcGxlbWVudHMgSU9wZXJhdGlvblJ1bm5hYmxlIHsKLQlwcml2YXRlIElQcm9qZWN0IF9wcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIElCdWZmZXIgX2J1ZmZlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX3Rlc3RDYXNlTmFtZSA9IG51bGw7Ci0JCi0JLyoqCi0JICogTXVzdCBoYXZlIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IgaW4gb3JkZXIgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbi4KLQkgKiBNVVNUIGNhbGwgc2V0QnVmZmVyLCBzZXRQcm9qZWN0LCBhbmQgc2V0TmFtZSBiZWZvcmUgdXNpbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgVGVzdE9wQ29uc3RyT3BlcmF0aW9uKCkgewotCX0KLQkKLQkvKioKLQkgKiBJUHJvamVjdCBtdXN0IGV4aXN0IGFuZCBiZSBvcGVuLgotCSAqLwotCXB1YmxpYyBUZXN0T3BDb25zdHJPcGVyYXRpb24oSUJ1ZmZlciBidWZmZXIsIElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0ZXN0Q2FzZU5hbWUpIHsKLQkJc2V0QnVmZmVyKGJ1ZmZlcik7Ci0JCXNldFByb2plY3QocHJvamVjdCk7Ci0JCXNldE5hbWUodGVzdENhc2VOYW1lKTsKLQl9Ci0JCi0JcHVibGljIElCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlyZXR1cm4gX2J1ZmZlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QnVmZmVyKElCdWZmZXIgYikgewotCQlfYnVmZmVyID0gYjsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBfcHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwKSB7Ci0JCV9wcm9qZWN0ID0gcDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gX3Rlc3RDYXNlTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlfdGVzdENhc2VOYW1lID0gbmFtZTsKLQl9CQotCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJR2xvYmFsQ29uZmlndXJhdGlvbiBnY29uZiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCQlHbG9iYWxDb25maWd1cmF0aW9uIG9yaWdHY29uZiA9IG5ldyBHbG9iYWxDb25maWd1cmF0aW9uKGdjb25mKTsKLQkJCWJvb2xlYW4gYXV0b0J1aWxkRW5hYmxlZCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5pc0F1dG9CdWlsZGluZygpOwotCQkJdHJ5IHsKLQkJCQkvLyBJbiBvcmRlciBmb3IgdGhlIG9wZXJhdGlvbnMgdG8gd29yayBjb3JyZWN0bHksIHNldCB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIHRvCi0JCQkJLy8gdGhlIHZhbGlkYXRvcnMgZm9yIHdoaWNoIHRlc3RzIGV4aXN0LCBhbmQgdHVybiBvZmYgYXV0by1idWlsZCBzbyB0aGF0IGEKLQkJCQkvLyB2YWxpZGF0aW9uIGlzIGZvcmNlZC4KLQkJCQlnY29uZi5zZXRDYW5Qcm9qZWN0c092ZXJyaWRlKGZhbHNlKTsKLQkJCQkvL2djb25mLnNldEF1dG9WYWxpZGF0ZShmYWxzZSk7Ci0JCQkJLy9nY29uZi5zZXRBdXRvVmFsaWRhdGUodHJ1ZSk7Ci0JCQkJLy9nY29uZi5zZXRCdWlsZFZhbGlkYXRlKHRydWUpOwotCQkJCS8vZ2NvbmYuc2V0TWF4aW11bU51bWJlck9mTWVzc2FnZXMoV29ya2JlbmNoUmVwb3J0ZXIuTk9fTUVTU0FHRV9MSU1JVCk7Ci0JCQkJZ2NvbmYucGFzc2l2YXRlKCk7Ci0JCQkJCi0JCQkJSkRUVXRpbGl0eS5zZXRBdXRvQnVpbGQoZmFsc2UpOwotCQkJCQotCQkJCW1vbml0b3Iuc3ViVGFzaygiTG9hZGluZyBvcGVyYXRpb25zOyBwbGVhc2Ugd2FpdC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJVGVzdFdyYXBwZXJbXSB0ZXN0Q2FzZUFuZE9wZXJhdGlvbnMgPSBnZXRPcGVyYXRpb25zKG1vbml0b3IsIGdjb25mKTsKLQkJCQlpZih0ZXN0Q2FzZUFuZE9wZXJhdGlvbnMgPT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJUZXN0IGNhc2UgZmFpbGVkOyBjYW5ub3QgdGVzdCBudWxsIG9wZXJhdGlvbnMuIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRCdWZmZXIoKS53cml0ZShtZXNzYWdlKTsKLQkJCQkJbW9uaXRvci5zdWJUYXNrKG1lc3NhZ2UpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQotCQkJCWludCBudW1QYXNzZWQgPSAwOwotCQkJCWZvcihpbnQgaT0wOyBpPHRlc3RDYXNlQW5kT3BlcmF0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlUZXN0V3JhcHBlciB0ZXN0V3JhcHBlciA9IHRlc3RDYXNlQW5kT3BlcmF0aW9uc1tpXTsKLQkJCQkJVmFsaWRhdGlvbk9wZXJhdGlvbiBvcGVyYXRpb24gPSB0ZXN0V3JhcHBlci5nZXRPcGVyYXRpb24oKTsKLQkJCQkJYm9vbGVhbiB0cGFzc2VkID0gZmFsc2U7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZihtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJbW9uaXRvci5zdWJUYXNrKCJUZXN0aW5nICIgKyAoaSsxKSArICIgb2YgIiArIHRlc3RDYXNlQW5kT3BlcmF0aW9ucy5sZW5ndGggKyAiIGNvbnN0cnVjdG9ycy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCXByZVRlc3QodGVzdFdyYXBwZXIpOwotCQkJCQkJaWYodGVzdChtb25pdG9yLCB0ZXN0V3JhcHBlcikpIHsKLQkJCQkJCQludW1QYXNzZWQrKzsKLQkJCQkJCQl0cGFzc2VkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiVGhyb3dhYmxlIGNhdWdodCB3aGlsZSB0ZXN0aW5nICMiICsgKGkrMSkgKyAiICIgKyBvcGVyYXRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiVGVzdCAjIiArIChpKzEpICsgIiBvZiAiICsgdGVzdENhc2VBbmRPcGVyYXRpb25zLmxlbmd0aCArICgodHBhc3NlZCkgPyAiIHBhc3NlZC4iIDogIiBmYWlsZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhtZXNzYWdlKTsKLQkJCQkJCWdldEJ1ZmZlcigpLndyaXRlKG1lc3NhZ2UpOwotCQkJCQkJZ2V0QnVmZmVyKCkuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgdGVzdFdyYXBwZXIuZ2V0TmFtZSgpLCB0cGFzc2VkKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCQotCQkJCVN0cmluZyBzdGF0dXMgPSBudW1QYXNzZWQgKyAiIG9mICIgKyB0ZXN0Q2FzZUFuZE9wZXJhdGlvbnMubGVuZ3RoICsgIiB0ZXN0cyBwYXNzZWQuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbW9uaXRvci5zdWJUYXNrKHN0YXR1cyk7Ci0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoc3RhdHVzKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIFNldCB0aGUgcHJvamVjdCdzIHNldHRpbmdzIGJhY2sgdG8gd2hhdCB0aGV5IHdlcmUuCi0JCQkJZ2NvbmYgPSBvcmlnR2NvbmY7Ci0JCQkJZ2NvbmYucGFzc2l2YXRlKCk7Ci0JCQkJCi0JCQkJSkRUVXRpbGl0eS5zZXRBdXRvQnVpbGQoYXV0b0J1aWxkRW5hYmxlZCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcmVUZXN0KFRlc3RXcmFwcGVyIHdyYXBwZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gRmlyc3QsIHJlbW92ZSBhbGwgb2YgdGhlIG1hcmtlcnMuIENhbid0IHJlbHkgb24gdGhlIG9wZXJhdGlvbiB0byByZW1vdmUgdGhlIG1hcmtlcnMgYmV0d2VlbgotCQkvLyBvbmUgaW52b2NhdGlvbiBhbmQgdGhlIG5leHQgYmVjYXVzZSBzb21ldGltZXMgdGhlIHZhbGlkYXRpb24gaXMgbm90IHN1cHBvc2VkIHRvIHJ1bi4KLQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKGdldFByb2plY3QoKSwgd3JhcHBlci5nZXRWYWxpZGF0b3JOYW1lcygpKTsgLy8gbnVsbD1kZWxldGUgbWFya2VycyBvbiBhbGwgb2JqZWN0cwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGVzdCBwYXNzZXMsIGFuZCBmYWxzZSBpZiBpdCBmYWlsZWQuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHRlc3QoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBUZXN0V3JhcHBlciB0ZXN0V3JhcHBlcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBCVlRSdW5uZXIuc2luZ2xldG9uKCkudGVzdChnZXRCdWZmZXIoKSwgZ2V0TmFtZSgpLCB0ZXN0V3JhcHBlci5nZXROYW1lKCksIHRlc3RXcmFwcGVyLmdldEV4cGVjdGVkTWVzc2FnZXMoKSwgdGVzdFdyYXBwZXIuZ2V0T3BlcmF0aW9uKCksIHRlc3RXcmFwcGVyLmdldFZhbGlkYXRvck5hbWVzKCkpICYmIHJlc3VsdDsKLQkJfQotCQljYXRjaChCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSwgZXhjLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5LCB3aXRoIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgYXJyYXkgdGhlIFZhbGlkYXRvclRlc3RjYXNlIHRoYXQgCi0JICogaG9sZHMgdGhlIGV4cGVjdGVkIHJlc3VsdHMsIGFuZCB0aGUgc2Vjb25kIGVudHJ5IG9mIHRoZSBhcnJheSBhIFZhbGlkYXRpb25PcGVyYXRpb25bXQotCSAqIGNvbnRhaW5pbmcgdGhlIG9wZXJhdGlvbnMgdG8gYmUgdGVzdGVkLgotCSAqLwotCXByaXZhdGUgVGVzdFdyYXBwZXJbXSBnZXRPcGVyYXRpb25zKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmNvbmYpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSBhbGxUbWRzID0gSkRUVXRpbGl0eS5nZXRWRlRlc3RzKG1vbml0b3IsIGdldFByb2plY3QoKSk7Ci0JCWlmKChhbGxUbWRzID09IG51bGwpIHx8IChhbGxUbWRzLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBTb21lIG9mIHRoZSBvcGVyYXRpb24gY29uc3RydWN0b3JzIHJlcXVpcmUgZmlsZSBleHRlbnNpb25zLiAKLQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSAiLmphdmEiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZWZhdWx0RXh0ZW5zaW9uID0gbnVsbDsKLQkJSUZpbGUgamF2YUZpbGUgPSBnZXRQcm9qZWN0KCkuZ2V0RmlsZSgiZm9vLmphdmEiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFNvbWUgb2YgdGhlIG9wZXJhdGlvbnMgYmVsb3cgcGFzcyBpZiB0aGV5IGRvbid0IHByb2R1Y2UgYW55IHJlc3VsdHMuCi0JCS8vIENyZWF0ZSBhIHRlc3QgY2FzZSB0aGF0IHBhc3NlcyB0aGUgb3BlcmF0aW9uIGlmIHRoZSBvcGVyYXRpb24gZG9lcyBub3RoaW5nLgotCQlMaXN0IHRtZEVtcHR5ID0gbmV3IEFycmF5TGlzdCgpOyAvLyBleHBlY3RlZCBtZXNzYWdlcyA9PSBub25lCi0JCUxpc3QgdG1kSW5jID0gbmV3IEFycmF5TGlzdCgpOyAvLyBleHBlY3RlZCBtZXNzYWdlcyB3aGVuIGluY3JlbWVudGFsIHZhbGlkYXRvcnMgcmFuCi0JCUxpc3QgdG1kRW5hYmxlZCA9IG5ldyBBcnJheUxpc3QoKTsgLy8gZXhwZWN0ZWQgbWVzc2FnZXMgd2hlbiBlbmFibGVkIHZhbGlkYXRvcnMgcmFuCi0JCUxpc3QgdG1kSmF2YSA9IG5ldyBBcnJheUxpc3QoKTsgLy8gZXhwZWN0ZWQgbWVzc2FnZXMgd2hlbiB2YWxpZGF0b3JzIHRoYXQgdmFsaWRhdGUgLmphdmEgZmlsZXMgYXJlIHJ1bgotCQlMaXN0IHRtZEZ1bGwgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIGV4cGVjdGVkIG1lc3NhZ2VzIHdoZW4gdmFsaWRhdG9ycyB0aGF0IHN1cHBvcnQgb25seSAiUnVuIFZhbGlkYXRpb24iIGFyZSBydW4KLQkJU2V0IGVuYWJsZWRWYWxpZGF0b3JzID0gbmV3IEhhc2hTZXQoKTsgLy8gZW5hYmxlZCB2YWxpZGF0b3JzID09IEZXSyBWYWwsIEZXSyBOb0J1aWxkIFZhbCwgUHJvcGVydGllcyBWYWwKLQkJU2V0IGVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMgPSBuZXcgSGFzaFNldCgpOyAvLyBlbmFibGVkIGluY3JlbWVudGFsID09IEZXSyBWYWwsIFByb3BlcnRpZXMgVmFsIChzdXBwb3J0IGluY3JlbWVudGFsIHZhbGlkYXRpb24pCi0JCVNldCBqYXZhVmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0KCk7IC8vIGphdmEgdmFsID09IEZXSyBWYWwsIEZXSyBOb0J1aWxkIFZhbCAodmFsaWRhdGUgLmphdmEgZmlsZXMpCi0JCVNldCBmdWxsVmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0KCk7IC8vIGZ1bGwgdmFsID09IEZXSyBOb0J1aWxkIFZhbCAocnVucyBvbmx5IHdoZW4gIlJ1biBWYWxpZGF0aW9uIiBjbGlja2VkKQotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRWbWQgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbYWxsVG1kcy5sZW5ndGhdOwotCQlmb3IoaW50IGk9MDsgaTxhbGxUbWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZSB2dCA9IGFsbFRtZHNbaV07Ci0JCQkKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IHZ0LmdldFZhbGlkYXRvck1ldGFEYXRhKCk7Ci0JCQllbmFibGVkVmFsaWRhdG9ycy5hZGQodm1kKTsKLQkJCWVuYWJsZWRWbWRbaV0gPSB2bWQ7Ci0JCQlpZih2bWQuaXNJbmNyZW1lbnRhbCgpKSB7Ci0JCQkJZW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycy5hZGQodm1kKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZ1bGxWYWxpZGF0b3JzLmFkZCh2bWQpOwotCQkJCXRtZEZ1bGwuYWRkQWxsKHZ0LmdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTikpOwotCQkJfQotCQkJCi0JCQkvLyBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNvZGUgdGhhdCBpbnN0YW50aWF0ZXMgdGhlIFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbgotCQkJLy8gdG8gZW5zdXJlIHRoYXQgd2hlbiBhbiBhcnJheSBvZiBjaGFuZ2VkIHJlc291cmNlcyBvciBvYmplY3RzIGlzIHBhc3NlZCB0byB0aGUgb3BlcmF0aW9uLAotCQkJLy8gdGhhdCBvbmx5IGluY3JlbWVudGFsIHZhbGlkYXRvcnMgYXJlIGludm9rZWQgYnkgdGhlIG9wZXJhdGlvbi4gVGhlIGZyYW1ld29yayBkb2VzIG5vdAotCQkJLy8gY2hlY2sgaWYgdGhlIHZhbGlkYXRvcnMgYXJlIGluY3JlbWVudGFsIG9yIG5vdDsgaW5zdGVhZCwgdGhlIG5hbWVkIHZhbGlkYXRvcnMgd2lsbCBydW4sCi0JCQkvLyBldmVuIGlmIHRoZXkgcGVyZm9ybSBhIGZ1bGwgdmFsaWRhdGlvbiBpbnN0ZWFkIG9mIHZhbGlkYXRpbmcganVzdCB0aGUgYXJyYXlzLgotCQkJaWYodm1kLmlzQXBwbGljYWJsZVRvKGphdmFGaWxlKSAmJiB2bWQuaXNJbmNyZW1lbnRhbCgpKSB7Ci0JCQkJamF2YVZhbGlkYXRvcnMuYWRkKHZtZCk7Ci0JCQkJdG1kSmF2YS5hZGRBbGwodnQuZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLklOQ1JFTUVOVEFMX1ZBTElEQVRJT04pKTsKLQkJCX0KLQkJCQotCQkJdG1kRW5hYmxlZC5hZGRBbGwodnQuZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLlJVTl9WQUxJREFUSU9OKSk7Ci0JCQl0bWRJbmMuYWRkQWxsKHZ0LmdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5JTkNSRU1FTlRBTF9WQUxJREFUSU9OKSk7CQkJCi0JCX0KLQkJU3RyaW5nW10gYWxsVmFsaWRhdG9yTmFtZXMgPSBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFZhbGlkYXRvck5hbWVzKGVuYWJsZWRWYWxpZGF0b3JzKTsKLQkJU3RyaW5nW10gaW5jVmFsaWRhdG9yTmFtZXMgPSBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFZhbGlkYXRvck5hbWVzKGVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMpOwotCQlTdHJpbmdbXSBqYXZhVmFsaWRhdG9yTmFtZXMgPSBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFZhbGlkYXRvck5hbWVzKGphdmFWYWxpZGF0b3JzKTsKLQkJU3RyaW5nW10gZnVsbFZhbGlkYXRvck5hbWVzID0gSW50ZXJuYWxWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRWYWxpZGF0b3JOYW1lcyhmdWxsVmFsaWRhdG9ycyk7Ci0JCQotCQl2Y29uZi5zZXRFbmFibGVkVmFsaWRhdG9ycyhlbmFibGVkVm1kKTsKLQkJdmNvbmYucGFzc2l2YXRlKCk7Ci0JCQotCQkvLyBTdGFydCBjb25zdHJ1Y3RpbmcgdGhlIHRlc3RzCi0JCS8vIEZvciB0aGUgdGVzdHMgdGhhdCBkZXBlbmQgb24gdGhlIHZhbHVlIG9mIHRoZSBhdXRvQnVpbGQgc2V0dGluZywgaXQgaXMgYXNzdW1lZCB0aGF0Ci0JCS8vIGF1dG9CdWlsZCBpcyBvbi4gVGhlIHRlc3RzIHdpbGwgZmFpbCBpZiBhdXRvQnVpbGQgaXMgZGlzYWJsZWQuCi0JCS8vCi0JCS8vIFVubGlrZSB0aGUgc3Vic2VxdWVudCBvcGVyYXRpb25zLCB0aGVzZSBmaXJzdCB0d28gY2Fubm90IHVzZSB0aGUgYWxsVG1kcyBUTUQgYmVjYXVzZQotCQkvLyBtb3JlIHRoYW4gb25lIHZhbGlkYXRvciBydW5zLiBUaGUgYWxsVG1kRnVsbCBUTUQgY29udGFpbnMgYWxsIHRtZCBvZiB2YWxpZGF0b3JzIHRoYXQKLQkJLy8gd2lsbCBydW4uIAotCQlBbGxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMSA9IG5ldyBBbGxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3QxID0gbmV3IFRlc3RXcmFwcGVyKG9wMSwgdG1kRW5hYmxlZCwgIm9wMSIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJQWxsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDIgPSBuZXcgQWxsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZhbHNlKTsgLy8gZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MiA9IG5ldyBUZXN0V3JhcHBlcihvcDIsIHRtZEVuYWJsZWQsICJvcDIiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDb25zdHJ1Y3QgdGhlIGlucHV0IGZvciB0aGUgcmVzdCBvZiB0aGUgb3BlcmF0aW9ucyB1c2luZyB0aGUgVkYgVGVzdCB2YWxpZGF0b3JzLgotCQlUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbiBpbnB1dE9wID0gbmV3IFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uKGdldEJ1ZmZlcigpLCBnZXRQcm9qZWN0KCkpOwotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihpbnB1dE9wLCBtb25pdG9yKTsKLQkJfQotCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgVGVzdFdyYXBwZXJbMF07Ci0JCX0KLQkJCi0JCUlSZXNvdXJjZVtdIGNoYW5nZWRSZXNvdXJjZXMgPSBUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5nZXRDaGFuZ2VkUmVzb3VyY2VzKGdldFByb2plY3QoKSwgYWxsVG1kcyk7Ci0JCUlSZXNvdXJjZVtdIGVtcHR5UmVzb3VyY2VzID0gVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uZ2V0RW1wdHlSZXNvdXJjZXMoZ2V0UHJvamVjdCgpKTsKLQkJSmF2YUhlbHBlcnNbXSBjaGFuZ2VkQ2xhc3NlcyA9IGlucHV0T3AuZ2V0Q2hhbmdlZENsYXNzZXMoY2hhbmdlZFJlc291cmNlcyk7Ci0JCUlSZXNvdXJjZURlbHRhIGVtcHR5RGVsdGEgPSBpbnB1dE9wLmdldEVtcHR5RGVsdGEoKTsKLQkJSVJlc291cmNlRGVsdGEgY2hhbmdlZERlbHRhID0gaW5wdXRPcC5nZXRDaGFuZ2VkRGVsdGEoKTsKLQkJLy8gZW5kIGNvbnN0cnVjdCBpbnB1dAotCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3AzID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBudWxsLHRydWUpOwotCQlUZXN0V3JhcHBlciB0ZXN0MyA9IG5ldyBUZXN0V3JhcHBlcihvcDMsIHRtZEluYywgIm9wMyIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDQgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSxmYWxzZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0ID0gbmV3IFRlc3RXcmFwcGVyKG9wNCwgdG1kSW5jLCAib3A0IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wNSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSxmYWxzZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1ID0gbmV3IFRlc3RXcmFwcGVyKG9wNSwgdG1kRW1wdHksICJvcDUiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3A2ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBudWxsLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCxmYWxzZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q2ID0gbmV3IFRlc3RXcmFwcGVyKG9wNiwgdG1kSW5jLCAib3A2IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wNyA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgY2hhbmdlZERlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCxmYWxzZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q3ID0gbmV3IFRlc3RXcmFwcGVyKG9wNywgdG1kSW5jLCAib3A3IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wOCA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsZmFsc2UpOwotCQlUZXN0V3JhcHBlciB0ZXN0OCA9IG5ldyBUZXN0V3JhcHBlcihvcDgsIHRtZEVtcHR5LCAib3A4IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wOSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycywgbnVsbCwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QpOwotCQlUZXN0V3JhcHBlciB0ZXN0OSA9IG5ldyBUZXN0V3JhcHBlcihvcDksIHRtZEluYywgIm9wOSIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDEwID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzLCBjaGFuZ2VkRGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNUKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDEwID0gbmV3IFRlc3RXcmFwcGVyKG9wMTAsIHRtZEluYywgIm9wMTAiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3AxMSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycywgZW1wdHlEZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QpOwotCQlUZXN0V3JhcHBlciB0ZXN0MTEgPSBuZXcgVGVzdFdyYXBwZXIob3AxMSwgdG1kRW1wdHksICJvcDExIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMTIgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIG51bGwsIGZhbHNlKTsgLy8gZnVsbCB2YWxpZGF0ZSwgZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MTIgPSBuZXcgVGVzdFdyYXBwZXIob3AxMiwgdG1kSW5jLCAib3AxMiIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDEzID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsIGZhbHNlKTsgLy8gZGVsdGEgdmFsaWRhdGUsIGRvbid0IGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDEzID0gbmV3IFRlc3RXcmFwcGVyKG9wMTMsIHRtZEluYywgIm9wMTMiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3AxNCA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSwgZmFsc2UpOyAvLyBlbXB0eSBkZWx0YSB2YWxpZGF0ZSwgZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MTQgPSBuZXcgVGVzdFdyYXBwZXIob3AxNCwgdG1kRW1wdHksICJvcDE0IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMTUgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIG51bGwsIElSdWxlR3JvdXAuUEFTU19GQVNULCBmYWxzZSk7IC8vIGZ1bGwgdmFsaWRhdGUsIGRvbid0IGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDE1ID0gbmV3IFRlc3RXcmFwcGVyKG9wMTUsIHRtZEluYywgIm9wMTUiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3AxNiA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgY2hhbmdlZERlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCwgZmFsc2UpOyAvLyBkZWx0YSB2YWxpZGF0ZSwgZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MTYgPSBuZXcgVGVzdFdyYXBwZXIob3AxNiwgdG1kSW5jLCAib3AxNiIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDE3ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbXB0eURlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCwgZmFsc2UpOyAvLyBlbXB0eSBkZWx0YSB2YWxpZGF0ZSwgZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MTcgPSBuZXcgVGVzdFdyYXBwZXIob3AxNywgdG1kRW1wdHksICJvcDE3IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDE4ID0gbmV3IEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3QxOD0gbmV3IFRlc3RXcmFwcGVyKG9wMTgsIHRtZEVuYWJsZWQsICJvcDE4IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDE5ID0gbmV3IEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmFsc2UpOyAvLyBkb24ndCBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QxOSA9IG5ldyBUZXN0V3JhcHBlcihvcDE5LCB0bWRFbmFibGVkLCAib3AxOSIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AyMCA9IG5ldyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIElSdWxlR3JvdXAuUEFTU19GQVNUKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDIwID0gbmV3IFRlc3RXcmFwcGVyKG9wMjAsIHRtZEVuYWJsZWQsICJvcDIwIiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDIxID0gbmV3IEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIHRydWUsZmFsc2UpOyAvLyBmb3JjZSB2YWxpZGF0aW9uIGlmIGl0IGRvZXNuJ3QgbmVlZCB0byBydW4KLQkJVGVzdFdyYXBwZXIgdGVzdDIxID0gbmV3IFRlc3RXcmFwcGVyKG9wMjEsIHRtZEVuYWJsZWQsICJvcDIxIiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDIyID0gbmV3IEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIGZhbHNlLGZhbHNlKTsgLy8gbm8gZm9yY2UgdmFsaWRhdGlvbiBpZiBpdCBkb2Vzbid0IG5lZWQgdG8gcnVuCi0JCVRlc3RXcmFwcGVyIHRlc3QyMiA9IG5ldyBUZXN0V3JhcHBlcihvcDIyLCB0bWRFbmFibGVkLCAib3AyMiIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AyMyA9IG5ldyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIElSdWxlR3JvdXAuUEFTU19GQVNULCB0cnVlLCBmYWxzZSk7IC8vIGZvcmNlLCBkb24ndCBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QyMyA9IG5ldyBUZXN0V3JhcHBlcihvcDIzLCB0bWRFbmFibGVkLCAib3AyMyIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AyNCA9IG5ldyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIElSdWxlR3JvdXAuUEFTU19GQVNULCBmYWxzZSwgZmFsc2UpOyAvLyBubyBmb3JjZSwgZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MjQgPSBuZXcgVGVzdFdyYXBwZXIob3AyNCwgdG1kRW5hYmxlZCwgIm9wMjQiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMjUgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIG51bGwsdHJ1ZSk7IAotCQlUZXN0V3JhcHBlciB0ZXN0MjUgPSBuZXcgVGVzdFdyYXBwZXIob3AyNSwgdG1kRW5hYmxlZCwgIm9wMjUiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMjYgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSx0cnVlKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDI2ID0gbmV3IFRlc3RXcmFwcGVyKG9wMjYsIHRtZEluYywgIm9wMjYiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMjcgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVtcHR5RGVsdGEsdHJ1ZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3QyNyA9IG5ldyBUZXN0V3JhcHBlcihvcDI3LCB0bWRFbXB0eSwgIm9wMjciLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMjggPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIG51bGwsIElSdWxlR3JvdXAuUEFTU19GQVNULHRydWUpOwotCQlUZXN0V3JhcHBlciB0ZXN0MjggPSBuZXcgVGVzdFdyYXBwZXIob3AyOCwgdG1kRW5hYmxlZCwgIm9wMjgiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMjkgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsdHJ1ZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3QyOSA9IG5ldyBUZXN0V3JhcHBlcihvcDI5LCB0bWRJbmMsICJvcDI5IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDMwID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbXB0eURlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCx0cnVlKTsgCi0JCVRlc3RXcmFwcGVyIHRlc3QzMCA9IG5ldyBUZXN0V3JhcHBlcihvcDMwLCB0bWRFbXB0eSwgIm9wMzAiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBhbGxUbWRzWzBdLmdldFZhbGlkYXRvck1ldGFEYXRhKCk7Ci0JCVN0cmluZyB2YWxpZGF0b3JOYW1lID0gdm1kLmdldFZhbGlkYXRvclVuaXF1ZU5hbWUoKTsKLQkJU3RyaW5nW10gdm1kTmFtZXMgPSBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFZhbGlkYXRvck5hbWVzKG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtde3ZtZH0pOwotCQlMaXN0IGV4cGVjdGVkTWVzc2FnZXMgPSBhbGxUbWRzWzBdLmdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTik7Ci0JCU9uZVZhbGlkYXRvck9wZXJhdGlvbiBvcDMxID0gbmV3IE9uZVZhbGlkYXRvck9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHZhbGlkYXRvck5hbWUpOwotCQlUZXN0V3JhcHBlciB0ZXN0MzEgPSBuZXcgVGVzdFdyYXBwZXIob3AzMSwgZXhwZWN0ZWRNZXNzYWdlcywgIm9wMzEiLCB2bWROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCU9uZVZhbGlkYXRvck9wZXJhdGlvbiBvcDMyID0gbmV3IE9uZVZhbGlkYXRvck9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHZhbGlkYXRvck5hbWUsIHRydWUpOyAvLyBmb3JjZSBpZiBuZWNlc3NhcnkKLQkJVGVzdFdyYXBwZXIgdGVzdDMyID0gbmV3IFRlc3RXcmFwcGVyKG9wMzIsIGV4cGVjdGVkTWVzc2FnZXMsICJvcDMyIiwgdm1kTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlPbmVWYWxpZGF0b3JPcGVyYXRpb24gb3AzMyA9IG5ldyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB2YWxpZGF0b3JOYW1lLCBmYWxzZSk7IC8vIG5vIGZvcmNlCi0JCVRlc3RXcmFwcGVyIHRlc3QzMyA9IG5ldyBUZXN0V3JhcHBlcihvcDMzLCBleHBlY3RlZE1lc3NhZ2VzLCAib3AzMyIsIHZtZE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJT25lVmFsaWRhdG9yT3BlcmF0aW9uIG9wMzQgPSBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKGdldFByb2plY3QoKSwgdmFsaWRhdG9yTmFtZSwgdHJ1ZSwgZmFsc2UpOyAvLyBmb3JjZSwgbm8gZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MzQgPSBuZXcgVGVzdFdyYXBwZXIob3AzNCwgZXhwZWN0ZWRNZXNzYWdlcywgIm9wMzQiLCB2bWROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCU9uZVZhbGlkYXRvck9wZXJhdGlvbiBvcDM1ID0gbmV3IE9uZVZhbGlkYXRvck9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHZhbGlkYXRvck5hbWUsIGZhbHNlLCBmYWxzZSk7IC8vIG5vIGZvcmNlLCBubyBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QzNSA9IG5ldyBUZXN0V3JhcHBlcihvcDM1LCBleHBlY3RlZE1lc3NhZ2VzLCAib3AzNSIsIHZtZE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJT25lVmFsaWRhdG9yT3BlcmF0aW9uIG9wMzYgPSBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKGdldFByb2plY3QoKSwgdmFsaWRhdG9yTmFtZSwgdHJ1ZSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QpOyAvLyBmb3JjZQotCQlUZXN0V3JhcHBlciB0ZXN0MzYgPSBuZXcgVGVzdFdyYXBwZXIob3AzNiwgZXhwZWN0ZWRNZXNzYWdlcywgIm9wMzYiLCB2bWROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCU9uZVZhbGlkYXRvck9wZXJhdGlvbiBvcDM3ID0gbmV3IE9uZVZhbGlkYXRvck9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHZhbGlkYXRvck5hbWUsIGZhbHNlLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCk7IC8vIG5vIGZvcmNlCi0JCVRlc3RXcmFwcGVyIHRlc3QzNyA9IG5ldyBUZXN0V3JhcHBlcihvcDM3LCBleHBlY3RlZE1lc3NhZ2VzLCAib3AzNyIsIHZtZE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJT25lVmFsaWRhdG9yT3BlcmF0aW9uIG9wMzggPSBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKGdldFByb2plY3QoKSwgdmFsaWRhdG9yTmFtZSwgdHJ1ZSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIGZhbHNlKTsgLy8gZm9yY2UsIG5vIGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDM4ID0gbmV3IFRlc3RXcmFwcGVyKG9wMzgsIGV4cGVjdGVkTWVzc2FnZXMsICJvcDM4Iiwgdm1kTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlPbmVWYWxpZGF0b3JPcGVyYXRpb24gb3AzOSA9IG5ldyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB2YWxpZGF0b3JOYW1lLCBmYWxzZSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIGZhbHNlKTsgLy8gbm8gZm9yY2UsIG5vIGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDM5ID0gbmV3IFRlc3RXcmFwcGVyKG9wMzksIGV4cGVjdGVkTWVzc2FnZXMsICJvcDM5Iiwgdm1kTmFtZXMpOyAvLyROT04tTkxTLTEkCi0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNDAgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSx0cnVlLGZhbHNlKTsKLQkJb3A0MC5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDQwID0gbmV3IFRlc3RXcmFwcGVyKG9wNDAsIHRtZEVuYWJsZWQsICJvcDQwIiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A0MSA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB0cnVlLGZhbHNlKTsgLy8gZm9yY2UKLQkJb3A0MS5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDQxID0gbmV3IFRlc3RXcmFwcGVyKG9wNDEsIHRtZEVuYWJsZWQsICJvcDQxIiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A0MiA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmYWxzZSxmYWxzZSk7IC8vIG5vIGZvcmNlCi0JCW9wNDIuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0MiA9IG5ldyBUZXN0V3JhcHBlcihvcDQyLCB0bWRFbmFibGVkLCAib3A0MiIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNDMgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgdHJ1ZSwgZmFsc2UpOyAvLyBmb3JjZSwgbm8gZm9yawotCQlvcDQzLnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NDMgPSBuZXcgVGVzdFdyYXBwZXIob3A0MywgdG1kRW5hYmxlZCwgIm9wNDMiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDQ0ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZhbHNlLCBmYWxzZSk7IC8vIG5vIGZvcmNlLCBubyBmb3JrCi0JCW9wNDQuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0NCA9IG5ldyBUZXN0V3JhcHBlcihvcDQ0LCB0bWRFbmFibGVkLCAib3A0NCIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNDUgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgdHJ1ZSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsZmFsc2UpOyAvLyBmb3JjZQotCQlvcDQ1LnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NDUgPSBuZXcgVGVzdFdyYXBwZXIob3A0NSwgdG1kRW5hYmxlZCwgIm9wNDUiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDQ2ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZhbHNlLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCxmYWxzZSk7IC8vIG5vIGZvcmNlCi0JCW9wNDYuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0NiA9IG5ldyBUZXN0V3JhcHBlcihvcDQ2LCB0bWRFbmFibGVkLCAib3A0NiIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNDcgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgdHJ1ZSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIGZhbHNlKTsgLy8gZm9yY2UsIG5vIGZvcmsKLQkJb3A0Ny5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDQ3ID0gbmV3IFRlc3RXcmFwcGVyKG9wNDcsIHRtZEVuYWJsZWQsICJvcDQ3IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A0OCA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmYWxzZSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIGZhbHNlKTsgLy8gbm8gZm9yY2UsIG5vIGZvcmsKLQkJb3A0OC5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDQ4ID0gbmV3IFRlc3RXcmFwcGVyKG9wNDgsIHRtZEVuYWJsZWQsICJvcDQ4IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A0OSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgbnVsbCxmYWxzZSk7Ci0JCW9wNDkuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0OSA9IG5ldyBUZXN0V3JhcHBlcihvcDQ5LCB0bWRFbmFibGVkLCAib3A0OSIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNTAgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSxmYWxzZSk7Ci0JCW9wNTAuc2V0VmFsaWRhdG9ycyhpbmNWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1MCA9IG5ldyBUZXN0V3JhcHBlcihvcDUwLCB0bWRJbmMsICJvcDUwIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A1MSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSxmYWxzZSk7Ci0JCW9wNTEuc2V0VmFsaWRhdG9ycyhpbmNWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1MSA9IG5ldyBUZXN0V3JhcHBlcihvcDUxLCB0bWRFbXB0eSwgIm9wNTEiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDUyID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBudWxsLCBmYWxzZSk7IC8vIGZhbHNlPWF1dG9CdWlsZCBkaXNhYmxlZAotCQlvcDUyLnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NTIgPSBuZXcgVGVzdFdyYXBwZXIob3A1MiwgdG1kRW5hYmxlZCwgIm9wNTIiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDUzID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBudWxsLCB0cnVlKTsgLy8gdHJ1ZT1hdXRvQnVpbGQgZW5hYmxlZAotCQlvcDUzLnNldFZhbGlkYXRvcnMoZnVsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDUzID0gbmV3IFRlc3RXcmFwcGVyKG9wNTMsIHRtZEZ1bGwsICJvcDUzIiwgZnVsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNTQgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSwgZmFsc2UpOyAvLyBmYWxzZT1hdXRvQnVpbGQgZGlzYWJsZWQKLQkJb3A1NC5zZXRWYWxpZGF0b3JzKGluY1ZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDU0ID0gbmV3IFRlc3RXcmFwcGVyKG9wNTQsIHRtZEluYywgIm9wNTQiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDU1ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsIHRydWUpOyAvLyB0cnVlPWF1dG9CdWlsZCBlbmFibGVkCi0JCW9wNTUuc2V0VmFsaWRhdG9ycyhpbmNWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1NSA9IG5ldyBUZXN0V3JhcHBlcihvcDU1LCB0bWRFbXB0eSwgIm9wNTUiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDU2ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbXB0eURlbHRhLCBmYWxzZSk7IC8vIGZhbHNlPWF1dG9CdWlsZCBkaXNhYmxlZAotCQlvcDU2LnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NTYgPSBuZXcgVGVzdFdyYXBwZXIob3A1NiwgdG1kRW1wdHksICJvcDU2IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A1NyA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSwgdHJ1ZSk7IC8vIHRydWU9YXV0b0J1aWxkIGVuYWJsZWQKLQkJb3A1Ny5zZXRWYWxpZGF0b3JzKGluY1ZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDU3ID0gbmV3IFRlc3RXcmFwcGVyKG9wNTcsIHRtZEVtcHR5LCAib3A1NyIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNTggPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksbnVsbCwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsZmFsc2UpOyAvLyBmYWxzZT1hdXRvQnVpbGQgZGlzYWJsZWQKLQkJb3A1OC5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDU4ID0gbmV3IFRlc3RXcmFwcGVyKG9wNTgsIHRtZEVuYWJsZWQsICJvcDU4IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A1OSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgbnVsbCwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsZmFsc2UpOyAvLyB0cnVlPWF1dG9CdWlsZCBlbmFibGVkCi0JCW9wNTkuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1OSA9IG5ldyBUZXN0V3JhcHBlcihvcDU5LCB0bWRGdWxsLCAib3A1OSIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNjAgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsZmFsc2UpOyAvLyBmYWxzZT1hdXRvQnVpbGQgZGlzYWJsZWQKLQkJb3A2MC5zZXRWYWxpZGF0b3JzKGluY1ZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDYwID0gbmV3IFRlc3RXcmFwcGVyKG9wNjAsIHRtZEluYywgIm9wNjAiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDYxID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNULGZhbHNlKTsgLy8gdHJ1ZT1hdXRvQnVpbGQgZW5hYmxlZAotCQlvcDYxLnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NjEgPSBuZXcgVGVzdFdyYXBwZXIob3A2MSwgdG1kRW1wdHksICJvcDYxIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A2MiA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSxJUnVsZUdyb3VwLlBBU1NfRkFTVCxmYWxzZSk7IC8vIGZhbHNlPWF1dG9CdWlsZCBkaXNhYmxlZAotCQlvcDYyLnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NjIgPSBuZXcgVGVzdFdyYXBwZXIob3A2MiwgdG1kRW1wdHksICJvcDYyIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A2MyA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSxJUnVsZUdyb3VwLlBBU1NfRkFTVCx0cnVlKTsgLy8gdHJ1ZT1hdXRvQnVpbGQgZW5hYmxlZAotCQlvcDYzLnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NjMgPSBuZXcgVGVzdFdyYXBwZXIob3A2MywgdG1kRW1wdHksICJvcDYzIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A2NCA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSxudWxsLElSdWxlR3JvdXAuUEFTU19GQVNULHRydWUpOwotCQlvcDY0LnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NjQgPSBuZXcgVGVzdFdyYXBwZXIob3A2NCwgdG1kRW5hYmxlZCwgIm9wNjQiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDY1ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNULHRydWUpOwotCQlvcDY1LnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NjUgPSBuZXcgVGVzdFdyYXBwZXIob3A2NSwgdG1kSW5jLCAib3A2NSIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNjYgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVtcHR5RGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNULHRydWUpOwotCQlvcDY2LnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NjYgPSBuZXcgVGVzdFdyYXBwZXIob3A2NiwgdG1kRW1wdHksICJvcDY2IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYoY2hhbmdlZENsYXNzZXMgIT0gbnVsbCkgewotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNjcgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgY2hhbmdlZFJlc291cmNlcyxmYWxzZSk7Ci0JCQlvcDY3LnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q2NyA9IG5ldyBUZXN0V3JhcHBlcihvcDY3LCB0bWRKYXZhLCAib3A2NyIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNjggPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgY2hhbmdlZFJlc291cmNlcywgZmFsc2UpOyAvLyBubyBmb3JrCi0JCQlvcDY4LnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q2OCA9IG5ldyBUZXN0V3JhcHBlcihvcDY4LCB0bWRKYXZhLCAib3A2OCIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNjkgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgZGVmYXVsdEV4dGVuc2lvbiwgY2hhbmdlZFJlc291cmNlcyxmYWxzZSk7Ci0JCQlvcDY5LnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q2OSA9IG5ldyBUZXN0V3JhcHBlcihvcDY5LCB0bWRKYXZhLCAib3A2OSIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNzAgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgZGVmYXVsdEV4dGVuc2lvbiwgY2hhbmdlZFJlc291cmNlcywgZmFsc2UpOyAvLyBubyBmb3JrCi0JCQlvcDcwLnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q3MCA9IG5ldyBUZXN0V3JhcHBlcihvcDcwLCB0bWRKYXZhLCAib3A3MCIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNzEgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgZW1wdHlSZXNvdXJjZXMsZmFsc2UpOwotCQkJb3A3MS5zZXRWYWxpZGF0b3JzKGphdmFWYWxpZGF0b3JOYW1lcyk7Ci0JCQlUZXN0V3JhcHBlciB0ZXN0NzEgPSBuZXcgVGVzdFdyYXBwZXIob3A3MSwgdG1kRW1wdHksICJvcDcxIiwgamF2YVZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A3MiA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmaWxlRXh0ZW5zaW9uLCBlbXB0eVJlc291cmNlcywgZmFsc2UpOyAvLyBubyBmb3JrCi0JCQlvcDcyLnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q3MiA9IG5ldyBUZXN0V3JhcHBlcihvcDcyLCB0bWRFbXB0eSwgIm9wNzIiLCBqYXZhVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDczID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZpbGVFeHRlbnNpb24sIGRlZmF1bHRFeHRlbnNpb24sIGVtcHR5UmVzb3VyY2VzLGZhbHNlKTsKLQkJCW9wNzMuc2V0VmFsaWRhdG9ycyhqYXZhVmFsaWRhdG9yTmFtZXMpOwotCQkJVGVzdFdyYXBwZXIgdGVzdDczID0gbmV3IFRlc3RXcmFwcGVyKG9wNzMsIHRtZEVtcHR5LCAib3A3MyIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNzQgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgZGVmYXVsdEV4dGVuc2lvbiwgZW1wdHlSZXNvdXJjZXMsIGZhbHNlKTsgLy8gbm8gZm9yawotCQkJb3A3NC5zZXRWYWxpZGF0b3JzKGphdmFWYWxpZGF0b3JOYW1lcyk7Ci0JCQlUZXN0V3JhcHBlciB0ZXN0NzQgPSBuZXcgVGVzdFdyYXBwZXIob3A3NCwgdG1kRW1wdHksICJvcDc0IiwgamF2YVZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A3NSA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmaWxlRXh0ZW5zaW9uLCBjaGFuZ2VkQ2xhc3NlcyxmYWxzZSk7Ci0JCQlvcDc1LnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q3NSA9IG5ldyBUZXN0V3JhcHBlcihvcDc1LCB0bWRKYXZhLCAib3A3NSIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNzYgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgY2hhbmdlZENsYXNzZXMsIGZhbHNlKTsgLy8gbm8gZm9yawotCQkJb3A3Ni5zZXRWYWxpZGF0b3JzKGphdmFWYWxpZGF0b3JOYW1lcyk7Ci0JCQlUZXN0V3JhcHBlciB0ZXN0NzYgPSBuZXcgVGVzdFdyYXBwZXIob3A3NiwgdG1kSmF2YSwgIm9wNzYiLCBqYXZhVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDc3ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZpbGVFeHRlbnNpb24sIGRlZmF1bHRFeHRlbnNpb24sIGNoYW5nZWRDbGFzc2VzLGZhbHNlKTsKLQkJCW9wNzcuc2V0VmFsaWRhdG9ycyhqYXZhVmFsaWRhdG9yTmFtZXMpOwotCQkJVGVzdFdyYXBwZXIgdGVzdDc3ID0gbmV3IFRlc3RXcmFwcGVyKG9wNzcsIHRtZEphdmEsICJvcDc3IiwgamF2YVZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A3OCA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmaWxlRXh0ZW5zaW9uLCBkZWZhdWx0RXh0ZW5zaW9uLCBjaGFuZ2VkQ2xhc3NlcywgZmFsc2UpOyAvLyBubyBmb3JrCi0JCQlvcDc4LnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q3OCA9IG5ldyBUZXN0V3JhcHBlcihvcDc4LCB0bWRKYXZhLCAib3A3OCIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVGVzdFdyYXBwZXJbXSByZXN1bHQgPSBuZXcgVGVzdFdyYXBwZXJbXSB7Ci0JCQkJdGVzdDEsIHRlc3QyLCB0ZXN0MywgdGVzdDQsIHRlc3Q1LCB0ZXN0NiwgdGVzdDcsIHRlc3Q4LCB0ZXN0OSwKLQkJCQl0ZXN0MTAsIHRlc3QxMSwgdGVzdDEyLCB0ZXN0MTMsIHRlc3QxNCwgdGVzdDE1LCB0ZXN0MTYsIHRlc3QxNywgdGVzdDE4LCB0ZXN0MTksCi0JCQkJdGVzdDIwLCB0ZXN0MjEsIHRlc3QyMiwgdGVzdDIzLCB0ZXN0MjQsIHRlc3QyNSwgdGVzdDI2LCB0ZXN0MjcsIHRlc3QyOCwgdGVzdDI5LAotCQkJCXRlc3QzMCwgdGVzdDMxLCB0ZXN0MzIsIHRlc3QzMywgdGVzdDM0LCB0ZXN0MzUsIHRlc3QzNiwgdGVzdDM3LCB0ZXN0MzgsIHRlc3QzOSwKLQkJCQl0ZXN0NDAsIHRlc3Q0MSwgdGVzdDQyLCB0ZXN0NDMsIHRlc3Q0NCwgdGVzdDQ1LCB0ZXN0NDYsIHRlc3Q0NywgdGVzdDQ4LCB0ZXN0NDksCi0JCQkJdGVzdDUwLCB0ZXN0NTEsIHRlc3Q1MiwgdGVzdDUzLCB0ZXN0NTQsIHRlc3Q1NSwgdGVzdDU2LCB0ZXN0NTcsIHRlc3Q1OCwgdGVzdDU5LAotCQkJCXRlc3Q2MCwgdGVzdDYxLCB0ZXN0NjIsIHRlc3Q2MywgdGVzdDY0LCB0ZXN0NjUsIHRlc3Q2NiwgdGVzdDY3LCB0ZXN0NjgsIHRlc3Q2OSwKLQkJCQl0ZXN0NzAsIHRlc3Q3MSwgdGVzdDcyLCB0ZXN0NzMsIHRlc3Q3NCwgdGVzdDc1LCB0ZXN0NzYsIHRlc3Q3NywgdGVzdDc4Ci0JCQl9OwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQllbHNlIHsKLQkJCVRlc3RXcmFwcGVyW10gcmVzdWx0ID0gbmV3IFRlc3RXcmFwcGVyW10gewotCQkJCXRlc3QxLCB0ZXN0MiwgdGVzdDMsIHRlc3Q0LCB0ZXN0NSwgdGVzdDYsIHRlc3Q3LCB0ZXN0OCwgdGVzdDksCi0JCQkJdGVzdDEwLCB0ZXN0MTEsIHRlc3QxMiwgdGVzdDEzLCB0ZXN0MTQsIHRlc3QxNSwgdGVzdDE2LCB0ZXN0MTcsIHRlc3QxOCwgdGVzdDE5LAotCQkJCXRlc3QyMCwgdGVzdDIxLCB0ZXN0MjIsIHRlc3QyMywgdGVzdDI0LCB0ZXN0MjUsIHRlc3QyNiwgdGVzdDI3LCB0ZXN0MjgsIHRlc3QyOSwKLQkJCQl0ZXN0MzAsIHRlc3QzMSwgdGVzdDMyLCB0ZXN0MzMsIHRlc3QzNCwgdGVzdDM1LCB0ZXN0MzYsIHRlc3QzNywgdGVzdDM4LCB0ZXN0MzksCi0JCQkJdGVzdDQwLCB0ZXN0NDEsIHRlc3Q0MiwgdGVzdDQzLCB0ZXN0NDQsIHRlc3Q0NSwgdGVzdDQ2LCB0ZXN0NDcsIHRlc3Q0OCwgdGVzdDQ5LAotCQkJCXRlc3Q1MCwgdGVzdDUxLCB0ZXN0NTIsIHRlc3Q1MywgdGVzdDU0LCB0ZXN0NTUsIHRlc3Q1NiwgdGVzdDU3LCB0ZXN0NTgsIHRlc3Q1OSwKLQkJCQl0ZXN0NjAsIHRlc3Q2MSwgdGVzdDYyLCB0ZXN0NjMsIHRlc3Q2NCwgdGVzdDY1LCB0ZXN0NjYKLQkJCX07Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9CQkKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRlc3RXcmFwcGVyIHsKLQkJcHJpdmF0ZSBMaXN0IF9tZXNzYWdlcyA9IG51bGw7Ci0JCXByaXZhdGUgVmFsaWRhdGlvbk9wZXJhdGlvbiBfb3BlcmF0aW9uID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgX3Rlc3ROYW1lID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmdbXSBfdmFsaWRhdG9yTmFtZXMgPSBudWxsOwotCQkKLQkJVGVzdFdyYXBwZXIoVmFsaWRhdGlvbk9wZXJhdGlvbiBvcCwgTGlzdCBleHBlY3RlZE1lc3NhZ2VzLCBTdHJpbmcgdGVzdE5hbWUsIFN0cmluZ1tdIHZhbGlkYXRvck5hbWVzKSB7Ci0JCQlfbWVzc2FnZXMgPSBleHBlY3RlZE1lc3NhZ2VzOwotCQkJX29wZXJhdGlvbiA9IG9wOwotCQkJX3Rlc3ROYW1lID0gdGVzdE5hbWU7Ci0JCQlfdmFsaWRhdG9yTmFtZXMgPSB2YWxpZGF0b3JOYW1lczsKLQkJfQotCQkKLQkJcHVibGljIExpc3QgZ2V0RXhwZWN0ZWRNZXNzYWdlcygpIHsKLQkJCXJldHVybiBfbWVzc2FnZXM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBWYWxpZGF0aW9uT3BlcmF0aW9uIGdldE9wZXJhdGlvbigpIHsKLQkJCXJldHVybiBfb3BlcmF0aW9uOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gX3Rlc3ROYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsaWRhdG9yTmFtZXMoKSB7Ci0JCQlyZXR1cm4gX3ZhbGlkYXRvck5hbWVzOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVkFMRldLMDJPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9WQUxGV0swMk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Y5Y2YyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9WQUxGV0swMk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3azsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LklPcGVyYXRpb25SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LlZhbGlkYXRpb25UeXBlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3IuSkRUVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlZhbGlkYXRvclRlc3RjYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbC5CVlRSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkdsb2JhbENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVGFza0xpc3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBydW5zIHRoZSBWQUxGV0swMiB0ZXN0LgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVkFMRldLMDJPcGVyYXRpb24gaW1wbGVtZW50cyBJT3BlcmF0aW9uUnVubmFibGUgewotCXByaXZhdGUgSVByb2plY3QgX3Byb2plY3QgPSBudWxsOwotCXByaXZhdGUgSUJ1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfdGVzdENhc2VOYW1lID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBORVdMSU5FID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogTXVzdCBoYXZlIGEgcHVibGljIGRlZmF1bHQgY29uc3RydWN0b3IgaW4gb3JkZXIgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbi4KLQkgKiBNVVNUIGNhbGwgc2V0QnVmZmVyLCBzZXRQcm9qZWN0LCBhbmQgc2V0TmFtZSBiZWZvcmUgdXNpbmcgdGhlIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgVkFMRldLMDJPcGVyYXRpb24oKSB7Ci0JfQotCQotCS8qKgotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICovCi0JcHVibGljIFZBTEZXSzAyT3BlcmF0aW9uKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgdGVzdENhc2VOYW1lKSB7Ci0JCXNldFByb2plY3QocHJvamVjdCk7Ci0JCXNldEJ1ZmZlcihidWZmZXIpOwotCQlzZXROYW1lKHRlc3RDYXNlTmFtZSk7Ci0JfQotCi0JcHVibGljIElCdWZmZXIgZ2V0QnVmZmVyKCkgeyAKLQkJcmV0dXJuIF9idWZmZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEJ1ZmZlcihJQnVmZmVyIGIpIHsKLQkJX2J1ZmZlciA9IGI7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gX3Byb2plY3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcCkgewotCQlfcHJvamVjdCA9IHA7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gX3Rlc3RDYXNlTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlfdGVzdENhc2VOYW1lID0gbmFtZTsKLQl9CQotCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZihwcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJ1biBWQUxGV0swMiBvbiBhbiBleGlzdGluZyBvcGVuIElQcm9qZWN0LiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCS8vIEZpcnN0LCBhZGQgdGhlIFZhbGlkYXRpb25CdWlsZGVyIHRvIHRoZSBKYXZhIFByb2plY3QKLQkJVmFsaWRhdG9yTWFuYWdlci5hZGRQcm9qZWN0QnVpbGRWYWxpZGF0aW9uU3VwcG9ydChwcm9qZWN0KTsKLQotCQkvLyBTYXZlIHRoZSBvbGQgdXNlciBjb25maWd1cmF0aW9uIGFuZCByZXN0b3JlIGl0IGluIHRoZSBmaW5hbGx5IGJsb2NrLgotCQl0cnkgewotCQkJR2xvYmFsQ29uZmlndXJhdGlvbiBnY29uZiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRHbG9iYWxDb25maWd1cmF0aW9uKCk7Ci0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBwY29uZiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihwcm9qZWN0KTsKLQkJCUdsb2JhbENvbmZpZ3VyYXRpb24gb3JpZ0djb25mID0gbmV3IEdsb2JhbENvbmZpZ3VyYXRpb24oZ2NvbmYpOyAvLyBjb3B5IHRoZSBvcmlnaW5hbCB2YWx1ZXMgc28gdGhhdCB0aGV5IGNhbiBiZSByZXN0b3JlZCBpbiB0aGUgZmluYWxseSBibG9jawotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gb3JpZ1Bjb25mID0gbmV3IFByb2plY3RDb25maWd1cmF0aW9uKHBjb25mKTsgLy8gY29weSB0aGUgb3JpZ2luYWwgdmFsdWVzIHNvIHRoYXQgdGhleSBjYW4gYmUgcmVzdG9yZWQgaW4gdGhlIGZpbmFsbHkgYmxvY2sKLQkJCWJvb2xlYW4gYXV0b0J1aWxkRW5hYmxlZCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5pc0F1dG9CdWlsZGluZygpOwotCQkJCQotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSBjb25maWd1cmVkVmFsaWRhdG9ycyA9IHBjb25mLmdldFZhbGlkYXRvcnMoKTsKLQkJCWlmKGNvbmZpZ3VyZWRWYWxpZGF0b3JzLmxlbmd0aCA8IDIpIHsKLQkJCQltb25pdG9yLnN1YlRhc2soIlJ1biBWQUxGV0swMiBvbiBhbiBleGlzdGluZyBvcGVuIHByb2plY3QgdGhhdCBoYXMgYXQgbGVhc3QgdHdvIHZhbGlkYXRvcnMgY29uZmlndXJlZDogb25lIHRvIGVuYWJsZSwgYW5kIG9uZSB0byBkaXNhYmxlLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBEaXNhYmxlIGF0IGxlYXN0IG9uZSB2YWxpZGF0b3IgZm9yIHRoaXMgdGVzdC4KLQkJCS8vIFJlbW92ZSB0aGUgZmlyc3QgZW5hYmxlZCB2YWxpZGF0b3IgZnJvbSB0aGUgUHJvcGVydGllcywgYW5kIHRoZSBzZWNvbmQgZW5hYmxlZCB2YWxpZGF0b3IgZnJvbSB0aGUKLQkJCS8vIFByZWZlcmVuY2VzLiAoSXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggdmFsaWRhdG9yIGlzIHJlbW92ZWQ7IGl0IG9ubHkgbWF0dGVycyB0aGF0IHRoZSBQcm9wZXJ0aWVzIGFuZAotCQkJLy8gdGhlIFByZWZlcmVuY2VzIGhhdmUgZGlmZmVyZW50IHZhbGlkYXRvcnMuKQotCQkJVmFsaWRhdG9yTWV0YURhdGEgdmZUZXN0VmFsaWRhdG9yID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLkZXS19OT0JVSUxEX1RFU1RfVkFMSURBVE9SX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQkJVmFsaWRhdG9yTWV0YURhdGEgdmZOb0J1aWxkVGVzdFZhbGlkYXRvciA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YShUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5GV0tfVEVTVF9WQUxJREFUT1JfQ0xBU1MpOyAvLyROT04tTkxTLTEkCi0JCQlWYWxpZGF0b3JNZXRhRGF0YSBwcm9wZXJ0aWVzVmFsaWRhdG9yID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLlBST1BFUlRJRVNfVkFMSURBVE9SX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSBlbmFibGVkUHJvcFZhbGlkYXRvcnMgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbMl07Ci0JCQllbmFibGVkUHJvcFZhbGlkYXRvcnNbMF0gPSB2ZlRlc3RWYWxpZGF0b3I7Ci0JCQllbmFibGVkUHJvcFZhbGlkYXRvcnNbMV0gPSB2Zk5vQnVpbGRUZXN0VmFsaWRhdG9yOwotCQkJcGNvbmYuc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZFByb3BWYWxpZGF0b3JzKTsKLQkJCS8vcGNvbmYuc2V0TWF4aW11bU51bWJlck9mTWVzc2FnZXMoMSk7Ci0JCQlwY29uZi5wYXNzaXZhdGUoKTsKLQotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSBlbmFibGVkUHJlZlZhbGlkYXRvcnMgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbMV07Ci0JCQllbmFibGVkUHJlZlZhbGlkYXRvcnNbMF0gPSBwcm9wZXJ0aWVzVmFsaWRhdG9yOwotCQkJZ2NvbmYuc2V0RW5hYmxlZFZhbGlkYXRvcnMoZW5hYmxlZFByZWZWYWxpZGF0b3JzKTsKLQkJCS8vZ2NvbmYuc2V0TWF4aW11bU51bWJlck9mTWVzc2FnZXMoMTApOwotCQkJZ2NvbmYucGFzc2l2YXRlKCk7Ci0JCQkKLQkJCQotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0bWRzID0gSkRUVXRpbGl0eS5nZXRWRlRlc3RzKG1vbml0b3IsIGdldFByb2plY3QoKSk7Ci0JCQlpZigodG1kcyA9PSBudWxsKSB8fCAodG1kcy5sZW5ndGggPT0gMCkpIHsKLQkJCQltb25pdG9yLnN1YlRhc2soIkNhbm5vdCBydW4gVkFMRldLMDIgYmVjYXVzZSB0aGVyZSBhcmUgbm8gdGVzdCBjYXNlcyByZWdpc3RlcmVkIGZvciBKYXZhUHJvamVjdC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJVmFsaWRhdG9yVGVzdGNhc2UgZndrTm9idWlsZFRlc3RUTUQgPSBudWxsOwotCQkJVmFsaWRhdG9yVGVzdGNhc2UgZndrVGVzdFRNRCA9IG51bGw7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZSBwcm9wVE1EID0gbnVsbDsKLQkJCWZvcihpbnQgaT0wOyBpPHRtZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlWYWxpZGF0b3JUZXN0Y2FzZSB0bWQgPSB0bWRzW2ldOwotCQkJCWlmKHRtZC5nZXRWYWxpZGF0b3JDbGFzcygpLmVxdWFscyhUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5GV0tfVEVTVF9WQUxJREFUT1JfQ0xBU1MpKSB7Ci0JCQkJCWZ3a1Rlc3RUTUQgPSB0bWQ7Ci0JCQkJfQotCQkJCWVsc2UgaWYodG1kLmdldFZhbGlkYXRvckNsYXNzKCkuZXF1YWxzKFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLlBST1BFUlRJRVNfVkFMSURBVE9SX0NMQVNTKSkgewotCQkJCQlwcm9wVE1EID0gdG1kOwotCQkJCX0KLQkJCQllbHNlIGlmKHRtZC5nZXRWYWxpZGF0b3JDbGFzcygpLmVxdWFscyhUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5GV0tfTk9CVUlMRF9URVNUX1ZBTElEQVRPUl9DTEFTUykpIHsKLQkJCQkJZndrTm9idWlsZFRlc3RUTUQgPSB0bWQ7Ci0JCQkJfQotCQkJCQotCQkJCWlmKChmd2tUZXN0VE1EICE9IG51bGwpICYmIChwcm9wVE1EICE9IG51bGwpICYmIChmd2tOb2J1aWxkVGVzdFRNRCAhPSBudWxsKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKChmd2tUZXN0VE1EID09IG51bGwpIHx8IChwcm9wVE1EID09IG51bGwpIHx8IChmd2tOb2J1aWxkVGVzdFRNRCA9PSBudWxsKSkgewotCQkJCS8vIENhbid0IHJ1biB0aGUgdGVzdHMKLQkJCQltb25pdG9yLnN1YlRhc2soIkNhbm5vdCBydW4gVkFMRldLMDIgYmVjYXVzZSB0aGUgdGVzdCBjYXNlIGlzIG1pc3NpbmcgZm9yIGVpdGhlciB0aGUgVkYgVGVzdCBWYWxpZGF0b3IsIFByb3BlcnRpZXMgVmFsaWRhdG9yLCBvciBib3RoLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQl0cnkgewotCQkJCS8vIFNldCBsZXZlbCB0byBGSU5FU1Qgc28gdGhhdCB0aGUgbGF1bmNoIHZhbGlkYXRvcnMgYXJlIGFjY3VtdWxhdGVkIGluIFZhbGlkYXRpb25PcGVyYXRpb24uCi0JCQkJLy8gKFNlZSBWYWxpZGF0aW9uT3BlcmF0aW9uOjpnZXRMYXVuY2hlZFZhbGlkYXRvcnMoKSkKLQkJCQlUcmFjaW5nLnNldEZvcmNlTG9nZ2luZyh0cnVlKTsKLQkJCQkKLQkJCQlnZXRCdWZmZXIoKS53cml0ZSgidGVzdFByb3BOb3RPdmVycmlkZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IGFsbG93UGFzcyA9IHRlc3RQcm9wTm90T3ZlcnJpZGUobW9uaXRvciwgcHJvamVjdCwgZ2NvbmYsIHBjb25mLCBwcm9wVE1EKTsKLQkJCQlnZXRCdWZmZXIoKS53cml0ZShORVdMSU5FKTsgLy8kTk9OLU5MUy0xJAotCQkJCWdldEJ1ZmZlcigpLndyaXRlKCJ0ZXN0UHJvcE92ZXJyaWRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgcHJvcFBhc3MgPSB0ZXN0UHJvcE92ZXJyaWRlKG1vbml0b3IsIHByb2plY3QsIGdjb25mLCBwY29uZiwgZndrVGVzdFRNRCk7Ci0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoTkVXTElORSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRCdWZmZXIoKS53cml0ZSgidGVzdFByZWZOb3RBbGxvd092ZXJyaWRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgbm90QWxsb3dQYXNzID0gdGVzdFByZWZOb3RBbGxvd092ZXJyaWRlKG1vbml0b3IsIHByb2plY3QsIGdjb25mLCBwY29uZiwgcHJvcFRNRCk7Ci0JCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoTkVXTElORSk7Ci0JCQkJcmVzdWx0LmFwcGVuZCgiUHJvcGVydGllcyBEb2Vzbid0IE92ZXJyaWRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoYWxsb3dQYXNzKTsKLQkJCQlyZXN1bHQuYXBwZW5kKCIgb2YgNyBwYXNzLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZChORVdMSU5FKTsKLQkJCQlyZXN1bHQuYXBwZW5kKCJQcm9wZXJpdGVzIE92ZXJyaWRlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKHByb3BQYXNzKTsKLQkJCQlyZXN1bHQuYXBwZW5kKCIgb2YgNyBwYXNzLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZChORVdMSU5FKTsKLQkJCQlyZXN1bHQuYXBwZW5kKCJQcmVmZXJlbmNlIERvZXNuJ3QgQWxsb3cgT3ZlcnJpZGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZChub3RBbGxvd1Bhc3MpOwotCQkJCXJlc3VsdC5hcHBlbmQoIiBvZiA3IHBhc3MuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKE5FV0xJTkUpOwotCQkJCW1vbml0b3Iuc3ViVGFzayhyZXN1bHQudG9TdHJpbmcoKSk7Ci0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoTkVXTElORSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRCdWZmZXIoKS53cml0ZShyZXN1bHQudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlnY29uZiA9IG9yaWdHY29uZjsKLQkJCQlnY29uZi5wYXNzaXZhdGUoKTsKLQkJCQkKLQkJCQlwY29uZiA9IG9yaWdQY29uZjsKLQkJCQlwY29uZi5wYXNzaXZhdGUoKTsKLQkJCQkKLQkJCQlKRFRVdGlsaXR5LnNldEF1dG9CdWlsZChhdXRvQnVpbGRFbmFibGVkKTsKLQkKLQkJCX0KLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWJ1ZyhJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHRpdGxlLCBWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRWYWxpZGF0b3JzKSB7Ci0JCWJ1ZmZlci53cml0ZSgiQ29udGVudHMgb2YgIiArIHRpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IoaW50IGk9MDsgaTxlbmFibGVkVmFsaWRhdG9ycy5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gZW5hYmxlZFZhbGlkYXRvcnNbaV07Ci0JCQlidWZmZXIud3JpdGUoIlx0IiArIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJ1ZmZlci53cml0ZSgiRW5kIGNvbnRlbnRzIG9mICIgKyB0aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLndyaXRlKE5FV0xJTkUpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCXByaXZhdGUgaW50IHRlc3RQcm9wTm90T3ZlcnJpZGUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBHbG9iYWxDb25maWd1cmF0aW9uIGdjb25mLCBQcm9qZWN0Q29uZmlndXJhdGlvbiBwY29uZiwgVmFsaWRhdG9yVGVzdGNhc2UgdG1kKSB7Ci0JCWludCBudW1QYXNzID0gMDsKLQkJdHJ5IHsKLQkJCS8vIFNldCB1cCB0aGUgdXNlciBjb25maWd1cmF0aW9uIGZvciB0aGUgdGVzdC4gVGhlIHJ1bihJUHJvZ3Jlc3NNb25pdG9yKSBtZXRob2QKLQkJCS8vIHdpbGwgc2V0IHRoZSB2YWx1ZXMgYmFjayB0byB3aGF0IHRoZXkgd2VyZSBiZWZvcmUgdGhlIHRlc3QuCQkKLQkJCWdjb25mLnNldENhblByb2plY3RzT3ZlcnJpZGUodHJ1ZSk7Ci0JCQlnY29uZi5wYXNzaXZhdGUoKTsKLQkJCXBjb25mLnNldERvZXNQcm9qZWN0T3ZlcnJpZGUoZmFsc2UpOwotCQkJcGNvbmYucGFzc2l2YXRlKCk7Ci0JCQkKLQkJCVZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLnVwZGF0ZVRhc2tMaXN0KHByb2plY3QpOyAvLyBVcGRhdGUgdGhlIHRhc2sgbGlzdCBiZWNhdXNlIHRoZSBwcmVmZXJlbmNlIGFuZCBwcm9wZXJ0aWVzIHBhZ2UgZG8sIHNvIHRoZSBjb25maWd1cmF0aW9uIGNsYXNzZXMgZG9uJ3QuCi0JCQkKLQkJCWRlYnVnKGdldEJ1ZmZlcigpLCAiRW5hYmxlZCBQcm9wZXJ0aWVzIFZhbGlkYXRvcnMiLCBwY29uZi5nZXRFbmFibGVkVmFsaWRhdG9ycygpKTsgLy8kTk9OLU5MUy0xJAotCQkJZGVidWcoZ2V0QnVmZmVyKCksICJFbmFibGVkIFByZWZlcmVuY2UgVmFsaWRhdG9ycyIsIGdjb25mLmdldEVuYWJsZWRWYWxpZGF0b3JzKCkpOyAvLyROT04tTkxTLTEkCi0JCi0JCQludW1QYXNzID0gdmFsaWRhdGUobW9uaXRvciwgcHJvamVjdCwgZ2NvbmYsIHRtZCwgInRlc3RQcm9wTm90T3ZlcnJpZGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJCW51bVBhc3MgPSAwOwotCQl9Ci0JCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJbnVtUGFzcyA9IDA7Ci0JCX0KLQkJCi0JCQlyZXR1cm4gbnVtUGFzczsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBpbnQgdGVzdFByb3BPdmVycmlkZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIEdsb2JhbENvbmZpZ3VyYXRpb24gZ2NvbmYsIFByb2plY3RDb25maWd1cmF0aW9uIHBjb25mLCBWYWxpZGF0b3JUZXN0Y2FzZSB0bWQpIHsKLQkJaW50IG51bVBhc3MgPSAwOwotCQl0cnkgewotCQkJLy8gU2V0IHVwIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0ZXN0LiBUaGUgcnVuKElQcm9ncmVzc01vbml0b3IpIG1ldGhvZAotCQkJLy8gd2lsbCBzZXQgdGhlIHZhbHVlcyBiYWNrIHRvIHdoYXQgdGhleSB3ZXJlIGJlZm9yZSB0aGUgdGVzdC4JCQotCQkJZ2NvbmYuc2V0Q2FuUHJvamVjdHNPdmVycmlkZSh0cnVlKTsKLQkJCWdjb25mLnBhc3NpdmF0ZSgpOwotCQkJcGNvbmYuc2V0RG9lc1Byb2plY3RPdmVycmlkZSh0cnVlKTsKLQkJCXBjb25mLnBhc3NpdmF0ZSgpOwotCi0JCQlWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS51cGRhdGVUYXNrTGlzdChwcm9qZWN0KTsgLy8gVXBkYXRlIHRoZSB0YXNrIGxpc3QgYmVjYXVzZSB0aGUgcHJlZmVyZW5jZSBhbmQgcHJvcGVydGllcyBwYWdlIGRvLCBzbyB0aGUgY29uZmlndXJhdGlvbiBjbGFzc2VzIGRvbid0LgotCQkJCi0JCQlkZWJ1ZyhnZXRCdWZmZXIoKSwgIkVuYWJsZWQgUHJvcGVydGllcyBWYWxpZGF0b3JzIiwgcGNvbmYuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRlYnVnKGdldEJ1ZmZlcigpLCAiRW5hYmxlZCBQcmVmZXJlbmNlIFZhbGlkYXRvcnMiLCBnY29uZi5nZXRFbmFibGVkVmFsaWRhdG9ycygpKTsgLy8kTk9OLU5MUy0xJAotCQotCQkJbnVtUGFzcyA9IHZhbGlkYXRlKG1vbml0b3IsIHByb2plY3QsIHBjb25mLCB0bWQsICJ0ZXN0UHJvcE92ZXJyaWRlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bVBhc3M7Ci0JfQotCQotCXByaXZhdGUgaW50IHRlc3RQcmVmTm90QWxsb3dPdmVycmlkZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIEdsb2JhbENvbmZpZ3VyYXRpb24gZ2NvbmYsIFByb2plY3RDb25maWd1cmF0aW9uIHBjb25mLCBWYWxpZGF0b3JUZXN0Y2FzZSB0bWQpIHsKLQkJaW50IG51bVBhc3MgPSAwOwotCQl0cnkgewotCQkJLy8gU2V0IHVwIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0ZXN0LiBUaGUgcnVuKElQcm9ncmVzc01vbml0b3IpIG1ldGhvZAotCQkJLy8gd2lsbCBzZXQgdGhlIHZhbHVlcyBiYWNrIHRvIHdoYXQgdGhleSB3ZXJlIGJlZm9yZSB0aGUgdGVzdC4JCQotCQkJZ2NvbmYuc2V0Q2FuUHJvamVjdHNPdmVycmlkZShmYWxzZSk7Ci0JCQlnY29uZi5wYXNzaXZhdGUoKTsKLQkJCXBjb25mLnNldERvZXNQcm9qZWN0T3ZlcnJpZGUodHJ1ZSk7Ci0JCQlwY29uZi5wYXNzaXZhdGUoKTsKLQotCQkJVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkudXBkYXRlVGFza0xpc3QocHJvamVjdCk7IC8vIFVwZGF0ZSB0aGUgdGFzayBsaXN0IGJlY2F1c2UgdGhlIHByZWZlcmVuY2UgYW5kIHByb3BlcnRpZXMgcGFnZSBkbywgc28gdGhlIGNvbmZpZ3VyYXRpb24gY2xhc3NlcyBkb24ndC4KLQkJCQotCQkJZGVidWcoZ2V0QnVmZmVyKCksICJFbmFibGVkIFByb3BlcnRpZXMgVmFsaWRhdG9ycyIsIHBjb25mLmdldEVuYWJsZWRWYWxpZGF0b3JzKCkpOyAvLyROT04tTkxTLTEkCi0JCQlkZWJ1ZyhnZXRCdWZmZXIoKSwgIkVuYWJsZWQgUHJlZmVyZW5jZSBWYWxpZGF0b3JzIiwgZ2NvbmYuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkKLQkJCW51bVBhc3MgPSB2YWxpZGF0ZShtb25pdG9yLCBwcm9qZWN0LCBnY29uZiwgdG1kLCAidGVzdFByZWZOb3RBbGxvd092ZXJyaWRlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bVBhc3M7Ci0JfQotCQotCXByaXZhdGUgaW50IHZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmNvbmYsIFZhbGlkYXRvclRlc3RjYXNlIHRtZCwgU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCWludCBudW1QYXNzID0gMDsKLQkJYm9vbGVhbiBzdWNjZXNzZnVsID0gdHJ1ZTsgLy8gQXNzdW1lIHRoYXQgYWxsIG9mIHRoZSB0ZXN0IGNhc2VzIHdpbGwgcGFzcy4KLQkJdHJ5IHsKLQkJCS8vIEZvciB0aGUgZmlyc3QgZm91ciB0ZXN0cywgbmVlZCBhbGwgb2YgdGhlIG1lc3NhZ2VzIHRvIGJlIHJlcG9ydGVkCi0JCQkvL2ludCBvcmlnaW5hbExpbWl0ID0gdmNvbmYuZ2V0TWF4aW11bU51bWJlck9mTWVzc2FnZXMoKTsKLQkJCS8vdmNvbmYuc2V0TWF4aW11bU51bWJlck9mTWVzc2FnZXMoV29ya2JlbmNoUmVwb3J0ZXIuTk9fTUVTU0FHRV9MSU1JVCk7Ci0JCQl2Y29uZi5wYXNzaXZhdGUoKTsKLQkJCQotCQkJYm9vbGVhbiBwYXNzID0gcnVuVmFsaWRhdGlvbihtb25pdG9yLCBwcm9qZWN0LCB2Y29uZik7Ci0JCQlpZighcGFzcykgewotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjpydW5WYWxpZGF0aW9uIGZhaWxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJc3VjY2Vzc2Z1bCA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbnVtUGFzcysrOwotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjpydW5WYWxpZGF0aW9uIHBhc3NlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlnZXRCdWZmZXIoKS5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCAiOjoiICsgdGVzdE5hbWUgKyAicnVuVmFsaWRhdGlvbiIsIHBhc3MpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQotCQkJcGFzcyA9IGZ1bGxCdWlsZFZhbGlkYXRlKG1vbml0b3IsIHByb2plY3QsIHZjb25mLCB0bWQpOwotCQkJaWYoIXBhc3MpIHsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6ZnVsbEJ1aWxkVmFsaWRhdGlvbiBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3NmdWwgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW51bVBhc3MrKzsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6ZnVsbEJ1aWxkVmFsaWRhdGlvbiBwYXNzZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZ2V0QnVmZmVyKCkuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgIjo6IiArIHRlc3ROYW1lICsgImZ1bGxCdWlsZFZhbGlkYXRpb24iLCBwYXNzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkKLQkJCXBhc3MgPSBhdXRvVmFsaWRhdGVFbmFibGVkKG1vbml0b3IsIHByb2plY3QsIHZjb25mLCB0bWQpOwotCQkJaWYoIXBhc3MpIHsKLQkJCQlzdWNjZXNzZnVsID0gZmFsc2U7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmF1dG9WYWxpZGF0ZUVuYWJsZWQgZmFpbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCW51bVBhc3MrKzsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6YXV0b1ZhbGlkYXRlRW5hYmxlZCBwYXNzZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZ2V0QnVmZmVyKCkuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgIjo6IiArIHRlc3ROYW1lICsgImF1dG9WYWxpZGF0ZUVuYWJsZWQiLCBwYXNzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkKLQkJCXBhc3MgPSBhdXRvVmFsaWRhdGVEaXNhYmxlZChtb25pdG9yLCBwcm9qZWN0LCB2Y29uZiwgdG1kKTsKLQkJCWlmKCFwYXNzKSB7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmF1dG9WYWxpZGF0ZURpc2FibGVkIGZhaWxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJc3VjY2Vzc2Z1bCA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbnVtUGFzcysrOwotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjphdXRvVmFsaWRhdGVEaXNhYmxlZCBwYXNzZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZ2V0QnVmZmVyKCkuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgIjo6IiArIHRlc3ROYW1lICsgImF1dG9WYWxpZGF0ZURpc2FibGVkIiwgcGFzcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQlwYXNzID0gYnVpbGRWYWxpZGF0ZUVuYWJsZWQobW9uaXRvciwgcHJvamVjdCwgdmNvbmYsIHRtZCk7Ci0JCQlpZighcGFzcykgewotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjpidWlsZFZhbGlkYXRlRW5hYmxlZCBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3NmdWwgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW51bVBhc3MrKzsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6YnVpbGRWYWxpZGF0ZUVuYWJsZWQgcGFzc2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWdldEJ1ZmZlcigpLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksICI6OiIgKyB0ZXN0TmFtZSArICJidWlsZFZhbGlkYXRlRW5hYmxlZCIsIHBhc3MpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJcGFzcyA9IGJ1aWxkVmFsaWRhdGVEaXNhYmxlZChtb25pdG9yLCBwcm9qZWN0LCB2Y29uZiwgdG1kKTsKLQkJCWlmKCFwYXNzKSB7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmJ1aWxkVmFsaWRhdGVEaXNhYmxlZCBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3NmdWwgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW51bVBhc3MrKzsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6YnVpbGRWYWxpZGF0ZURpc2FibGVkIHBhc3NlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlnZXRCdWZmZXIoKS5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCAiOjoiICsgdGVzdE5hbWUgKyAiYnVpbGRWYWxpZGF0ZURpc2FibGVkIiwgcGFzcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkvLyBBbmQgZm9yIHRoaXMgdGVzdCwgdGhlIG9yaWdpbmFsIGxpbWl0IG5lZWRzIHRvIGJlIGVuZm9yY2VkCi0JCQkvL3Zjb25mLnNldE1heGltdW1OdW1iZXJPZk1lc3NhZ2VzKG9yaWdpbmFsTGltaXQpOwotCQkJdmNvbmYucGFzc2l2YXRlKCk7Ci0KLQkJCXBhc3MgPSBtYXhNZXNzYWdlc1JlcG9ydGVkKG1vbml0b3IsIHByb2plY3QsIHZjb25mKTsKLQkJCWlmKCFwYXNzKSB7Ci0JCQkJc3VjY2Vzc2Z1bCA9IGZhbHNlOwotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjptYXhNZXNzYWdlc1JlcG9ydGVkIGZhaWxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQludW1QYXNzKys7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6Om1heE1lc3NhZ2VzUmVwb3J0ZWQgcGFzc2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWdldEJ1ZmZlcigpLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksICI6OiIgKyB0ZXN0TmFtZSArICJtYXhNZXNzYWdlc1JlcG9ydGVkIiwgcGFzcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlzdWNjZXNzZnVsID0gZmFsc2U7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWdldEJ1ZmZlcigpLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksIHRlc3ROYW1lLCBzdWNjZXNzZnVsKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudW1QYXNzOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcnVuVmFsaWRhdGlvbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHZjb25mKSB7Ci0JCWJvb2xlYW4gcGFzc2VkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCS8vIFVubGlrZSB0aGUgb3RoZXIgdmFsaWRhdGlvbnMsIHdoaWNoIHJlbHkgb24gYSBidWlsZCwgdGhpcyBtZXRob2QgaGFzIGFjY2VzcyB0byB0aGUKLQkJCS8vIG9wZXJhdGlvbiBhbmQgY2FuIHF1ZXJ5IGl0IGZvciB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzIHRoYXQgd2VyZSBsYXVuY2hlZC4gVGhpcyB0ZWNobmlxdWUKLQkJCS8vIGlzIGJldHRlciBiZWNhdXNlIGl0IGRvZXNuJ3QgcmVseSBvbiB0aGUgdmFsaWRhdG9yIHByb2R1Y2luZyB0aGUgY29ycmVjdCBvdXRwdXQgKG1hcmtlcnMpLgotCQkJLy8gVkFMRldLMDIganVzdCB3YW50cyB0byBjaGVjayB0aGF0IHRoZSBjb3JyZWN0IHZhbGlkYXRvcnMgd2VyZSBsYXVuY2hlZDsgdGhlIFRlc3RPcENvbnN0cgotCQkJLy8gdGVzdCB3YW50cyB0byBjaGVjayB0aGUgcmVzdWx0IGdpdmVuIGRpZmZlcmVudCBvdXRwdXQgYW5kIGNvbnN0cnVjdG9yIG9mIHRoZSBPcGVyYXRpb24uCi0JCQkKLQkJCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIHZhbGlkT3AgPSBuZXcgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24ocHJvamVjdCxmYWxzZSk7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHZhbGlkT3AsIG1vbml0b3IpOwotCQkJLy8gTGF1bmNoZWQgdmFsaWRhdG9ycyBzaG91bGQgYmUgY29uZmlndXJlZCwgZW5hYmxlZCwgYW5kIGhhZCBmaWxlcyB0byB2YWxpZGF0ZSBvbiB0aGUgcHJvamVjdC4KLQkJCVNldDxWYWxpZGF0b3JNZXRhRGF0YT4gbGF1bmNoZWRWYWxpZGF0b3JzID0gdmFsaWRPcC5nZXRMYXVuY2hlZFZhbGlkYXRvcnMoKTsKLQkJCQotCQkJLy8gU2luY2UgYSBmdWxsIHZhbGlkYXRpb24gd2FzIHJ1biwgdGhlIGxhdW5jaGVkIHZhbGlkYXRvcnMgc2hvdWxkIGJlIGVxdWl2YWxlbnQKLQkJCS8vIHRvIHRoZSBjb25maWd1cmVkIGVuYWJsZWQgdmFsZGlhdG9ycy4KLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gZW5hYmxlZFZhbGlkYXRvcnMgPSB2Y29uZi5nZXRFbmFibGVkVmFsaWRhdG9ycygpOwotCQkJZm9yKGludCBpPTA7IGk8ZW5hYmxlZFZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBlbmFibGVkVmFsaWRhdG9yc1tpXTsKLQkJCQkKLQkJCQkvLyBJZiBpdCdzIGNvbmZpZ3VyZWQgb24gdGhlIHByb2plY3QsIGVuc3VyZSB0aGF0IHRoZSBlbmFibGVkIHZhbGlkYXRvciB3YXMgbGF1bmNoZWQuCi0JCQkJLy8gKE1heSBub3QgYmUgY29uZmlndXJlZCBpZiB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIGlzIHRoZSBsaXN0IG9mIFByZWZlcmVuY2UgZW5hYmxlZAotCQkJCS8vIHZhbGlkYXRvcnMuKQotCQkJCWlmKCFsYXVuY2hlZFZhbGlkYXRvcnMuY29udGFpbnModm1kKSkgewotCQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiRVJST1I6IEV4cGVjdGVkIHZhbGlkYXRvciAiICsgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkgKyAiIHdhcyBub3QgcnVuIG9uIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIi4gRmFpbGluZyB0ZXN0LiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWdldEJ1ZmZlcigpLndyaXRlKCJJTkZPOiBFeHBlY3RlZCB2YWxpZGF0b3IgIiArIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpICsgIiByYW4gYXMgZXhwZWN0ZWQgb24gcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYocGFzc2VkID09IGZhbHNlKSB7Ci0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoImxhdW5jaGVkIHZhbGlkYXRvcnMgYXJlIHRoZSBmb2xsb3dpbmc6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlmb3IoVmFsaWRhdG9yTWV0YURhdGEgdm1kIDogbGF1bmNoZWRWYWxpZGF0b3JzKSB7Ci0JCQkJCWdldEJ1ZmZlcigpLndyaXRlKCJcdCIgKyB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoImVuZCBvZiBsYXVuY2hlZCB2YWxpZGF0b3JzIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCQlwYXNzZWQgPSBmYWxzZTsKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZnVsbEJ1aWxkVmFsaWRhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB2Y29uZiwgVmFsaWRhdG9yVGVzdGNhc2UgdG1kKSB7Ci0JCXRyeSB7Ci0JCQkvL3Zjb25mLnNldEJ1aWxkVmFsaWRhdGUodHJ1ZSk7Ci0JCQl2Y29uZi5wYXNzaXZhdGUoKTsKLQotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHByb2plY3QpOwotCQkJSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyA9IHRtZC5nZXRSZXNvdXJjZXMocHJvamVjdCk7OwotCQkJVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24udG91Y2gocHJvamVjdCwgY2hhbmdlZFJlc291cmNlcyk7Ci0JCQkKLQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBtb25pdG9yKTsKLQkJCUlNYXJrZXJbXSBtZXNzYWdlc0FmdGVyQnVpbGQgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIElNZXNzYWdlLkFMTF9NRVNTQUdFUyk7Ci0JCQkKLQkJCXJldHVybiBCVlRSdW5uZXIuc2luZ2xldG9uKCkuY29tcGFyZShnZXRCdWZmZXIoKSwgZ2V0TmFtZSgpLCB0bWQuZ2V0TmFtZSgpLCB0bWQuZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLkZVTExfVkFMSURBVElPTiksIG1lc3NhZ2VzQWZ0ZXJCdWlsZCk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYXV0b1ZhbGlkYXRlRW5hYmxlZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHZjb25mLCBWYWxpZGF0b3JUZXN0Y2FzZSB0bWQpIHsKLQkJSkRUVXRpbGl0eS5zZXRBdXRvQnVpbGQodHJ1ZSk7Ci0JCQotCQl0cnkgewotCQkJLy92Y29uZi5zZXRBdXRvVmFsaWRhdGUodHJ1ZSk7Ci0JCQl2Y29uZi5wYXNzaXZhdGUoKTsKLQkJCQotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHByb2plY3QpOwotCQkJSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyA9IHRtZC5nZXRSZXNvdXJjZXMocHJvamVjdCk7OwotCQkJVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24udG91Y2gocHJvamVjdCwgY2hhbmdlZFJlc291cmNlcyk7Ci0JCQkKLQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5BVVRPX0JVSUxELCBtb25pdG9yKTsKLQkJCUlNYXJrZXJbXSBtZXNzYWdlc0FmdGVyQnVpbGQgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIElNZXNzYWdlLkFMTF9NRVNTQUdFUyk7Ci0JCQkKLQkJCXJldHVybiBCVlRSdW5uZXIuc2luZ2xldG9uKCkuY29tcGFyZShnZXRCdWZmZXIoKSwgZ2V0TmFtZSgpLCB0bWQuZ2V0TmFtZSgpLCB0bWQuZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLkFVVE9fVkFMSURBVElPTiksIG1lc3NhZ2VzQWZ0ZXJCdWlsZCk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYXV0b1ZhbGlkYXRlRGlzYWJsZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB2Y29uZiwgVmFsaWRhdG9yVGVzdGNhc2UgdG1kKSB7Ci0JCUpEVFV0aWxpdHkuc2V0QXV0b0J1aWxkKHRydWUpOwotCi0JCXRyeSB7CQkKLQkJCS8vdmNvbmYuc2V0QXV0b1ZhbGlkYXRlKGZhbHNlKTsKLQkJCXZjb25mLnBhc3NpdmF0ZSgpOwotCi0JCQlUYXNrTGlzdFV0aWxpdHkucmVtb3ZlQWxsVGFza3MocHJvamVjdCk7Ci0JCQlJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzID0gdG1kLmdldFJlc291cmNlcyhwcm9qZWN0KTsKLQkJCVRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLnRvdWNoKHByb2plY3QsIGNoYW5nZWRSZXNvdXJjZXMpOwotCQkKLQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5BVVRPX0JVSUxELCBtb25pdG9yKTsKLQkJCUlNYXJrZXJbXSBtZXNzYWdlc0FmdGVyQnVpbGQgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIElNZXNzYWdlLkFMTF9NRVNTQUdFUyk7Ci0JCQkKLQkJCS8vIFBhc3MgaW4gYW4gZW1wdHkgbGlzdCBiZWNhdXNlIHRoZSB2YWxpZGF0aW9uIGlzbid0IHN1cHBvc2VkIHRvIHJ1bi4KLQkJCXJldHVybiBCVlRSdW5uZXIuc2luZ2xldG9uKCkuY29tcGFyZShnZXRCdWZmZXIoKSwgZ2V0TmFtZSgpLCB0bWQuZ2V0TmFtZSgpLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBtZXNzYWdlc0FmdGVyQnVpbGQpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkVmFsaWRhdGVFbmFibGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmNvbmYsIFZhbGlkYXRvclRlc3RjYXNlIHRtZCkgewotCQl0cnkgewotCQkJLy92Y29uZi5zZXRCdWlsZFZhbGlkYXRlKHRydWUpOwotCQkJdmNvbmYucGFzc2l2YXRlKCk7Ci0JCQlKRFRVdGlsaXR5LnNldEF1dG9CdWlsZChmYWxzZSk7Ci0JCi0JCQkvLyBDb25zdHJ1Y3QgdGhlIGlucHV0Ci0JCQlUYXNrTGlzdFV0aWxpdHkucmVtb3ZlQWxsVGFza3MocHJvamVjdCk7Ci0JCQlJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzID0gdG1kLmdldFJlc291cmNlcyhwcm9qZWN0KTsKLQkJCVRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLnRvdWNoKHByb2plY3QsIGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJdHJ5IHsJCQotCQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbW9uaXRvcik7Ci0JCQl9Ci0JCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUlNYXJrZXJbXSBtZXNzYWdlc0FmdGVyQnVpbGQgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIElNZXNzYWdlLkFMTF9NRVNTQUdFUyk7Ci0JCQkKLQkJCXJldHVybiBCVlRSdW5uZXIuc2luZ2xldG9uKCkuY29tcGFyZShnZXRCdWZmZXIoKSwgZ2V0TmFtZSgpLCB0bWQuZ2V0TmFtZSgpLCB0bWQuZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLklOQ1JFTUVOVEFMX1ZBTElEQVRJT04pLCBtZXNzYWdlc0FmdGVyQnVpbGQpOwotCQl9Ci0JCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRWYWxpZGF0ZURpc2FibGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmNvbmYsIFZhbGlkYXRvclRlc3RjYXNlIHRtZCkgewotCQl0cnkgewotCQkJLy92Y29uZi5zZXRCdWlsZFZhbGlkYXRlKGZhbHNlKTsKLQkJCXZjb25mLnBhc3NpdmF0ZSgpOwotCQkJSkRUVXRpbGl0eS5zZXRBdXRvQnVpbGQoZmFsc2UpOwotCQkJCi0JCQkvLyBDb25zdHJ1Y3QgdGhlIGlucHV0Ci0JCQlUYXNrTGlzdFV0aWxpdHkucmVtb3ZlQWxsVGFza3MocHJvamVjdCk7Ci0JCQlJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzID0gdG1kLmdldFJlc291cmNlcyhwcm9qZWN0KTsKLQkJCVRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLnRvdWNoKHByb2plY3QsIGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJdHJ5IHsJCQotCQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbW9uaXRvcik7Ci0JCQkJSU1hcmtlcltdIG1lc3NhZ2VzQWZ0ZXJCdWlsZCA9IFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwgSU1lc3NhZ2UuQUxMX01FU1NBR0VTKTsKLQotCQkJCS8vIFBhc3MgaW4gYW4gZW1wdHkgbGlzdCBiZWNhdXNlIHZhbGlkYXRpb24gaXNuJ3Qgc3VwcG9zZWQgdG8gcnVuLgkJCQkKLQkJCQlyZXR1cm4gQlZUUnVubmVyLnNpbmdsZXRvbigpLmNvbXBhcmUoZ2V0QnVmZmVyKCksIGdldE5hbWUoKSwgdG1kLmdldE5hbWUoKSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgbWVzc2FnZXNBZnRlckJ1aWxkKTsKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gbWF4TWVzc2FnZXNSZXBvcnRlZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHZjb25mKSB7Ci0JCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiB2YWxpZE9wID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJdmFsaWRPcCA9IG5ldyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihwcm9qZWN0LGZhbHNlKTsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHZhbGlkT3AsIG1vbml0b3IpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLX0KLQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a05vQnVpbGRUZXN0SGVscGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a05vQnVpbGRUZXN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZDNkZjguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9Gd2tOb0J1aWxkVGVzdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudmFsaWRhdGlvbi5BV29ya2JlbmNoTU9GSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaEZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgRndrTm9CdWlsZFRlc3RIZWxwZXIgZXh0ZW5kcyBBV29ya2JlbmNoTU9GSGVscGVyIHsKLQkKLQlwdWJsaWMgRndrTm9CdWlsZFRlc3RIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQlyZWdpc3Rlck1vZGVsKEZ3a1Rlc3RWYWxpZGF0b3IuQUxMX0ZJTEVTLCAibG9hZEFsbEZpbGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJNb2RlbChGd2tUZXN0VmFsaWRhdG9yLkpBVkFIRUxQRVJTLCAibG9hZEphdmFIZWxwZXJzIiwgbmV3IENsYXNzW117SUZpbGVEZWx0YS5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMudmFsaWRhdGUuSVdvcmtiZW5jaEhlbHBlciNnZXRUYXJnZXRPYmplY3ROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCBhcmcwKSB7Ci0JCS8vIE5vIHRhcmdldCBvYmplY3RzIG91dHNpZGUgb2YgYW4gSVJlc291cmNlIGFyZSB1c2VkLCB0aGVyZWZvcmUgbm8gdGFyZ2V0IG9iamVjdCBuYW1lcyBhcmUgbmVlZGVkLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUZpbGVEZWx0YVtdIGxvYWRBbGxGaWxlcygpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJCi0JCWZpbmFsIFNldCBmaWxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlSZXNvdXJjZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCWlmKCFyZXMuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBpZiB0aGUgcmVzb3VyY2UgaXNuJ3QgYWNjZXNzaWJsZSB0aGVuIG5laXRoZXIgYXJlIGl0cyBjaGlsZHJlbgotCQkJCX0KLQkJCQkKLQkJCQlpZigocmVzIGluc3RhbmNlb2YgSUZpbGUpICYmICgiamF2YSIuZXF1YWxzKHJlcy5nZXRGaWxlRXh0ZW5zaW9uKCkpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVdvcmtiZW5jaEZpbGVEZWx0YSBuZXdGaWxlRGVsdGEgPSBuZXcgV29ya2JlbmNoRmlsZURlbHRhKHJlcy5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIElGaWxlRGVsdGEuQ0hBTkdFRCwgcmVzKTsKLQkJCQkJZmlsZXMuYWRkKG5ld0ZpbGVEZWx0YSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRydWU7IC8vIHZpc2l0IHRoZSByZXNvdXJjZSdzIGNoaWxkcmVuIGFzIHdlbGwKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCB0cnVlKTsgLy8gdHJ1ZSBtZWFucyBpbmNsdWRlIHBoYW50b20gcmVzb3VyY2VzCi0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJSUZpbGVEZWx0YVtdIHJlc3VsdCA9IG5ldyBJRmlsZURlbHRhW2ZpbGVzLnNpemUoKV07Ci0JCWZpbGVzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIEphdmFIZWxwZXJzIGxvYWRKYXZhSGVscGVycyhJRmlsZURlbHRhIGRlbHRhKSB7Ci0JCVdvcmtiZW5jaEZpbGVEZWx0YSBmZCA9IChXb3JrYmVuY2hGaWxlRGVsdGEpZGVsdGE7Ci0JCUlSZXNvdXJjZSByZXN1bHQgPSBmZC5nZXRSZXNvdXJjZSgpOwotCQlpZihyZXN1bHQgIT0gbnVsbCl7Ci0JCQlpZihyZXN1bHQgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCXJldHVybiBKRFRVdGlsaXR5LmdldEphdmFIZWxwZXJzKChJRmlsZSlyZXN1bHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBUaGlzIHZhbGlkYXRvciB2YWxpZGF0ZXMgb25seSAuamF2YSBmaWxlcywgc28gdGhpcwotCQkJLy8gbXVzdCBiZSBhbiBpbnN0YW5jZW9mIEphdmFDbGFzcy4KLQkJCXJldHVybiAoSmF2YUhlbHBlcnMpZmQuZ2V0T2JqZWN0KCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5JV29ya2JlbmNoSGVscGVyI2dldFJlc291cmNlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUlSZXNvdXJjZSByZXN1bHQgPSBzdXBlci5nZXRSZXNvdXJjZShvYmplY3QpOwotCQlpZigocmVzdWx0ICE9IG51bGwpICYmIChyZXN1bHQuZXhpc3RzKCkpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgSmF2YUhlbHBlcnMpIHsKLQkJCS8vIElmIHRoZSBtZXNzYWdlIHdhcyBhZGRlZCB0byBhIEphdmFIZWxwZXJzLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZC4KLQkJCXJldHVybiBKRFRVdGlsaXR5LmdldFJlc291cmNlKGdldFByb2plY3QoKSwgKEphdmFIZWxwZXJzKSBvYmplY3QpOwotCQl9Ci0JCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgV29ya2JlbmNoRmlsZURlbHRhKSB7Ci0JCQkvLyBJZiB0aGUgd29ya2JlbmNoIGlzIHJlbW92aW5nIG1lc3NhZ2VzIGZyb20gZmlsZXMsIGFuZCB0aGUgb2JqZWN0IGlzIHNldAotCQkJLy8gaW5zdGVhZCBvZiB0aGUgSVJlc291cmNlLCBuZWVkIHRvIHByb2Nlc3MgdGhlIGRlbHRhJ3Mgb2JqZWN0IGluc3RlYWQgb2YKLQkJCS8vIGl0cyByZXNvdXJjZS4KLQkJCXJldHVybiBKRFRVdGlsaXR5LmdldFJlc291cmNlKGdldFByb2plY3QoKSwgKEphdmFIZWxwZXJzKSgoV29ya2JlbmNoRmlsZURlbHRhKW9iamVjdCkuZ2V0T2JqZWN0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRlLkFXb3JrYmVuY2hIZWxwZXIjZ2V0TGluZU5vKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lTm8oT2JqZWN0IG9iamVjdCkgewotCQlpbnQgbGluZU5vID0gc3VwZXIuZ2V0TGluZU5vKG9iamVjdCk7Ci0JCWlmKGxpbmVObyA9PSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQpIHsKLQkJCS8vIE5vIGFkYXB0ZXJzLCBzbyBmdWRnZSB0aGUgbGluZSBudW1iZXIgYnkgYWRkaW5nIHRoZSBtZXNzYWdlIHRvIHRoZSBmaXJzdCBsaW5lIGluIHRoZSBmaWxlLgotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcmV0dXJuIGxpbmVObzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrTm9CdWlsZFRlc3RWYWxpZGF0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrTm9CdWlsZFRlc3RWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyNDJmMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a05vQnVpbGRUZXN0VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Mb2NhbGl6ZWRNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgRndrTm9CdWlsZFRlc3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfRklMRVMgPSAiQUxMX0ZJTEVTIjsgLy8gTG9hZCBhbGwgSUZpbGVEZWx0YXMgZm9yIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgcHJvamVjdC4gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFIRUxQRVJTID0gIkpBVkFIRUxQRVJTIjsgLy8gVGhlIEphdmFDbGFzcyB0aGF0IHRoZSBJRmlsZURlbHRhIG1hcHMgdG8uIC8vJE5PTi1OTFMtMSQKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVZhbGlkYXRvciNjbGVhbnVwKGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVJlcG9ydGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIE5vdGhpbmcgaXMgY2FjaGVkLCBzbyBub3RoaW5nIHRvIGRvLgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVZhbGlkYXRvciN2YWxpZGF0ZShjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklIZWxwZXIsIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVJlcG9ydGVyLCBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklGaWxlRGVsdGFbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJSUZpbGVEZWx0YVtdIGRlbHRhID0gbnVsbCA7Ci0JCWlmKChkZWx0YSA9PSBudWxsKSB8fCAoZGVsdGEubGVuZ3RoID09MCkpIHsKLQkJCS8vIEZ1bGwgVmFsaWRhdGUKLQkJCWRlbHRhID0gKElGaWxlRGVsdGFbXSloZWxwZXIubG9hZE1vZGVsKEFMTF9GSUxFUyk7Ci0JCX0KLQkJCi0JCWlmKGRlbHRhID09IG51bGwpIHsKLQkJCS8vIFByb2JsZW0gbG9hZGluZyB0aGUgZmlsZXMKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZm9yKGludCBpPTA7IGk8ZGVsdGEubGVuZ3RoOyBpKyspIHsKLQkJCUphdmFIZWxwZXJzIHRhcmdldCA9IChKYXZhSGVscGVycyloZWxwZXIubG9hZE1vZGVsKEpBVkFIRUxQRVJTLCBuZXcgT2JqZWN0W117ZGVsdGFbaV19KTsKLQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgIlRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UgZm9yIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yaywgcmVwb3J0ZWQgYnkgVkYgTm9CdWlsZCBUZXN0IFZhbGlkYXRvci4gUGxlYXNlIGlnbm9yZS4iLCB0YXJnZXQpOyAvLyROT04tTkxTLTEkCi0JCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a1Rlc3RIZWxwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrVGVzdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc0ZTU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrVGVzdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb24uQVdvcmtiZW5jaE1PRkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIEZ3a1Rlc3RIZWxwZXIgZXh0ZW5kcyBBV29ya2JlbmNoTU9GSGVscGVyIHsKLQkKLQlwdWJsaWMgRndrVGVzdEhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCXJlZ2lzdGVyTW9kZWwoRndrVGVzdFZhbGlkYXRvci5BTExfRklMRVMsICJsb2FkQWxsRmlsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3Rlck1vZGVsKEZ3a1Rlc3RWYWxpZGF0b3IuSkFWQUhFTFBFUlMsICJsb2FkSmF2YUhlbHBlcnMiLCBuZXcgQ2xhc3NbXXtJRmlsZURlbHRhLmNsYXNzfSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5JV29ya2JlbmNoSGVscGVyI2dldFRhcmdldE9iamVjdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE9iamVjdE5hbWUoT2JqZWN0IGFyZzApIHsKLQkJLy8gTm8gdGFyZ2V0IG9iamVjdHMgb3V0c2lkZSBvZiBhbiBJUmVzb3VyY2UgYXJlIHVzZWQsIHRoZXJlZm9yZSBubyB0YXJnZXQgb2JqZWN0IG5hbWVzIGFyZSBuZWVkZWQuCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJRmlsZURlbHRhW10gbG9hZEFsbEZpbGVzKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQkKLQkJZmluYWwgU2V0IGZpbGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJSVJlc291cmNlVmlzaXRvciB2aXNpdG9yID0gbmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJaWYoIXJlcy5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGlmIHRoZSByZXNvdXJjZSBpc24ndCBhY2Nlc3NpYmxlIHRoZW4gbmVpdGhlciBhcmUgaXRzIGNoaWxkcmVuCi0JCQkJfQotCQkJCQotCQkJCWlmKChyZXMgaW5zdGFuY2VvZiBJRmlsZSkgJiYgKCAocmVzLmdldEZpbGVFeHRlbnNpb24oKSAhPSBudWxsKSAmJiByZXMuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscygiamF2YSIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVdvcmtiZW5jaEZpbGVEZWx0YSBuZXdGaWxlRGVsdGEgPSBuZXcgV29ya2JlbmNoRmlsZURlbHRhKHJlcy5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIElGaWxlRGVsdGEuQ0hBTkdFRCwgcmVzKTsKLQkJCQkJZmlsZXMuYWRkKG5ld0ZpbGVEZWx0YSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRydWU7IC8vIHZpc2l0IHRoZSByZXNvdXJjZSdzIGNoaWxkcmVuIGFzIHdlbGwKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCB0cnVlKTsgLy8gdHJ1ZSBtZWFucyBpbmNsdWRlIHBoYW50b20gcmVzb3VyY2VzCi0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJSUZpbGVEZWx0YVtdIHJlc3VsdCA9IG5ldyBJRmlsZURlbHRhW2ZpbGVzLnNpemUoKV07Ci0JCWZpbGVzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIEphdmFIZWxwZXJzIGxvYWRKYXZhSGVscGVycyhJRmlsZURlbHRhIGRlbHRhKSB7Ci0JCVdvcmtiZW5jaEZpbGVEZWx0YSBmZCA9IChXb3JrYmVuY2hGaWxlRGVsdGEpZGVsdGE7Ci0JCUlSZXNvdXJjZSByZXN1bHQgPSBmZC5nZXRSZXNvdXJjZSgpOwotCQlpZihyZXN1bHQgIT0gbnVsbCl7Ci0JCQlpZihyZXN1bHQgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCXJldHVybiBKRFRVdGlsaXR5LmdldEphdmFIZWxwZXJzKChJRmlsZSlyZXN1bHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBUaGlzIHZhbGlkYXRvciB2YWxpZGF0ZXMgb25seSAuamF2YSBmaWxlcywgc28gdGhpcwotCQkJLy8gbXVzdCBiZSBhbiBpbnN0YW5jZW9mIEphdmFDbGFzcy4KLQkJCXJldHVybiAoSmF2YUhlbHBlcnMpZmQuZ2V0T2JqZWN0KCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5JV29ya2JlbmNoSGVscGVyI2dldFJlc291cmNlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUlSZXNvdXJjZSByZXN1bHQgPSBzdXBlci5nZXRSZXNvdXJjZShvYmplY3QpOwotCQlpZigocmVzdWx0ICE9IG51bGwpICYmIChyZXN1bHQuZXhpc3RzKCkpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgSmF2YUhlbHBlcnMpIHsKLQkJCS8vIElmIHRoZSBtZXNzYWdlIHdhcyBhZGRlZCB0byBhIEphdmFIZWxwZXJzLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZC4KLQkJCXJldHVybiBKRFRVdGlsaXR5LmdldFJlc291cmNlKGdldFByb2plY3QoKSwgKEphdmFIZWxwZXJzKSBvYmplY3QpOwotCQl9Ci0JCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgV29ya2JlbmNoRmlsZURlbHRhKSB7Ci0JCQkvLyBJZiB0aGUgd29ya2JlbmNoIGlzIHJlbW92aW5nIG1lc3NhZ2VzIGZyb20gZmlsZXMsIGFuZCB0aGUgb2JqZWN0IGlzIHNldAotCQkJLy8gaW5zdGVhZCBvZiB0aGUgSVJlc291cmNlLCBuZWVkIHRvIHByb2Nlc3MgdGhlIGRlbHRhJ3Mgb2JqZWN0IGluc3RlYWQgb2YKLQkJCS8vIGl0cyByZXNvdXJjZS4KLQkJCXJldHVybiBKRFRVdGlsaXR5LmdldFJlc291cmNlKGdldFByb2plY3QoKSwgKEphdmFIZWxwZXJzKSgoV29ya2JlbmNoRmlsZURlbHRhKW9iamVjdCkuZ2V0T2JqZWN0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRlLkFXb3JrYmVuY2hIZWxwZXIjZ2V0TGluZU5vKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lTm8oT2JqZWN0IG9iamVjdCkgewotCQlpbnQgbGluZU5vID0gc3VwZXIuZ2V0TGluZU5vKG9iamVjdCk7Ci0JCWlmKGxpbmVObyA9PSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQpIHsKLQkJCS8vIE5vIGFkYXB0ZXJzLCBzbyBmdWRnZSB0aGUgbGluZSBudW1iZXIgYnkgYWRkaW5nIHRoZSBtZXNzYWdlIHRvIHRoZSBmaXJzdCBsaW5lIGluIHRoZSBmaWxlLgotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcmV0dXJuIGxpbmVObzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrVGVzdFZhbGlkYXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9Gd2tUZXN0VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMWZhYmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9Gd2tUZXN0VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Mb2NhbGl6ZWRNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgRndrVGVzdFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9GSUxFUyA9ICJBTExfRklMRVMiOyAvLyBMb2FkIGFsbCBJRmlsZURlbHRhcyBmb3IgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBwcm9qZWN0LiAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQUhFTFBFUlMgPSAiSkFWQUhFTFBFUlMiOyAvLyBUaGUgSmF2YUNsYXNzIHRoYXQgdGhlIElGaWxlRGVsdGEgbWFwcyB0by4gLy8kTk9OLU5MUy0xJAotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5JVmFsaWRhdG9yI2NsZWFudXAoY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5JUmVwb3J0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gTm90aGluZyBpcyBjYWNoZWQsIHNvIG5vdGhpbmcgdG8gZG8uCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5JVmFsaWRhdG9yI3ZhbGlkYXRlKGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSUhlbHBlciwgY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5JUmVwb3J0ZXIsIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSUZpbGVEZWx0YVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlJRmlsZURlbHRhW10gZGVsdGEgPSBudWxsOwotCQlpZigoZGVsdGEgPT0gbnVsbCkgfHwgKGRlbHRhLmxlbmd0aCA9PTApKSB7Ci0JCQkvLyBGdWxsIFZhbGlkYXRlCi0JCQlkZWx0YSA9IChJRmlsZURlbHRhW10paGVscGVyLmxvYWRNb2RlbChBTExfRklMRVMpOwotCQl9Ci0JCQotCQlpZihkZWx0YSA9PSBudWxsKSB7Ci0JCQkvLyBQcm9ibGVtIGxvYWRpbmcgdGhlIGZpbGVzCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZvcihpbnQgaT0wOyBpPGRlbHRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlKYXZhSGVscGVycyB0YXJnZXQgPSAoSmF2YUhlbHBlcnMpaGVscGVyLmxvYWRNb2RlbChKQVZBSEVMUEVSUywgbmV3IE9iamVjdFtde2RlbHRhW2ldfSk7Ci0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksICJUaGlzIGlzIGEgdGVzdCBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIHJlcG9ydGVkIGJ5IFZGIFRlc3QgVmFsaWRhdG9yLiBQbGVhc2UgaWdub3JlLiIsIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvSkRUVXRpbGl0eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9KRFRVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOTZmMWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9KRFRVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFFTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2suVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5CVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5WYWxpZGF0b3JUZXN0Y2FzZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgc29tZSB1dGlsaXR5IG1ldGhvZHMgdXNlZCB0byAKLSAqIGFjY2VzcywgbWFuaXB1bGF0ZSwgZXRjLiBqZHQgdHlwZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKRFRVdGlsaXR5IHsKLQlwcml2YXRlIEpEVFV0aWxpdHkoKSB7Ci0JCS8vIERvIG5vdCBuZWVkIGFueSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluZXJzIGluIHRoZSBnaXZlbiBwcm9qZWN0IHRoYXQgY29udGFpbiBlaXRoZXIKLQkgKiAuamF2YSBzb3VyY2UgZmlsZXMgb3IgLmNsYXNzIGJpbmFyeSBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250YWluZXJbXSBnZXRKYXZhQ29udGFpbmVycyhJSmF2YVByb2plY3QganApIHsKLQkJaWYgKGpwID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IGpwLmdldFByb2plY3QoKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNsYXNzcGF0aCA9IGpwLmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOyAvLyB0cnVlIG1lYW5zIGlnbm9yZSB1bnJlc29sdmVkIChtaXNzaW5nKSB2YXJpYWJsZXMsIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uCi0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIFRyYXZlcnNlIHRoZSBjbGFzc3BhdGgsIGFuZCBjYWxjdWxhdGUgYSBsaXN0IG9mIGp1c3QgdGhlIAotCQkvLyBJRm9sZGVycyBhbmQgSVByb2plY3RzIChpLmUuLCBJQ29udGFpbmVycykgdGhhdCBjb250YWluIHNvdXJjZQotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUNvbnRhaW5lcltdIGljb250YWluZXJzID0gbmV3IElDb250YWluZXJbY2xhc3NwYXRoLmxlbmd0aF07Ci0JCWludCB2YWxpZENvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtpXTsKLQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCUlSZXNvdXJjZSByZXMgPSByb290LmZpbmRNZW1iZXIoZW50cnkuZ2V0UGF0aCgpKTsKLQkJCQlpZihyZXMgPT0gbnVsbCkgewotCQkJCQkvLyBub3QgaW4gdGhlIHdvcmtzcGFjZQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZighcmVzLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpIHsKLQkJCQkJLy8gaW4gYSBkaWZmZXJlbnQgcHJvamVjdAotCQkJCQljb250aW51ZTsKLQkJCQl9CQkJCQotCi0JCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJaWNvbnRhaW5lcnNbdmFsaWRDb3VudCsrXSA9IChJQ29udGFpbmVyKSByZXM7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdHJ5IHsKLQkJCUlDb250YWluZXIgb3V0cHV0Q29udGFpbmVyID0gKElDb250YWluZXIpcm9vdC5maW5kTWVtYmVyKGpwLmdldE91dHB1dExvY2F0aW9uKCkpOwotCQkJSUNvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSBudWxsOwotCQkJaWYob3V0cHV0Q29udGFpbmVyID09IG51bGwpIHsKLQkJCQljb250YWluZXJzID0gbmV3IElDb250YWluZXJbdmFsaWRDb3VudF07Ci0JCQl9Ci0JCQllbHNlIGlmKG91dHB1dENvbnRhaW5lci5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKSB7Ci0JCQkJY29udGFpbmVycyA9IG5ldyBJQ29udGFpbmVyW3ZhbGlkQ291bnQrMV07Ci0JCQkJY29udGFpbmVyc1t2YWxpZENvdW50XSA9IG91dHB1dENvbnRhaW5lcjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNvbnRhaW5lcnMgPSBuZXcgSUNvbnRhaW5lclt2YWxpZENvdW50XTsKLQkJCX0KLQkJCVN5c3RlbS5hcnJheWNvcHkoaWNvbnRhaW5lcnMsIDAsIGNvbnRhaW5lcnMsIDAsIHZhbGlkQ291bnQpOwotCQkJcmV0dXJuIGNvbnRhaW5lcnM7Ci0JCX0KLQkJY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJVHlwZSB0aGF0IHJlcHJlc2VudHMgdGhpcyBmaWxlLCBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVR5cGUgZ2V0VHlwZShJQ29udGFpbmVyW10gamF2YUNvbnRhaW5lcnMsIElGaWxlIGZpbGUpIHsKLQkJaWYoZmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJaWYoZmlsZUV4dGVuc2lvbiA9PSBudWxsKSB7Ci0JCQkvLyBub3QgYSAuamF2YSBvciBhIC5jbGFzcyBmaWxlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaWYoIShmaWxlRXh0ZW5zaW9uLmVxdWFscygiamF2YSIpIHx8IGZpbGVFeHRlbnNpb24uZXF1YWxzKCJjbGFzcyIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCUlKYXZhUHJvamVjdCBqcCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJaWYoanAgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlJUGF0aCByZWxhdGl2ZVBhdGggPSBnZXRSZWxhdGl2ZVBhdGgoamF2YUNvbnRhaW5lcnMsIGZpbGUpOwotCQkJaWYocmVsYXRpdmVQYXRoID09IG51bGwpIHsKLQkJCQkvLyBOb3QgYSBtZW1iZXIgb2YgYSBzb3VyY2Ugb3Igb3V0cHV0IGNvbnRhaW5lcgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlJUGF0aCBwYWNrYWdlUGF0aCA9IHJlbGF0aXZlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBwYWNrYWdlUGF0aC50b1N0cmluZygpLnJlcGxhY2UoSVBhdGguU0VQQVJBVE9SLCAnLicpOwotCQkJU3RyaW5nIHR5cGVOYW1lID0gcmVsYXRpdmVQYXRoLmxhc3RTZWdtZW50KCk7Ci0JCQl0eXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCB0eXBlTmFtZS5sZW5ndGgoKSAtIGZpbGVFeHRlbnNpb24ubGVuZ3RoKCkgLSAxKTsKLQkJCVN0cmluZyBxdWFsaWZpZWROYW1lID0gbnVsbDsKLQkJCWlmIChwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlxdWFsaWZpZWROYW1lID0gcGFja2FnZU5hbWUgKyAiLiIgKyB0eXBlTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlxdWFsaWZpZWROYW1lID0gdHlwZU5hbWU7Ci0JCQl9Ci0JCQlyZXR1cm4ganAuZmluZFR5cGUocXVhbGlmaWVkTmFtZSk7Ci0JCX0KLQkJY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJUGF0aCBvZiB0aGUgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIGZpcnN0IGNvbnRhaW5lciB0aGF0IHRoZQotCSAqIHJlc291cmNlIGlzIGZvdW5kIGluLiBJZiB0aGUgcmVzb3VyY2UgaXMgY29udGFpbmVkIGluIG1vcmUgdGhhbiBvbmUgY29udGFpbmVyCi0JICogaW4gdGhlIGFycmF5LCByZXR1cm4gdGhlIGZpcnN0IElQYXRoIGZvdW5kLiBJZiB0aGUgcmVzb3VyY2UgaXMgbm90IGEgbWVtYmVyCi0JICogb2YgYW55IG9mIHRoZSBjb250YWluZXJzLCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFJlbGF0aXZlUGF0aChJQ29udGFpbmVyW10gY29udGFpbmVycywgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWZvcihpbnQgaT0wOyBpPGNvbnRhaW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlQYXRoIHBhdGggPSBnZXRSZWxhdGl2ZVBhdGgoY29udGFpbmVyc1tpXSwgcmVzb3VyY2UpOwotCQkJaWYocGF0aCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHBhdGg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIElQYXRoIG9mIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5lci4KLQkgKiBJZiB0aGUgSVJlc291cmNlIGlzIG5vdCBhIG1lbWJlciBvZiB0aGUgY29udGFpbmVyLCByZXR1cm4gbnVsbC4gCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRSZWxhdGl2ZVBhdGgoSUNvbnRhaW5lciBjb250YWluZXIsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAoKHJlc291cmNlID09IG51bGwpIHx8IChjb250YWluZXIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gSXMgdGhlIHBhdGggcGFydCBvZiB0aGUgSUNvbnRhaW5lcj8KLQkJaW50IG1hdGNoaW5nRmlyc3RTZWdtZW50cyA9IGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLQkJaWYobWF0Y2hpbmdGaXJzdFNlZ21lbnRzID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMobWF0Y2hpbmdGaXJzdFNlZ21lbnRzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyBnZXRKYXZhSGVscGVycyhJRmlsZSBmaWxlKSB7Ci0JCUlUeXBlIHR5cGUgPSBnZXRUeXBlKGZpbGUpOwotCQlpZih0eXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0SmF2YUhlbHBlcnModHlwZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVR5cGUgZ2V0VHlwZShJRmlsZSBmaWxlKSB7Ci0JCUlKYXZhUHJvamVjdCBqcCA9IEphdmFDb3JlLmNyZWF0ZShmaWxlLmdldFByb2plY3QoKSk7Ci0JCUlDb250YWluZXJbXSBqYXZhQ29udGFpbmVycyA9IChqcCA9PSBudWxsKSA/IG51bGwgOiBKRFRVdGlsaXR5LmdldEphdmFDb250YWluZXJzKGpwKTsKLQkJaWYoamF2YUNvbnRhaW5lcnMgIT0gbnVsbCkgewotCQkJcmV0dXJuIEpEVFV0aWxpdHkuZ2V0VHlwZShqYXZhQ29udGFpbmVycywgZmlsZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyBnZXRKYXZhSGVscGVycyhJVHlwZSB0eXBlKSB7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZ2V0UmVzb3VyY2VTZXQodHlwZSk7Ci0JCWlmKHJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgcmVzb3VyY2VTZXQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KElUeXBlIHR5cGUpIHsKLQkJSmF2YUVNRk5hdHVyZSBuYXR1cmUgPSBnZXROYXR1cmUodHlwZSk7Ci0JCWlmKG5hdHVyZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbmF0dXJlLmdldFJlc291cmNlU2V0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBKYXZhRU1GTmF0dXJlIGdldE5hdHVyZShJVHlwZSB0eXBlKSB7Ci0JCUlKYXZhUHJvamVjdCBqcCA9IHR5cGUuZ2V0SmF2YVByb2plY3QoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGpwLmdldFByb2plY3QoKTsKLQkJCi0JCXRyeSB7Ci0JCQlKYXZhRU1GTmF0dXJlIG5hdHVyZSA9IEphdmFFTUZOYXR1cmUuY3JlYXRlUnVudGltZShwcm9qZWN0KTsKLQkJCXJldHVybiBuYXR1cmU7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSVByb2plY3QgcHJvamVjdCwgSmF2YUhlbHBlcnMgY2xhenopIHsKLQkJSVR5cGUgdHlwZSA9IGdldFR5cGUocHJvamVjdCwgY2xhenopOwotCQlyZXR1cm4gdHlwZS5nZXRSZXNvdXJjZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVR5cGUgZ2V0VHlwZShJUHJvamVjdCBwcm9qZWN0LCBKYXZhSGVscGVycyBjbGF6eikgewotCQlpZihjbGF6eiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSA9IGNsYXp6LmdldEphdmFOYW1lKCk7Ci0JCUlKYXZhUHJvamVjdCBqcCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJdHJ5IHsKLQkJCXJldHVybiBqcC5maW5kVHlwZShmdWxseVF1YWxpZmllZE5hbWUpOwotCQl9Ci0JCWNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0aHJlZSB2YWxpZGF0b3IgdGVzdCBjYXNlcyB1c2VkIHRvIHRlc3QgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWRlRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCkgewotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRtZHMgPSBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0QWxsVmFsaWRhdG9yVGVzdHMobW9uaXRvciwgcHJvamVjdCk7Ci0JCWlmKCh0bWRzID09IG51bGwpIHx8ICh0bWRzLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVswXTsKLQkJfQotCQkKLQkJVmFsaWRhdG9yVGVzdGNhc2UgZndrTm9idWlsZFRlc3RUTUQgPSBudWxsOwotCQlWYWxpZGF0b3JUZXN0Y2FzZSBmd2tUZXN0VE1EID0gbnVsbDsKLQkJVmFsaWRhdG9yVGVzdGNhc2UgcHJvcFRNRCA9IG51bGw7Ci0JCVZhbGlkYXRvclRlc3RjYXNlW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlWzNdOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IoaW50IGk9MDsgaTx0bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZSB0bWQgPSB0bWRzW2ldOwotCQkJaWYodG1kLmdldFZhbGlkYXRvckNsYXNzKCkuZXF1YWxzKFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLkZXS19URVNUX1ZBTElEQVRPUl9DTEFTUykpIHsKLQkJCQlmd2tUZXN0VE1EID0gdG1kOwotCQkJCXJlc3VsdFtjb3VudCsrXSA9IHRtZDsKLQkJCX0KLQkJCWVsc2UgaWYodG1kLmdldFZhbGlkYXRvckNsYXNzKCkuZXF1YWxzKFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLlBST1BFUlRJRVNfVkFMSURBVE9SX0NMQVNTKSkgewotCQkJCXByb3BUTUQgPSB0bWQ7Ci0JCQkJcmVzdWx0W2NvdW50KytdID0gdG1kOwotCQkJfQotCQkJZWxzZSBpZih0bWQuZ2V0VmFsaWRhdG9yQ2xhc3MoKS5lcXVhbHMoVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uRldLX05PQlVJTERfVEVTVF9WQUxJREFUT1JfQ0xBU1MpKSB7Ci0JCQkJZndrTm9idWlsZFRlc3RUTUQgPSB0bWQ7Ci0JCQkJcmVzdWx0W2NvdW50KytdID0gdG1kOwotCQkJfQotCQkJCi0JCQlpZigoZndrVGVzdFRNRCAhPSBudWxsKSAmJiAocHJvcFRNRCAhPSBudWxsKSAmJiAoZndrTm9idWlsZFRlc3RUTUQgIT0gbnVsbCkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJaWYoY291bnQgIT0gcmVzdWx0Lmxlbmd0aCkgewotCQkJLy8gT24gdGhpcyBwcm9qZWN0LCBub3QgYWxsIG9mIHRoZSB0ZXN0IHZhbGlkYXRvcnMgYXJlIHVzZWQuCi0JCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHIgPSBuZXcgVmFsaWRhdG9yVGVzdGNhc2VbY291bnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIHIsIDAsIGNvdW50KTsKLQkJCXJldHVybiByOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXV0b0J1aWxkKGJvb2xlYW4gYXV0b0J1aWxkRW5hYmxlZCkgewotCQl0cnkgewotCQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWRlc2Muc2V0QXV0b0J1aWxkaW5nKGF1dG9CdWlsZEVuYWJsZWQpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNldERlc2NyaXB0aW9uKGRlc2MpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdElucHV0L0ZXSy9CVlQvb3BDb25zdHIuamFyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0SW5wdXQvRldLL0JWVC9vcENvbnN0ci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNGIwMzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0SW5wdXQvRldLL0JWVC9vcENvbnN0ci5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RJbnB1dC9Qcm9wZXJ0aWVzL2FQcm9wZXJ0aWVzLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdElucHV0L1Byb3BlcnRpZXMvYVByb3BlcnRpZXMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTZmNGNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdElucHV0L1Byb3BlcnRpZXMvYVByb3BlcnRpZXMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgo=