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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3Zjg3OS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpTVCBFbnRlcnByaXNlIFRlc3RzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249SlNUIGVudGVycHJpc2UgdGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZhNTk5OS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3QuZW50ZXJwcmlzZV90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53cy50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LndzLnRlc3RzLnBlcmZvcm1hbmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC5lbnRlcnByaXNlX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LmVudGVycHJpc2VfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlM2Q3MTIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUpTVCBXZWIgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1KU1QgV2ViIHRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanN0LndlYl90ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDBiMTFhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjUuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudGVzdHMuZW5jb2RpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVzdHMucGVyZm9ybWFuY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3Qud2ViX3Rlc3RzLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpzdC53ZWJfdGVzdHMuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTg2ZWUxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1jb3JlLXBlcmZvcm1hbmNlLmphcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZTEyZmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2U8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhOTBkMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXNvdXJjZS5jb3JlLXBlcmZvcm1hbmNlLmphciA9IHNyYy8KLW91dHB1dC5jb3JlLXBlcmZvcm1hbmNlLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgY29yZS1wZXJmb3JtYW5jZS5qYXIsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgdGVzdGNhc2UueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyMGI1Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UiCi0gICBuYW1lPSJDb3JlIFBlcmZvcm1hbmNlIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLkNvcmVQZXJmb3JtYW5jZVRlc3RQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImNvcmUtcGVyZm9ybWFuY2UuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmp1bml0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzIi8+Ci0gICA8L3JlcXVpcmVzPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvcGVyZm9ybWFuY2UvQWxsQ29yZVBlcmZvcm1hbmNlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2Uvc3JjL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvcGVyZm9ybWFuY2UvQWxsQ29yZVBlcmZvcm1hbmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE1MDQ0MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL3BlcmZvcm1hbmNlL0FsbENvcmVQZXJmb3JtYW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjgsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5BcHBDbGllbnRFTUZFZGl0VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkFwcENsaWVudEVNRlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FYXJFTUZFZGl0VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkVhckVNRlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FamJFTUZFZGl0VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLlJhckVNRkVkaXRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuUmFyRU1GVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLldhckVNRkVkaXRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuV2FyRU1GVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLldlYlNlcnZpY2VzRU1GVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS5CYXNlUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuaGVhZGxlc3MudGVzdHMuc2F2ZXN0cmF0ZWd5LkVKQkltcG9ydE9wZXJhdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuYXBwY2xpZW50Lm9wZXJhdGlvbnMuQXBwQ2xpZW50UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5lamIub3BlcmF0aW9ucy5FSkJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmpjYS5vcGVyYXRpb25zLkNvbm5lY3RvclByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMud2ViLm9wZXJhdGlvbnMuV2ViUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdDsKLQotLyoqCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgQWxsQ29yZVBlcmZvcm1hbmNlVGVzdHMgZXh0ZW5kcyBCYXNlUGVyZm9ybWFuY2VUZXN0Q2FzZXsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCi0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlBlcmZvcm1hbmNlIFRlc3QgZm9yIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdCIpOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBBcHBDbGllbnRFTUZFZGl0VGVzdCgidGVzdEFwcGxpY2F0aW9uQ2xpZW50RWRpdCIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJBcHBsaWNhdGlvbiBDbGllbnQgZW1mIGVkaXQgdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgQXBwQ2xpZW50RU1GVGVzdCgidGVzdEFwcGxpY2F0aW9uQ2xpZW50UG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5MT0NBTCwgIkFwcGxpY2F0aW9uIENsaWVudCBlbWYgdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgQXBwQ2xpZW50RU1GVGVzdCgidGVzdDE0QXBwbGljYXRpb25DbGllbnRQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIkFwcGxpY2F0aW9uIENsaWVudCAxNCBlbWYgdGVzdCIgKTsKLQkJCi0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEVhckVNRkVkaXRUZXN0KCJ0ZXN0RUFSRWRpdCIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUwsICJFQVIgZW1mIGVkaXQgdGVzdCIgKTsKLQkJLy9hZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBFYXJFTUZUZXN0KCJ0ZXN0RUFSUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5MT0NBTCwgIkVBUiAgZW1mIHRlc3QiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEVhckVNRlRlc3QoInRlc3QxNEVBUlBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiRUFSIDE0IGVtZiB0ZXN0IiApOwotCQkKLQkJLy9hZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBFamJFTUZFZGl0VGVzdCgidGVzdEVKQkphckVkaXQiKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiRUpCIGVtZiBlZGl0IHRlc3QgLXRlc3RFSkJKYXJFZGl0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBFamJFTUZFZGl0VGVzdCgidGVzdFdDQ01KYXIiKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuTE9DQUwsICJFSkIgZW1mIGVkaXQgdGVzdCAtIHRlc3RXQ0NNSmFyIiApOwotCQkvL2FkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEVqYkVNRlRlc3QoInRlc3RFSkJKYXJQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkxPQ0FMLCAiRUpCICBlbWYgdGVzdCIgKTsKLQkJLy9hZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBFamJFTUZUZXN0KCJ0ZXN0MTRFSkJKYXJQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIkVKQiAxNCBlbWYgdGVzdCIgKTsKLQkKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgUmFyRU1GRWRpdFRlc3QoInRlc3RSQVJFZGl0IiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIlJBUiBlbWYgZWRpdCB0ZXN0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBSYXJFTUZUZXN0KCJ0ZXN0UkFSUG9wdWxhdGlvbiIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5MT0NBTCwgIlJBUiAgZW1mIHRlc3QiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IFJhckVNRlRlc3QoInRlc3QxNFJBUlBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiUkFSIDE0IGVtZiB0ZXN0IiApOwotCQotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBXYXJFTUZFZGl0VGVzdCgidGVzdFdBUkVkaXQiKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiV0FSIGVtZiBlZGl0IHRlc3QiICk7Ci0JCS8vYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgV2FyRU1GVGVzdCgidGVzdFdBUlBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuTE9DQUwsICJXQVIgIGVtZiB0ZXN0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBXYXJFTUZUZXN0KCJ0ZXN0MTRXQVJQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIldBUiAxNCBlbWYgdGVzdCIgKTsKLQkJCi0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IFdlYlNlcnZpY2VzRU1GVGVzdCgidGVzdDEzV2ViU2VydmljZXNDbGllbnRQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLk5PTkUsICJXZWIgU2VydmljZSBDbGllbnQgMTMgZW1mIHRlc3QiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IFdlYlNlcnZpY2VzRU1GVGVzdCgidGVzdDEzV2ViU2VydmljZXNERFBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuTE9DQUwsICJXZWIgc2VydmljZXMgMTMgZW1mIHRlc3QiICk7Ci0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IFdlYlNlcnZpY2VzRU1GVGVzdCgidGVzdDE0V2ViU2VydmljZXNERFBvcHVsYXRpb24iKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuR0xPQkFMLCAiV2ViIHNlcnZpY2VzIDE0IGVtZiB0ZXN0IiApOwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBXZWJTZXJ2aWNlc0VNRlRlc3QoInRlc3RKYXhSUENNYXBQb3B1bGF0aW9uIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIkpheFJQQ01hcHBpbmcgZW1mIHRlc3QiICk7Ci0JCQotCQkKLQkJLy9DcmVhdGlvbiB0ZXN0cwotCQlhZGRQZXJmb3JtYW5jZVRlc3Qoc3VpdGUsIG5ldyBFSkJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0KCJ0ZXN0RGVmYXVsdHMiKSwgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuTk9ORSwgIkVKQiBDb21wb25lbnQgY3JlYXRpb24gdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgQXBwQ2xpZW50UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdCgidGVzdERlZmF1bHRzIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkxPQ0FMLCAiQXBwIENsaWVudCBDb21wb25lbnQgY3JlYXRpb24gdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgQ29ubmVjdG9yUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdCgidGVzdERlZmF1bHRzIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIkNvbm5lY3RvciBDb21wb25lbnQgY3JlYXRpb24gdGVzdCIgKTsKLQkJYWRkUGVyZm9ybWFuY2VUZXN0KHN1aXRlLCBuZXcgV2ViUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdCgidGVzdERlZmF1bHRzIiksIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLkdMT0JBTCwgIldlYiBDb21wb25lbnQgY3JlYXRpb24gdGVzdCIgKTsKLQkJCi0JCWFkZFBlcmZvcm1hbmNlVGVzdChzdWl0ZSwgbmV3IEVKQkltcG9ydE9wZXJhdGlvblRlc3QoInRlc3RFSkIyMUltcG9ydCIpLCBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5OT05FLCAiRUpCIENvbXBvbmVudCBpbXBvcnQgdGVzdCIgKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS9zcmMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9wZXJmb3JtYW5jZS9Db3JlUGVyZm9ybWFuY2VUZXN0UGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL3BlcmZvcm1hbmNlL0NvcmVQZXJmb3JtYW5jZVRlc3RQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg3NjllYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3NyYy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL3Rlc3RzL3BlcmZvcm1hbmNlL0NvcmVQZXJmb3JtYW5jZVRlc3RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgQ29yZVBlcmZvcm1hbmNlVGVzdFBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBDb3JlUGVyZm9ybWFuY2VUZXN0UGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ29yZVBlcmZvcm1hbmNlVGVzdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29yZVBlcmZvcm1hbmNlVGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gQ29yZVBlcmZvcm1hbmNlVGVzdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVBsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3QueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5wZXJmb3JtYW5jZS90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxNTQ0Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9IkoyRUUgUGVyZm9ybWFuY2UgdGVzdCIgZGVmYXVsdD0icGVyZm9ybWFuY2UiIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLiIvPgotCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIKLSAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMS4wL2xpYnJhcnkueG1sIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwZXJmLXRlc3RzLWZpbGUiCi0gICAgICAgICAgICB2YWx1ZT0iJHt0ZXN0RGlyfS9wZXJmb3JtYW5jZS10ZXN0cy54bWwiLz4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotICA8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0gIDwhLS0gZGVsZXRlIHRlbXBvcmFyeSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0KLSAKLSAgPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSBwZXJmb3JtYW5jZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLTx0YXJnZXQgbmFtZT0icGVyZm9ybWFuY2Utc3VpdGUiPgotICA8cHJvcGVydHkgbmFtZT0icGVyZm9ybWFuY2UtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BlcmZvcm1hbmNlX2ZvbGRlciIvPgotICA8ZGVsZXRlIGRpcj0iJHtwZXJmb3JtYW5jZS1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke3BlcmYtdGVzdHMtZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtwZXJmb3JtYW5jZS1mb2xkZXJ9Ii8+Ci0gICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlLkFsbENvcmVQZXJmb3JtYW5jZVRlc3RzIi8+Ci0gIDwvYW50PgotPC90YXJnZXQ+Ci0gICAgICAgICAgICAgICAgICAgIAotPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSBwZXJmb3JtYW5jZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotPHRhcmdldCBuYW1lPSJwZXJmb3JtYW5jZSIgZGVwZW5kcz0iaW5pdCxwZXJmb3JtYW5jZS1zdWl0ZSxjbGVhbnVwIj4KLSAgPGFudCB0YXJnZXQ9ImNvbGxlY3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gIDwvYW50PgotPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLnBlcmZvcm1hbmNlL3Rlc3RjYXNlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvdGVzdGNhc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTcxODY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMucGVyZm9ybWFuY2UvdGVzdGNhc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08dGVzdENhc2VzPgotCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5FYXJFTUZFZGl0VGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdEVBUkVkaXQiIHRhZ2dpbmc9IkdMT0JBTCIgc2hvcnROYW1lPSJFQVIgZW1mIGVkaXQiIC8+Ci0JPC90ZXN0Q2FzZT4KLQk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuRWFyRU1GVGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdDE0RUFSUG9wdWxhdGlvbiIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IkVBUiAxNCBlbWYgdGVzdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkVqYkVNRkVkaXRUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0RUpCSmFyRWRpdCIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IkVKQiBlbWYgZWRpdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkVqYkVNRkVkaXRUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0V0NDTUphciIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IkVKQiBlbWYgZWRpdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkVqYkVNRlRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3RFSkJKYXJQb3B1bGF0aW9uIiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iRUpCIGVtZiB0ZXN0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuRWpiRU1GVGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdDE0RUpCSmFyUG9wdWxhdGlvbiIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IkVKQiAxNCBlbWYgdGVzdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkFwcENsaWVudEVNRkVkaXRUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0QXBwbGljYXRpb25DbGllbnRFZGl0IiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iQXBwbGljYXRpb24gQ2xpZW50IGVtZiBlZGl0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuQXBwQ2xpZW50RU1GVGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdDE0QXBwbGljYXRpb25DbGllbnRQb3B1bGF0aW9uIiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iQXBwbGljYXRpb24gQ2xpZW50IDE0IGVtZiB0ZXN0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAkKLSAJPHRlc3RDYXNlIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLlJhckVNRkVkaXRUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0UkFSRWRpdCIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IkNvbm5lY3RvciBlbWYgZWRpdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJCi0gCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5SYXJFTUZUZXN0Ij4KLQkJPG1ldGhvZCBuYW1lPSJ0ZXN0MTRSQVJQb3B1bGF0aW9uIiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iQ29ubmVjdG9yIDE0IGVtZiB0ZXN0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuV2FyRU1GRWRpdFRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3RXQVJFZGl0IiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iV2ViIGVtZiBlZGl0IiAvPgotIAk8L3Rlc3RDYXNlPgotIAk8dGVzdENhc2UgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuV2FyRU1GVGVzdCI+Ci0JCTxtZXRob2QgbmFtZT0idGVzdDE0V0FSUG9wdWxhdGlvbiIgdGFnZ2luZz0iR0xPQkFMIiBzaG9ydE5hbWU9IldlYiAxNCBlbWYgdGVzdCIgLz4KLSAJPC90ZXN0Q2FzZT4KLSAJCi0gCTx0ZXN0Q2FzZSBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5XZWJTZXJ2aWNlc0VNRlRlc3QiPgotCQk8bWV0aG9kIG5hbWU9InRlc3QxNFdlYlNlcnZpY2VzRERQb3B1bGF0aW9uIiB0YWdnaW5nPSJHTE9CQUwiIHNob3J0TmFtZT0iV2ViIHNlcnZpY2VzIDE0IGVtZiB0ZXN0IiAvPgotIAk8L3Rlc3RDYXNlPiAKLSAJCi08L3Rlc3RDYXNlcz4KLQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NWQ5YjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJjb21tb25BcmNoaXZlVGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJtb2ZqMmVlVGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzY5OTY5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi10ZXN0T3V0cHV0Ci1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi10ZXN0cy5qYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvLnByb2plY3QgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Q3YWFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+PC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNjlmOGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gdGVzdHMuamFyLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgY29tbW9uQXJjaGl2ZVJlc291cmNlcy8sXAotICAgICAgICAgICAgICAgdGVzdERhdGEvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLW91dHB1dC50ZXN0cy5qYXIgPSBiaW4vCi1qYXJzLmNvbXBpbGUub3JkZXIgPSB0ZXN0cy5qYXIKLXNvdXJjZS50ZXN0cy5qYXIgPSBjb21tb25BcmNoaXZlVGVzdHMvLFwKLSAgICAgICAgICAgICAgICAgICBtb2ZqMmVlVGVzdHMvCi1iaW4uZXhjbHVkZXMgPSBjb21tb25BcmNoaXZlUmVzb3VyY2VzLy5jdnNpZ25vcmUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQvYnVpbGRjb250cm9sLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkL2J1aWxkY29udHJvbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODJhOTkzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQvYnVpbGRjb250cm9sLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUNPTlRBQ1Q9ZGFuYmVyZ0B1cy5pYm0uY29tCi1Db21wb25lbnRTaG9ydE5hbWU9Y29tLmlibS5ldG9vbHMuajJlZS5jb3JlLnRlc3QKLUNvbXBvbmVudEZ1bGxOYW1lPWNvbS5pYm0uZXRvb2xzLmoyZWUuY29yZS50ZXN0Ci1Db21wb25lbnRDb21wZXRlbmN5PVRFU1RTCi1KYXZhQ29tcGlsZS4xPXNyY2phcgotQnVpbGRWZXJpZmljYXRpb24uMT1kaXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQvcGFja2FnZS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkL3BhY2thZ2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTFmMzI2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQvcGFja2FnZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJjb20uaWJtLmV0b29scy5qMmVlLmNvcmUudGVzdCIgZGVmYXVsdD0icGFja2FnaW5nUGx1Z2luIiBiYXNlZGlyPSIuLy4uIj4KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFja2FnZURpciIgdmFsdWU9IiIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLmRpcmVjdG9yeSIgIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uaWQiIHZhbHVlPSJjb20uaWJtLmV0b29scy5qMmVlLmNvcmUudGVzdCIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLnZlcnNpb24iICB2YWx1ZT0iIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJwYWNrYWdpbmdQbHVnaW4iIGRlcGVuZHM9ImluaXQiPgotICAgICAgICA8ZWNobyBtZXNzYWdlPSIke3BsdWdpbi5pZH0iLz4KLSAgICAgICAgPGNvcHkgdG9kaXI9IiR7cGFja2FnZURpcn0vcGx1Z2lucy8ke3BsdWdpbi5pZH1fJHtwbHVnaW4udmVyc2lvbn0iPgotICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke3BsdWdpbi5kaXJlY3Rvcnl9Ij4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJwbHVnaW4ueG1sIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0idGVzdC54bWwiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJydW50aW1lL2NvbW1vbkFyY2hpdmVUZXN0cy5qYXIiLz4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZSBuYW1lPSJydW50aW1lL21vZGVsVGVzdHMuamFyIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icnVudGltZS9qYXZhVGVzdHMuamFyIi8+Ci0gICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgIDwvY29weT4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQvd3NCdWlsZC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2J1aWxkL3dzQnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjUzODg1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvYnVpbGQvd3NCdWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBwcm9qZWN0IFsKLQk8IUVOVElUWSBiYXNlQnVpbGQgU1lTVEVNICJmaWxlOi4uLy4uL3dzQnVpbGREZWYueG1sIj4KLV0+Ci0KLTxwcm9qZWN0IG5hbWU9ImJ1aWxkUGx1Z2luIiBkZWZhdWx0PSJidWlsZCIgYmFzZWRpcj0iLi8uLiI+Ci0KLTwhLS0gaW5jbHVkZSB0aGUgY29tbW9uIHhtbCBidWlsZCBmaWxlIC0tPgotJmJhc2VCdWlsZDsKLQotPHRhcmdldCBuYW1lPSJidWlsZCIgZGVwZW5kcz0icHJlcGFyZSIgaWY9InBsdWdpbi5pZCI+Ci0KLSAgICA8YW50Y2FsbCB0YXJnZXQ9InVuemlwc3JjamFyIj4gPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSJjb21tb25BcmNoaXZlVGVzdHMiLz4gPC9hbnRjYWxsPgotICAgIDxhbnRjYWxsIHRhcmdldD0idW56aXBzcmNqYXIiPiA8cGFyYW0gbmFtZT0iamFybmFtZSIgdmFsdWU9Im1vZGVsVGVzdHMiLz4gPC9hbnRjYWxsPgotICAgIDxhbnRjYWxsIHRhcmdldD0idW56aXBzcmNqYXIiPiA8cGFyYW0gbmFtZT0iamFybmFtZSIgdmFsdWU9ImphdmFUZXN0cyIvPiA8L2FudGNhbGw+Ci0KLSAgICA8bWtkaXIgZGlyPSAiJHtwbHVnaW4uYnVpbGQuZGlyZWN0b3J5fS9jb21tb25ibGQiLz4KLSAgICA8amF2YWMgZmFpbG9uZXJyb3I9ImZhbHNlIiBkZXN0ZGlyPSIke3BsdWdpbi5idWlsZC5kaXJlY3Rvcnl9L2NvbW1vbmJsZCIgaW5jbHVkZUFudFJ1bnRpbWU9ImZhbHNlIj4KLSAgICAgICAgPHNyYyBwYXRoPSIke3BsdWdpbi5zcmMuZGlyZWN0b3J5fS9jb21tb25BcmNoaXZlVGVzdHMiLz4KLSAgICAgICAgPHNyYyBwYXRoPSIke3BsdWdpbi5zcmMuZGlyZWN0b3J5fS9tb2RlbFRlc3RzIi8+Ci0gICAgICAgIDxzcmMgcGF0aD0iJHtwbHVnaW4uc3JjLmRpcmVjdG9yeX0vamF2YVRlc3RzIi8+Ci0gICAgICAgIDxib290Y2xhc3NwYXRoIHBhdGg9IiR7Ym9vdGNsYXNzcGF0aH0iLz4KLSAgICAgICAgPGNsYXNzcGF0aCBwYXRoPSIke3BsdWdpbi5jbGFzc3BhdGh9Ii8+Ci0gICAgPC9qYXZhYz4KLQotCTxhbnRjYWxsIHRhcmdldD0iYnVpbGRqYXIiPgotCQk8cGFyYW0gbmFtZT0iamFybmFtZSIgdmFsdWU9ImNvbW1vbkFyY2hpdmVUZXN0cyIvPgotCQk8cGFyYW0gbmFtZT0iamFyY2xhc3NwYXRoIiB2YWx1ZT0iJHtwbHVnaW4uY2xhc3NwYXRofTske3BsdWdpbi5idWlsZC5kaXJlY3Rvcnl9L2NvbW1vbmJsZCIvPgotCTwvYW50Y2FsbD4KLQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkamFyIj4KLQkJPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSJtb2RlbFRlc3RzIi8+Ci0JCTxwYXJhbSBuYW1lPSJqYXJjbGFzc3BhdGgiIHZhbHVlPSIke3BsdWdpbi5jbGFzc3BhdGh9OyR7cGx1Z2luLmJ1aWxkLmRpcmVjdG9yeX0vY29tbW9uYmxkIi8+Ci0JPC9hbnRjYWxsPgotCTxhbnRjYWxsIHRhcmdldD0iYnVpbGRqYXIiPgotCQk8cGFyYW0gbmFtZT0iamFybmFtZSIgdmFsdWU9ImphdmFUZXN0cyIvPgotCQk8cGFyYW0gbmFtZT0iamFyY2xhc3NwYXRoIiB2YWx1ZT0iJHtwbHVnaW4uY2xhc3NwYXRofTske3BsdWdpbi5idWlsZC5kaXJlY3Rvcnl9L2NvbW1vbmJsZCIvPgotCTwvYW50Y2FsbD4KLQotPC90YXJnZXQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MTc4ZWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbgotdGVzdE91dHB1dApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC9hcHBsaWNhdGlvbi1jbGllbnQueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL2FwcGxpY2F0aW9uLWNsaWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OTZlMjMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL2FwcGxpY2F0aW9uLWNsaWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbi1jbGllbnQgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiBDbGllbnQgMS4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkIj4KLQotICAgPGFwcGxpY2F0aW9uLWNsaWVudCBpZD0iQXBwbGljYXRpb24tY2xpZW50X0lEIj4KLSAgICAgIDxpY29uPgotICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgIDwvaWNvbj4KLSAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8wPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICA8L2Vudi1lbnRyeT4KLSAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZWpiLXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMDwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzI8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8yPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzM8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzA8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8zPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPGNhbGxiYWNrLWhhbmRsZXI+amF2YS51dGlsLkhhc2hUYWJsZTwvY2FsbGJhY2staGFuZGxlcj4KLSAgIDwvYXBwbGljYXRpb24tY2xpZW50PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL2FwcGxpY2F0aW9uLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC9hcHBsaWNhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTc3NDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL2FwcGxpY2F0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYXBwbGljYXRpb24gUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjMvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvYXBwbGljYXRpb25fMV8zLmR0ZCI+Ci0KLSAgIDxhcHBsaWNhdGlvbiBpZD0iQXBwbGljYXRpb25fSUQiPgotICAgICAgPGljb24+Ci0gICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgPC9pY29uPgotICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICA8bW9kdWxlPgotICAgICAgICAgPGphdmE+dXJpXzA8L2phdmE+Ci0gICAgICAgICA8YWx0LWRkPmFsdEREXzA8L2FsdC1kZD4KLSAgICAgIDwvbW9kdWxlPgotICAgICAgPG1vZHVsZT4KLSAgICAgICAgIDxlamI+dXJpXzA8L2VqYj4KLSAgICAgICAgIDxhbHQtZGQ+YWx0RERfMDwvYWx0LWRkPgotICAgICAgPC9tb2R1bGU+Ci0gICAgICA8bW9kdWxlPgotICAgICAgICAgPHdlYj4KLSAgICAgICAgICAgIDx3ZWItdXJpPnVyaV8wPC93ZWItdXJpPgotICAgICAgICAgICAgPGNvbnRleHQtcm9vdD5jb250ZXh0Um9vdF8wPC9jb250ZXh0LXJvb3Q+Ci0gICAgICAgICA8L3dlYj4KLSAgICAgICAgIDxhbHQtZGQ+YWx0RERfMDwvYWx0LWRkPgotICAgICAgPC9tb2R1bGU+Ci0gICAgICA8bW9kdWxlPgotICAgICAgICAgPGNvbm5lY3Rvcj51cmlfMDwvY29ubmVjdG9yPgotICAgICAgICAgPGFsdC1kZD5hbHRERF8wPC9hbHQtZGQ+Ci0gICAgICA8L21vZHVsZT4KLSAgICAgIDxtb2R1bGU+Ci0gICAgICAgICA8amF2YT51cmlfMTwvamF2YT4KLSAgICAgICAgIDxhbHQtZGQ+YWx0RERfMTwvYWx0LWRkPgotICAgICAgPC9tb2R1bGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgIDwvYXBwbGljYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvZWpiLWphci54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvZWpiLWphci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOWQ2OGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL2VqYi1qYXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjg2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGVqYi1qYXIgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2VqYi1qYXJfMl8wLmR0ZCI+Ci0KLSAgIDxlamItamFyIGlkPSJlamItamFyX0lEIj4KLSAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgIDxlbnRlcnByaXNlLWJlYW5zPgotICAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8wPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzI8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzM8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8wPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5MaXN0PC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuTGlzdDwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkxpc3Q8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkxpc3Q8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV82PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV83PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV83PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV84PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzY8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV82PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua182PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzc8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV83PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua183PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV84PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfODwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV85PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV85PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV81PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV81PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzY8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV83PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzg8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV85PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV85PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua181PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua182PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua183PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua184PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua185PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHk+PC91c2UtY2FsbGVyLWlkZW50aXR5PgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV82PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV82PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV84PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV84PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV82PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV83PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxjbXAtdmVyc2lvbj4yLng8L2NtcC12ZXJzaW9uPgotICAgICAgICAgICAgPGFic3RyYWN0LXNjaGVtYS1uYW1lPmFic3RyYWN0U2NoZW1hTmFtZV8wPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzA8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzE8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzI8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzM8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzQ8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxwcmlta2V5LWZpZWxkPm5hbWVfMDwvcHJpbWtleS1maWVsZD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzEwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzExPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzExPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzEyPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTM8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTQ8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTA8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzEwPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzExPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzExPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzEyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xMjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzEzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xNDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTQ8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzExPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzEwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzExPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzEyPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzEzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPlJlbW90ZTwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMDwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18wPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPkxvY2FsPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8xPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5SZW1vdGU8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzI8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+TG9jYWw8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzM8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPlJlbW90ZTwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfNDwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgIDwvZW50aXR5PgotICAgICAgICAgPHNlc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8zPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5IYXNoVGFibGU8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxzZXNzaW9uLXR5cGU+U3RhdGVmdWw8L3Nlc3Npb24tdHlwZT4KLSAgICAgICAgICAgIDx0cmFuc2FjdGlvbi10eXBlPkJlYW48L3RyYW5zYWN0aW9uLXR5cGU+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzE1PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzE2PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTc8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTg8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xODwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xOTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTY8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTc8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE4PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE5PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5PjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L3Nlc3Npb24+Ci0gICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMjwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8yPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnNxbC5EYXRhPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnNxbC5EYXRhPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnNxbC5EYXRhPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEuc3FsLkRhdGE8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnNxbC5EYXRhPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEuc3FsLkRhdGE8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjA8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzIzPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzI0PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzIwPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yMDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzIxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yMjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjI8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjM8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjQ8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI0PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8zPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMzwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8zPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLkludGVnZXI8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI4PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzI3PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzI4PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjk8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjU8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI2PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzI3PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI4PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yODwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eT48L3VzZS1jYWxsZXItaWRlbnRpdHk+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8bWVzc2FnZS1kcml2ZW4+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV82PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHRyYW5zYWN0aW9uLXR5cGU+QmVhbjwvdHJhbnNhY3Rpb24tdHlwZT4KLSAgICAgICAgICAgIDxtZXNzYWdlLXNlbGVjdG9yPm1lc3NhZ2VTZWxlY3Rvcl8wPC9tZXNzYWdlLXNlbGVjdG9yPgotICAgICAgICAgICAgPGFja25vd2xlZGdlLW1vZGU+QXV0by1hY2tub3dsZWRnZTwvYWNrbm93bGVkZ2UtbW9kZT4KLSAgICAgICAgICAgIDxtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbj4KLSAgICAgICAgICAgICAgIDxkZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZTwvZGVzdGluYXRpb24tdHlwZT4KLSAgICAgICAgICAgICAgIDxzdWJzY3JpcHRpb24tZHVyYWJpbGl0eT5EdXJhYmxlPC9zdWJzY3JpcHRpb24tZHVyYWJpbGl0eT4KLSAgICAgICAgICAgIDwvbWVzc2FnZS1kcml2ZW4tZGVzdGluYXRpb24+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzMzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzMwPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzE8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzI8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zMDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzA8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzE8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzMyPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzMzPC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMxPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvbWVzc2FnZS1kcml2ZW4+Ci0gICAgICAgICA8c2Vzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzc8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkxpc3Q8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5MaXN0PC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuTGlzdDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnV0aWwuTGlzdDwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5MaXN0PC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8c2Vzc2lvbi10eXBlPlN0YXRlbGVzczwvc2Vzc2lvbi10eXBlPgotICAgICAgICAgICAgPHRyYW5zYWN0aW9uLXR5cGU+Q29udGFpbmVyPC90cmFuc2FjdGlvbi10eXBlPgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzU8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzY8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zODwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzM5PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM1PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM2PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzg8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzk8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzMwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzMxPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzMyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzMzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHk+PC91c2UtY2FsbGVyLWlkZW50aXR5PgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvc2Vzc2lvbj4KLSAgICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzQ8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl80PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzQ8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5TdHJpbmc8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEubGFuZy5TdHJpbmc8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLlN0cmluZzwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80MjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDA8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQzPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ0PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQwPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80MDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80MTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80MjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDI8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDM8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDQ8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ0PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80MTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80MzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV81PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fNTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl81PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80NzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80OTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80OTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ1PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ2PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDc8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDg8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80ODwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80OTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180OTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQ1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDY8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDc8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ4PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80OTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ5PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180MDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180MTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Mjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Mzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180NDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5PjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80ODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80OTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80OTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L2VudGl0eT4KLSAgICAgIDwvZW50ZXJwcmlzZS1iZWFucz4KLSAgICAgIDxyZWxhdGlvbnNoaXBzPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzA8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8wPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV84PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuQ29sbGVjdGlvbjwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotCQkJICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzk8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5Db2xsZWN0aW9uPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8xPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMzwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8yPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLQkJCSAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMzwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzY8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzc8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfNDwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzg8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzk8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0JCQkgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgPC9yZWxhdGlvbnNoaXBzPgotICAgICAgPGFzc2VtYmx5LWRlc2NyaXB0b3I+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1bmNoZWNrZWQvPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzM8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV81PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV83PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV84PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc183PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV85PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc185PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzExPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV81PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV82PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzc8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8zPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV80PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV81PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV82PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzc8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPk5vdFN1cHBvcnRlZDwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlN1cHBvcnRzPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzU8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzY8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz48L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180ODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzM8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzQ8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5SZXF1aXJlc05ldzwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV81PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV82PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzc8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181ODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPk1hbmRhdG9yeTwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8ZXhjbHVkZS1saXN0PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+PC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfNDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L2V4Y2x1ZGUtbGlzdD4KLSAgICAgIDwvYXNzZW1ibHktZGVzY3JpcHRvcj4KLSAgICAgIDxlamItY2xpZW50LWphcj5lamJDbGllbnRKYXJfMDwvZWpiLWNsaWVudC1qYXI+Ci0gICA8L2VqYi1qYXI+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvcmEueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL3JhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUyYTI2Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdE5vSUQvcmEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgY29ubmVjdG9yIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIENvbm5lY3RvciAxLjAvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvY29ubmVjdG9yXzFfMC5kdGQiPgotPGNvbm5lY3Rvcj4KLSAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgPGljb24+Ci0gICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICA8L2ljb24+Ci0gICAgPHZlbmRvci1uYW1lPnZlbmRvck5hbWVfMDwvdmVuZG9yLW5hbWU+Ci0gICAgPHNwZWMtdmVyc2lvbj4xLjA8L3NwZWMtdmVyc2lvbj4KLSAgICA8ZWlzLXR5cGU+ZWlzVHlwZV8wPC9laXMtdHlwZT4KLSAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPGxpY2Vuc2U+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxpY2Vuc2UtcmVxdWlyZWQ+dHJ1ZTwvbGljZW5zZS1yZXF1aXJlZD4KLSAgICA8L2xpY2Vuc2U+Ci0gICAgPHJlc291cmNlYWRhcHRlcj4KLSAgICAgICAgPG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz5tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc18wPC9tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0gICAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Y29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VfMDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz5jb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzc18wPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotICAgICAgICA8Y29ubmVjdGlvbi1pbnRlcmZhY2U+Y29ubmVjdGlvbkludGVyZmFjZV8wPC9jb25uZWN0aW9uLWludGVyZmFjZT4KLSAgICAgICAgPGNvbm5lY3Rpb24taW1wbC1jbGFzcz5jb25uZWN0aW9uSW1wbENsYXNzXzA8L2Nvbm5lY3Rpb24taW1wbC1jbGFzcz4KLSAgICAgICAgPHRyYW5zYWN0aW9uLXN1cHBvcnQ+Tm9UcmFuc2FjdGlvbjwvdHJhbnNhY3Rpb24tc3VwcG9ydD4KLSAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzA8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8wPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8Y29uZmlnLXByb3BlcnR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfMTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzE8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgIDxjb25maWctcHJvcGVydHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8yPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfMjwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzM8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8zPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8Y29uZmlnLXByb3BlcnR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfNDwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzQ8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbDwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPktlcmJ2NTwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+amF2YXgucmVzb3VyY2Uuc3BpLnNlY3VyaXR5LlBhc3N3b3JkQ3JlZGVudGlhbDwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQ8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWw8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5LZXJidjU8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmphdmF4LnJlc291cmNlLnNwaS5zZWN1cml0eS5QYXNzd29yZENyZWRlbnRpYWw8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5qYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgIDxyZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+dHJ1ZTwvcmVhdXRoZW50aWNhdGlvbi1zdXBwb3J0PgotICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8wPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fMTwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzI8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8zPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fNDwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgPC9yZXNvdXJjZWFkYXB0ZXI+Ci08L2Nvbm5lY3Rvcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0Tm9JRC93ZWIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNGVjNTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3ROb0lEL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+Ci08d2ViLWFwcCBpZD0iV2ViQXBwX0lEIj4KLSAgICA8aWNvbj4KLSAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgIDwvaWNvbj4KLSAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgPGRpc3RyaWJ1dGFibGUvPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI8L3BhcmFtLXZhbHVlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80PC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8ZmlsdGVyPgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZmlsdGVyLWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yNTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI1PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yNjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI3PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjc8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yODwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI4PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yOTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgPC9maWx0ZXI+Ci0gICAgPGZpbHRlcj4KLSAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8xPC9sYXJnZS1pY29uPgotICAgICAgICA8L2ljb24+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzE8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPmphdmEudXRpbC5MaXN0PC9maWx0ZXItY2xhc3M+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzMwPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzA8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzMxPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzI8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zMjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzMzPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzM8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM0PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICA8L2ZpbHRlcj4KLSAgICA8ZmlsdGVyPgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8yPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzI8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMjwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMjwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+amF2YS5zcWwuRGF0YTwvZmlsdGVyLWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zNTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM1PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zNjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM3PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzc8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zODwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM4PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zOTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgPC9maWx0ZXI+Ci0gICAgPGZpbHRlcj4KLSAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMzwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8zPC9sYXJnZS1pY29uPgotICAgICAgICA8L2ljb24+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzM8L2ZpbHRlci1uYW1lPgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzM8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZmlsdGVyLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9maWx0ZXItY2xhc3M+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQwPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDA8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80MTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQxPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDI8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80MjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQzPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDM8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80NDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ0PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICA8L2ZpbHRlcj4KLSAgICA8ZmlsdGVyPgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl80PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzQ8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfNDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvZmlsdGVyLWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80NTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ1PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80NjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ3PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDc8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80ODwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ4PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80OTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgPC9maWx0ZXI+Ci0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8wPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMDwvdXJsLXBhdHRlcm4+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzE8L2ZpbHRlci1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xPC91cmwtcGF0dGVybj4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgIDxmaWx0ZXItbWFwcGluZz4KLSAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMjwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI8L3VybC1wYXR0ZXJuPgotICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8zPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzwvdXJsLXBhdHRlcm4+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzQ8L2ZpbHRlci1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80PC91cmwtcGF0dGVybj4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgIDxsaXN0ZW5lcj4KLSAgICAgICAgPGxpc3RlbmVyLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+amF2YS51dGlsLkxpc3Q8L2xpc3RlbmVyLWNsYXNzPgotICAgIDwvbGlzdGVuZXI+Ci0gICAgPGxpc3RlbmVyPgotICAgICAgICA8bGlzdGVuZXItY2xhc3M+amF2YS5zcWwuRGF0YTwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgPC9saXN0ZW5lcj4KLSAgICA8bGlzdGVuZXI+Ci0gICAgICAgIDxsaXN0ZW5lci1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9saXN0ZW5lci1jbGFzcz4KLSAgICA8L2xpc3RlbmVyPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8wPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxqc3AtZmlsZT5qc3BGaWxlXzA8L2pzcC1maWxlPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8wPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MDwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvcnVuLWFzPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzA8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xPC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgPC9zZXJ2bGV0PgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8xPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmNsYXNzTmFtZV8wPC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV81PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzY8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzc8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV83PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV84PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfODwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfOTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzk8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvcnVuLWFzPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzU8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua182PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV83PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNzwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzg8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua185PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgPC9zZXJ2bGV0PgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8yPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzI8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8yPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMjwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxqc3AtZmlsZT5qc3BGaWxlXzE8L2pzcC1maWxlPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xMDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzEwPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xMTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzEyPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xMzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzEzPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xNDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MjwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvcnVuLWFzPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTA8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzExPC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMjwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTM8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE0PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgPC9zZXJ2bGV0PgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8zPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzM8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8zPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxzZXJ2bGV0LWNsYXNzPmNsYXNzTmFtZV8xPC9zZXJ2bGV0LWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xNTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE1PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xNjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE3PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTc8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xODwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE4PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xOTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MzwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvcnVuLWFzPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTU8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE2PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNzwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTg8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE5PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgPC9zZXJ2bGV0PgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl80PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzQ8L2xhcmdlLWljb24+Ci0gICAgICAgIDwvaWNvbj4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV80PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxqc3AtZmlsZT5qc3BGaWxlXzI8L2pzcC1maWxlPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yMDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzIwPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yMTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxpbml0LXBhcmFtPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzIyPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yMzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzIzPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yNDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+NDwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvcnVuLWFzPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjA8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIxPC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMjwvcm9sZS1saW5rPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjM8L3JvbGUtbGluaz4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI0PC9yb2xlLWxpbms+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgPC9zZXJ2bGV0PgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMDwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8wPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzE8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8yPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI8L3VybC1wYXR0ZXJuPgotICAgIDwvc2VydmxldC1tYXBwaW5nPgotICAgIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMzwvc2VydmxldC1uYW1lPgotICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zPC91cmwtcGF0dGVybj4KLSAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICA8c2VydmxldC1tYXBwaW5nPgotICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0gICAgPHNlc3Npb24tY29uZmlnPgotICAgICAgICA8c2Vzc2lvbi10aW1lb3V0PjA8L3Nlc3Npb24tdGltZW91dD4KLSAgICA8L3Nlc3Npb24tY29uZmlnPgotICAgIDxtaW1lLW1hcHBpbmc+Ci0gICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzA8L2V4dGVuc2lvbj4KLSAgICAgICAgPG1pbWUtdHlwZT5taW1lVHlwZV8wPC9taW1lLXR5cGU+Ci0gICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgPG1pbWUtbWFwcGluZz4KLSAgICAgICAgPGV4dGVuc2lvbj5leHRlbnNpb25fMTwvZXh0ZW5zaW9uPgotICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzE8L21pbWUtdHlwZT4KLSAgICA8L21pbWUtbWFwcGluZz4KLSAgICA8bWltZS1tYXBwaW5nPgotICAgICAgICA8ZXh0ZW5zaW9uPmV4dGVuc2lvbl8yPC9leHRlbnNpb24+Ci0gICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfMjwvbWltZS10eXBlPgotICAgIDwvbWltZS1tYXBwaW5nPgotICAgIDxtaW1lLW1hcHBpbmc+Ci0gICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzM8L2V4dGVuc2lvbj4KLSAgICAgICAgPG1pbWUtdHlwZT5taW1lVHlwZV8zPC9taW1lLXR5cGU+Ci0gICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgPG1pbWUtbWFwcGluZz4KLSAgICAgICAgPGV4dGVuc2lvbj5leHRlbnNpb25fNDwvZXh0ZW5zaW9uPgotICAgICAgICA8bWltZS10eXBlPm1pbWVUeXBlXzQ8L21pbWUtdHlwZT4KLSAgICA8L21pbWUtbWFwcGluZz4KLSAgICA8d2VsY29tZS1maWxlLWxpc3Q+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+d2VsY29tZUZpbGVfMDwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPndlbGNvbWVGaWxlXzE8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgPHdlbGNvbWUtZmlsZT53ZWxjb21lRmlsZV8yPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgIDx3ZWxjb21lLWZpbGU+d2VsY29tZUZpbGVfMzwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPndlbGNvbWVGaWxlXzQ8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotICAgIDxlcnJvci1wYWdlPgotICAgICAgICA8ZXhjZXB0aW9uLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvZXhjZXB0aW9uLXR5cGU+Ci0gICAgICAgIDxsb2NhdGlvbj5sb2NhdGlvbl8wPC9sb2NhdGlvbj4KLSAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgPGVycm9yLXBhZ2U+Ci0gICAgICAgIDxlcnJvci1jb2RlPmVycm9yQ29kZV8wPC9lcnJvci1jb2RlPgotICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMDwvbG9jYXRpb24+Ci0gICAgPC9lcnJvci1wYWdlPgotICAgIDxlcnJvci1wYWdlPgotICAgICAgICA8ZXhjZXB0aW9uLXR5cGU+amF2YS51dGlsLkxpc3Q8L2V4Y2VwdGlvbi10eXBlPgotICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMTwvbG9jYXRpb24+Ci0gICAgPC9lcnJvci1wYWdlPgotICAgIDxlcnJvci1wYWdlPgotICAgICAgICA8ZXJyb3ItY29kZT5lcnJvckNvZGVfMTwvZXJyb3ItY29kZT4KLSAgICAgICAgPGxvY2F0aW9uPmxvY2F0aW9uXzE8L2xvY2F0aW9uPgotICAgIDwvZXJyb3ItcGFnZT4KLSAgICA8ZXJyb3ItcGFnZT4KLSAgICAgICAgPGV4Y2VwdGlvbi10eXBlPmphdmEuc3FsLkRhdGE8L2V4Y2VwdGlvbi10eXBlPgotICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMjwvbG9jYXRpb24+Ci0gICAgPC9lcnJvci1wYWdlPgotICAgIDx0YWdsaWI+Ci0gICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV8wPC90YWdsaWItdXJpPgotICAgICAgICA8dGFnbGliLWxvY2F0aW9uPnRhZ2xpYkxvY2F0aW9uXzA8L3RhZ2xpYi1sb2NhdGlvbj4KLSAgICA8L3RhZ2xpYj4KLSAgICA8dGFnbGliPgotICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfMTwvdGFnbGliLXVyaT4KLSAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl8xPC90YWdsaWItbG9jYXRpb24+Ci0gICAgPC90YWdsaWI+Ci0gICAgPHRhZ2xpYj4KLSAgICAgICAgPHRhZ2xpYi11cmk+dGFnbGliVVJJXzI8L3RhZ2xpYi11cmk+Ci0gICAgICAgIDx0YWdsaWItbG9jYXRpb24+dGFnbGliTG9jYXRpb25fMjwvdGFnbGliLWxvY2F0aW9uPgotICAgIDwvdGFnbGliPgotICAgIDx0YWdsaWI+Ci0gICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV8zPC90YWdsaWItdXJpPgotICAgICAgICA8dGFnbGliLWxvY2F0aW9uPnRhZ2xpYkxvY2F0aW9uXzM8L3RhZ2xpYi1sb2NhdGlvbj4KLSAgICA8L3RhZ2xpYj4KLSAgICA8dGFnbGliPgotICAgICAgICA8dGFnbGliLXVyaT50YWdsaWJVUklfNDwvdGFnbGliLXVyaT4KLSAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl80PC90YWdsaWItbG9jYXRpb24+Ci0gICAgPC90YWdsaWI+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMDwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzE8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMjwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzM8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfNDwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8c2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8wPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzI8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMzwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzQ8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPGF1dGgtY29uc3RyYWludD4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc180PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5OT05FPC90cmFuc3BvcnQtZ3VhcmFudGVlPgotICAgICAgICA8L3VzZXItZGF0YS1jb25zdHJhaW50PgotICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICA8c2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfNTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfNjwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV83PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzM1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzM2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzM3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzM4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzM5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV84PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzk8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgIDxhdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc183PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfOTwvcm9sZS1uYW1lPgotICAgICAgICA8L2F1dGgtY29uc3RyYWludD4KLSAgICAgICAgPHVzZXItZGF0YS1jb25zdHJhaW50PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHRyYW5zcG9ydC1ndWFyYW50ZWU+SU5URUdSQUw8L3RyYW5zcG9ydC1ndWFyYW50ZWU+Ci0gICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgotICAgIDxzZWN1cml0eS1jb25zdHJhaW50PgotICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzI8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xMDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xMTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xMjwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNjQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzEzPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xNDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8YXV0aC1jb25zdHJhaW50PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xNDwvcm9sZS1uYW1lPgotICAgICAgICA8L2F1dGgtY29uc3RyYWludD4KLSAgICAgICAgPHVzZXItZGF0YS1jb25zdHJhaW50PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHRyYW5zcG9ydC1ndWFyYW50ZWU+Q09ORklERU5USUFMPC90cmFuc3BvcnQtZ3VhcmFudGVlPgotICAgICAgICA8L3VzZXItZGF0YS1jb25zdHJhaW50PgotICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICA8c2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8zPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTU8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzc1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzc2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzc3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzc4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzc5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE2PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xNzwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xODwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xOTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fOTk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8YXV0aC1jb25zdHJhaW50PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18xOTwvcm9sZS1uYW1lPgotICAgICAgICA8L2F1dGgtY29uc3RyYWludD4KLSAgICAgICAgPHVzZXItZGF0YS1jb25zdHJhaW50PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHRyYW5zcG9ydC1ndWFyYW50ZWU+Tk9ORTwvdHJhbnNwb3J0LWd1YXJhbnRlZT4KLSAgICAgICAgPC91c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzIwPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTAxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzIxPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8yMjwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTEwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTEzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8yMzwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8yNDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTIwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMjI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTIzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICA8YXV0aC1jb25zdHJhaW50PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18yMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18yMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18yMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18yMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18yNDwvcm9sZS1uYW1lPgotICAgICAgICA8L2F1dGgtY29uc3RyYWludD4KLSAgICAgICAgPHVzZXItZGF0YS1jb25zdHJhaW50PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHRyYW5zcG9ydC1ndWFyYW50ZWU+SU5URUdSQUw8L3RyYW5zcG9ydC1ndWFyYW50ZWU+Ci0gICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgotICAgIDxsb2dpbi1jb25maWc+Ci0gICAgICAgIDxhdXRoLW1ldGhvZD5CQVNJQzwvYXV0aC1tZXRob2Q+Ci0gICAgICAgIDxyZWFsbS1uYW1lPnJlYWxtTmFtZV8wPC9yZWFsbS1uYW1lPgotICAgICAgICA8Zm9ybS1sb2dpbi1jb25maWc+Ci0gICAgICAgICAgICA8Zm9ybS1sb2dpbi1wYWdlPmZvcm1Mb2dpblBhZ2VfMDwvZm9ybS1sb2dpbi1wYWdlPgotICAgICAgICAgICAgPGZvcm0tZXJyb3ItcGFnZT5mb3JtRXJyb3JQYWdlXzA8L2Zvcm0tZXJyb3ItcGFnZT4KLSAgICAgICAgPC9mb3JtLWxvZ2luLWNvbmZpZz4KLSAgICA8L2xvZ2luLWNvbmZpZz4KLSAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgPC9zZWN1cml0eS1yb2xlPgotICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzM8L3JvbGUtbmFtZT4KLSAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgPC9zZWN1cml0eS1yb2xlPgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV8wPC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV8wPC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzE8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzE8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzI8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzI8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMzwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfNDwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMDwvbG9jYWwtaG9tZT4KLSAgICAgICAgPGxvY2FsPnJlbW90ZV8wPC9sb2NhbD4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgPC9lamItbG9jYWwtcmVmPgotICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgPGxvY2FsPnJlbW90ZV8xPC9sb2NhbD4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgPC9lamItbG9jYWwtcmVmPgotICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI8L2xvY2FsLWhvbWU+Ci0gICAgICAgIDxsb2NhbD5yZW1vdGVfMjwvbG9jYWw+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgIDxsb2NhbD5yZW1vdGVfMzwvbG9jYWw+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80PC9sb2NhbC1ob21lPgotICAgICAgICA8bG9jYWw+cmVtb3RlXzQ8L2xvY2FsPgotICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICA8L2VqYi1sb2NhbC1yZWY+Ci08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvYXBwbGljYXRpb24tY2xpZW50LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9hcHBsaWNhdGlvbi1jbGllbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjU5NjBjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9hcHBsaWNhdGlvbi1jbGllbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYXBwbGljYXRpb24tY2xpZW50IFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEoyRUUgQXBwbGljYXRpb24gQ2xpZW50IDEuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbi1jbGllbnRfMV8zLmR0ZCI+Ci0KLSAgIDxhcHBsaWNhdGlvbi1jbGllbnQgaWQ9IkFwcGxpY2F0aW9uLWNsaWVudF9JRCI+Ci0gICAgICA8aWNvbj4KLSAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICA8L2ljb24+Ci0gICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3NjMyMzkiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc2MzI0MCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc2MzI0MSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc2MzI1OSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5NzYzMjYwIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3NjMyNzkiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV8wPC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMDwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3NjMyODAiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzE8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8xPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc2MzI4MSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzI8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8yPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc2MzI4MiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMzwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5NzYzMjgzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfNDwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc2MzI5OSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfMDwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5NzYzMzAwIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5NzYzMzAxIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8yPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3NjMzMDIiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3NjMzMDMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3NjMzMTkiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3NjMzNDkiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5NzYzMzUwIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5NzYzMzUxIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc2MzM1MiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8Y2FsbGJhY2staGFuZGxlcj5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jYWxsYmFjay1oYW5kbGVyPgotICAgPC9hcHBsaWNhdGlvbi1jbGllbnQ+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvYXBwbGljYXRpb24ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2FwcGxpY2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFmNDZiZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvYXBwbGljYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBhcHBsaWNhdGlvbiBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIDEuMy8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9hcHBsaWNhdGlvbl8xXzMuZHRkIj4KLQotICAgPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCI+Ci0gICAgICA8aWNvbj4KLSAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICA8L2ljb24+Ci0gICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxtb2R1bGUgaWQ9IkphdmFDbGllbnRNb2R1bGVfMTA1MTYzOTc3ODE2MCI+Ci0gICAgICAgICA8amF2YT51cmlfMDwvamF2YT4KLSAgICAgICAgIDxhbHQtZGQ+YWx0RERfMDwvYWx0LWRkPgotICAgICAgPC9tb2R1bGU+Ci0gICAgICA8bW9kdWxlIGlkPSJFamJNb2R1bGVfMTA1MTYzOTc3ODE2MCI+Ci0gICAgICAgICA8ZWpiPnVyaV8xPC9lamI+Ci0gICAgICAgICA8YWx0LWRkPmFsdEREXzE8L2FsdC1kZD4KLSAgICAgIDwvbW9kdWxlPgotICAgICAgPG1vZHVsZSBpZD0iV2ViTW9kdWxlXzEwNTE2Mzk3NzgxNjAiPgotICAgICAgICAgPHdlYj4KLSAgICAgICAgICAgIDx3ZWItdXJpPnVyaV8yPC93ZWItdXJpPgotICAgICAgICAgICAgPGNvbnRleHQtcm9vdD5jb250ZXh0Um9vdF8wPC9jb250ZXh0LXJvb3Q+Ci0gICAgICAgICA8L3dlYj4KLSAgICAgICAgIDxhbHQtZGQ+YWx0RERfMjwvYWx0LWRkPgotICAgICAgPC9tb2R1bGU+Ci0gICAgICA8bW9kdWxlIGlkPSJDb25uZWN0b3JNb2R1bGVfMTA1MTYzOTc3ODE2MCI+Ci0gICAgICAgICA8Y29ubmVjdG9yPnVyaV8zPC9jb25uZWN0b3I+Ci0gICAgICAgICA8YWx0LWRkPmFsdEREXzM8L2FsdC1kZD4KLSAgICAgIDwvbW9kdWxlPgotICAgICAgPG1vZHVsZSBpZD0iSmF2YUNsaWVudE1vZHVsZV8xMDUxNjM5Nzc4MTYxIj4KLSAgICAgICAgIDxqYXZhPnVyaV80PC9qYXZhPgotICAgICAgICAgPGFsdC1kZD5hbHRERF80PC9hbHQtZGQ+Ci0gICAgICA8L21vZHVsZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTYzOTc3ODE3MCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTYzOTc3ODE5MCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTYzOTc3ODE5MSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTYzOTc3ODE5MiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTYzOTc3ODE5MyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgIDwvYXBwbGljYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphci54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NzVlYWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2VqYi1qYXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGVqYi1qYXIgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2VqYi1qYXJfMl8wLmR0ZCI+Ci0KLSAgIDxlamItamFyIGlkPSJlamItamFyX0lEIj4KLSAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgIDxlbnRlcnByaXNlLWJlYW5zPgotICAgICAgICAgPGVudGl0eSBpZD0iRW50aXR5XzEwNTE2Mzk3ODg2NDUiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuTGlzdDwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5zcWwuRGF0YTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLlN0cmluZzwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg2OTUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODcwNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODcwNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODcwNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4NzE1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg3MjUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8wPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg3MjYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzE8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODcyNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzI8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODcyOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4NzI5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg3NDUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzU8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODc0NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzY8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODc0NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua183PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4NzQ4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV84PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfODwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua184PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4NzQ5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV85PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV85PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODc3NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4Nzc2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg3NzciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODc3OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4Nzc5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxydW4tYXMgaWQ9IlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfMTA1MTYzOTc4ODc3NSI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg3ODUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODc4NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODc4NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4Nzg4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4Nzk1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4ODA1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8wPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODgwNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODgwNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODgwOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg4MDkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgICA8ZW50aXR5IGlkPSJFbnRpdHlfMTA1MTYzOTc4ODgwNSI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEuc3FsLkRhdGE8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEubGFuZy5JbnRlZ2VyPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODA1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODgxNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV82PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODgxNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV83PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV83PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg4MTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODgxOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV85PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg4MTUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzEwPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODgxNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzExPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMTwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzExPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg4MTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzEyPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODgxOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMzwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzEzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg4MTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzE0PC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4ODE1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODgxNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE2PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4ODE3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODgxOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE4PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4ODE5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4ODI1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV81PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg4MjYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua182PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODgyNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4ODI4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV84PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg4MjkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua185PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkgaWQ9IlVzZUNhbGxlcklkZW50aXR5XzEwNTE2Mzk3ODg4MjUiPjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4ODI1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV81PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV81PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4ODI2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV82PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV82PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg4MjciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg4MjgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODgyOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg4MjUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg4MjYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg4MjciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4ODI4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV84PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4ODI5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV85PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgIDxlbnRpdHkgaWQ9IkNvbnRhaW5lck1hbmFnZWRFbnRpdHlfMTA1MTYzOTc4ODgyNSI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzI8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8yPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzI8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5JbnRlZ2VyPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLmxhbmcuU3RyaW5nPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5MaXN0PC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5zcWwuRGF0YTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEuc3FsLkRhdGE8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8Y21wLXZlcnNpb24+Mi4wPC9jbXAtdmVyc2lvbj4KLSAgICAgICAgICAgIDxhYnN0cmFjdC1zY2hlbWEtbmFtZT5hYnN0cmFjdFNjaGVtYU5hbWVfMDwvYWJzdHJhY3Qtc2NoZW1hLW5hbWU+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkIGlkPSJDTVBBdHRyaWJ1dGVfMTA1MTYzOTc4ODg0NSI+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzM8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQgaWQ9IkNNUEF0dHJpYnV0ZV8xMDUxNjM5Nzg4ODQ2Ij4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfNDwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZCBpZD0iQ01QQXR0cmlidXRlXzEwNTE2Mzk3ODg4NDciPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+bmFtZV81PC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkIGlkPSJDTVBBdHRyaWJ1dGVfMTA1MTYzOTc4ODg0OCI+Ci0gICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzY8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQgaWQ9IkNNUEF0dHJpYnV0ZV8xMDUxNjM5Nzg4ODQ5Ij4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfNzwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODg4NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODg4NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODg4NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODg4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4ODg5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4ODg1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg4ODYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjE8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4ODg3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg4ODgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjM8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4ODg5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODg5NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjU8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg4OTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI2PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yNjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODg5NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjc8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg4OTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI4PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yODwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODg5OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjk8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODg5NSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4ODk2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg4OTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODg5OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4ODk5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxydW4tYXMgaWQ9IlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfMTA1MTYzOTc4ODg5NSI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg4OTUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODg5NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzExPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODg5NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzEyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4ODk4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzEzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4OTA1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTA1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5MDYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5MDciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODkwOCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzEzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODkwOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxxdWVyeSBpZD0iUXVlcnlfMTA1MTYzOTc4ODkzNiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kIGlkPSJRdWVyeU1ldGhvZF8xMDUxNjM5Nzg4OTM2Ij4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICA8cmVzdWx0LXR5cGUtbWFwcGluZz5SZW1vdGU8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzA8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnkgaWQ9IlF1ZXJ5XzEwNTE2Mzk3ODg5MzciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZCBpZD0iUXVlcnlNZXRob2RfMTA1MTYzOTc4ODkzNyI+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81NjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+TG9jYWw8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzE8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnkgaWQ9IlF1ZXJ5XzEwNTE2Mzk3ODg5MzgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZCBpZD0iUXVlcnlNZXRob2RfMTA1MTYzOTc4ODkzOCI+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81NzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+UmVtb3RlPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8yPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5IGlkPSJRdWVyeV8xMDUxNjM5Nzg4OTM5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2QgaWQ9IlF1ZXJ5TWV0aG9kXzEwNTE2Mzk3ODg5MzkiPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzcwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzcxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPkxvY2FsPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8zPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5IGlkPSJRdWVyeV8xMDUxNjM5Nzg4OTQwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2QgaWQ9IlF1ZXJ5TWV0aG9kXzEwNTE2Mzk3ODg5NDAiPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPlJlbW90ZTwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfNDwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgIDwvZW50aXR5PgotICAgICAgICAgPHNlc3Npb24gaWQ9IlNlc3Npb25fMTA1MTYzOTc4ODk0NiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzM8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8zPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzM8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5TdHJpbmc8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5IYXNoVGFibGU8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5MaXN0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEuc3FsLkRhdGE8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHNlc3Npb24tdHlwZT5TdGF0ZWZ1bDwvc2Vzc2lvbi10eXBlPgotICAgICAgICAgICAgPHRyYW5zYWN0aW9uLXR5cGU+QmVhbjwvdHJhbnNhY3Rpb24tdHlwZT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg5NDYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE1PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg5NDciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRmxvYXQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjM5Nzg4OTQ4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkNoYXJhY3RlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg5NDkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk1MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4OTQ2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg5NDciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzE8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4OTQ4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMjwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2Mzk3ODg5NDkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzM8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4OTUwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNDwvaG9tZT4KLSAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODk0NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzU8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg5NDciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM2PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zNjwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODk0OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzc8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg5NDkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM4PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zODwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTYzOTc4ODk1MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzk8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODk0NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4OTQ3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg5NDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODk0OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4OTUwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xOTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5IGlkPSJVc2VDYWxsZXJJZGVudGl0eV8xMDUxNjM5Nzg4OTQ2Ij48L3VzZS1jYWxsZXItaWRlbnRpdHk+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODk0NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODk0NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4OTQ4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4OTQ5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg5NTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTU2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTU3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5NTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5NTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODk2MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgIDwvc2Vzc2lvbj4KLSAgICAgICAgIDxlbnRpdHkgaWQ9IkVudGl0eV8xMDUxNjM5Nzg4OTU2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzQ8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLlN0cmluZzwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS51dGlsLkxpc3Q8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5zcWwuRGF0YTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg5NTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIwPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg5NTciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzIxPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk1OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTYzOTc4ODk1OSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2Mzk3ODg5NjAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODk1NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDA8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4OTU3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQxPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODk1OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDI8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MjwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjM5Nzg4OTU5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICA8aG9tZT5ob21lXzQzPC9ob21lPgotICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTYzOTc4ODk2MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDQ8L2hvbWU+Ci0gICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NDwvcmVtb3RlPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg5NTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ1PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4OTU3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDY8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg5NTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ3PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjM5Nzg4OTU5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80ODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDg8L2xvY2FsPgotICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2Mzk3ODg5NjAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80OTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ5PC9sb2NhbD4KLSAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg5NTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODk1NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjM5Nzg4OTU4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2Mzk3ODg5NTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTYzOTc4ODk2MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cnVuLWFzIGlkPSJSdW5Bc1NwZWNpZmllZElkZW50aXR5XzEwNTE2Mzk3ODg5NTYiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjM5Nzg4OTU3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg5NTgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2Mzk3ODg5NTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODk2MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTYzOTc4ODk2MSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODk2MSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTYzOTc4ODk2MiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTYzIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjM5Nzg4OTY0Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2Mzk3ODg5NjUiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICA8L2VudGl0eT4KLSAgICAgIDwvZW50ZXJwcmlzZS1iZWFucz4KLSAgICAgIDxyZWxhdGlvbnNoaXBzIGlkPSJSZWxhdGlvbnNoaXBzXzEwNTE2Mzk3ODg5NTYiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWxhdGlvbiBpZD0iRUpCUmVsYXRpb25fMTA1MTYzOTc4ODk5NiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8wPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUgaWQ9IkVKQlJlbGF0aW9uc2hpcFJvbGVfMTA1MTYzOTc4ODk5NiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlPjwvY2FzY2FkZS1kZWxldGU+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGlkPSJSb2xlU291cmNlXzEwNTE2Mzk3ODg5OTYiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQgaWQ9IkNNUkZpZWxkXzEwNTE2Mzk3ODg5OTYiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMTA8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUgaWQ9IkVKQlJlbGF0aW9uc2hpcFJvbGVfMTA1MTYzOTc4ODk5NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgaWQ9IlJvbGVTb3VyY2VfMTA1MTYzOTc4ODk5NyI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZCBpZD0iQ01SRmllbGRfMTA1MTYzOTc4ODk5NyI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8xMTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgICA8ZWpiLXJlbGF0aW9uIGlkPSJFSkJSZWxhdGlvbl8xMDUxNjM5Nzg4OTk3Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzE8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBpZD0iRUpCUmVsYXRpb25zaGlwUm9sZV8xMDUxNjM5Nzg4OTk4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV81PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBpZD0iUm9sZVNvdXJjZV8xMDUxNjM5Nzg4OTk4Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICA8Y21yLWZpZWxkIGlkPSJDTVJGaWVsZF8xMDUxNjM5Nzg4OTk4Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzE1PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGlkPSJFSkJSZWxhdGlvbnNoaXBSb2xlXzEwNTE2Mzk3ODg5OTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzY8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZT48L2Nhc2NhZGUtZGVsZXRlPgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBpZD0iUm9sZVNvdXJjZV8xMDUxNjM5Nzg4OTk5Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICA8Y21yLWZpZWxkIGlkPSJDTVJGaWVsZF8xMDUxNjM5Nzg4OTk5Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzE2PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgIDxlamItcmVsYXRpb24gaWQ9IkVKQlJlbGF0aW9uXzEwNTE2Mzk3ODkwMDYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMjwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGlkPSJFSkJSZWxhdGlvbnNoaXBSb2xlXzEwNTE2Mzk3ODkwMDYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xMDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlPjwvY2FzY2FkZS1kZWxldGU+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGlkPSJSb2xlU291cmNlXzEwNTE2Mzk3ODkwMDYiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICA8Y21yLWZpZWxkIGlkPSJDTVJGaWVsZF8xMDUxNjM5Nzg5MDA2Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8yMDwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBpZD0iRUpCUmVsYXRpb25zaGlwUm9sZV8xMDUxNjM5Nzg5MDA3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMTE8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGlkPSJSb2xlU291cmNlXzEwNTE2Mzk3ODkwMDciPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICA8Y21yLWZpZWxkIGlkPSJDTVJGaWVsZF8xMDUxNjM5Nzg5MDA3Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8yMTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgICA8ZWpiLXJlbGF0aW9uIGlkPSJFSkJSZWxhdGlvbl8xMDUxNjM5Nzg5MDA3Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzM8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBpZD0iRUpCUmVsYXRpb25zaGlwUm9sZV8xMDUxNjM5Nzg5MDA4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMTU8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlIGlkPSJSb2xlU291cmNlXzEwNTE2Mzk3ODkwMDgiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICA8Y21yLWZpZWxkIGlkPSJDTVJGaWVsZF8xMDUxNjM5Nzg5MDA4Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8yNTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZSBpZD0iRUpCUmVsYXRpb25zaGlwUm9sZV8xMDUxNjM5Nzg5MDA5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMTY8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZT48L2Nhc2NhZGUtZGVsZXRlPgotICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZSBpZD0iUm9sZVNvdXJjZV8xMDUxNjM5Nzg5MDA5Ij4KLSAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgPGNtci1maWVsZCBpZD0iQ01SRmllbGRfMTA1MTYzOTc4OTAwOSI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMjY8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICAgPGVqYi1yZWxhdGlvbiBpZD0iRUpCUmVsYXRpb25fMTA1MTYzOTc4OTAwOCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV80PC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUgaWQ9IkVKQlJlbGF0aW9uc2hpcFJvbGVfMTA1MTYzOTc4OTAxMCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzIwPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgaWQ9IlJvbGVTb3VyY2VfMTA1MTYzOTc4OTAxMCI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQgaWQ9IkNNUkZpZWxkXzEwNTE2Mzk3ODkwMTAiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzMwPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlIGlkPSJFSkJSZWxhdGlvbnNoaXBSb2xlXzEwNTE2Mzk3ODkwMTEiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8yMTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2UgaWQ9IlJvbGVTb3VyY2VfMTA1MTYzOTc4OTAxMSI+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgIDxjbXItZmllbGQgaWQ9IkNNUkZpZWxkXzEwNTE2Mzk3ODkwMTEiPgotICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzMxPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgIDwvcmVsYXRpb25zaGlwcz4KLSAgICAgIDxhc3NlbWJseS1kZXNjcmlwdG9yIGlkPSJBc3NlbWJseURlc2NyaXB0b3JfMTA1MTYzOTc4OTAxNiI+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2Mzk3ODkwMzYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2Mzk3ODkwMzciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2Mzk3ODkwNDYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2Mzk3ODkwNDciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZSBpZD0iU2VjdXJpdHlSb2xlXzEwNTE2Mzk3ODkwNDgiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24gaWQ9Ik1ldGhvZFBlcm1pc3Npb25fMTA1MTYzOTc4OTA1NiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMDYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8wPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTA3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMDgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18wPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEwOSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTEwIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uIGlkPSJNZXRob2RQZXJtaXNzaW9uXzEwNTE2Mzk3ODkxMTYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTE2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTExNyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTE4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc184PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEyMCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uIGlkPSJNZXRob2RQZXJtaXNzaW9uXzEwNTE2Mzk3ODkxMTciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTIxIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTIyIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEyMyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTI0Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTI1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24gaWQ9Ik1ldGhvZFBlcm1pc3Npb25fMTA1MTYzOTc4OTEyNiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMjYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMjciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTI4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMjkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMzAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgIDxtZXRob2QtcGVybWlzc2lvbiBpZD0iTWV0aG9kUGVybWlzc2lvbl8xMDUxNjM5Nzg5MTI3Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEzMSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEzMiI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzIxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxMzMiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEzNCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTEzNSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbiBpZD0iTWV0aG9kVHJhbnNhY3Rpb25fMTA1MTYzOTc4OTE0NiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNDYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNDciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTQ4Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNDkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNTAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5Ob3RTdXBwb3J0ZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbiBpZD0iTWV0aG9kVHJhbnNhY3Rpb25fMTA1MTYzOTc4OTE0NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNTEiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNTIiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTUzIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNTQiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNTYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5TdXBwb3J0czwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uIGlkPSJNZXRob2RUcmFuc2FjdGlvbl8xMDUxNjM5Nzg5MTU2Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE1NyI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE1OCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNTkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE2MCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfODwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzg8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE2MSI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWxIb21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVkPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24gaWQ9Ik1ldGhvZFRyYW5zYWN0aW9uXzEwNTE2Mzk3ODkxNTciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTYyIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTYzIj4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2QgaWQ9Ik1ldGhvZEVsZW1lbnRfMTA1MTYzOTc4OTE2NCI+Ci0gICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMjwvZWpiLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTY1Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTY2Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV85PC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDx0cmFucy1hdHRyaWJ1dGU+UmVxdWlyZXNOZXc8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbiBpZD0iTWV0aG9kVHJhbnNhY3Rpb25fMTA1MTYzOTc4OTE1OCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNjciPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNjgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTY5Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNzAiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNzEiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80OTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5NYW5kYXRvcnk8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgPGV4Y2x1ZGUtbGlzdCBpZD0iRXhjbHVkZUxpc3RfMTA1MTYzOTc4OTE2NiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNzIiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNzYiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81MTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZCBpZD0iTWV0aG9kRWxlbWVudF8xMDUxNjM5Nzg5MTc3Ij4KLSAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8yPC9lamItbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNzgiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzUzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzg8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kIGlkPSJNZXRob2RFbGVtZW50XzEwNTE2Mzk3ODkxNzkiPgotICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzk8L2VqYi1uYW1lPgotICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81NDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgPC9leGNsdWRlLWxpc3Q+Ci0gICAgICA8L2Fzc2VtYmx5LWRlc2NyaXB0b3I+Ci0gICAgICA8ZWpiLWNsaWVudC1qYXI+ZWpiQ2xpZW50SmFyXzA8L2VqYi1jbGllbnQtamFyPgotICAgPC9lamItamFyPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2VqYi1qYXIxLTEueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2VqYi1qYXIxLTEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzBkMmQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyMS0xLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4MzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBlamItamFyIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDEuMS8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy9lamItamFyXzFfMS5kdGQiPgotPGVqYi1qYXIgaWQ9ImVqYi1qYXJfSUQiPgotICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICA8ZW50ZXJwcmlzZS1iZWFucz4KLSAgICAgICAgPGVudGl0eSBpZD0iTXlDTVAiPgotICAgICAgICAgICAgPGVqYi1uYW1lPk15Q01QPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmNvbS5pYm0udGVzdC5lamIuTXlDTVBIb21lPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5jb20uaWJtLnRlc3QuZWpiLk15Q01QPC9yZW1vdGU+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5pYm0udGVzdC5lamIuTXlDTVBCZWFuPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+Y29tLmlibS50ZXN0LmVqYi5NeUNNUEtleTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPmsxPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5IGlkPSJNeUNNUDEiPgotICAgICAgICAgICAgPGVqYi1uYW1lPk15Q01QMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5jb20uaWJtLnRlc3QuZWpiLk15Q01QMUhvbWU8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmNvbS5pYm0udGVzdC5lamIuTXlDTVAxPC9yZW1vdGU+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5pYm0udGVzdC5lamIuTXlDTVAxQmVhbjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmNvbS5pYm0udGVzdC5lamIuTXlDTVAxS2V5PC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+azE8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHkgaWQ9Ik15Q01QMiI+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+TXlDTVAyPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmNvbS5pYm0udGVzdC5lamIuTXlDTVAySG9tZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+Y29tLmlibS50ZXN0LmVqYi5NeUNNUDI8L3JlbW90ZT4KLSAgICAgICAgICAgIDxlamItY2xhc3M+Y29tLmlibS50ZXN0LmVqYi5NeUNNUDJCZWFuPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+Y29tLmlibS50ZXN0LmVqYi5NeUNNUDJLZXk8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGNtcC1maWVsZD4KLSAgICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5rMTwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkxpc3Q8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEuc3FsLkRhdGE8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5JbnRlZ2VyPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8wPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8wPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8wPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzA8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzA8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMjwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8zPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV80PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF80PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+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+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV81PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF81PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua181PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV82PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF82PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua182PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV84PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzg8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV85PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV81PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV82PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV83PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV84PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV85PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5Lz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV84PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV85PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV81PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV82PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMjwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzI8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMjwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5sYW5nLkludGVnZXI8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEubGFuZy5TdHJpbmc8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkxpc3Q8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnNxbC5EYXRhPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEuc3FsLkRhdGE8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+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+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTA8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzEwPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzExPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8xMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzEyPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzEzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8xMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTQ8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzE0PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+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+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8zPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMzwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8zPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMzwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuTGlzdDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnNxbC5EYXRhPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+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+bG9jYWxIb21lXzE1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8xNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzE2PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzE3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8xNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMTg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzE4PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzE5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8xOTwvbG9jYWw+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+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzQ8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzQ8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkxpc3Q8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEuc3FsLkRhdGE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIxPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjA8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzIzPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI0PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjA8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzIwPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzIxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8yMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzIyPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzIzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8yMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjQ8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzI0PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+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+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzU8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzU8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+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+bG9jYWxIb21lXzI1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8yNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzI2PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzI3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8yNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMjg8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzI4PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzI5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8yOTwvbG9jYWw+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+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzY8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl82PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzY8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV82PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEuc3FsLkRhdGE8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEubGFuZy5JbnRlZ2VyPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PlRydWU8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+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+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMzA8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzMwPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzMxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8zMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMzI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzMyPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzMzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF8zMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMzQ8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzM0PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzI8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMxPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzc8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl83PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzc8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV83PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5JbnRlZ2VyPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLmxhbmcuU3RyaW5nPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5MaXN0PC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5zcWwuRGF0YTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnNxbC5EYXRhPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM1PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM2PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzc8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzg8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zOTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzM1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zNjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzY8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMzc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzM3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV8zODwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfMzg8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfMzk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzM5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5Lz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM2PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzY8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzk8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zOTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzg8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl84PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzg8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV84PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5TdHJpbmc8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5IYXNoVGFibGU8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5MaXN0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEuc3FsLkRhdGE8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvcHJpbS1rZXktY2xhc3M+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+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNDA8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQwPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzQxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF80MTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNDI8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQyPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzQzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF80MzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5sb2NhbEhvbWVfNDQ8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPmxvY2FsXzQ0PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+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+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV85PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fOTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl85PC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfOTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuTGlzdDwvcmVtb3RlPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+amF2YS5zcWwuRGF0YTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkJlYW48L3BlcnNpc3RlbmNlLXR5cGU+Ci0gICAgICAgICAgICA8cHJpbS1rZXktY2xhc3M+amF2YS5sYW5nLlN0cmluZzwvcHJpbS1rZXktY2xhc3M+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+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV80NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNDU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzQ2PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF80NjwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV80NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNDc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+bG9jYWxIb21lXzQ4PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5sb2NhbF80ODwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmxvY2FsSG9tZV80OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+bG9jYWxfNDk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80NTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180NTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80Njwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Njwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80Nzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Nzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80ODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180ODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80OTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180OTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkvPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80OTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgPC9lbnRlcnByaXNlLWJlYW5zPgotICAgIDxyZWxhdGlvbnNoaXBzPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8wPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8wPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMDwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzE8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzE8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkxpc3Q8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMTwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzI8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5zcWwuRGF0YTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8zPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8zPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzI8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzQ8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV80PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzM8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzY8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV82PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5MaXN0PC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzc8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzc8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5zcWwuRGF0YTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV80PC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV84PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfODwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV85PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV85PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgIDwvcmVsYXRpb25zaGlwcz4KLSAgICA8YXNzZW1ibHktZGVzY3JpcHRvcj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV83PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1bmNoZWNrZWQvPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV83PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVuY2hlY2tlZC8+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dW5jaGVja2VkLz4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5Ob3RTdXBwb3J0ZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5TdXBwb3J0czwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVkPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVzTmV3PC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5NYW5kYXRvcnk8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxleGNsdWRlLWxpc3Q+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L2V4Y2x1ZGUtbGlzdD4KLSAgICA8L2Fzc2VtYmx5LWRlc2NyaXB0b3I+Ci0gICAgPGVqYi1jbGllbnQtamFyPmVqYkNsaWVudEphcl8wPC9lamItY2xpZW50LWphcj4KLTwvZWpiLWphcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphcjItMC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphcjItMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YjQ4MjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL2VqYi1qYXIyLTAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjgxOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGVqYi1qYXIgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRW50ZXJwcmlzZSBKYXZhQmVhbnMgMi4wLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2VqYi1qYXJfMl8wLmR0ZCI+Ci08ZWpiLWphciBpZD0iZWpiLWphcl9JRCI+Ci0gICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotCTxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotCTxlbnRlcnByaXNlLWJlYW5zPgotCQk8ZW50aXR5IGlkPSJDTVAxIj4KLQkJCTxlamItbmFtZT5DTVAxPC9lamItbmFtZT4KLQkJCTxsb2NhbC1ob21lPmVqYnMuQ01QMUxvY2FsSG9tZTwvbG9jYWwtaG9tZT4KLQkJCTxsb2NhbD5lamJzLkNNUDFMb2NhbDwvbG9jYWw+Ci0JCQk8ZWpiLWNsYXNzPmVqYnMuQ01QMUJlYW48L2VqYi1jbGFzcz4KLQkJCTxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLQkJCTxwcmltLWtleS1jbGFzcz5lamJzLkNNUDFLZXk8L3ByaW0ta2V5LWNsYXNzPgotCQkJPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotCQkJPGNtcC12ZXJzaW9uPjIueDwvY21wLXZlcnNpb24+Ci0JCQk8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+Q01QMTwvYWJzdHJhY3Qtc2NoZW1hLW5hbWU+Ci0JCQk8Y21wLWZpZWxkPgotCQkJCTxmaWVsZC1uYW1lPmlkPC9maWVsZC1uYW1lPgotCQkJPC9jbXAtZmllbGQ+Ci0JCTwvZW50aXR5PgotCQk8ZW50aXR5IGlkPSJDTVAyIj4KLQkJCTxlamItbmFtZT5DTVAyPC9lamItbmFtZT4KLQkJCTxsb2NhbC1ob21lPmVqYnMuQ01QMkxvY2FsSG9tZTwvbG9jYWwtaG9tZT4KLQkJCTxsb2NhbD5lamJzLkNNUDJMb2NhbDwvbG9jYWw+Ci0JCQk8ZWpiLWNsYXNzPmVqYnMuQ01QMkJlYW48L2VqYi1jbGFzcz4KLQkJCTxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLQkJCTxwcmltLWtleS1jbGFzcz5lamJzLkNNUDJLZXk8L3ByaW0ta2V5LWNsYXNzPgotCQkJPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotCQkJPGNtcC12ZXJzaW9uPjIueDwvY21wLXZlcnNpb24+Ci0JCQk8YWJzdHJhY3Qtc2NoZW1hLW5hbWU+Q01QMjwvYWJzdHJhY3Qtc2NoZW1hLW5hbWU+Ci0JCQk8Y21wLWZpZWxkPgotCQkJCTxmaWVsZC1uYW1lPmlkPC9maWVsZC1uYW1lPgotCQkJPC9jbXAtZmllbGQ+Ci0JCTwvZW50aXR5PgotICAgICAgICA8ZW50aXR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+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+bGlua180PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18wPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8wPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8wPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMTwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzE8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS5zcWwuRGF0YTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS5sYW5nLkludGVnZXI8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEubGFuZy5TdHJpbmc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS51dGlsLkhhc2hUYWJsZTwvbG9jYWw+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5MaXN0PC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEudXRpbC5MaXN0PC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV82PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV83PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV85PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV85PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV81PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua181PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV82PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV83PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzg8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfODwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV85PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzk8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV81PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzExPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV82PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzEzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua182PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua183PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xOTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua182PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV83PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+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+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzEyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+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+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5PjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvc2Vzc2lvbj4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMjwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzI8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMjwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkxpc3Q8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEuc3FsLkRhdGE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIxPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjA8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzIzPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI0PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjE8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjQ8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+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+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzU5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNTk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eT48L3VzZS1jYWxsZXItaWRlbnRpdHk+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzI4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxtZXNzYWdlLWRyaXZlbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzA8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHRyYW5zYWN0aW9uLXR5cGU+QmVhbjwvdHJhbnNhY3Rpb24tdHlwZT4KLSAgICAgICAgICAgIDxtZXNzYWdlLXNlbGVjdG9yPm1lc3NhZ2VTZWxlY3Rvcl8wPC9tZXNzYWdlLXNlbGVjdG9yPgotICAgICAgICAgICAgPGFja25vd2xlZGdlLW1vZGU+QXV0by1hY2tub3dsZWRnZTwvYWNrbm93bGVkZ2UtbW9kZT4KLSAgICAgICAgICAgIDxtZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbj4KLSAgICAgICAgICAgICAgICA8ZGVzdGluYXRpb24tdHlwZT5qYXZheC5qbXMuUXVldWU8L2Rlc3RpbmF0aW9uLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHN1YnNjcmlwdGlvbi1kdXJhYmlsaXR5PkR1cmFibGU8L3N1YnNjcmlwdGlvbi1kdXJhYmlsaXR5PgotICAgICAgICAgICAgPC9tZXNzYWdlLWRyaXZlbi1kZXN0aW5hdGlvbj4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMxPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzMyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzMzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzA8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzMzPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM0PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzYxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNjE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzYzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNjM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV82NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzY1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV82NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzY3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNjk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV82OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMyPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMwPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzMyPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM0PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvbWVzc2FnZS1kcml2ZW4+Ci0gICAgICAgIDxzZXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMTwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8xPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMTwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8aG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuTGlzdDwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLnNxbC5EYXRhPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxzZXNzaW9uLXR5cGU+U3RhdGVsZXNzPC9zZXNzaW9uLXR5cGU+Ci0gICAgICAgICAgICA8dHJhbnNhY3Rpb24tdHlwZT5Db250YWluZXI8L3RyYW5zYWN0aW9uLXR5cGU+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzU8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zNjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM3PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM4PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzk8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzcxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83MzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8zNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zNzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMzg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eT48L3VzZS1jYWxsZXItaWRlbnRpdHk+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvc2Vzc2lvbj4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzQ8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzQ8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkxpc3Q8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEuc3FsLkRhdGE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQwPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV84MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzgxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV84MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzgzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV84NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV84NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzg5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfODk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDA8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQxPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80Mjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Mjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDM8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+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+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80NTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180NTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzQ3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80ODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180ODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNDk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5PjwvdXNlLWNhbGxlci1pZGVudGl0eT4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80ODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80OTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80ODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvZW50aXR5PgotCTwvZW50ZXJwcmlzZS1iZWFucz4KLSAgICA8cmVsYXRpb25zaGlwcz4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMDwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8wPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5MaXN0PC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzE8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzE8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5zcWwuRGF0YTwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8xPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8yPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZT48L2Nhc2NhZGUtZGVsZXRlPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzI8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMzwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMzwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzI8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzQ8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlPjwvY2FzY2FkZS1kZWxldGU+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNDwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzU8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzU8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS51dGlsLkxpc3Q8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMzwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGU+PC9jYXNjYWRlLWRlbGV0ZT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV82PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEuc3FsLkRhdGE8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNzwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNzwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV80PC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV84PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZT48L2Nhc2NhZGUtZGVsZXRlPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzg8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV85PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV85PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgIDwvcmVsYXRpb25zaGlwcz4KLSAgICA8YXNzZW1ibHktZGVzY3JpcHRvcj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV83PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1bmNoZWNrZWQ+PC91bmNoZWNrZWQ+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8wPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV82PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV84PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc183PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV85PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc185PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dW5jaGVja2VkPjwvdW5jaGVja2VkPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzExPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE1PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xNzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE5PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVuY2hlY2tlZD48L3VuY2hlY2tlZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5Ob3RTdXBwb3J0ZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5TdXBwb3J0czwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVkPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVzTmV3PC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5NYW5kYXRvcnk8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxleGNsdWRlLWxpc3Q+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L2V4Y2x1ZGUtbGlzdD4KLSAgICA8L2Fzc2VtYmx5LWRlc2NyaXB0b3I+Ci0gICAgPGVqYi1jbGllbnQtamFyPmVqYkNsaWVudEphcl8wPC9lamItY2xpZW50LWphcj4KLTwvZWpiLWphcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyMi0wc2F4LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9lamItamFyMi0wc2F4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5NzI0Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvZWpiLWphcjItMHNheC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyODU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgZWpiLWphciBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAyLjAvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZWpiLWphcl8yXzAuZHRkIj4KLTxlamItamFyIGlkPSJlamItamFyX0lEIj4KLSAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgPGVudGVycHJpc2UtYmVhbnM+Ci0gICAgICAgIDxlbnRpdHkgaWQ9IkNNUDEiPgotICAgICAgICAgICAgPGVqYi1uYW1lPkNNUDE8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+ZWpicy5DTVAxTG9jYWxIb21lPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmVqYnMuQ01QMUxvY2FsPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+ZWpicy5DTVAxQmVhbjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmVqYnMuQ01QMUtleTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLSAgICAgICAgICAgIDxhYnN0cmFjdC1zY2hlbWEtbmFtZT5DTVAxPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+aWQ8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHkgaWQ9IkNNUDIiPgotICAgICAgICAgICAgPGVqYi1uYW1lPkNNUDI8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGxvY2FsLWhvbWU+ZWpicy5DTVAyTG9jYWxIb21lPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmVqYnMuQ01QMkxvY2FsPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+ZWpicy5DTVAyQmVhbjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmVqYnMuQ01QMktleTwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLSAgICAgICAgICAgIDxhYnN0cmFjdC1zY2hlbWEtbmFtZT5DTVAyPC9hYnN0cmFjdC1zY2hlbWEtbmFtZT4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+aWQ8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5MaXN0PC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnNxbC5EYXRhPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+VHJ1ZTwvcmVlbnRyYW50PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8wPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18wPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8wPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEuc3FsLkRhdGE8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEubGFuZy5JbnRlZ2VyPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5IYXNoVGFibGU8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuTGlzdDwvcHJpbS1rZXktY2xhc3M+Ci0gICAgICAgICAgICA8cmVlbnRyYW50PkZhbHNlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV81PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlNob3J0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV83PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfOTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfOTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV81PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV83PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzc8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV84PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV84PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua184PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV85PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua185PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8xMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzExPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua181PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xMzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMTU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8xNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV85PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzE5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMTk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua181PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua182PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua183PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua184PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua185PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eS8+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV81PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV82PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV83PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV84PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV83PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV84PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5JbnRlZ2VyPC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLmxhbmcuU3RyaW5nPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEudXRpbC5MaXN0PC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS5zcWwuRGF0YTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEuc3FsLkRhdGE8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8Y21wLXZlcnNpb24+Mi54PC9jbXAtdmVyc2lvbj4KLSAgICAgICAgICAgIDxhYnN0cmFjdC1zY2hlbWEtbmFtZT5hYnN0cmFjdFNjaGVtYU5hbWVfMDwvYWJzdHJhY3Qtc2NoZW1hLW5hbWU+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZmllbGQtbmFtZT5uYW1lXzE8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQ+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPm5hbWVfMzwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzExPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzEyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTM8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzEwPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzEwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xMzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xMzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzEzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xNDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzEwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yMTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzIxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8yMzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzIzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xMTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yNTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMjc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8yNzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzI5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMjk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzEwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xMzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzExPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzEyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzEzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+TG9jYWw8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8wPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8xPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgIDxyZXN1bHQtdHlwZS1tYXBwaW5nPlJlbW90ZTwvcmVzdWx0LXR5cGUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8ZWpiLXFsPmVqYlFMXzE8L2VqYi1xbD4KLSAgICAgICAgICAgIDwvcXVlcnk+Ci0gICAgICAgICAgICA8cXVlcnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+TG9jYWw8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF8yPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+UmVtb3RlPC9yZXN1bHQtdHlwZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxlamItcWw+ZWpiUUxfMzwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHF1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgPC9xdWVyeS1tZXRob2Q+Ci0gICAgICAgICAgICAgICAgPHJlc3VsdC10eXBlLW1hcHBpbmc+TG9jYWw8L3Jlc3VsdC10eXBlLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPGVqYi1xbD5lamJRTF80PC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPHNlc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8wPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5TdHJpbmc8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5IYXNoVGFibGU8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5MaXN0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEuc3FsLkRhdGE8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHNlc3Npb24tdHlwZT5TdGF0ZWZ1bDwvc2Vzc2lvbi10eXBlPgotICAgICAgICAgICAgPHRyYW5zYWN0aW9uLXR5cGU+QmVhbjwvdHJhbnNhY3Rpb24tdHlwZT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Mb25nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE1PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xNjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzE3PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xODwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzE5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTU8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMTY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xNzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8xODwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8xODwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzE5PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzE5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfMzE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV8zMTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMTU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMTY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzMzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzM1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfMzU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzE3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV8zOTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzM5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18xOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5Lz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzE1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMTU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTY8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8xNjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xOTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzE5PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8xODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvc2Vzc2lvbj4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMjwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzI8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMjwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzI8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkxpc3Q8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEuc3FsLkRhdGE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIxPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzIyPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TaG9ydDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuTG9uZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjA8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjA8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yMjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yMjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzIzPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzIzPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI0PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI0PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzQzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNDM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzIxPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzIyPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV80NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzQ3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNDk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV80OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjQ8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIwPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIxPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIxPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIyPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIzPC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzI0PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzI0PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cnVuLWFzPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjA8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzIxPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjE8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzIzPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI0PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzIzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzM8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8zPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzM8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8zPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5MaXN0PC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnNxbC5EYXRhPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5GbG9hdDwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yNTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjY8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzI2PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yNzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjg8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzI5PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjk8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjU8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjU8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMjY8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjY8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yNzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yNzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8yODwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8yODwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzI5PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzI5PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNTE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV81MTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMjU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzUzPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNTM8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzU1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNTU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzI3PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI4PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81NzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzU3PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8yOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV81OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzU5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18yOTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjU8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjY8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjY8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjc8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjg8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjk8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjk8L3JvbGUtbGluaz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDx1c2UtY2FsbGVyLWlkZW50aXR5Lz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI1PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjU8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjc8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8yNzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yODwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzI4PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzI5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMjk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yNzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjg8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yOTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8L2VudGl0eT4KLSAgICAgICAgPG1lc3NhZ2UtZHJpdmVuPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgICAgPGVqYi1uYW1lPm5hbWVfMDwvZWpiLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmphdmEudXRpbC5MaXN0PC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8dHJhbnNhY3Rpb24tdHlwZT5CZWFuPC90cmFuc2FjdGlvbi10eXBlPgotICAgICAgICAgICAgPG1lc3NhZ2Utc2VsZWN0b3I+bWVzc2FnZVNlbGVjdG9yXzA8L21lc3NhZ2Utc2VsZWN0b3I+Ci0gICAgICAgICAgICA8YWNrbm93bGVkZ2UtbW9kZT5BdXRvLWFja25vd2xlZGdlPC9hY2tub3dsZWRnZS1tb2RlPgotICAgICAgICAgICAgPG1lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uPgotICAgICAgICAgICAgICAgIDxkZXN0aW5hdGlvbi10eXBlPmphdmF4Lmptcy5RdWV1ZTwvZGVzdGluYXRpb24tdHlwZT4KLSAgICAgICAgICAgICAgICA8c3Vic2NyaXB0aW9uLWR1cmFiaWxpdHk+RHVyYWJsZTwvc3Vic2NyaXB0aW9uLWR1cmFiaWxpdHk+Ci0gICAgICAgICAgICA8L21lc3NhZ2UtZHJpdmVuLWRlc3RpbmF0aW9uPgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMwPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzI8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzMzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM0PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM0PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zMDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zMDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMwPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMxPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzMxPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMxPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzMyPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzMyPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzM8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzM8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zMzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzQ8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzQ8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zMDwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNjE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV82MTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNjM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV82MzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzE8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzY1PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNjU8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMyPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzMzPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzY3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNjc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzMzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV82OTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzY5PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8c2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxydW4tYXM+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMwPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzMxPC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zMjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzMzPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzM8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zNDwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzI8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9tZXNzYWdlLWRyaXZlbj4KLSAgICAgICAgPHNlc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8xPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzE8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV8xPC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEubGFuZy5TdHJpbmc8L2hvbWU+Ci0gICAgICAgICAgICA8cmVtb3RlPmphdmEudXRpbC5IYXNoVGFibGU8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEudXRpbC5MaXN0PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmphdmEuc3FsLkRhdGE8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHNlc3Npb24tdHlwZT5TdGF0ZWxlc3M8L3Nlc3Npb24tdHlwZT4KLSAgICAgICAgICAgIDx0cmFuc2FjdGlvbi10eXBlPkNvbnRhaW5lcjwvdHJhbnNhY3Rpb24tdHlwZT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zNTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzM2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzc8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zNzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzg8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM5PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM1PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM1PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzU8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzY8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzM2PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM2PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzc8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzc8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfMzg8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMzg8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zODwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zOTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV8zOTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV8zOTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM1PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzcxPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzE8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzM1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzczPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV83NTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzc1PC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua18zNzwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8zODwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzk8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV83OTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfMzk8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM1PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM2PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM3PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM4PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzM5PC9yb2xlLWxpbms+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgICAgPHNlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8dXNlLWNhbGxlci1pZGVudGl0eS8+Ci0gICAgICAgICAgICA8L3NlY3VyaXR5LWlkZW50aXR5PgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNTwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM1PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8zNzwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM3PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzg8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV8zODwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfMzk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM1PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzY8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM3PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8zODwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM5PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDwvc2Vzc2lvbj4KLSAgICAgICAgPGVudGl0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzQ8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgICAgIDxlamItbmFtZT5uYW1lXzQ8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+amF2YS51dGlsLkhhc2hUYWJsZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+amF2YS51dGlsLkxpc3Q8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmphdmEuc3FsLkRhdGE8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICA8bG9jYWw+amF2YS5sYW5nLkludGVnZXI8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9lamItY2xhc3M+Ci0gICAgICAgICAgICA8cGVyc2lzdGVuY2UtdHlwZT5CZWFuPC9wZXJzaXN0ZW5jZS10eXBlPgotICAgICAgICAgICAgPHByaW0ta2V5LWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L3ByaW0ta2V5LWNsYXNzPgotICAgICAgICAgICAgPHJlZW50cmFudD5UcnVlPC9yZWVudHJhbnQ+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80MDwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDE8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU2hvcnQ8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDE8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQyPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkxvbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDI8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQzPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkZsb2F0PC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQzPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICAgICA8L2Vudi1lbnRyeT4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQwPC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQwPC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDA8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDE8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDE8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDI8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDI8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MjwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80MzwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80MzwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQzPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ0PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NDwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NDwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQwPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV84MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzgxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV84MzwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzgzPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180MTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80MjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV84NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDI8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODc8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV84NzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDM8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDQ8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzg5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfODk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ0PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80MDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180MDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80MTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180MTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80Mjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Mjwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80Mzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Mzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80NDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180NDwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJ1bi1hcz4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgICAgIDwvc2VjdXJpdHktaWRlbnRpdHk+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQwPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDA8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQxPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDE8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPlNFUlZMRVQ8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDI8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MjwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80MzwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ0PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDQ8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDA8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQxPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80MjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkxpc3Q8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQzPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnNxbC5EYXRhPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICAgICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80NDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgICAgIDxlbnRpdHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzU8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl81PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzU8L2xhcmdlLWljb24+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+bmFtZV81PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmphdmEudXRpbC5MaXN0PC9ob21lPgotICAgICAgICAgICAgPHJlbW90ZT5qYXZhLnNxbC5EYXRhPC9yZW1vdGU+Ci0gICAgICAgICAgICA8bG9jYWwtaG9tZT5qYXZhLmxhbmcuSW50ZWdlcjwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgIDxsb2NhbD5qYXZhLmxhbmcuU3RyaW5nPC9sb2NhbD4KLSAgICAgICAgICAgIDxlamItY2xhc3M+amF2YS51dGlsLkhhc2hUYWJsZTwvZWpiLWNsYXNzPgotICAgICAgICAgICAgPHBlcnNpc3RlbmNlLXR5cGU+QmVhbjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLnV0aWwuSGFzaFRhYmxlPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxlbnYtZW50cnk+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80NTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5TdHJpbmc8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDU8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ2PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDY8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ3PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJvb2xlYW48L2Vudi1lbnRyeS10eXBlPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfNDc8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgICAgIDwvZW52LWVudHJ5PgotICAgICAgICAgICAgPGVudi1lbnRyeT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ4PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkRvdWJsZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80ODwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZW52LWVudHJ5PgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfNDk8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQnl0ZTwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80OTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICAgICAgICA8ZWpiLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NTwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NTwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ1PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ2PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGhvbWU+aG9tZV80NjwvaG9tZT4KLSAgICAgICAgICAgICAgICA8cmVtb3RlPnJlbW90ZV80NjwvcmVtb3RlPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ2PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLXJlZj4KLSAgICAgICAgICAgIDxlamItcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ3PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ3PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ3PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8aG9tZT5ob21lXzQ4PC9ob21lPgotICAgICAgICAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ4PC9yZW1vdGU+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDg8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItcmVmPgotICAgICAgICAgICAgPGVqYi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDk8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxob21lPmhvbWVfNDk8L2hvbWU+Ci0gICAgICAgICAgICAgICAgPHJlbW90ZT5yZW1vdGVfNDk8L3JlbW90ZT4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180OTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NTwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85MTwvbG9jYWwtaG9tZT4KLSAgICAgICAgICAgICAgICA8bG9jYWw+cmVtb3RlXzkxPC9sb2NhbD4KLSAgICAgICAgICAgICAgICA8ZWpiLWxpbms+bGlua180NTwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80NjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTM8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV85MzwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDY8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDc8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfOTU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICAgPGxvY2FsPnJlbW90ZV85NTwvbG9jYWw+Ci0gICAgICAgICAgICAgICAgPGVqYi1saW5rPmxpbmtfNDc8L2VqYi1saW5rPgotICAgICAgICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgICAgICAgICAgPGVqYi1sb2NhbC1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDg8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzk3PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfOTc8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ4PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxlamItbG9jYWwtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzQ5PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzk5PC9sb2NhbC1ob21lPgotICAgICAgICAgICAgICAgIDxsb2NhbD5yZW1vdGVfOTk8L2xvY2FsPgotICAgICAgICAgICAgICAgIDxlamItbGluaz5saW5rXzQ5PC9lamItbGluaz4KLSAgICAgICAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80NTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180NTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80Njwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Njwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80Nzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180Nzwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80ODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180ODwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV80OTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua180OTwvcm9sZS1saW5rPgotICAgICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHVzZS1jYWxsZXItaWRlbnRpdHkvPgotICAgICAgICAgICAgPC9zZWN1cml0eS1pZGVudGl0eT4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfNDU8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzLXR5cGU+dHlwZV80NTwvcmVzLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80NjwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ2PC9yZXMtdHlwZT4KLSAgICAgICAgICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ3PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDc8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5TRVJWTEVUPC9yZXMtYXV0aD4KLSAgICAgICAgICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ4PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDg8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICAgICAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ5PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlcy10eXBlPnR5cGVfNDk8L3Jlcy10eXBlPgotICAgICAgICAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDU8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ2PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDc8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80ODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ4PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICAgICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ5PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDk8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICAgICAgICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPC9lbnRpdHk+Ci0gICAgPC9lbnRlcnByaXNlLWJlYW5zPgotICAgIDxyZWxhdGlvbnNoaXBzPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8wPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8wPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMDwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuTGlzdDwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV8xPC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV8xPC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEuc3FsLkRhdGE8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfMTwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMjwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzI8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfMzwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfMzwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICA8L2VqYi1yZWxhdGlvbj4KLSAgICAgICAgPGVqYi1yZWxhdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb24tbmFtZT5uYW1lXzI8L2VqYi1yZWxhdGlvbi1uYW1lPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzQ8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+T25lPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPGNhc2NhZGUtZGVsZXRlLz4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV80PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfNTwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5NYW55PC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNTwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnV0aWwuTGlzdDwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgPC9lamItcmVsYXRpb24+Ci0gICAgICAgIDxlamItcmVsYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uLW5hbWU+bmFtZV8zPC9lamItcmVsYXRpb24tbmFtZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV82PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk9uZTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxjYXNjYWRlLWRlbGV0ZS8+Ci0gICAgICAgICAgICAgICAgPHJlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDwvcmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgIDxjbXItZmllbGQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC1uYW1lPm5hbWVfNjwvY21yLWZpZWxkLW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtdHlwZT5qYXZhLnNxbC5EYXRhPC9jbXItZmllbGQtdHlwZT4KLSAgICAgICAgICAgICAgICA8L2Ntci1maWVsZD4KLSAgICAgICAgICAgIDwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPGVqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPnJvbGVOYW1lXzc8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZS1uYW1lPgotICAgICAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+TWFueTwvbXVsdGlwbGljaXR5PgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzc8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgICAgICA8ZWpiLXJlbGF0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGVqYi1yZWxhdGlvbi1uYW1lPm5hbWVfNDwvZWpiLXJlbGF0aW9uLW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8ZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+cm9sZU5hbWVfODwvZWpiLXJlbGF0aW9uc2hpcC1yb2xlLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG11bHRpcGxpY2l0eT5PbmU8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8Y2FzY2FkZS1kZWxldGUvPgotICAgICAgICAgICAgICAgIDxyZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8L3JlbGF0aW9uc2hpcC1yb2xlLXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8Y21yLWZpZWxkPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDxjbXItZmllbGQtbmFtZT5uYW1lXzg8L2Ntci1maWVsZC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvY21yLWZpZWxkLXR5cGU+Ci0gICAgICAgICAgICAgICAgPC9jbXItZmllbGQ+Ci0gICAgICAgICAgICA8L2VqYi1yZWxhdGlvbnNoaXAtcm9sZT4KLSAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxlamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT5yb2xlTmFtZV85PC9lamItcmVsYXRpb25zaGlwLXJvbGUtbmFtZT4KLSAgICAgICAgICAgICAgICA8bXVsdGlwbGljaXR5Pk1hbnk8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICAgICAgICA8cmVsYXRpb25zaGlwLXJvbGUtc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPC9yZWxhdGlvbnNoaXAtcm9sZS1zb3VyY2U+Ci0gICAgICAgICAgICAgICAgPGNtci1maWVsZD4KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgICAgICA8Y21yLWZpZWxkLW5hbWU+bmFtZV85PC9jbXItZmllbGQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPGNtci1maWVsZC10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L2Ntci1maWVsZC10eXBlPgotICAgICAgICAgICAgICAgIDwvY21yLWZpZWxkPgotICAgICAgICAgICAgPC9lamItcmVsYXRpb25zaGlwLXJvbGU+Ci0gICAgICAgIDwvZWpiLXJlbGF0aW9uPgotICAgIDwvcmVsYXRpb25zaGlwcz4KLSAgICA8YXNzZW1ibHktZGVzY3JpcHRvcj4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfNjwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxzZWN1cml0eS1yb2xlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV83PC9yb2xlLW5hbWU+Ci0gICAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgICAgPHNlY3VyaXR5LXJvbGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgPC9zZWN1cml0eS1yb2xlPgotICAgICAgICA8c2VjdXJpdHktcm9sZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfOTwvcm9sZS1uYW1lPgotICAgICAgICA8L3NlY3VyaXR5LXJvbGU+Ci0gICAgICAgIDxtZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1bmNoZWNrZWQvPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV81PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV83PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfODwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzEwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVuY2hlY2tlZC8+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5SZW1vdGU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzEzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE0PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzE2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMTc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgPC9tZXRob2QtcGVybWlzc2lvbj4KLSAgICAgICAgPG1ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzE4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18xOTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIwPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMTk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzIxPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjI8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yMzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L21ldGhvZC1wZXJtaXNzaW9uPgotICAgICAgICA8bWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dW5jaGVja2VkLz4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+SG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yMTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjI8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjM8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI1PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8yNDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMjc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18yODwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzI5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgIDwvbWV0aG9kLXBlcm1pc3Npb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI2PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzI4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zMTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlNlcnZpY2VFbmRwb2ludDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMjk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzMzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5Ob3RTdXBwb3J0ZWQ8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxjb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzA8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zMjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfMzY8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+TG9jYWw8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzMzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc18zNzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM4PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzM5PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDA8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5TdXBwb3J0czwvdHJhbnMtYXR0cmlidXRlPgotICAgICAgICA8L2NvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgPGNvbnRhaW5lci10cmFuc2FjdGlvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+U2VydmljZUVuZHBvaW50PC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zNjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXMvPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfMzc8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzM4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180MzwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ0PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV8zOTwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc180NjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzQ3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVkPC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQxPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcy8+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MjwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICA8L21ldGhvZD4KLSAgICAgICAgICAgIDxtZXRob2Q+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLWludGY+UmVtb3RlPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80MzwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNDk8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Ib21lPC9tZXRob2QtaW50Zj4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLW5hbWU+bmFtZV80NDwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTE8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181MjwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzUzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8dHJhbnMtYXR0cmlidXRlPlJlcXVpcmVzTmV3PC90cmFucy1hdHRyaWJ1dGU+Ci0gICAgICAgIDwvY29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICA8Y29udGFpbmVyLXRyYW5zYWN0aW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDU8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkxvY2FsSG9tZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDY8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ3PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzQ4PC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU2PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80OTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPlJlbW90ZTwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNDk8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzU3PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNTg8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc181OTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPHRyYW5zLWF0dHJpYnV0ZT5NYW5kYXRvcnk8L3RyYW5zLWF0dHJpYnV0ZT4KLSAgICAgICAgPC9jb250YWluZXItdHJhbnNhY3Rpb24+Ci0gICAgICAgIDxleGNsdWRlLWxpc3Q+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81MDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1pbnRmPkhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUwPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbDwvbWV0aG9kLWludGY+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTE8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zLz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5Mb2NhbEhvbWU8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUyPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MDwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICAgICAgPG1ldGhvZD4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxtZXRob2QtaW50Zj5TZXJ2aWNlRW5kcG9pbnQ8L21ldGhvZC1pbnRmPgotICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5uYW1lXzUzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182MTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYyPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgPC9tZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgPC9tZXRob2Q+Ci0gICAgICAgICAgICA8bWV0aG9kPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81NDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPm5hbWVfNTQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPnBhcm1zXzYzPC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+cGFybXNfNjQ8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5wYXJtc182NTwvbWV0aG9kLXBhcmFtPgotICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgIDwvbWV0aG9kPgotICAgICAgICA8L2V4Y2x1ZGUtbGlzdD4KLSAgICA8L2Fzc2VtYmx5LWRlc2NyaXB0b3I+Ci0gICAgPGVqYi1jbGllbnQtamFyPmVqYkNsaWVudEphcl8wPC9lamItY2xpZW50LWphcj4KLTwvZWpiLWphcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9yYS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvRU1GVGVzdHMvcmEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDgxNmFlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy9yYS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBjb25uZWN0b3IgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgQ29ubmVjdG9yIDEuMC8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9jb25uZWN0b3JfMV8wLmR0ZCI+Ci0KLSAgIDxjb25uZWN0b3IgaWQ9IkNvbm5lY3Rvcl9JRCI+Ci0gICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxpY29uPgotICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzA8L3NtYWxsLWljb24+Ci0gICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICAgIDwvaWNvbj4KLSAgICAgIDx2ZW5kb3ItbmFtZT52ZW5kb3JOYW1lXzA8L3ZlbmRvci1uYW1lPgotICAgICAgPHNwZWMtdmVyc2lvbj4xLjA8L3NwZWMtdmVyc2lvbj4KLSAgICAgIDxlaXMtdHlwZT5laXNUeXBlXzA8L2Vpcy10eXBlPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgPGxpY2Vuc2U+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8bGljZW5zZS1yZXF1aXJlZD50cnVlPC9saWNlbnNlLXJlcXVpcmVkPgotICAgICAgPC9saWNlbnNlPgotICAgICAgPHJlc291cmNlYWRhcHRlciBpZD0iUmVzb3VyY2VBZGFwdGVyXzEwNTE2Mzk3NjkwODciPgotICAgICAgICAgPG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz5tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc18wPC9tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0gICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPmNvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlXzA8L2Nvbm5lY3Rpb25mYWN0b3J5LWludGVyZmFjZT4KLSAgICAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPmNvbm5lY3Rpb25GYWN0b3J5SW1wbENsYXNzXzA8L2Nvbm5lY3Rpb25mYWN0b3J5LWltcGwtY2xhc3M+Ci0gICAgICAgICA8Y29ubmVjdGlvbi1pbnRlcmZhY2U+Y29ubmVjdGlvbkludGVyZmFjZV8wPC9jb25uZWN0aW9uLWludGVyZmFjZT4KLSAgICAgICAgIDxjb25uZWN0aW9uLWltcGwtY2xhc3M+Y29ubmVjdGlvbkltcGxDbGFzc18wPC9jb25uZWN0aW9uLWltcGwtY2xhc3M+Ci0gICAgICAgICA8dHJhbnNhY3Rpb24tc3VwcG9ydD5Ob1RyYW5zYWN0aW9uPC90cmFuc2FjdGlvbi1zdXBwb3J0PgotICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eSBpZD0iQ29uZmlnUHJvcGVydHlfMTA1MTYzOTc2OTEyNyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8wPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT50eXBlXzA8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8wPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgIDxjb25maWctcHJvcGVydHkgaWQ9IkNvbmZpZ1Byb3BlcnR5XzEwNTE2Mzk3NjkxMjgiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfMTwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+dHlwZV8xPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfMTwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgICA8Y29uZmlnLXByb3BlcnR5IGlkPSJDb25maWdQcm9wZXJ0eV8xMDUxNjM5NzY5MTI5Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzI8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPnR5cGVfMjwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzI8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eSBpZD0iQ29uZmlnUHJvcGVydHlfMTA1MTYzOTc2OTEzMCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8zPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT50eXBlXzM8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8zPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgIDxjb25maWctcHJvcGVydHkgaWQ9IkNvbmZpZ1Byb3BlcnR5XzEwNTE2Mzk3NjkxMzEiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfNDwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+dHlwZV80PC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfNDwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtIGlkPSJBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV8xMDUxNjM5NzY5MTQ3Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5jcmVkZW50aWFsSW50ZXJmYWNlXzA8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtIGlkPSJBdXRoZW50aWNhdGlvbk1lY2hhbmlzbV8xMDUxNjM5NzY5MTQ4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5LZXJidjU8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmNyZWRlbnRpYWxJbnRlcmZhY2VfMTwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gaWQ9IkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtXzEwNTE2Mzk3NjkxNDkiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQ8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmNyZWRlbnRpYWxJbnRlcmZhY2VfMjwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20gaWQ9IkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtXzEwNTE2Mzk3NjkxNTAiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPktlcmJ2NTwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+Y3JlZGVudGlhbEludGVyZmFjZV8zPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbSBpZD0iQXV0aGVudGljYXRpb25NZWNoYW5pc21fMTA1MTYzOTc2OTE1MSI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+Y3JlZGVudGlhbEludGVyZmFjZV80PC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgPHJlYXV0aGVudGljYXRpb24tc3VwcG9ydD50cnVlPC9yZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+Ci0gICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbiBpZD0iU2VjdXJpdHlQZXJtaXNzaW9uXzEwNTE2Mzk3NjkxNjciPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzA8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uIGlkPSJTZWN1cml0eVBlcm1pc3Npb25fMTA1MTYzOTc2OTE3NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fMTwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24gaWQ9IlNlY3VyaXR5UGVybWlzc2lvbl8xMDUxNjM5NzY5MTc4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8yPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbiBpZD0iU2VjdXJpdHlQZXJtaXNzaW9uXzEwNTE2Mzk3NjkxNzkiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzM8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uIGlkPSJTZWN1cml0eVBlcm1pc3Npb25fMTA1MTYzOTc2OTE4MCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fNDwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgPC9yZXNvdXJjZWFkYXB0ZXI+Ci0gICA8L2Nvbm5lY3Rvcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9FTUZUZXN0cy93ZWIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ODMxYjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL0VNRlRlc3RzL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCI+Ci0KLSAgIDx3ZWItYXBwIGlkPSJXZWJBcHBfSUQiPgotICAgICAgPGljb24+Ci0gICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgPC9pY29uPgotICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICA8ZGlzdHJpYnV0YWJsZT48L2Rpc3RyaWJ1dGFibGU+Ci0gICAgICA8Y29udGV4dC1wYXJhbSBpZD0iQ29udGV4dFBhcmFtXzEwNTE2NDM0OTk4NTIiPgotICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzA8L3BhcmFtLW5hbWU+Ci0gICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8wPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAgIDxjb250ZXh0LXBhcmFtIGlkPSJDb250ZXh0UGFyYW1fMTA1MTY0MzQ5OTg1MyI+Ci0gICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE8L3BhcmFtLXZhbHVlPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9jb250ZXh0LXBhcmFtPgotICAgICAgPGNvbnRleHQtcGFyYW0gaWQ9IkNvbnRleHRQYXJhbV8xMDUxNjQzNDk5ODYyIj4KLSAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yPC9wYXJhbS1uYW1lPgotICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgICA8Y29udGV4dC1wYXJhbSBpZD0iQ29udGV4dFBhcmFtXzEwNTE2NDM0OTk4NjMiPgotICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAgIDxjb250ZXh0LXBhcmFtIGlkPSJDb250ZXh0UGFyYW1fMTA1MTY0MzQ5OTg3MiI+Ci0gICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ8L3BhcmFtLXZhbHVlPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgPC9jb250ZXh0LXBhcmFtPgotICAgICAgPGZpbHRlciBpZD0iRmlsdGVyXzEwNTE2NDM0OTk5MDIiPgotICAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMDwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8wPC9sYXJnZS1pY29uPgotICAgICAgICAgPC9pY29uPgotICAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMDwvZmlsdGVyLW5hbWU+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxmaWx0ZXItY2xhc3M+amF2YS5sYW5nLkludGVnZXI8L2ZpbHRlci1jbGFzcz4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAwMiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjU8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yNTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDAzIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yNjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI2PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMDQiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzI3PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjc8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAwNSI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjg8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yODwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDA2Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yOTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI5PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICA8L2ZpbHRlcj4KLSAgICAgIDxmaWx0ZXIgaWQ9IkZpbHRlcl8xMDUxNjQzNTAwMDAyIj4KLSAgICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgIDwvaWNvbj4KLSAgICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzE8L2ZpbHRlci1uYW1lPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZmlsdGVyLWNsYXNzPmphdmEubGFuZy5TdHJpbmc8L2ZpbHRlci1jbGFzcz4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAwNyI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzA8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDEyIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzMxPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMTMiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzMyPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzMyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAxNCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDE1Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM0PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICA8L2ZpbHRlcj4KLSAgICAgIDxmaWx0ZXIgaWQ9IkZpbHRlcl8xMDUxNjQzNTAwMDEyIj4KLSAgICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzI8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMjwvbGFyZ2UtaWNvbj4KLSAgICAgICAgIDwvaWNvbj4KLSAgICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzI8L2ZpbHRlci1uYW1lPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8yPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZmlsdGVyLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2ZpbHRlci1jbGFzcz4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAxNiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzU8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zNTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDE3Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zNjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM2PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMTgiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM3PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMzc8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM3PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAxOSI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMzg8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zODwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDIwIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8zOTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzM5PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICA8L2ZpbHRlcj4KLSAgICAgIDxmaWx0ZXIgaWQ9IkZpbHRlcl8xMDUxNjQzNTAwMDEzIj4KLSAgICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzM8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMzwvbGFyZ2UtaWNvbj4KLSAgICAgICAgIDwvaWNvbj4KLSAgICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzM8L2ZpbHRlci1uYW1lPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8zPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZmlsdGVyLWNsYXNzPmphdmEudXRpbC5MaXN0PC9maWx0ZXItY2xhc3M+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMjEiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQwPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDA8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAyMiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDE8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80MTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDMyIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80MjwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQyPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80MjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMzMiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQzPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDM8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQzPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAzNCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80NDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgPC9maWx0ZXI+Ci0gICAgICA8ZmlsdGVyIGlkPSJGaWx0ZXJfMTA1MTY0MzUwMDAzMiI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl80PC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzQ8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV80PC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfNDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGZpbHRlci1jbGFzcz5qYXZhLnNxbC5EYXRhPC9maWx0ZXItY2xhc3M+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMzUiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ1PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDAzNiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80NjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMDM3Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV80NzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ3PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80NzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAwMzgiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzQ4PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNDg8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDA0MiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV80OTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgPC9maWx0ZXI+Ci0gICAgICA8ZmlsdGVyLW1hcHBpbmcgaWQ9IkZpbHRlck1hcHBpbmdfMTA1MTY0MzUwMDA4MiI+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8wPC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzA8L3VybC1wYXR0ZXJuPgotICAgICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICAgIDxmaWx0ZXItbWFwcGluZyBpZD0iRmlsdGVyTWFwcGluZ18xMDUxNjQzNTAwMDgzIj4KLSAgICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzE8L2ZpbHRlci1uYW1lPgotICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTwvdXJsLXBhdHRlcm4+Ci0gICAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgICAgPGZpbHRlci1tYXBwaW5nIGlkPSJGaWx0ZXJNYXBwaW5nXzEwNTE2NDM1MDAwODQiPgotICAgICAgICAgPGZpbHRlci1uYW1lPm5hbWVfMjwvZmlsdGVyLW5hbWU+Ci0gICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yPC91cmwtcGF0dGVybj4KLSAgICAgIDwvZmlsdGVyLW1hcHBpbmc+Ci0gICAgICA8ZmlsdGVyLW1hcHBpbmcgaWQ9IkZpbHRlck1hcHBpbmdfMTA1MTY0MzUwMDA4NSI+Ci0gICAgICAgICA8ZmlsdGVyLW5hbWU+bmFtZV8zPC9maWx0ZXItbmFtZT4KLSAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzM8L3VybC1wYXR0ZXJuPgotICAgICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICAgIDxmaWx0ZXItbWFwcGluZyBpZD0iRmlsdGVyTWFwcGluZ18xMDUxNjQzNTAwMDg2Ij4KLSAgICAgICAgIDxmaWx0ZXItbmFtZT5uYW1lXzQ8L2ZpbHRlci1uYW1lPgotICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDwvdXJsLXBhdHRlcm4+Ci0gICAgICA8L2ZpbHRlci1tYXBwaW5nPgotICAgICAgPGxpc3RlbmVyIGlkPSJMaXN0ZW5lcl8xMDUxNjQzNTAwMTEyIj4KLSAgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5qYXZhLmxhbmcuSW50ZWdlcjwvbGlzdGVuZXItY2xhc3M+Ci0gICAgICA8L2xpc3RlbmVyPgotICAgICAgPGxpc3RlbmVyIGlkPSJMaXN0ZW5lcl8xMDUxNjQzNTAwMTEzIj4KLSAgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9saXN0ZW5lci1jbGFzcz4KLSAgICAgIDwvbGlzdGVuZXI+Ci0gICAgICA8bGlzdGVuZXIgaWQ9Ikxpc3RlbmVyXzEwNTE2NDM1MDAxMTQiPgotICAgICAgICAgPGxpc3RlbmVyLWNsYXNzPmphdmEudXRpbC5IYXNoVGFibGU8L2xpc3RlbmVyLWNsYXNzPgotICAgICAgPC9saXN0ZW5lcj4KLSAgICAgIDxsaXN0ZW5lciBpZD0iTGlzdGVuZXJfMTA1MTY0MzUwMDExNSI+Ci0gICAgICAgICA8bGlzdGVuZXItY2xhc3M+amF2YS51dGlsLkxpc3Q8L2xpc3RlbmVyLWNsYXNzPgotICAgICAgPC9saXN0ZW5lcj4KLSAgICAgIDxsaXN0ZW5lciBpZD0iTGlzdGVuZXJfMTA1MTY0MzUwMDExNiI+Ci0gICAgICAgICA8bGlzdGVuZXItY2xhc3M+amF2YS5zcWwuRGF0YTwvbGlzdGVuZXItY2xhc3M+Ci0gICAgICA8L2xpc3RlbmVyPgotICAgICAgPHNlcnZsZXQgaWQ9IlNlcnZsZXRfMTA1MTY0MzUwMDIxMiI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzA8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzA8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGpzcC1maWxlPmpzcEZpbGVfMDwvanNwLWZpbGU+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyMzIiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzA8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8wPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDIzMyI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjM0Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyMzUiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8zPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDIzNiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzQ8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4wPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgICAgICA8cnVuLWFzIGlkPSJSdW5Bc1NwZWNpZmllZElkZW50aXR5XzEwNTE2NDM1MDAyMzIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8wPC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyNzIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18wPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI3MyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjc0Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyNzUiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18zPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI3NiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzQ8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICA8L3NlcnZsZXQ+Ci0gICAgICA8c2VydmxldCBpZD0iU2VydmxldF8xMDUxNjQzNTAwMjcyIj4KLSAgICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzE8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMTwvbGFyZ2UtaWNvbj4KLSAgICAgICAgIDwvaWNvbj4KLSAgICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMTwvc2VydmxldC1uYW1lPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8xPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8c2VydmxldC1jbGFzcz5jbGFzc05hbWVfMDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI3MiI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfNTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjczIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV82PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfNjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyNzQiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzc8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV83PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl83PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI3NSI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfODwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzg8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjc2Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV85PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfOTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgICAgICAgIDxydW4tYXMgaWQ9IlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfMTA1MTY0MzUwMDI3MiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI3NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzU8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjc4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl82PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV82PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfNjwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyODIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua183PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI4MyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fODwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzg8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjg0Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV85PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfOTwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgIDwvc2VydmxldD4KLSAgICAgIDxzZXJ2bGV0IGlkPSJTZXJ2bGV0XzEwNTE2NDM1MDAyODIiPgotICAgICAgICAgPGljb24+Ci0gICAgICAgICAgICA8c21hbGwtaWNvbj5zbWFsbEljb25fMjwvc21hbGwtaWNvbj4KLSAgICAgICAgICAgIDxsYXJnZS1pY29uPmxhcmdlSWNvbl8yPC9sYXJnZS1pY29uPgotICAgICAgICAgPC9pY29uPgotICAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8yPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzI8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxqc3AtZmlsZT5qc3BGaWxlXzE8L2pzcC1maWxlPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjgyIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xMDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzEwPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyODMiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzExPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTE8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI4NCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTI8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xMjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjg1Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xMzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzEzPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyODYiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE0PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTQ8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MjwvbG9hZC1vbi1zdGFydHVwPgotICAgICAgICAgPHJ1bi1hcyBpZD0iUnVuQXNTcGVjaWZpZWRJZGVudGl0eV8xMDUxNjQzNTAwMjgyIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZU5hbWVfMjwvcm9sZS1uYW1lPgotICAgICAgICAgPC9ydW4tYXM+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjg1Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMDwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyODYiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzExPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI4NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzEyPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTI8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjg4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xMzwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyODkiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE0PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgPC9zZXJ2bGV0PgotICAgICAgPHNlcnZsZXQgaWQ9IlNlcnZsZXRfMTA1MTY0MzUwMDI4MyI+Ci0gICAgICAgICA8aWNvbj4KLSAgICAgICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8zPC9zbWFsbC1pY29uPgotICAgICAgICAgICAgPGxhcmdlLWljb24+bGFyZ2VJY29uXzM8L2xhcmdlLWljb24+Ci0gICAgICAgICA8L2ljb24+Ci0gICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzM8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHNlcnZsZXQtY2xhc3M+Y2xhc3NOYW1lXzE8L3NlcnZsZXQtY2xhc3M+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyODciPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE1PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTU8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI4OCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTY8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xNjwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjkyIj4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8xNzwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzE3PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyOTMiPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzE4PC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMTg8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI5NCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMTk8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8xOTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4zPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgICAgICA8cnVuLWFzIGlkPSJSdW5Bc1NwZWNpZmllZElkZW50aXR5XzEwNTE2NDM1MDAyOTIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlTmFtZV8zPC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L3J1bi1hcz4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyOTIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE1PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xNTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE1PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI5MyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTY8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTY8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjk0Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMTc8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18xNzwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyOTUiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8xODwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzE4PC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI5NiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzE5PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMTk8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICA8L3NlcnZsZXQ+Ci0gICAgICA8c2VydmxldCBpZD0iU2VydmxldF8xMDUxNjQzNTAwMjkyIj4KLSAgICAgICAgIDxpY29uPgotICAgICAgICAgICAgPHNtYWxsLWljb24+c21hbGxJY29uXzQ8L3NtYWxsLWljb24+Ci0gICAgICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fNDwvbGFyZ2UtaWNvbj4KLSAgICAgICAgIDwvaWNvbj4KLSAgICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfNDwvc2VydmxldC1uYW1lPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV80PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8anNwLWZpbGU+anNwRmlsZV8yPC9qc3AtZmlsZT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI5NSI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjA8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yMDwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjk2Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yMTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzIxPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8aW5pdC1wYXJhbSBpZD0iSW5pdFBhcmFtXzEwNTE2NDM1MDAyOTciPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+cGFyYW1OYW1lXzIyPC9wYXJhbS1uYW1lPgotICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnBhcmFtVmFsdWVfMjI8L3BhcmFtLXZhbHVlPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgIDxpbml0LXBhcmFtIGlkPSJJbml0UGFyYW1fMTA1MTY0MzUwMDI5OCI+Ci0gICAgICAgICAgICA8cGFyYW0tbmFtZT5wYXJhbU5hbWVfMjM8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+cGFyYW1WYWx1ZV8yMzwvcGFyYW0tdmFsdWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9pbml0LXBhcmFtPgotICAgICAgICAgPGluaXQtcGFyYW0gaWQ9IkluaXRQYXJhbV8xMDUxNjQzNTAwMjk5Ij4KLSAgICAgICAgICAgIDxwYXJhbS1uYW1lPnBhcmFtTmFtZV8yNDwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wYXJhbVZhbHVlXzI0PC9wYXJhbS12YWx1ZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2luaXQtcGFyYW0+Ci0gICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjQ8L2xvYWQtb24tc3RhcnR1cD4KLSAgICAgICAgIDxydW4tYXMgaWQ9IlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlfMTA1MTY0MzUwMDI5MyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvcnVuLWFzPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDI5NyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIwPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjA8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMjk4Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yMTwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgICAgIDxzZWN1cml0eS1yb2xlLXJlZiBpZD0iU2VjdXJpdHlSb2xlUmVmXzEwNTE2NDM1MDAyOTkiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+bmFtZV8yMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbGluaz5saW5rXzIyPC9yb2xlLWxpbms+Ci0gICAgICAgICA8L3NlY3VyaXR5LXJvbGUtcmVmPgotICAgICAgICAgPHNlY3VyaXR5LXJvbGUtcmVmIGlkPSJTZWN1cml0eVJvbGVSZWZfMTA1MTY0MzUwMDMwMCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5uYW1lXzIzPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1saW5rPmxpbmtfMjM8L3JvbGUtbGluaz4KLSAgICAgICAgIDwvc2VjdXJpdHktcm9sZS1yZWY+Ci0gICAgICAgICA8c2VjdXJpdHktcm9sZS1yZWYgaWQ9IlNlY3VyaXR5Um9sZVJlZl8xMDUxNjQzNTAwMzAxIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPm5hbWVfMjQ8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLWxpbms+bGlua18yNDwvcm9sZS1saW5rPgotICAgICAgICAgPC9zZWN1cml0eS1yb2xlLXJlZj4KLSAgICAgIDwvc2VydmxldD4KLSAgICAgIDxzZXJ2bGV0LW1hcHBpbmcgaWQ9IlNlcnZsZXRNYXBwaW5nXzEwNTE2NDM1MDAzMTIiPgotICAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8wPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8wPC91cmwtcGF0dGVybj4KLSAgICAgIDwvc2VydmxldC1tYXBwaW5nPgotICAgICAgPHNlcnZsZXQtbWFwcGluZyBpZD0iU2VydmxldE1hcHBpbmdfMTA1MTY0MzUwMDMxMyI+Ci0gICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzE8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzE8L3VybC1wYXR0ZXJuPgotICAgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICA8c2VydmxldC1tYXBwaW5nIGlkPSJTZXJ2bGV0TWFwcGluZ18xMDUxNjQzNTAwMzE0Ij4KLSAgICAgICAgIDxzZXJ2bGV0LW5hbWU+c2VydmxldE5hbWVfMjwvc2VydmxldC1uYW1lPgotICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMjwvdXJsLXBhdHRlcm4+Ci0gICAgICA8L3NlcnZsZXQtbWFwcGluZz4KLSAgICAgIDxzZXJ2bGV0LW1hcHBpbmcgaWQ9IlNlcnZsZXRNYXBwaW5nXzEwNTE2NDM1MDAzMTUiPgotICAgICAgICAgPHNlcnZsZXQtbmFtZT5zZXJ2bGV0TmFtZV8zPC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zPC91cmwtcGF0dGVybj4KLSAgICAgIDwvc2VydmxldC1tYXBwaW5nPgotICAgICAgPHNlcnZsZXQtbWFwcGluZyBpZD0iU2VydmxldE1hcHBpbmdfMTA1MTY0MzUwMDMxNiI+Ci0gICAgICAgICA8c2VydmxldC1uYW1lPnNlcnZsZXROYW1lXzQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzQ8L3VybC1wYXR0ZXJuPgotICAgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0gICAgICA8c2Vzc2lvbi1jb25maWcgaWQ9IlNlc3Npb25Db25maWdfMTA1MTY0MzUwMDMxMiI+Ci0gICAgICAgICA8c2Vzc2lvbi10aW1lb3V0PjA8L3Nlc3Npb24tdGltZW91dD4KLSAgICAgIDwvc2Vzc2lvbi1jb25maWc+Ci0gICAgICA8bWltZS1tYXBwaW5nIGlkPSJNaW1lTWFwcGluZ18xMDUxNjQzNTAwMzMyIj4KLSAgICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzA8L2V4dGVuc2lvbj4KLSAgICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfMDwvbWltZS10eXBlPgotICAgICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgICA8bWltZS1tYXBwaW5nIGlkPSJNaW1lTWFwcGluZ18xMDUxNjQzNTAwMzMzIj4KLSAgICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzE8L2V4dGVuc2lvbj4KLSAgICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfMTwvbWltZS10eXBlPgotICAgICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgICA8bWltZS1tYXBwaW5nIGlkPSJNaW1lTWFwcGluZ18xMDUxNjQzNTAwMzM0Ij4KLSAgICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzI8L2V4dGVuc2lvbj4KLSAgICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfMjwvbWltZS10eXBlPgotICAgICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgICA8bWltZS1tYXBwaW5nIGlkPSJNaW1lTWFwcGluZ18xMDUxNjQzNTAwMzM1Ij4KLSAgICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzM8L2V4dGVuc2lvbj4KLSAgICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfMzwvbWltZS10eXBlPgotICAgICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgICA8bWltZS1tYXBwaW5nIGlkPSJNaW1lTWFwcGluZ18xMDUxNjQzNTAwMzM2Ij4KLSAgICAgICAgIDxleHRlbnNpb24+ZXh0ZW5zaW9uXzQ8L2V4dGVuc2lvbj4KLSAgICAgICAgIDxtaW1lLXR5cGU+bWltZVR5cGVfNDwvbWltZS10eXBlPgotICAgICAgPC9taW1lLW1hcHBpbmc+Ci0gICAgICA8d2VsY29tZS1maWxlLWxpc3QgaWQ9IldlbGNvbWVGaWxlTGlzdF8xMDUxNjQzNTAwMzMyIj4KLSAgICAgICAgIDx3ZWxjb21lLWZpbGU+d2VsY29tZUZpbGVfMDwvd2VsY29tZS1maWxlPgotICAgICAgICAgPHdlbGNvbWUtZmlsZT53ZWxjb21lRmlsZV8xPC93ZWxjb21lLWZpbGU+Ci0gICAgICAgICA8d2VsY29tZS1maWxlPndlbGNvbWVGaWxlXzI8L3dlbGNvbWUtZmlsZT4KLSAgICAgICAgIDx3ZWxjb21lLWZpbGU+d2VsY29tZUZpbGVfMzwvd2VsY29tZS1maWxlPgotICAgICAgICAgPHdlbGNvbWUtZmlsZT53ZWxjb21lRmlsZV80PC93ZWxjb21lLWZpbGU+Ci0gICAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotICAgICAgPGVycm9yLXBhZ2UgaWQ9IkV4Y2VwdGlvblR5cGVFcnJvclBhZ2VfMTA1MTY0MzUwMDM0MiI+Ci0gICAgICAgICA8ZXhjZXB0aW9uLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvZXhjZXB0aW9uLXR5cGU+Ci0gICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMDwvbG9jYXRpb24+Ci0gICAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgICA8ZXJyb3ItcGFnZSBpZD0iRXJyb3JDb2RlRXJyb3JQYWdlXzEwNTE2NDM1MDAzNDIiPgotICAgICAgICAgPGVycm9yLWNvZGU+ZXJyb3JDb2RlXzA8L2Vycm9yLWNvZGU+Ci0gICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMTwvbG9jYXRpb24+Ci0gICAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgICA8ZXJyb3ItcGFnZSBpZD0iRXhjZXB0aW9uVHlwZUVycm9yUGFnZV8xMDUxNjQzNTAwMzQzIj4KLSAgICAgICAgIDxleGNlcHRpb24tdHlwZT5qYXZhLnV0aWwuTGlzdDwvZXhjZXB0aW9uLXR5cGU+Ci0gICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMjwvbG9jYXRpb24+Ci0gICAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgICA8ZXJyb3ItcGFnZSBpZD0iRXJyb3JDb2RlRXJyb3JQYWdlXzEwNTE2NDM1MDAzNDMiPgotICAgICAgICAgPGVycm9yLWNvZGU+ZXJyb3JDb2RlXzE8L2Vycm9yLWNvZGU+Ci0gICAgICAgICA8bG9jYXRpb24+bG9jYXRpb25fMzwvbG9jYXRpb24+Ci0gICAgICA8L2Vycm9yLXBhZ2U+Ci0gICAgICA8ZXJyb3ItcGFnZSBpZD0iRXhjZXB0aW9uVHlwZUVycm9yUGFnZV8xMDUxNjQzNTAwMzUyIj4KLSAgICAgICAgIDxleGNlcHRpb24tdHlwZT5qYXZhLnNxbC5EYXRhPC9leGNlcHRpb24tdHlwZT4KLSAgICAgICAgIDxsb2NhdGlvbj5sb2NhdGlvbl80PC9sb2NhdGlvbj4KLSAgICAgIDwvZXJyb3ItcGFnZT4KLSAgICAgIDx0YWdsaWIgaWQ9IlRhZ0xpYlJlZl8xMDUxNjQzNTAwMzYyIj4KLSAgICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV8wPC90YWdsaWItdXJpPgotICAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl8wPC90YWdsaWItbG9jYXRpb24+Ci0gICAgICA8L3RhZ2xpYj4KLSAgICAgIDx0YWdsaWIgaWQ9IlRhZ0xpYlJlZl8xMDUxNjQzNTAwMzYzIj4KLSAgICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV8xPC90YWdsaWItdXJpPgotICAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl8xPC90YWdsaWItbG9jYXRpb24+Ci0gICAgICA8L3RhZ2xpYj4KLSAgICAgIDx0YWdsaWIgaWQ9IlRhZ0xpYlJlZl8xMDUxNjQzNTAwMzY0Ij4KLSAgICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV8yPC90YWdsaWItdXJpPgotICAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl8yPC90YWdsaWItbG9jYXRpb24+Ci0gICAgICA8L3RhZ2xpYj4KLSAgICAgIDx0YWdsaWIgaWQ9IlRhZ0xpYlJlZl8xMDUxNjQzNTAwMzY1Ij4KLSAgICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV8zPC90YWdsaWItdXJpPgotICAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl8zPC90YWdsaWItbG9jYXRpb24+Ci0gICAgICA8L3RhZ2xpYj4KLSAgICAgIDx0YWdsaWIgaWQ9IlRhZ0xpYlJlZl8xMDUxNjQzNTAwMzY2Ij4KLSAgICAgICAgIDx0YWdsaWItdXJpPnRhZ2xpYlVSSV80PC90YWdsaWItdXJpPgotICAgICAgICAgPHRhZ2xpYi1sb2NhdGlvbj50YWdsaWJMb2NhdGlvbl80PC90YWdsaWItbG9jYXRpb24+Ci0gICAgICA8L3RhZ2xpYj4KLSAgICAgIDxyZXNvdXJjZS1lbnYtcmVmIGlkPSJSZXNvdXJjZUVudlJlZl8xMDUxNjQzNTAwMzgyIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8wPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTY0MzUwMDM4MyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTY0MzUwMDM4NCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuSGFzaFRhYmxlPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgICA8cmVzb3VyY2UtZW52LXJlZiBpZD0iUmVzb3VyY2VFbnZSZWZfMTA1MTY0MzUwMDM4NSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLWVudi1yZWYgaWQ9IlJlc291cmNlRW52UmVmXzEwNTE2NDM1MDAzODYiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzQ8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgICAgPHJlc291cmNlLXJlZiBpZD0iUmVzb3VyY2VSZWZfMTA1MTY0MzUwMDQwMiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMDwvcmVzLXJlZi1uYW1lPgotICAgICAgICAgPHJlcy10eXBlPnR5cGVfMDwvcmVzLXR5cGU+Ci0gICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjQzNTAwNDAzIj4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8xPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgICA8cmVzb3VyY2UtcmVmIGlkPSJSZXNvdXJjZVJlZl8xMDUxNjQzNTAwNDA0Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgICA8cmVzLXR5cGU+dHlwZV8yPC9yZXMtdHlwZT4KLSAgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2NDM1MDA0MDUiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzM8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgICA8L3Jlc291cmNlLXJlZj4KLSAgICAgIDxyZXNvdXJjZS1yZWYgaWQ9IlJlc291cmNlUmVmXzEwNTE2NDM1MDA0MDYiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICAgIDwvcmVzb3VyY2UtcmVmPgotICAgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQgaWQ9IlNlY3VyaXR5Q29uc3RyYWludF8xMDUxNjQzNTAwNDMyIj4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMDwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ1MiI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzA8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl80PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDUzIj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl81PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl84PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ1NCI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzI8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ1NSI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzM8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDYyIj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfNDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8yNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDxhdXRoLWNvbnN0cmFpbnQgaWQ9IkF1dGhDb25zdHJhaW50XzEwNTE2NDM1MDA0NjIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18wPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18zPC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzQ8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICAgPHVzZXItZGF0YS1jb25zdHJhaW50IGlkPSJVc2VyRGF0YUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2MiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5OT05FPC90cmFuc3BvcnQtZ3VhcmFudGVlPgotICAgICAgICAgPC91c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgIDxzZWN1cml0eS1jb25zdHJhaW50IGlkPSJTZWN1cml0eUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2MiI+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzE8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NjMiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV81PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl81PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzI5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDY0Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfNjwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDY1Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfNzwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zNTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zNjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8zOTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ2NiI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzg8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzg8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ2NyI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzk8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzk8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNDk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPGF1dGgtY29uc3RyYWludCBpZD0iQXV0aENvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2MyI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzU8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfNjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc183PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzg8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfOTwvcm9sZS1uYW1lPgotICAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQgaWQ9IlVzZXJEYXRhQ29uc3RyYWludF8xMDUxNjQzNTAwNDYzIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx0cmFuc3BvcnQtZ3VhcmFudGVlPklOVEVHUkFMPC90cmFuc3BvcnQtZ3VhcmFudGVlPgotICAgICAgICAgPC91c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgIDxzZWN1cml0eS1jb25zdHJhaW50IGlkPSJTZWN1cml0eUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2MyI+Ci0gICAgICAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzI8L2Rpc3BsYXktbmFtZT4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NjgiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xMDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTA8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTM8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fNTQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDY5Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTE8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzExPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU1PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU3PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU4PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzU5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3MCI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzEyPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82MzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3MSI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzEzPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl82OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDcyIj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTQ8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE0PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzcwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzcxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzcyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzczPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzc0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8YXV0aC1jb25zdHJhaW50IGlkPSJBdXRoQ29uc3RyYWludF8xMDUxNjQzNTAwNDY0Ij4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTA8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTE8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTI8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTM8L3JvbGUtbmFtZT4KLSAgICAgICAgICAgIDxyb2xlLW5hbWU+cm9sZXNfMTQ8L3JvbGUtbmFtZT4KLSAgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgotICAgICAgICAgPHVzZXItZGF0YS1jb25zdHJhaW50IGlkPSJVc2VyRGF0YUNvbnN0cmFpbnRfMTA1MTY0MzUwMDQ2NCI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5DT05GSURFTlRJQUw8L3RyYW5zcG9ydC1ndWFyYW50ZWU+Ci0gICAgICAgICA8L3VzZXItZGF0YS1jb25zdHJhaW50PgotICAgICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgotICAgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQgaWQ9IlNlY3VyaXR5Q29uc3RyYWludF8xMDUxNjQzNTAwNDY0Ij4KLSAgICAgICAgIDxkaXNwbGF5LW5hbWU+ZGlzcGxheU5hbWVfMzwvZGlzcGxheS1uYW1lPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3MyI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE1PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xNTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl83OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDc0Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTY8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE2PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzgzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzg0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0NzUiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8xNzwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTc8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODY8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODc8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fODk8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDc2Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMTg8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE4PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzkwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzkxPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzkyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzkzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzk0PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+R0VUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QT1NUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5QVVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkRFTEVURTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3NyI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzE5PC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xOTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NjwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85NzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85ODwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl85OTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+SEVBRDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+T1BUSU9OUzwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+VFJBQ0U8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPGF1dGgtY29uc3RyYWludCBpZD0iQXV0aENvbnN0cmFpbnRfMTA1MTY0MzUwMDQ3MiI+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE1PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE2PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE3PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE4PC9yb2xlLW5hbWU+Ci0gICAgICAgICAgICA8cm9sZS1uYW1lPnJvbGVzXzE5PC9yb2xlLW5hbWU+Ci0gICAgICAgICA8L2F1dGgtY29uc3RyYWludD4KLSAgICAgICAgIDx1c2VyLWRhdGEtY29uc3RyYWludCBpZD0iVXNlckRhdGFDb25zdHJhaW50XzEwNTE2NDM1MDA0NzIiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHRyYW5zcG9ydC1ndWFyYW50ZWU+Tk9ORTwvdHJhbnNwb3J0LWd1YXJhbnRlZT4KLSAgICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+Ci0gICAgICA8L3NlY3VyaXR5LWNvbnN0cmFpbnQ+Ci0gICAgICA8c2VjdXJpdHktY29uc3RyYWludCBpZD0iU2VjdXJpdHlDb25zdHJhaW50XzEwNTE2NDM1MDA0NzIiPgotICAgICAgICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV80PC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDc4Ij4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMjA8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIwPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTAyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5PUFRJT05TPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5UUkFDRTwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ3OSI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzIxPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEwNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMDg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTA5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+REVMRVRFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5IRUFEPC9odHRwLW1ldGhvZD4KLSAgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+Ci0gICAgICAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24gaWQ9IldlYlJlc291cmNlQ29sbGVjdGlvbl8xMDUxNjQzNTAwNDgwIj4KLSAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT53ZWJSZXNvdXJjZU5hbWVfMjI8L3dlYi1yZXNvdXJjZS1uYW1lPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzIyPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExMDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTE8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTEyPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExMzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTQ8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBPU1Q8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlBVVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgotICAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uIGlkPSJXZWJSZXNvdXJjZUNvbGxlY3Rpb25fMTA1MTY0MzUwMDQ4MSI+Ci0gICAgICAgICAgICA8d2ViLXJlc291cmNlLW5hbWU+d2ViUmVzb3VyY2VOYW1lXzIzPC93ZWItcmVzb3VyY2UtbmFtZT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTU8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE2PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzExNzwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMTg8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTE5PC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPlRSQUNFPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5HRVQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbiBpZD0iV2ViUmVzb3VyY2VDb2xsZWN0aW9uXzEwNTE2NDM1MDA0ODIiPgotICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPndlYlJlc291cmNlTmFtZV8yNDwvd2ViLXJlc291cmNlLW5hbWU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTIwPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyMTwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8dXJsLXBhdHRlcm4+dXJsUGF0dGVybl8xMjI8L3VybC1wYXR0ZXJuPgotICAgICAgICAgICAgPHVybC1wYXR0ZXJuPnVybFBhdHRlcm5fMTIzPC91cmwtcGF0dGVybj4KLSAgICAgICAgICAgIDx1cmwtcGF0dGVybj51cmxQYXR0ZXJuXzEyNDwvdXJsLXBhdHRlcm4+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UE9TVDwvaHR0cC1tZXRob2Q+Ci0gICAgICAgICAgICA8aHR0cC1tZXRob2Q+UFVUPC9odHRwLW1ldGhvZD4KLSAgICAgICAgICAgIDxodHRwLW1ldGhvZD5ERUxFVEU8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkhFQUQ8L2h0dHAtbWV0aG9kPgotICAgICAgICAgICAgPGh0dHAtbWV0aG9kPk9QVElPTlM8L2h0dHAtbWV0aG9kPgotICAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KLSAgICAgICAgIDxhdXRoLWNvbnN0cmFpbnQgaWQ9IkF1dGhDb25zdHJhaW50XzEwNTE2NDM1MDA0NzMiPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18yMDwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18yMTwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18yMjwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18yMzwvcm9sZS1uYW1lPgotICAgICAgICAgICAgPHJvbGUtbmFtZT5yb2xlc18yNDwvcm9sZS1uYW1lPgotICAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+Ci0gICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQgaWQ9IlVzZXJEYXRhQ29uc3RyYWludF8xMDUxNjQzNTAwNDczIj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDx0cmFuc3BvcnQtZ3VhcmFudGVlPklOVEVHUkFMPC90cmFuc3BvcnQtZ3VhcmFudGVlPgotICAgICAgICAgPC91c2VyLWRhdGEtY29uc3RyYWludD4KLSAgICAgIDwvc2VjdXJpdHktY29uc3RyYWludD4KLSAgICAgIDxsb2dpbi1jb25maWcgaWQ9IkxvZ2luQ29uZmlnXzEwNTE2NDM1MDA0ODIiPgotICAgICAgICAgPGF1dGgtbWV0aG9kPkJBU0lDPC9hdXRoLW1ldGhvZD4KLSAgICAgICAgIDxyZWFsbS1uYW1lPnJlYWxtTmFtZV8wPC9yZWFsbS1uYW1lPgotICAgICAgICAgPGZvcm0tbG9naW4tY29uZmlnIGlkPSJGb3JtTG9naW5Db25maWdfMTA1MTY0MzUwMDQ4MiI+Ci0gICAgICAgICAgICA8Zm9ybS1sb2dpbi1wYWdlPmZvcm1Mb2dpblBhZ2VfMDwvZm9ybS1sb2dpbi1wYWdlPgotICAgICAgICAgICAgPGZvcm0tZXJyb3ItcGFnZT5mb3JtRXJyb3JQYWdlXzA8L2Zvcm0tZXJyb3ItcGFnZT4KLSAgICAgICAgIDwvZm9ybS1sb2dpbi1jb25maWc+Ci0gICAgICA8L2xvZ2luLWNvbmZpZz4KLSAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTY0MzUwMDQ5MiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzA8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTY0MzUwMDQ5MyI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzE8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTY0MzUwMDQ5NCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzI8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTY0MzUwMDQ5NSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzM8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxzZWN1cml0eS1yb2xlIGlkPSJTZWN1cml0eVJvbGVfMTA1MTY0MzUwMDQ5NiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8cm9sZS1uYW1lPnJvbGVOYW1lXzQ8L3JvbGUtbmFtZT4KLSAgICAgIDwvc2VjdXJpdHktcm9sZT4KLSAgICAgIDxlbnYtZW50cnkgaWQ9IkVudkVudHJ5XzEwNTE2NDM1MDA1MTMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzA8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTY0MzUwMDUxNCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTY0MzUwMDUxNSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgIDwvZW52LWVudHJ5PgotICAgICAgPGVudi1lbnRyeSBpZD0iRW52RW50cnlfMTA1MTY0MzUwMDUxNiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMzwvZW52LWVudHJ5LXZhbHVlPgotICAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZW52LWVudHJ5IGlkPSJFbnZFbnRyeV8xMDUxNjQzNTAwNTE3Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgPC9lbnYtZW50cnk+Ci0gICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2NDM1MDA1MzMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGhvbWU+aG9tZV8wPC9ob21lPgotICAgICAgICAgPHJlbW90ZT5yZW1vdGVfMDwvcmVtb3RlPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1yZWY+Ci0gICAgICA8ZWpiLXJlZiBpZD0iRWpiUmVmXzEwNTE2NDM1MDA1MzQiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzE8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8xPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTY0MzUwMDUzNSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8aG9tZT5ob21lXzI8L2hvbWU+Ci0gICAgICAgICA8cmVtb3RlPnJlbW90ZV8yPC9yZW1vdGU+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICAgIDwvZWpiLXJlZj4KLSAgICAgIDxlamItcmVmIGlkPSJFamJSZWZfMTA1MTY0MzUwMDUzNiI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfMzwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzM8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1yZWYgaWQ9IkVqYlJlZl8xMDUxNjQzNTAwNTM3Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxob21lPmhvbWVfNDwvaG9tZT4KLSAgICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ8L3JlbW90ZT4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgICAgPC9lamItcmVmPgotICAgICAgPGVqYi1sb2NhbC1yZWYgaWQ9IkVKQkxvY2FsUmVmXzEwNTE2NDM1MDA1NTMiPgotICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzU8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzU8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICA8bG9jYWw+cmVtb3RlXzU8L2xvY2FsPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfNTwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTY0MzUwMDU1NCI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNjwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgICA8bG9jYWwtaG9tZT5ob21lXzY8L2xvY2FsLWhvbWU+Ci0gICAgICAgICA8bG9jYWw+cmVtb3RlXzY8L2xvY2FsPgotICAgICAgICAgPGVqYi1saW5rPmxpbmtfNjwvZWpiLWxpbms+Ci0gICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMTA1MTY0MzUwMDU1NSI+Ci0gICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNzwvZWpiLXJlZi1uYW1lPgotICAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfNzwvbG9jYWwtaG9tZT4KLSAgICAgICAgIDxsb2NhbD5yZW1vdGVfNzwvbG9jYWw+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua183PC9lamItbGluaz4KLSAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjQzNTAwNTU2Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl84PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV84PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgIDxsb2NhbC1ob21lPmhvbWVfODwvbG9jYWwtaG9tZT4KLSAgICAgICAgIDxsb2NhbD5yZW1vdGVfODwvbG9jYWw+Ci0gICAgICAgICA8ZWpiLWxpbms+bGlua184PC9lamItbGluaz4KLSAgICAgIDwvZWpiLWxvY2FsLXJlZj4KLSAgICAgIDxlamItbG9jYWwtcmVmIGlkPSJFSkJMb2NhbFJlZl8xMDUxNjQzNTAwNTU3Ij4KLSAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl85PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV85PC9lamItcmVmLW5hbWU+Ci0gICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgPGxvY2FsLWhvbWU+aG9tZV85PC9sb2NhbC1ob21lPgotICAgICAgICAgPGxvY2FsPnJlbW90ZV85PC9sb2NhbD4KLSAgICAgICAgIDxlamItbGluaz5saW5rXzk8L2VqYi1saW5rPgotICAgICAgPC9lamItbG9jYWwtcmVmPgotICAgPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmoyZWUvbG9vc2VBcHAueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmoyZWUvbG9vc2VBcHAueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTNhZTBiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9jb20uaWJtLmV0b29scy5qMmVlL2xvb3NlQXBwLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4NCi08b3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWc6TG9vc2VBcHBsaWNhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnPSJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSIgdXJpPSJcZDpcd29ya1xXVFBcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0c1xjb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVIiIGJpbmFyaWVzUGF0aD0iXGQ6XHdvcmtcV1RQXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHNcY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSIiByZXNvdXJjZXNQYXRoPSJcZDpcd29ya1xXVFBcb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0c1xjb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVIiPg0KLSAgPGxvb3NlQXJjaGl2ZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnOkxvb3NlTW9kdWxlIiB1cmk9Ikxvb3NlRUFSRWpiLmphciIgYmluYXJpZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVJFamJcYmluIiByZXNvdXJjZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVJFamJcYmluIi8+DQotICA8bG9vc2VBcmNoaXZlcyB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWc6TG9vc2VXQVJGaWxlIiB1cmk9Ikxvb3NlRUFSV2ViLndhciIgYmluYXJpZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVJXZWJcd2ViQXBwbGljYXRpb24iIHJlc291cmNlc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUVBUldlYlx3ZWJBcHBsaWNhdGlvbiI+DQotICAgIDxsb29zZUxpYnMgdXJpPSJXRUItSU5GL2xpYi9saWJyYXJ5LmphciIgYmluYXJpZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VKYXZhV2ViTGliXGJpbiIgcmVzb3VyY2VzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlSmF2YVdlYkxpYlxiaW4iLz4NCi0gIDwvbG9vc2VBcmNoaXZlcz4NCi0gIDxsb29zZUFyY2hpdmVzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZUxpYnJhcnkiIHVyaT0idXRpbC5qYXIiIGJpbmFyaWVzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlSmF2YVV0aWxcYmluIiByZXNvdXJjZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VKYXZhVXRpbFxiaW4iLz4NCi08L29yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnOkxvb3NlQXBwbGljYXRpb24+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmoyZWUvbG9vc2VDb25maWcueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvLm1ldGFkYXRhLy5wbHVnaW5zL2NvbS5pYm0uZXRvb2xzLmoyZWUvbG9vc2VDb25maWcueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGZmYWY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlLy5tZXRhZGF0YS8ucGx1Z2lucy9jb20uaWJtLmV0b29scy5qMmVlL2xvb3NlQ29uZmlnLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IkFTQ0lJIj8+DQotPG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnOkxvb3NlQ29uZmlndXJhdGlvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zOm9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnPSJjb21tb25hcmNoaXZlLmxvb3NlY29uZmlnLnhtaSI+DQotICA8YXBwbGljYXRpb25zIHVyaT0iXGQ6XHdvcmtcV1RQXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHNcY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSIiBiaW5hcmllc1BhdGg9IlxkOlx3b3JrXFdUUFxvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzXGNvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUVBUiIgcmVzb3VyY2VzUGF0aD0iXGQ6XHdvcmtcV1RQXG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHNcY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSIj4NCi0gICAgPGxvb3NlQXJjaGl2ZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnOkxvb3NlTW9kdWxlIiB1cmk9Ikxvb3NlRUFSRWpiLmphciIgYmluYXJpZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVJFamJcYmluIiByZXNvdXJjZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VFQVJFamJcYmluIi8+DQotICAgIDxsb29zZUFyY2hpdmVzIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZVdBUkZpbGUiIHVyaT0iTG9vc2VFQVJXZWIud2FyIiBiaW5hcmllc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUVBUldlYlx3ZWJBcHBsaWNhdGlvbiIgcmVzb3VyY2VzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlRUFSV2ViXHdlYkFwcGxpY2F0aW9uIj4NCi0gICAgICA8bG9vc2VMaWJzIHVyaT0iV0VCLUlORi9saWIvbGlicmFyeS5qYXIiIGJpbmFyaWVzUGF0aD0iL2Q6L3dvcmsvV1RQL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlc1xsb29zZV9tb2R1bGVfd29ya3NwYWNlXExvb3NlSmF2YVdlYkxpYlxiaW4iIHJlc291cmNlc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUphdmFXZWJMaWJcYmluIi8+DQotICAgIDwvbG9vc2VBcmNoaXZlcz4NCi0gICAgPGxvb3NlQXJjaGl2ZXMgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnOkxvb3NlTGlicmFyeSIgdXJpPSJ1dGlsLmphciIgYmluYXJpZXNQYXRoPSIvZDovd29yay9XVFAvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzXGxvb3NlX21vZHVsZV93b3Jrc3BhY2VcTG9vc2VKYXZhVXRpbFxiaW4iIHJlc291cmNlc1BhdGg9Ii9kOi93b3JrL1dUUC9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXNcbG9vc2VfbW9kdWxlX3dvcmtzcGFjZVxMb29zZUphdmFVdGlsXGJpbiIvPg0KLSAgPC9hcHBsaWNhdGlvbnM+DQotPC9vcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZzpMb29zZUNvbmZpZ3VyYXRpb24+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VDb25uZWN0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExY2Q2Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08YXBwbGljYXRpb24gaWQ9IkFwcGxpY2F0aW9uX0lEIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiPgotICAgIDxtb2R1bGU+Ci0gICAgICAgIDxjb25uZWN0b3I+Zm9vUkFSPC9jb25uZWN0b3I+Ci0gICAgPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VDb25uZWN0b3IvZm9vUkFSL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VDb25uZWN0b3IvZm9vUkFSL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ5OWJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL2Zvb1JBUi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL2Zvb1JBUi9NRVRBLUlORi9yYS54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9mb29SQVIvTUVUQS1JTkYvcmEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzQxYzUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlQ29ubmVjdG9yL2Zvb1JBUi9NRVRBLUlORi9yYS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBjb25uZWN0b3IgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgQ29ubmVjdG9yIDEuMC8vRU4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvY29ubmVjdG9yXzFfMC5kdGQiPgotPGNvbm5lY3Rvcj4KLSAgICA8ZGlzcGxheS1uYW1lPmRpc3BsYXlOYW1lXzA8L2Rpc3BsYXktbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgPGljb24+Ci0gICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICA8L2ljb24+Ci0gICAgPHZlbmRvci1uYW1lPnZlbmRvck5hbWVfMDwvdmVuZG9yLW5hbWU+Ci0gICAgPHNwZWMtdmVyc2lvbj4xLjA8L3NwZWMtdmVyc2lvbj4KLSAgICA8ZWlzLXR5cGU+ZWlzVHlwZV8wPC9laXMtdHlwZT4KLSAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPGxpY2Vuc2U+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGxpY2Vuc2UtcmVxdWlyZWQ+dHJ1ZTwvbGljZW5zZS1yZXF1aXJlZD4KLSAgICA8L2xpY2Vuc2U+Ci0gICAgPHJlc291cmNlYWRhcHRlcj4KLSAgICAgICAgPG1hbmFnZWRjb25uZWN0aW9uZmFjdG9yeS1jbGFzcz5tYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzc18wPC9tYW5hZ2VkY29ubmVjdGlvbmZhY3RvcnktY2xhc3M+Ci0gICAgICAgIDxjb25uZWN0aW9uZmFjdG9yeS1pbnRlcmZhY2U+Y29ubmVjdGlvbkZhY3RvcnlJbnRlcmZhY2VfMDwvY29ubmVjdGlvbmZhY3RvcnktaW50ZXJmYWNlPgotICAgICAgICA8Y29ubmVjdGlvbmZhY3RvcnktaW1wbC1jbGFzcz5jb25uZWN0aW9uRmFjdG9yeUltcGxDbGFzc18wPC9jb25uZWN0aW9uZmFjdG9yeS1pbXBsLWNsYXNzPgotICAgICAgICA8Y29ubmVjdGlvbi1pbnRlcmZhY2U+Y29ubmVjdGlvbkludGVyZmFjZV8wPC9jb25uZWN0aW9uLWludGVyZmFjZT4KLSAgICAgICAgPGNvbm5lY3Rpb24taW1wbC1jbGFzcz5jb25uZWN0aW9uSW1wbENsYXNzXzA8L2Nvbm5lY3Rpb24taW1wbC1jbGFzcz4KLSAgICAgICAgPHRyYW5zYWN0aW9uLXN1cHBvcnQ+Tm9UcmFuc2FjdGlvbjwvdHJhbnNhY3Rpb24tc3VwcG9ydD4KLSAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzA8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPnR5cGVfMDwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzA8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgIDxjb25maWctcHJvcGVydHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV8xPC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT50eXBlXzE8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV8xPC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8Y29uZmlnLXByb3BlcnR5PgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS1uYW1lPm5hbWVfMjwvY29uZmlnLXByb3BlcnR5LW5hbWU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXR5cGU+dHlwZV8yPC9jb25maWctcHJvcGVydHktdHlwZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdmFsdWU+dmFsdWVfMjwvY29uZmlnLXByb3BlcnR5LXZhbHVlPgotICAgICAgICA8L2NvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktbmFtZT5uYW1lXzM8L2NvbmZpZy1wcm9wZXJ0eS1uYW1lPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS10eXBlPnR5cGVfMzwvY29uZmlnLXByb3BlcnR5LXR5cGU+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LXZhbHVlPnZhbHVlXzM8L2NvbmZpZy1wcm9wZXJ0eS12YWx1ZT4KLSAgICAgICAgPC9jb25maWctcHJvcGVydHk+Ci0gICAgICAgIDxjb25maWctcHJvcGVydHk+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8Y29uZmlnLXByb3BlcnR5LW5hbWU+bmFtZV80PC9jb25maWctcHJvcGVydHktbmFtZT4KLSAgICAgICAgICAgIDxjb25maWctcHJvcGVydHktdHlwZT50eXBlXzQ8L2NvbmZpZy1wcm9wZXJ0eS10eXBlPgotICAgICAgICAgICAgPGNvbmZpZy1wcm9wZXJ0eS12YWx1ZT52YWx1ZV80PC9jb25maWctcHJvcGVydHktdmFsdWU+Ci0gICAgICAgIDwvY29uZmlnLXByb3BlcnR5PgotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPkJhc2ljUGFzc3dvcmQ8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPgotICAgICAgICAgICAgPGNyZWRlbnRpYWwtaW50ZXJmYWNlPmNyZWRlbnRpYWxJbnRlcmZhY2VfMDwvY3JlZGVudGlhbC1pbnRlcmZhY2U+Ci0gICAgICAgIDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbS10eXBlPktlcmJ2NTwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+Y3JlZGVudGlhbEludGVyZmFjZV8xPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+QmFzaWNQYXNzd29yZDwvYXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+Ci0gICAgICAgICAgICA8Y3JlZGVudGlhbC1pbnRlcmZhY2U+Y3JlZGVudGlhbEludGVyZmFjZV8yPC9jcmVkZW50aWFsLWludGVyZmFjZT4KLSAgICAgICAgPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8YXV0aGVudGljYXRpb24tbWVjaGFuaXNtLXR5cGU+S2VyYnY1PC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5jcmVkZW50aWFsSW50ZXJmYWNlXzM8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgPGF1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxhdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT5CYXNpY1Bhc3N3b3JkPC9hdXRoZW50aWNhdGlvbi1tZWNoYW5pc20tdHlwZT4KLSAgICAgICAgICAgIDxjcmVkZW50aWFsLWludGVyZmFjZT5jcmVkZW50aWFsSW50ZXJmYWNlXzQ8L2NyZWRlbnRpYWwtaW50ZXJmYWNlPgotICAgICAgICA8L2F1dGhlbnRpY2F0aW9uLW1lY2hhbmlzbT4KLSAgICAgICAgPHJlYXV0aGVudGljYXRpb24tc3VwcG9ydD50cnVlPC9yZWF1dGhlbnRpY2F0aW9uLXN1cHBvcnQ+Ci0gICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzA8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl8xPC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPnNwZWNpZmljYXRpb25fMjwvc2VjdXJpdHktcGVybWlzc2lvbi1zcGVjPgotICAgICAgICA8L3NlY3VyaXR5LXBlcm1pc3Npb24+Ci0gICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHNlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz5zcGVjaWZpY2F0aW9uXzM8L3NlY3VyaXR5LXBlcm1pc3Npb24tc3BlYz4KLSAgICAgICAgPC9zZWN1cml0eS1wZXJtaXNzaW9uPgotICAgICAgICA8c2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDxzZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+c3BlY2lmaWNhdGlvbl80PC9zZWN1cml0eS1wZXJtaXNzaW9uLXNwZWM+Ci0gICAgICAgIDwvc2VjdXJpdHktcGVybWlzc2lvbj4KLSAgICA8L3Jlc291cmNlYWRhcHRlcj4KLTwvY29ubmVjdG9yPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVIvTUVUQS1JTkYvLm1vZHVsZW1hcHMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUi9NRVRBLUlORi8ubW9kdWxlbWFwcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyMGE5Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUi9NRVRBLUlORi8ubW9kdWxlbWFwcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08bW9kdWxlbWFwOkVBUlByb2plY3RNYXAgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczptb2R1bGVtYXA9Im1vZHVsZW1hcC54bWkiIHhtbG5zOmFwcGxpY2F0aW9uPSJhcHBsaWNhdGlvbi54bWkiIHhtaTppZD0iRUFSUHJvamVjdE1hcF8xIj4NCi0gIDxtYXBwaW5ncyB4bWk6aWQ9Ik1vZHVsZU1hcHBpbmdfMSIgcHJvamVjdE5hbWU9Ikxvb3NlRUFSRWpiIj4NCi0gICAgPG1vZHVsZSB4bWk6dHlwZT0iYXBwbGljYXRpb246RWpiTW9kdWxlIiBocmVmPSJNRVRBLUlORi9hcHBsaWNhdGlvbi54bWwjRWpiTW9kdWxlXzEiLz4NCi0gIDwvbWFwcGluZ3M+DQotICA8bWFwcGluZ3MgeG1pOmlkPSJNb2R1bGVNYXBwaW5nXzIiIHByb2plY3ROYW1lPSJMb29zZUVBUldlYiI+DQotICAgIDxtb2R1bGUgeG1pOnR5cGU9ImFwcGxpY2F0aW9uOldlYk1vZHVsZSIgaHJlZj0iTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sI1dlYk1vZHVsZV8xIi8+DQotICA8L21hcHBpbmdzPg0KLTwvbW9kdWxlbWFwOkVBUlByb2plY3RNYXA+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVIvTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVIvTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjA2N2Y2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgYXBwbGljYXRpb24gUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSjJFRSBBcHBsaWNhdGlvbiAxLjIvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvYXBwbGljYXRpb25fMV8yLmR0ZCI+Ci08YXBwbGljYXRpb24gaWQ9IkFwcGxpY2F0aW9uX0lEIj4KLQk8ZGlzcGxheS1uYW1lPkxvb3NlRUFSPC9kaXNwbGF5LW5hbWU+Ci0JPG1vZHVsZSBpZD0iRWpiTW9kdWxlXzEiPgotCQk8ZWpiPkxvb3NlRUFSRWpiLmphcjwvZWpiPgotCTwvbW9kdWxlPgotCTxtb2R1bGUgaWQ9IldlYk1vZHVsZV8xIj4KLQkJPHdlYj4KLQkJCTx3ZWItdXJpPkxvb3NlRUFSV2ViLndhcjwvd2ViLXVyaT4KLQkJCTxjb250ZXh0LXJvb3Q+TG9vc2VFQVJXZWI8L2NvbnRleHQtcm9vdD48L3dlYj4KLQk8L21vZHVsZT4KLTwvYXBwbGljYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUi9NRVRBLUlORi9pYm0tYXBwbGljYXRpb24tZXh0LnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSL01FVEEtSU5GL2libS1hcHBsaWNhdGlvbi1leHQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2ZiZDBkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSL01FVEEtSU5GL2libS1hcHBsaWNhdGlvbi1leHQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08YXBwbGljYXRpb25leHQ6QXBwbGljYXRpb25FeHRlbnNpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczphcHBsaWNhdGlvbmV4dD0iYXBwbGljYXRpb25leHQueG1pIiB4bWxuczphcHBsaWNhdGlvbj0iYXBwbGljYXRpb24ueG1pIiB4bWk6aWQ9IkFwcGxpY2F0aW9uX0lEX0V4dCI+DQotICA8bW9kdWxlRXh0ZW5zaW9ucyB4bWk6dHlwZT0iYXBwbGljYXRpb25leHQ6RWpiTW9kdWxlRXh0ZW5zaW9uIiB4bWk6aWQ9IkVqYk1vZHVsZV8xX0V4dCIgYWJzb2x1dGVQYXRoPSJEOlxXU0FEX0RFVlxlY2xpcHNlXHdvcmtzcGFjZVxMb29zZUVBUkVqYlxiaW4iPg0KLSAgICA8bW9kdWxlIHhtaTp0eXBlPSJhcHBsaWNhdGlvbjpFamJNb2R1bGUiIGhyZWY9Ik1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCNFamJNb2R1bGVfMSIvPg0KLSAgPC9tb2R1bGVFeHRlbnNpb25zPg0KLSAgPG1vZHVsZUV4dGVuc2lvbnMgeG1pOnR5cGU9ImFwcGxpY2F0aW9uZXh0OldlYk1vZHVsZUV4dGVuc2lvbiIgeG1pOmlkPSJXZWJNb2R1bGVfMV9FeHQiIGFic29sdXRlUGF0aD0iRDpcV1NBRF9ERVZcZWNsaXBzZVx3b3Jrc3BhY2VcTG9vc2VFQVJXZWJcd2ViQXBwbGljYXRpb24iPg0KLSAgICA8bW9kdWxlIHhtaTp0eXBlPSJhcHBsaWNhdGlvbjpXZWJNb2R1bGUiIGhyZWY9Ik1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCNXZWJNb2R1bGVfMSIvPg0KLSAgPC9tb2R1bGVFeHRlbnNpb25zPg0KLSAgPGFwcGxpY2F0aW9uIGhyZWY9Ik1FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCNBcHBsaWNhdGlvbl9JRCIvPg0KLTwvYXBwbGljYXRpb25leHQ6QXBwbGljYXRpb25FeHRlbnNpb24+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSQXBwL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSQXBwL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0ZDkxZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08YXBwbGljYXRpb24gaWQ9IkFwcGxpY2F0aW9uX0lEIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL2FwcGxpY2F0aW9uXzFfNC54c2QiPgotICAgIDxtb2R1bGU+Ci0gICAgICAgIDxqYXZhPmZvb0FQUDwvamF2YT4KLSAgICA8L21vZHVsZT4KLTwvYXBwbGljYXRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9mb29BUFAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9mb29BUFAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvZm9vQVBQL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJBcHAvZm9vQVBQL01FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9mb29BUFAvTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiZWQ3Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkFwcC9mb29BUFAvTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGFwcGxpY2F0aW9uLWNsaWVudCBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKMkVFIEFwcGxpY2F0aW9uIENsaWVudCAxLjMvL0VOIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL2FwcGxpY2F0aW9uLWNsaWVudF8xXzMuZHRkIj4KLTxhcHBsaWNhdGlvbi1jbGllbnQgaWQ9IkFwcGxpY2F0aW9uLWNsaWVudF9JRCI+Ci0gICAgPGljb24+Ci0gICAgICAgIDxzbWFsbC1pY29uPnNtYWxsSWNvbl8wPC9zbWFsbC1pY29uPgotICAgICAgICA8bGFyZ2UtaWNvbj5sYXJnZUljb25fMDwvbGFyZ2UtaWNvbj4KLSAgICA8L2ljb24+Ci0gICAgPGRpc3BsYXktbmFtZT5kaXNwbGF5TmFtZV8wPC9kaXNwbGF5LW5hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMDwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8wPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8xPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8xPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8yPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Cb29sZWFuPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8yPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV8zPC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5Eb3VibGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzM8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzQ8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkJ5dGU8L2Vudi1lbnRyeS10eXBlPgotICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPnZhbHVlXzQ8L2Vudi1lbnRyeS12YWx1ZT4KLSAgICA8L2Vudi1lbnRyeT4KLSAgICA8ZW52LWVudHJ5PgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlbnYtZW50cnktbmFtZT5uYW1lXzA8L2Vudi1lbnRyeS1uYW1lPgotICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLlN0cmluZzwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMDwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMTwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMTwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMjwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuQm9vbGVhbjwvZW52LWVudHJ5LXR5cGU+Ci0gICAgICAgIDxlbnYtZW50cnktdmFsdWU+dmFsdWVfMjwvZW52LWVudHJ5LXZhbHVlPgotICAgIDwvZW52LWVudHJ5PgotICAgIDxlbnYtZW50cnk+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVudi1lbnRyeS1uYW1lPm5hbWVfMzwvZW52LWVudHJ5LW5hbWU+Ci0gICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuRG91YmxlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV8zPC9lbnYtZW50cnktdmFsdWU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVudi1lbnRyeT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZW52LWVudHJ5LW5hbWU+bmFtZV80PC9lbnYtZW50cnktbmFtZT4KLSAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5CeXRlPC9lbnYtZW50cnktdHlwZT4KLSAgICAgICAgPGVudi1lbnRyeS12YWx1ZT52YWx1ZV80PC9lbnYtZW50cnktdmFsdWU+Ci0gICAgPC9lbnYtZW50cnk+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8wPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzA8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMDwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMDwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18wPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzE8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV8xPC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV8xPC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzE8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMjwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV8yPC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV8yPC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzI8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfMzwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzM8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzM8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMzwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV80PC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzQ8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzQ8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfNDwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8wPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+U2Vzc2lvbjwvZWpiLXJlZi10eXBlPgotICAgICAgICA8aG9tZT5ob21lXzA8L2hvbWU+Ci0gICAgICAgIDxyZW1vdGU+cmVtb3RlXzA8L3JlbW90ZT4KLSAgICAgICAgPGVqYi1saW5rPmxpbmtfMDwvZWpiLWxpbms+Ci0gICAgPC9lamItcmVmPgotICAgIDxlamItcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMTwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxlamItcmVmLW5hbWU+bmFtZV8xPC9lamItcmVmLW5hbWU+Ci0gICAgICAgIDxlamItcmVmLXR5cGU+RW50aXR5PC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMTwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMTwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18xPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8yPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzI8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5TZXNzaW9uPC9lamItcmVmLXR5cGU+Ci0gICAgICAgIDxob21lPmhvbWVfMjwvaG9tZT4KLSAgICAgICAgPHJlbW90ZT5yZW1vdGVfMjwvcmVtb3RlPgotICAgICAgICA8ZWpiLWxpbms+bGlua18yPC9lamItbGluaz4KLSAgICA8L2VqYi1yZWY+Ci0gICAgPGVqYi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPGVqYi1yZWYtbmFtZT5uYW1lXzM8L2VqYi1yZWYtbmFtZT4KLSAgICAgICAgPGVqYi1yZWYtdHlwZT5FbnRpdHk8L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV8zPC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV8zPC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzM8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8ZWpiLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8ZWpiLXJlZi1uYW1lPm5hbWVfNDwvZWpiLXJlZi1uYW1lPgotICAgICAgICA8ZWpiLXJlZi10eXBlPlNlc3Npb248L2VqYi1yZWYtdHlwZT4KLSAgICAgICAgPGhvbWU+aG9tZV80PC9ob21lPgotICAgICAgICA8cmVtb3RlPnJlbW90ZV80PC9yZW1vdGU+Ci0gICAgICAgIDxlamItbGluaz5saW5rXzQ8L2VqYi1saW5rPgotICAgIDwvZWpiLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8wPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzA8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkNvbnRhaW5lcjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5VbnNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMjwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8yPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMzwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8zPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV80PC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzQ8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+QXBwbGljYXRpb248L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+U2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8wPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzA8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlNoYXJlYWJsZTwvcmVzLXNoYXJpbmctc2NvcGU+Ci0gICAgPC9yZXNvdXJjZS1yZWY+Ci0gICAgPHJlc291cmNlLXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzLXJlZi1uYW1lPm5hbWVfMTwvcmVzLXJlZi1uYW1lPgotICAgICAgICA8cmVzLXR5cGU+dHlwZV8xPC9yZXMtdHlwZT4KLSAgICAgICAgPHJlcy1hdXRoPkFwcGxpY2F0aW9uPC9yZXMtYXV0aD4KLSAgICAgICAgPHJlcy1zaGFyaW5nLXNjb3BlPlVuc2hhcmVhYmxlPC9yZXMtc2hhcmluZy1zY29wZT4KLSAgICA8L3Jlc291cmNlLXJlZj4KLSAgICA8cmVzb3VyY2UtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXMtcmVmLW5hbWU+bmFtZV8yPC9yZXMtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXMtdHlwZT50eXBlXzI8L3Jlcy10eXBlPgotICAgICAgICA8cmVzLWF1dGg+U0VSVkxFVDwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzM8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfMzwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgotICAgICAgICA8cmVzLXNoYXJpbmctc2NvcGU+VW5zaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl80PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlcy1yZWYtbmFtZT5uYW1lXzQ8L3Jlcy1yZWYtbmFtZT4KLSAgICAgICAgPHJlcy10eXBlPnR5cGVfNDwvcmVzLXR5cGU+Ci0gICAgICAgIDxyZXMtYXV0aD5BcHBsaWNhdGlvbjwvcmVzLWF1dGg+Ci0gICAgICAgIDxyZXMtc2hhcmluZy1zY29wZT5TaGFyZWFibGU8L3Jlcy1zaGFyaW5nLXNjb3BlPgotICAgIDwvcmVzb3VyY2UtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8wPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS51dGlsLkhhc2hUYWJsZTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzE8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMTwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5MaXN0PC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fMjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV8yPC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5zcWwuRGF0YTwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzM8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMzwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9yZXNvdXJjZS1lbnYtcmVmLXR5cGU+Ci0gICAgPC9yZXNvdXJjZS1lbnYtcmVmPgotICAgIDxyZXNvdXJjZS1lbnYtcmVmPgotICAgICAgICA8ZGVzY3JpcHRpb24+ZGVzY3JpcHRpb25fNDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLW5hbWU+bmFtZV80PC9yZXNvdXJjZS1lbnYtcmVmLW5hbWU+Ci0gICAgICAgIDxyZXNvdXJjZS1lbnYtcmVmLXR5cGU+amF2YS5sYW5nLlN0cmluZzwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEudXRpbC5IYXNoVGFibGU8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8xPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzE8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLnV0aWwuTGlzdDwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfMjwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEuc3FsLkRhdGE8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPHJlc291cmNlLWVudi1yZWY+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5kZXNjcmlwdGlvbl8zPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtbmFtZT5uYW1lXzM8L3Jlc291cmNlLWVudi1yZWYtbmFtZT4KLSAgICAgICAgPHJlc291cmNlLWVudi1yZWYtdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvcmVzb3VyY2UtZW52LXJlZi10eXBlPgotICAgIDwvcmVzb3VyY2UtZW52LXJlZj4KLSAgICA8cmVzb3VyY2UtZW52LXJlZj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPmRlc2NyaXB0aW9uXzQ8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi1uYW1lPm5hbWVfNDwvcmVzb3VyY2UtZW52LXJlZi1uYW1lPgotICAgICAgICA8cmVzb3VyY2UtZW52LXJlZi10eXBlPmphdmEubGFuZy5TdHJpbmc8L3Jlc291cmNlLWVudi1yZWYtdHlwZT4KLSAgICA8L3Jlc291cmNlLWVudi1yZWY+Ci0gICAgPGNhbGxiYWNrLWhhbmRsZXI+amF2YS51dGlsLkhhc2hUYWJsZTwvY2FsbGJhY2staGFuZGxlcj4KLTwvYXBwbGljYXRpb24tY2xpZW50PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNWNhZTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZWpiTW9kdWxlIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9XZWJTcGhlcmUgQXBwbGljYXRpb24gU2VydmVyIHY2LjAgSlJFIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0iY29tLmlibS53dHAuc2VydmVyLmphdmEuY29yZS5jb250YWluZXIvY29tLmlibS53cy5hc3Quc3QucnVudGltZS5jb3JlLnJ1bnRpbWVUYXJnZXQudjYwL1dlYlNwaGVyZSBBcHBsaWNhdGlvbiBTZXJ2ZXIgdjYuMCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImVqYk1vZHVsZSIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8uajJlZSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5qMmVlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTk5NjlkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5qMmVlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxqMmVlc2V0dGluZ3MgdmVyc2lvbj0iNjAwIj4NCi08bW9kdWxldmVyc2lvbj4yMDwvbW9kdWxldmVyc2lvbj4NCi08L2oyZWVzZXR0aW5ncz4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODRmNzUxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+TG9vc2VFQVJFamI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5jb20uaWJtLnd0cC5taWdyYXRpb24uTWlncmF0aW9uQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5jb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnZhbGlkYXRpb25idWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPmNvbS5pYm0ud3RwLmoyZWUuTGliQ29weUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+Y29tLmlibS5ldG9vbHMuajJlZS5MaWJDb3B5QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamVtLndvcmtiZW5jaC5KYXZhRU1GTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+Y29tLmlibS5ldG9vbHMuajJlZS5FSkIyXzBOYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5jb20uaWJtLnd0cC5lamIuRUpCTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmplbS5iZWFuaW5mby5CZWFuSW5mb05hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvLnJ1bnRpbWUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8ucnVudGltZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjNWQ0MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi8ucnVudGltZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cnVudGltZSBydW50aW1lLWlkPSJXZWJTcGhlcmUgQXBwbGljYXRpb24gU2VydmVyIHY2LjAiLz4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYmFkMjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUNsYXNzLVBhdGg6IHV0aWwuamFyIC4uL2Jvby5qYXIKLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL01FVEEtSU5GL2VqYi1qYXIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL01FVEEtSU5GL2VqYi1qYXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGNlMWU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9lamItamFyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgZWpiLWphciBQVUJMSUMgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBFbnRlcnByaXNlIEphdmFCZWFucyAxLjEvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvZWpiLWphcl8xXzEuZHRkIj4KLTxlamItamFyIGlkPSJlamItamFyX0lEIj4KLQk8ZGlzcGxheS1uYW1lPkxvb3NlRUFSRWpiPC9kaXNwbGF5LW5hbWU+Ci0JPGVudGVycHJpc2UtYmVhbnM+Ci0JCTxlbnRpdHkgaWQ9Ik15Q01QIj4KLQkJCTxlamItbmFtZT5NeUNNUDwvZWpiLW5hbWU+Ci0JCQk8aG9tZT5jb20uaWJtLnRlc3QuZWpiLk15Q01QSG9tZTwvaG9tZT4KLQkJCTxyZW1vdGU+Y29tLmlibS50ZXN0LmVqYi5NeUNNUDwvcmVtb3RlPgotCQkJPGVqYi1jbGFzcz5jb20uaWJtLnRlc3QuZWpiLk15Q01QQmVhbjwvZWpiLWNsYXNzPgotCQkJPHBlcnNpc3RlbmNlLXR5cGU+Q29udGFpbmVyPC9wZXJzaXN0ZW5jZS10eXBlPgotCQkJPHByaW0ta2V5LWNsYXNzPmNvbS5pYm0udGVzdC5lamIuTXlDTVBLZXk8L3ByaW0ta2V5LWNsYXNzPgotCQkJPHJlZW50cmFudD5GYWxzZTwvcmVlbnRyYW50PgotCQkJPGNtcC1maWVsZD4KLQkJCQk8ZmllbGQtbmFtZT5rMTwvZmllbGQtbmFtZT4KLQkJCTwvY21wLWZpZWxkPgotCQk8L2VudGl0eT4KLQk8L2VudGVycHJpc2UtYmVhbnM+Ci08L2VqYi1qYXI+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9pYm0tZWpiLWphci1ibmQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzNhZjRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9pYm0tZWpiLWphci1ibmQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxlamJibmQ6RUpCSmFyQmluZGluZyB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVqYmJuZD0iZWpiYm5kLnhtaSIgeG1sbnM6ZWpiPSJlamIueG1pIiB4bWk6aWQ9ImVqYi1qYXJfSURfQm5kIj4NCi0gIDxlamJKYXIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjZWpiLWphcl9JRCIvPg0KLSAgPGVqYkJpbmRpbmdzIHhtaTppZD0iTXlDTVBfQm5kIiBqbmRpTmFtZT0iZWpiL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBIb21lIj4NCi0gICAgPGVudGVycHJpc2VCZWFuIHhtaTp0eXBlPSJlamI6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjTXlDTVAiLz4NCi0gIDwvZWpiQmluZGluZ3M+DQotPC9lamJibmQ6RUpCSmFyQmluZGluZz4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9pYm0tZWpiLWphci1leHQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmU3MGE4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9NRVRBLUlORi9pYm0tZWpiLWphci1leHQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxlamJleHQ6RUpCSmFyRXh0ZW5zaW9uIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6ZWpiZXh0PSJlamJleHQueG1pIiB4bWxuczplamI9ImVqYi54bWkiIHhtaTppZD0iZWpiLWphcl9JRCI+DQotICA8ZWpiSmFyIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI2VqYi1qYXJfSUQiLz4NCi08L2VqYmV4dDpFSkJKYXJFeHRlbnNpb24+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVAuY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUC5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmNzI3Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUC5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9jb20vaWJtL3Rlc3QvZWpiL015Q01QQmVhbi5jbGFzcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2Jpbi9jb20vaWJtL3Rlc3QvZWpiL015Q01QQmVhbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjZWQyZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUEJlYW4uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUEhvbWUuY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUEhvbWUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OTI1OTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBIb21lLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvYmluL2NvbS9pYm0vdGVzdC9lamIvTXlDTVBLZXkuY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUEtleS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFiNjcwMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9iaW4vY29tL2libS90ZXN0L2VqYi9NeUNNUEtleS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0OTliYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvZWpiLWphci54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvZWpiLWphci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YmFlOTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL2VqYi1qYXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBlamItamFyIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9lamItamFyXzJfMC5kdGQiPgotPGVqYi1qYXIgaWQ9ImVqYi1qYXJfSUQiPgotCTxkaXNwbGF5LW5hbWU+TG9vc2VFQVJFamI8L2Rpc3BsYXktbmFtZT4KLQk8ZW50ZXJwcmlzZS1iZWFucz4KLQkJPGVudGl0eSBpZD0iQ01QMSI+Ci0JCQk8ZWpiLW5hbWU+Q01QMTwvZWpiLW5hbWU+Ci0JCQk8bG9jYWwtaG9tZT5lamJzLkNNUDFMb2NhbEhvbWU8L2xvY2FsLWhvbWU+Ci0JCQk8bG9jYWw+ZWpicy5DTVAxTG9jYWw8L2xvY2FsPgotCQkJPGVqYi1jbGFzcz5lamJzLkNNUDFCZWFuPC9lamItY2xhc3M+Ci0JCQk8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0JCQk8cHJpbS1rZXktY2xhc3M+ZWpicy5DTVAxS2V5PC9wcmltLWtleS1jbGFzcz4KLQkJCTxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLQkJCTxjbXAtdmVyc2lvbj4yLng8L2NtcC12ZXJzaW9uPgotCQkJPGFic3RyYWN0LXNjaGVtYS1uYW1lPkNNUDE8L2Fic3RyYWN0LXNjaGVtYS1uYW1lPgotCQkJPGNtcC1maWVsZD4KLQkJCQk8ZmllbGQtbmFtZT5pZDwvZmllbGQtbmFtZT4KLQkJCTwvY21wLWZpZWxkPgotCQk8L2VudGl0eT4KLQkJPGVudGl0eSBpZD0iQ01QMiI+Ci0JCQk8ZWpiLW5hbWU+Q01QMjwvZWpiLW5hbWU+Ci0JCQk8bG9jYWwtaG9tZT5lamJzLkNNUDJMb2NhbEhvbWU8L2xvY2FsLWhvbWU+Ci0JCQk8bG9jYWw+ZWpicy5DTVAyTG9jYWw8L2xvY2FsPgotCQkJPGVqYi1jbGFzcz5lamJzLkNNUDJCZWFuPC9lamItY2xhc3M+Ci0JCQk8cGVyc2lzdGVuY2UtdHlwZT5Db250YWluZXI8L3BlcnNpc3RlbmNlLXR5cGU+Ci0JCQk8cHJpbS1rZXktY2xhc3M+ZWpicy5DTVAyS2V5PC9wcmltLWtleS1jbGFzcz4KLQkJCTxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLQkJCTxjbXAtdmVyc2lvbj4yLng8L2NtcC12ZXJzaW9uPgotCQkJPGFic3RyYWN0LXNjaGVtYS1uYW1lPkNNUDI8L2Fic3RyYWN0LXNjaGVtYS1uYW1lPgotCQkJPGNtcC1maWVsZD4KLQkJCQk8ZmllbGQtbmFtZT5pZDwvZmllbGQtbmFtZT4KLQkJCTwvY21wLWZpZWxkPgotCQk8L2VudGl0eT4KLQk8L2VudGVycHJpc2UtYmVhbnM+Ci08L2VqYi1qYXI+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9NRVRBLUlORi9pYm0tZWpiLWphci1ibmQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDhkZjk5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9NRVRBLUlORi9pYm0tZWpiLWphci1ibmQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZWpiYm5kOkVKQkphckJpbmRpbmcgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplamI9ImVqYi54bWkiIHhtbG5zOmVqYmJuZD0iZWpiYm5kLnhtaSIgeG1pOmlkPSJFSkJKYXJCaW5kaW5nXzEwOTkwNzY2OTg0ODEiPg0KLSAgPGVqYkphciBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNlamItamFyX0lEIi8+DQotICA8ZWpiQmluZGluZ3MgeG1pOmlkPSJFbnRlcnByaXNlQmVhbkJpbmRpbmdfMTA5OTA3NjY5ODQ5MSIgam5kaU5hbWU9ImVqYi9lamJzL0NNUDFMb2NhbEhvbWUiPg0KLSAgICA8ZW50ZXJwcmlzZUJlYW4geG1pOnR5cGU9ImVqYjpDb250YWluZXJNYW5hZ2VkRW50aXR5IiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNDTVAxIi8+DQotICA8L2VqYkJpbmRpbmdzPg0KLSAgPGVqYkJpbmRpbmdzIHhtaTppZD0iRW50ZXJwcmlzZUJlYW5CaW5kaW5nXzEwOTkwNzY3MjkyOTUiIGpuZGlOYW1lPSJlamIvZWpicy9DTVAyTG9jYWxIb21lIj4NCi0gICAgPGVudGVycHJpc2VCZWFuIHhtaTp0eXBlPSJlamI6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjQ01QMiIvPg0KLSAgPC9lamJCaW5kaW5ncz4NCi0gIDxkZWZhdWx0Q01QQ29ubmVjdGlvbkZhY3RvcnkgeG1pOmlkPSJDTVBDb25uZWN0aW9uRmFjdG9yeUJpbmRpbmdfMTA5OTA3NjY5ODQ5MSIgam5kaU5hbWU9ImpkYmMvRGVmYXVsdCIgcmVzQXV0aD0iUGVyX0Nvbm5lY3Rpb25fRmFjdG9yeSIvPg0KLTwvZWpiYm5kOkVKQkphckJpbmRpbmc+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL01FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlNzBhOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZWpiZXh0OkVKQkphckV4dGVuc2lvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVqYmV4dD0iZWpiZXh0LnhtaSIgeG1sbnM6ZWpiPSJlamIueG1pIiB4bWk6aWQ9ImVqYi1qYXJfSUQiPg0KLSAgPGVqYkphciBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNlamItamFyX0lEIi8+DQotPC9lamJleHQ6RUpCSmFyRXh0ZW5zaW9uPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmI4YjdjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgY29tLmlibS50ZXN0LmVqYjsKLS8qKgotICogUmVtb3RlIGludGVyZmFjZSBmb3IgRW50ZXJwcmlzZSBCZWFuOiBNeUNNUAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE15Q01QIGV4dGVuZHMgamF2YXguZWpiLkVKQk9iamVjdCB7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEJlYW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2RiMDQ0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotcGFja2FnZSBjb20uaWJtLnRlc3QuZWpiOwotLyoqCi0gKiBCZWFuIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBFbnRlcnByaXNlIEJlYW46IE15Q01QCi0gKi8KLXB1YmxpYyBjbGFzcyBNeUNNUEJlYW4gZXh0ZW5kcyBjb20uaWJtLnRlc3QuQSBpbXBsZW1lbnRzIGphdmF4LmVqYi5FbnRpdHlCZWFuIHsKLQlwcml2YXRlIGphdmF4LmVqYi5FbnRpdHlDb250ZXh0IG15RW50aXR5Q3R4OwotCS8qKgotCSAqIEltcGxlbWV0YXRpb24gZmllbGQgZm9yIHBlcnNpc3RlbnQgYXR0cmlidXRlOiBrMQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGsxOwotCS8qKgotCSAqIGdldEVudGl0eUNvbnRleHQKLQkgKi8KLQlwdWJsaWMgamF2YXguZWpiLkVudGl0eUNvbnRleHQgZ2V0RW50aXR5Q29udGV4dCgpIHsKLQkJcmV0dXJuIG15RW50aXR5Q3R4OwotCX0KLQkvKioKLQkgKiBzZXRFbnRpdHlDb250ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW50aXR5Q29udGV4dChqYXZheC5lamIuRW50aXR5Q29udGV4dCBjdHgpIHsKLQkJbXlFbnRpdHlDdHggPSBjdHg7Ci0JfQotCS8qKgotCSAqIHVuc2V0RW50aXR5Q29udGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RW50aXR5Q29udGV4dCgpIHsKLQkJbXlFbnRpdHlDdHggPSBudWxsOwotCX0KLQkvKioKLQkgKiBlamJBY3RpdmF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYkFjdGl2YXRlKCkgewotCQlfaW5pdExpbmtzKCk7Ci0JfQotCS8qKgotCSAqIGVqYkNyZWF0ZSBtZXRob2QgZm9yIGEgQ01QIGVudGl0eSBiZWFuLgotCSAqLwotCXB1YmxpYyBjb20uaWJtLnRlc3QuZWpiLk15Q01QS2V5IGVqYkNyZWF0ZShqYXZhLmxhbmcuU3RyaW5nIGsxKSB0aHJvd3MgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiB7Ci0JCV9pbml0TGlua3MoKTsKLQkJdGhpcy5rMSA9IGsxOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogZWpiTG9hZAotCSAqLwotCXB1YmxpYyB2b2lkIGVqYkxvYWQoKSB7Ci0JCV9pbml0TGlua3MoKTsKLQl9Ci0JLyoqCi0JICogZWpiUGFzc2l2YXRlCi0JICovCi0JcHVibGljIHZvaWQgZWpiUGFzc2l2YXRlKCkgewotCX0KLQkvKioKLQkgKiBlamJQb3N0Q3JlYXRlCi0JICovCi0JcHVibGljIHZvaWQgZWpiUG9zdENyZWF0ZShqYXZhLmxhbmcuU3RyaW5nIGsxKSB0aHJvd3MgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiB7Ci0JfQotCS8qKgotCSAqIGVqYlJlbW92ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlJlbW92ZSgpIHRocm93cyBqYXZheC5lamIuUmVtb3ZlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCV9yZW1vdmVMaW5rcygpOwotCQl9IGNhdGNoIChqYXZhLnJtaS5SZW1vdGVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IGphdmF4LmVqYi5SZW1vdmVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCS8qKgotCSAqIGVqYlN0b3JlCi0JICovCi0JcHVibGljIHZvaWQgZWpiU3RvcmUoKSB7Ci0JfQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdhcyBnZW5lcmF0ZWQgZm9yIHN1cHBvcnRpbmcgdGhlIGFzc29jaWF0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBfaW5pdExpbmtzKCkgewotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3YXMgZ2VuZXJhdGVkIGZvciBzdXBwb3J0aW5nIHRoZSBhc3NvY2lhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIGphdmEudXRpbC5WZWN0b3IgX2dldExpbmtzKCkgewotCQlqYXZhLnV0aWwuVmVjdG9yIGxpbmtzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQkJcmV0dXJuIGxpbmtzOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3YXMgZ2VuZXJhdGVkIGZvciBzdXBwb3J0aW5nIHRoZSBhc3NvY2lhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgX3JlbW92ZUxpbmtzKCkgdGhyb3dzIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbiwgamF2YXguZWpiLlJlbW92ZUV4Y2VwdGlvbiB7Ci0JCWphdmEudXRpbC5MaXN0IGxpbmtzID0gX2dldExpbmtzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlua3Muc2l6ZSgpIDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCSgoY29tLmlibS5pdmouZWpiLmFzc29jaWF0aW9ucy5pbnRlcmZhY2VzLkxpbmspIGxpbmtzLmdldChpKSkucmVtb3ZlKCk7Ci0JCQl9IGNhdGNoIChqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uIGUpIHt9IC8vQ29uc3VtZSBGaW5kZXIgZXJyb3Igc2luY2UgSSBhbSBnb2luZyBhd2F5Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEhvbWUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QSG9tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzA5ZjIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QSG9tZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBjb20uaWJtLnRlc3QuZWpiOwotLyoqCi0gKiBIb21lIGludGVyZmFjZSBmb3IgRW50ZXJwcmlzZSBCZWFuOiBNeUNNUAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE15Q01QSG9tZSBleHRlbmRzIGphdmF4LmVqYi5FSkJIb21lIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBrZXkgZm9yIEVudGl0eSBCZWFuOiBNeUNNUAotCSAqLwotCXB1YmxpYyBjb20uaWJtLnRlc3QuZWpiLk15Q01QIGNyZWF0ZShqYXZhLmxhbmcuU3RyaW5nIGsxKSB0aHJvd3MgamF2YXguZWpiLkNyZWF0ZUV4Y2VwdGlvbiwgamF2YS5ybWkuUmVtb3RlRXhjZXB0aW9uOwotCS8qKgotCSAqIEZpbmRzIGFuIGluc3RhbmNlIHVzaW5nIGEga2V5IGZvciBFbnRpdHkgQmVhbjogTXlDTVAKLQkgKi8KLQlwdWJsaWMgY29tLmlibS50ZXN0LmVqYi5NeUNNUCBmaW5kQnlQcmltYXJ5S2V5KGNvbS5pYm0udGVzdC5lamIuTXlDTVBLZXkgcHJpbWFyeUtleSkgdGhyb3dzIGphdmF4LmVqYi5GaW5kZXJFeGNlcHRpb24sIGphdmEucm1pLlJlbW90ZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QS2V5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvY29tL2libS90ZXN0L2VqYi9NeUNNUEtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWE2Zjc5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9jb20vaWJtL3Rlc3QvZWpiL015Q01QS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1wYWNrYWdlIGNvbS5pYm0udGVzdC5lamI7Ci0vKioKLSAqIEtleSBjbGFzcyBmb3IgRW50aXR5IEJlYW46IE15Q01QCi0gKi8KLXB1YmxpYyBjbGFzcyBNeUNNUEtleSBleHRlbmRzIGNvbS5pYm0udGVzdC5BIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUgewotCi0Jc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyMDYwOTM0NTk3NjA4NDYxNjNMOwotCS8qKgotCSAqIEltcGxlbWV0YXRpb24gZmllbGQgZm9yIHBlcnNpc3RlbnQgYXR0cmlidXRlOiBrMQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGsxOwotCS8qKgotCSAqIENyZWF0ZXMgYW4gZW1wdHkga2V5IGZvciBFbnRpdHkgQmVhbjogTXlDTVAKLQkgKi8KLQlwdWJsaWMgTXlDTVBLZXkoKSB7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBib3RoIGtleXMgYXJlIGVxdWFsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhqYXZhLmxhbmcuT2JqZWN0IG90aGVyS2V5KSB7Ci0JCWlmIChvdGhlcktleSBpbnN0YW5jZW9mIGNvbS5pYm0udGVzdC5lamIuTXlDTVBLZXkpIHsKLQkJCWNvbS5pYm0udGVzdC5lamIuTXlDTVBLZXkgbyA9IChjb20uaWJtLnRlc3QuZWpiLk15Q01QS2V5KW90aGVyS2V5OwotCQkJcmV0dXJuICgodGhpcy5rMS5lcXVhbHMoby5rMSkpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhhc2ggY29kZSBmb3IgdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gKGsxLmhhc2hDb2RlKCkpOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEga2V5IGZvciBFbnRpdHkgQmVhbjogTXlDTVAKLQkgKi8KLQlwdWJsaWMgTXlDTVBLZXkoamF2YS5sYW5nLlN0cmluZyBrMSkgewotCQl0aGlzLmsxID0gazE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUJlYW4uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NzI3NDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLXBhY2thZ2UgZWpiczsKLS8qKgotICogQmVhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgRW50ZXJwcmlzZSBCZWFuOiBDTVAxCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTVAxQmVhbiBpbXBsZW1lbnRzIGphdmF4LmVqYi5FbnRpdHlCZWFuIHsKLQlwcml2YXRlIGphdmF4LmVqYi5FbnRpdHlDb250ZXh0IG15RW50aXR5Q3R4OwotCS8qKgotCSAqIHNldEVudGl0eUNvbnRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRpdHlDb250ZXh0KGphdmF4LmVqYi5FbnRpdHlDb250ZXh0IGN0eCkgewotCQlteUVudGl0eUN0eCA9IGN0eDsKLQl9Ci0JLyoqCi0JICogZ2V0RW50aXR5Q29udGV4dAotCSAqLwotCXB1YmxpYyBqYXZheC5lamIuRW50aXR5Q29udGV4dCBnZXRFbnRpdHlDb250ZXh0KCkgewotCQlyZXR1cm4gbXlFbnRpdHlDdHg7Ci0JfQotCS8qKgotCSAqIHVuc2V0RW50aXR5Q29udGV4dAotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2V0RW50aXR5Q29udGV4dCgpIHsKLQkJbXlFbnRpdHlDdHggPSBudWxsOwotCX0KLQkvKioKLQkgKiBlamJDcmVhdGUKLQkgKi8KLQlwdWJsaWMgZWpicy5DTVAxS2V5IGVqYkNyZWF0ZShqYXZhLmxhbmcuSW50ZWdlciBpZCkKLQkJdGhyb3dzIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gewotCQlzZXRJZChpZCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBlamJQb3N0Q3JlYXRlCi0JICovCi0JcHVibGljIHZvaWQgZWpiUG9zdENyZWF0ZShqYXZhLmxhbmcuSW50ZWdlciBpZCkKLQkJdGhyb3dzIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb24gewotCX0KLQkvKioKLQkgKiBlamJBY3RpdmF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYkFjdGl2YXRlKCkgewotCX0KLQkvKioKLQkgKiBlamJMb2FkCi0JICovCi0JcHVibGljIHZvaWQgZWpiTG9hZCgpIHsKLQl9Ci0JLyoqCi0JICogZWpiUGFzc2l2YXRlCi0JICovCi0JcHVibGljIHZvaWQgZWpiUGFzc2l2YXRlKCkgewotCX0KLQkvKioKLQkgKiBlamJSZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJSZW1vdmUoKSB0aHJvd3MgamF2YXguZWpiLlJlbW92ZUV4Y2VwdGlvbiB7Ci0JfQotCS8qKgotCSAqIGVqYlN0b3JlCi0JICovCi0JcHVibGljIHZvaWQgZWpiU3RvcmUoKSB7Ci0JfQotCS8qKgotCSAqIEdldCBhY2Nlc3NvciBmb3IgcGVyc2lzdGVudCBhdHRyaWJ1dGU6IGlkCi0JICovCi0JcHVibGljIGFic3RyYWN0IGphdmEubGFuZy5JbnRlZ2VyIGdldElkKCk7Ci0JLyoqCi0JICogU2V0IGFjY2Vzc29yIGZvciBwZXJzaXN0ZW50IGF0dHJpYnV0ZTogaWQKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRJZChqYXZhLmxhbmcuSW50ZWdlciBuZXdJZCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUtleS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTI0MDE2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLXBhY2thZ2UgZWpiczsKLS8qKgotICogS2V5IGNsYXNzIGZvciBFbnRpdHkgQmVhbjogQ01QMQotICovCi1wdWJsaWMgY2xhc3MgQ01QMUtleSBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQlzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzIwNjA5MzQ1OTc2MDg0NjE2M0w7Ci0JLyoqCi0JICogSW1wbGVtZW50YXRpb24gZmllbGQgZm9yIHBlcnNpc3RlbnQgYXR0cmlidXRlOiBpZAotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuSW50ZWdlciBpZDsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGVtcHR5IGtleSBmb3IgRW50aXR5IEJlYW46IENNUDEKLQkgKi8KLQlwdWJsaWMgQ01QMUtleSgpIHsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyBhIGtleSBmb3IgRW50aXR5IEJlYW46IENNUDEKLQkgKi8KLQlwdWJsaWMgQ01QMUtleShqYXZhLmxhbmcuSW50ZWdlciBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBib3RoIGtleXMgYXJlIGVxdWFsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhqYXZhLmxhbmcuT2JqZWN0IG90aGVyS2V5KSB7Ci0JCWlmIChvdGhlcktleSBpbnN0YW5jZW9mIGVqYnMuQ01QMUtleSkgewotCQkJZWpicy5DTVAxS2V5IG8gPSAoZWpicy5DTVAxS2V5KSBvdGhlcktleTsKLQkJCXJldHVybiAoKHRoaXMuaWQuZXF1YWxzKG8uaWQpKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgZm9yIHRoZSBrZXkuCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIChpZC5oYXNoQ29kZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUxvY2FsLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAxTG9jYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmZGI1OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAxTG9jYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSBlamJzOwotLyoqCi0gKiBMb2NhbCBpbnRlcmZhY2UgZm9yIEVudGVycHJpc2UgQmVhbjogQ01QMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNUDFMb2NhbCBleHRlbmRzIGphdmF4LmVqYi5FSkJMb2NhbE9iamVjdCB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUxvY2FsSG9tZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMUxvY2FsSG9tZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODU2YTMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDFMb2NhbEhvbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2UgZWpiczsKLS8qKgotICogTG9jYWwgSG9tZSBpbnRlcmZhY2UgZm9yIEVudGVycHJpc2UgQmVhbjogQ01QMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNUDFMb2NhbEhvbWUgZXh0ZW5kcyBqYXZheC5lamIuRUpCTG9jYWxIb21lIHsKLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBrZXkgZm9yIEVudGl0eSBCZWFuOiBDTVAxCi0JICovCi0JcHVibGljIGVqYnMuQ01QMUxvY2FsIGNyZWF0ZShqYXZhLmxhbmcuSW50ZWdlciBpZCkKLQkJdGhyb3dzIGphdmF4LmVqYi5DcmVhdGVFeGNlcHRpb247Ci0JLyoqCi0JICogRmluZHMgYW4gaW5zdGFuY2UgdXNpbmcgYSBrZXkgZm9yIEVudGl0eSBCZWFuOiBDTVAxCi0JICovCi0JcHVibGljIGVqYnMuQ01QMUxvY2FsIGZpbmRCeVByaW1hcnlLZXkoZWpicy5DTVAxS2V5IHByaW1hcnlLZXkpCi0JCXRocm93cyBqYXZheC5lamIuRmluZGVyRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJCZWFuLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjlhYmUxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi1wYWNrYWdlIGVqYnM7Ci0vKioKLSAqIEJlYW4gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIEVudGVycHJpc2UgQmVhbjogQ01QMgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01QMkJlYW4gaW1wbGVtZW50cyBqYXZheC5lamIuRW50aXR5QmVhbiB7Ci0JcHJpdmF0ZSBqYXZheC5lamIuRW50aXR5Q29udGV4dCBteUVudGl0eUN0eDsKLQkvKioKLQkgKiBzZXRFbnRpdHlDb250ZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW50aXR5Q29udGV4dChqYXZheC5lamIuRW50aXR5Q29udGV4dCBjdHgpIHsKLQkJbXlFbnRpdHlDdHggPSBjdHg7Ci0JfQotCS8qKgotCSAqIGdldEVudGl0eUNvbnRleHQKLQkgKi8KLQlwdWJsaWMgamF2YXguZWpiLkVudGl0eUNvbnRleHQgZ2V0RW50aXR5Q29udGV4dCgpIHsKLQkJcmV0dXJuIG15RW50aXR5Q3R4OwotCX0KLQkvKioKLQkgKiB1bnNldEVudGl0eUNvbnRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnNldEVudGl0eUNvbnRleHQoKSB7Ci0JCW15RW50aXR5Q3R4ID0gbnVsbDsKLQl9Ci0JLyoqCi0JICogZWpiQ3JlYXRlCi0JICovCi0JcHVibGljIGVqYnMuQ01QMktleSBlamJDcmVhdGUoamF2YS5sYW5nLkludGVnZXIgaWQpCi0JCXRocm93cyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIHsKLQkJc2V0SWQoaWQpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyoqCi0JICogZWpiUG9zdENyZWF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlBvc3RDcmVhdGUoamF2YS5sYW5nLkludGVnZXIgaWQpCi0JCXRocm93cyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uIHsKLQl9Ci0JLyoqCi0JICogZWpiQWN0aXZhdGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBlamJBY3RpdmF0ZSgpIHsKLQl9Ci0JLyoqCi0JICogZWpiTG9hZAotCSAqLwotCXB1YmxpYyB2b2lkIGVqYkxvYWQoKSB7Ci0JfQotCS8qKgotCSAqIGVqYlBhc3NpdmF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlBhc3NpdmF0ZSgpIHsKLQl9Ci0JLyoqCi0JICogZWpiUmVtb3ZlCi0JICovCi0JcHVibGljIHZvaWQgZWpiUmVtb3ZlKCkgdGhyb3dzIGphdmF4LmVqYi5SZW1vdmVFeGNlcHRpb24gewotCX0KLQkvKioKLQkgKiBlamJTdG9yZQotCSAqLwotCXB1YmxpYyB2b2lkIGVqYlN0b3JlKCkgewotCX0KLQkvKioKLQkgKiBHZXQgYWNjZXNzb3IgZm9yIHBlcnNpc3RlbnQgYXR0cmlidXRlOiBpZAotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBqYXZhLmxhbmcuSW50ZWdlciBnZXRJZCgpOwotCS8qKgotCSAqIFNldCBhY2Nlc3NvciBmb3IgcGVyc2lzdGVudCBhdHRyaWJ1dGU6IGlkCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SWQoamF2YS5sYW5nLkludGVnZXIgbmV3SWQpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJLZXkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhlOWJjNy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1wYWNrYWdlIGVqYnM7Ci0vKioKLSAqIEtleSBjbGFzcyBmb3IgRW50aXR5IEJlYW46IENNUDIKLSAqLwotcHVibGljIGNsYXNzIENNUDJLZXkgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7Ci0Jc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMyMDYwOTM0NTk3NjA4NDYxNjNMOwotCS8qKgotCSAqIEltcGxlbWVudGF0aW9uIGZpZWxkIGZvciBwZXJzaXN0ZW50IGF0dHJpYnV0ZTogaWQKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLkludGVnZXIgaWQ7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBlbXB0eSBrZXkgZm9yIEVudGl0eSBCZWFuOiBDTVAyCi0JICovCi0JcHVibGljIENNUDJLZXkoKSB7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBrZXkgZm9yIEVudGl0eSBCZWFuOiBDTVAyCi0JICovCi0JcHVibGljIENNUDJLZXkoamF2YS5sYW5nLkludGVnZXIgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYm90aCBrZXlzIGFyZSBlcXVhbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoamF2YS5sYW5nLk9iamVjdCBvdGhlcktleSkgewotCQlpZiAob3RoZXJLZXkgaW5zdGFuY2VvZiBlamJzLkNNUDJLZXkpIHsKLQkJCWVqYnMuQ01QMktleSBvID0gKGVqYnMuQ01QMktleSkgb3RoZXJLZXk7Ci0JCQlyZXR1cm4gKCh0aGlzLmlkLmVxdWFscyhvLmlkKSkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIGZvciB0aGUga2V5LgotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAoaWQuaGFzaENvZGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJMb2NhbC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMkxvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YWM3MzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlL2VqYnMvQ01QMkxvY2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXBhY2thZ2UgZWpiczsKLS8qKgotICogTG9jYWwgaW50ZXJmYWNlIGZvciBFbnRlcnByaXNlIEJlYW46IENNUDIKLSAqLwotcHVibGljIGludGVyZmFjZSBDTVAyTG9jYWwgZXh0ZW5kcyBqYXZheC5lamIuRUpCTG9jYWxPYmplY3QgewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJMb2NhbEhvbWUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSRWpiL2VqYk1vZHVsZS9lamJzL0NNUDJMb2NhbEhvbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGExYmRmOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUkVqYi9lamJNb2R1bGUvZWpicy9DTVAyTG9jYWxIb21lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIGVqYnM7Ci0vKioKLSAqIExvY2FsIEhvbWUgaW50ZXJmYWNlIGZvciBFbnRlcnByaXNlIEJlYW46IENNUDIKLSAqLwotcHVibGljIGludGVyZmFjZSBDTVAyTG9jYWxIb21lIGV4dGVuZHMgamF2YXguZWpiLkVKQkxvY2FsSG9tZSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEga2V5IGZvciBFbnRpdHkgQmVhbjogQ01QMgotCSAqLwotCXB1YmxpYyBlamJzLkNNUDJMb2NhbCBjcmVhdGUoamF2YS5sYW5nLkludGVnZXIgaWQpCi0JCXRocm93cyBqYXZheC5lamIuQ3JlYXRlRXhjZXB0aW9uOwotCS8qKgotCSAqIEZpbmRzIGFuIGluc3RhbmNlIHVzaW5nIGEga2V5IGZvciBFbnRpdHkgQmVhbjogQ01QMgotCSAqLwotCXB1YmxpYyBlamJzLkNNUDJMb2NhbCBmaW5kQnlQcmltYXJ5S2V5KGVqYnMuQ01QMktleSBwcmltYXJ5S2V5KQotCQl0aHJvd3MgamF2YXguZWpiLkZpbmRlckV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiYjM4Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iU0VSVkVSSkRLX1BMVUdJTkRJUi9qcmUvbGliL3J0LmphciIKLSAgICAgICAgcm9vdHBhdGg9InNyYyIgc291cmNlcGF0aD0iU0VSVkVSSkRLX1BMVUdJTkRJUi9zcmMuamFyIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic291cmNlIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iV0FTX1BMVUdJTkRJUi9saWIvajJlZS5qYXIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIiBwYXRoPSJXQVNfUExVR0lORElSL2xpYi93ZWJjb250YWluZXIuamFyIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iV0FTX1BMVUdJTkRJUi9saWIvaXZqZWpiMzUuamFyIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iV0FTX1BMVUdJTkRJUi9saWIvd2Vic3BoZXJlLmphciIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9IndlYkFwcGxpY2F0aW9uXFdFQi1JTkZcY2xhc3NlcyIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi8ud2Vic2V0dGluZ3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi8ud2Vic2V0dGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNWI5YTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvLndlYnNldHRpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHdlYnNldHRpbmdzPgotCTxjb250ZXh0LXJvb3Q+TG9vc2VFQVJXZWI8L2NvbnRleHQtcm9vdD4KLTwvd2Vic2V0dGluZ3M+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi9zb3VyY2UvY29tL2libS90ZXN0L3dlYi9DLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi9zb3VyY2UvY29tL2libS90ZXN0L3dlYi9DLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MWIzOTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvc291cmNlL2NvbS9pYm0vdGVzdC93ZWIvQy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBjb20uaWJtLnRlc3Qud2ViOwotcHVibGljIGNsYXNzIEMgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEMKLQkgKi8KLQlwdWJsaWMgQygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3dlYkFwcGxpY2F0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzUxNjBhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3dlYkFwcGxpY2F0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUNsYXNzLVBhdGg6IExvb3NlRUFSRWpiLmphcgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL2NsYXNzZXMvY29tL2libS90ZXN0L3dlYi9DLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi9jbGFzc2VzL2NvbS9pYm0vdGVzdC93ZWIvQy5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1MTEzMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL2NsYXNzZXMvY29tL2libS90ZXN0L3dlYi9DLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi9pYm0td2ViLWJuZC54bWkgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL2libS13ZWItYm5kLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc0ODQ0Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL2libS13ZWItYm5kLnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPHdlYmFwcGJuZDpXZWJBcHBCaW5kaW5nIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6d2ViYXBwYm5kPSJ3ZWJhcHBibmQueG1pIiB4bWxuczp3ZWJhcHBsaWNhdGlvbj0id2ViYXBwbGljYXRpb24ueG1pIiB4bWk6aWQ9IldlYkFwcEJpbmRpbmdfMSIgdmlydHVhbEhvc3ROYW1lPSJkZWZhdWx0X2hvc3QiPgotCTx3ZWJhcHAgaHJlZj0iV0VCLUlORi93ZWIueG1sI1dlYkFwcCIvPgotPC93ZWJhcHBibmQ6V2ViQXBwQmluZGluZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL2libS13ZWItZXh0LnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3dlYkFwcGxpY2F0aW9uL1dFQi1JTkYvaWJtLXdlYi1leHQueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmVjMjYyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSV2ViL3dlYkFwcGxpY2F0aW9uL1dFQi1JTkYvaWJtLXdlYi1leHQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPHdlYmFwcGV4dDpXZWJBcHBFeHRlbnNpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczp3ZWJhcHBleHQ9IndlYmFwcGV4dC54bWkiIHhtbG5zOndlYmFwcGxpY2F0aW9uPSJ3ZWJhcHBsaWNhdGlvbi54bWkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtaTppZD0iV2ViQXBwRXh0ZW5zaW9uXzEiCi0gIHJlbG9hZEludGVydmFsPSIzIgotICByZWxvYWRpbmdFbmFibGVkPSJ0cnVlIgotICBkZWZhdWx0RXJyb3JQYWdlPSJlcnJvci5qc3AiCi0gIGFkZGl0aW9uYWxDbGFzc1BhdGg9IiIKLSAgZmlsZVNlcnZpbmdFbmFibGVkPSJ0cnVlIgotICBkaXJlY3RvcnlCcm93c2luZ0VuYWJsZWQ9ImZhbHNlIgotICBzZXJ2ZVNlcnZsZXRzQnlDbGFzc25hbWVFbmFibGVkPSJ0cnVlIj4KLQk8d2ViQXBwIGhyZWY9IldFQi1JTkYvd2ViLnhtbCNXZWJBcHAiLz4KLTwvd2ViYXBwZXh0OldlYkFwcEV4dGVuc2lvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MTJlZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJXZWIvd2ViQXBwbGljYXRpb24vV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjIvL0VOIiAiaHR0cDovL2phdmEuc3VuLmNvbS9qMmVlL2R0ZHMvd2ViLWFwcF8yXzIuZHRkIj4KLTx3ZWItYXBwIGlkPSJXZWJBcHAiPgotCTxkaXNwbGF5LW5hbWU+TG9vc2VFQVJXZWI8L2Rpc3BsYXktbmFtZT4KLQk8d2VsY29tZS1maWxlLWxpc3Q+Ci0JCTx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotCQk8d2VsY29tZS1maWxlPmluZGV4Lmh0bTwvd2VsY29tZS1maWxlPgotCQk8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotCQk8d2VsY29tZS1maWxlPmRlZmF1bHQuaHRtbDwvd2VsY29tZS1maWxlPgotCQk8d2VsY29tZS1maWxlPmRlZmF1bHQuaHRtPC93ZWxjb21lLWZpbGU+Ci0JCTx3ZWxjb21lLWZpbGU+ZGVmYXVsdC5qc3A8L3dlbGNvbWUtZmlsZT4KLQk8L3dlbGNvbWUtZmlsZS1saXN0PgotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhVXRpbC8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhVXRpbC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIzZmEwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVV0aWwvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iSlJFX0xJQiIgcm9vdHBhdGg9IkpSRV9TUkNST09UIiBzb3VyY2VwYXRoPSJKUkVfU1JDIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVV0aWwvYmluL2NvbS9pYm0vdGVzdC9BLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhVXRpbC9iaW4vY29tL2libS90ZXN0L0EuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmY2ZmZjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhVXRpbC9iaW4vY29tL2libS90ZXN0L0EuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFVdGlsL3NyYy9jb20vaWJtL3Rlc3QvQS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhVXRpbC9zcmMvY29tL2libS90ZXN0L0EuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdmMDljMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFVdGlsL3NyYy9jb20vaWJtL3Rlc3QvQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBjb20uaWJtLnRlc3Q7Ci1wdWJsaWMgY2xhc3MgQSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQQotCSAqLwotCXB1YmxpYyBBKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhV2ViTGliLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YjNmYTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhV2ViTGliLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiIHJvb3RwYXRoPSJKUkVfU1JDUk9PVCIgc291cmNlcGF0aD0iSlJFX1NSQyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUphdmFXZWJMaWIvYmluL2NvbS9pYm0vd2ViL3Rlc3QvQi5jbGFzcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi9iaW4vY29tL2libS93ZWIvdGVzdC9CLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2VlNTY0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi9iaW4vY29tL2libS93ZWIvdGVzdC9CLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhV2ViTGliL3NyYy9jb20vaWJtL3dlYi90ZXN0L0IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlSmF2YVdlYkxpYi9zcmMvY29tL2libS93ZWIvdGVzdC9CLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMTg1MzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VKYXZhV2ViTGliL3NyYy9jb20vaWJtL3dlYi90ZXN0L0IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2UgY29tLmlibS53ZWIudGVzdDsKLXB1YmxpYyBjbGFzcyBCIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBCCi0JICovCi0JcHVibGljIEIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvYm9vLmphci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL2Jvby5qYXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NDNlM2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvYm9vLmphci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1DbGFzcy1QYXRoOiB1dGlsLmphciBMb29zZUVBUkVqYi9iaW4gZm9vYmFyLmphciAKLQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9mb29iYXIuamFyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlUmVzb3VyY2VzL2xvb3NlX21vZHVsZV93b3Jrc3BhY2UvZm9vYmFyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9mb29iYXIuamFyCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL3JlYWRtZS50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVSZXNvdXJjZXMvbG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjE5NWI0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVJlc291cmNlcy9sb29zZV9tb2R1bGVfd29ya3NwYWNlL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGlzIG5vdCBhIGZ1bGwgV1NBRCB3b3Jrc3BhY2U7IGl0IGlzIGp1c3QgdGhlIGZpbGVzIG5lY2Vzc2FyeSB0byBlbXVsYXRlIG9uZSwgZm9yIHVuaXQgdGVzdGluZyB0aGUgcnVudGltZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQWxsRE9NVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvQWxsRE9NVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0OWI5NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FsbERPTVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBTZXAgNSwgMjAwMwotICoKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEFsbERPTVRlc3RzIGV4dGVuZHMgVGVzdENhc2V7Ci0JCi0JcHJpdmF0ZSBSZW5kZXJlckZhY3RvcnkgZGVmYXVsdFJlbmRlcmVyRmFjdG9yeTsKLQotICAgIHB1YmxpYyBBbGxET01UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIEFsbERPTVRlc3RzKFN0cmluZyBuYW1lLCBSZW5kZXJlckZhY3RvcnkgcmYpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMuZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSA9IHJmOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdCIpOwotCQkvLyRKVW5pdC1CRUdJTiQKLQkJc3VpdGUuYWRkVGVzdChuZXcgQWxsRE9NVGVzdHMoInRlc3RTd2l0Y2hSZW5kZXJlciIsIFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQkJc3VpdGUuYWRkVGVzdChBcHBDbGllbnRFTUZFZGl0VGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChBcHBDbGllbnRFTUZUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEVhckVNRkVkaXRUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEVhckVNRlRlc3Quc3VpdGUoKSk7IC8vCi0JCXN1aXRlLmFkZFRlc3QoRWpiRU1GRWRpdFRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRWpiRU1GVGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChSYXJFTUZFZGl0VGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChSYXJFTUZUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFdhckVNRkVkaXRUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFdhckVNRlRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoV2ViU2VydmljZXNFTUZUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBbGxET01UZXN0cygidGVzdFN3aXRjaFJlbmRlcmVyQmFjayIsIFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLSAKLQkJLy8kSlVuaXQtRU5EJAotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCSBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5tYWluKG5ldyBTdHJpbmdbXSB7IEFsbERPTVRlc3RzLmNsYXNzLmdldE5hbWUoKSB9KTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hSZW5kZXJlcigpIHsKLQkJUmVuZGVyZXJGYWN0b3J5LnNldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoRU1GMkRPTVJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSk7Ci0JCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3aXRjaFJlbmRlcmVyQmFjaygpIHsKLQkJUmVuZGVyZXJGYWN0b3J5LnNldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoZGVmYXVsdFJlbmRlcmVyRmFjdG9yeSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FsbFNBWFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FsbFNBWFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YzMyNmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BbGxTQVhUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDUsIDIwMDMKLSAqCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMlNBWFJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxTQVhUZXN0cyBleHRlbmRzIFRlc3RDYXNlewotCi0JcHJpdmF0ZSBSZW5kZXJlckZhY3RvcnkgZGVmYXVsdFJlbmRlcmVyRmFjdG9yeTsKLQkKLQlBbGxUZXN0cyB0ZXN0cyA9IG5ldyBBbGxUZXN0cygpOyAvLyBmb3JjZSB0aGUgY2xhc3MgdG8gbG9hZCBpZiB0aGlzIHRlc3QgaXMgbG9hZGVkIAotICAKLQlwdWJsaWMgQWxsU0FYVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfSAKLQotCXB1YmxpYyBBbGxTQVhUZXN0cyhTdHJpbmcgbmFtZSwgUmVuZGVyZXJGYWN0b3J5IHJmKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQl0aGlzLmRlZmF1bHRSZW5kZXJlckZhY3RvcnkgPSByZjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0IGZvciBjb20uaWJtLmV0b29scy5hcmNoaXZlLmVtZnRlc3QiKTsKLQkJLy8kSlVuaXQtQkVHSU4kCi0JCXN1aXRlLmFkZFRlc3QobmV3IEFsbFNBWFRlc3RzKCJ0ZXN0U3dpdGNoUmVuZGVyZXIiLCBSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQXBwQ2xpZW50RU1GRWRpdFRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoQXBwQ2xpZW50RU1GVGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChFYXJFTUZFZGl0VGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChFYXJFTUZUZXN0LnN1aXRlKCkpOyAvLwotCQlzdWl0ZS5hZGRUZXN0KEVqYkVNRkVkaXRUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEVqYkVNRlRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoUmFyRU1GRWRpdFRlc3Quc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoUmFyRU1GVGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChXYXJFTUZFZGl0VGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChXYXJFTUZUZXN0LnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KFdlYlNlcnZpY2VzRU1GVGVzdC5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQWxsU0FYVGVzdHMoInRlc3RTd2l0Y2hSZW5kZXJlckJhY2siLCBSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKSk7Ci0KLQkJLy8kSlVuaXQtRU5EJAotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCSBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5tYWluKG5ldyBTdHJpbmdbXSB7IEFsbFNBWFRlc3RzLmNsYXNzLmdldE5hbWUoKSB9KTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hSZW5kZXJlcigpIHsKLQkJUmVuZGVyZXJGYWN0b3J5LnNldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoRU1GMlNBWFJlbmRlcmVyRmFjdG9yeS5JTlNUQU5DRSk7IAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoUmVuZGVyZXJCYWNrKCkgewotCQlSZW5kZXJlckZhY3Rvcnkuc2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeShkZWZhdWx0UmVuZGVyZXJGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FsbFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMzAwOGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIENvbW1vbiBBcmNoaXZlIGFuZCBFTUYgVGVzdHMiKTsKLSAgICAgICAgLy8kSlVuaXQtQkVHSU4kCi0KLQkJc3VpdGUuYWRkVGVzdChBbGxET01UZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChBbGxTQVhUZXN0cy5zdWl0ZSgpKTsKLQotCQkvLyRKVW5pdC1FTkQkCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJanVuaXQudGV4dHVpLlRlc3RSdW5uZXIubWFpbihuZXcgU3RyaW5nW10geyBBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkgfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FwcENsaWVudEVNRkVkaXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FwcENsaWVudEVNRkVkaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyOWYwNjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BcHBDbGllbnRFTUZFZGl0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXBwbGljYXRpb25DbGllbnRGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50RU1GRWRpdFRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GRWRpdGluZ1Rlc3QgewotICAgIEVBUkZpbGUgZWFyRmlsZTsKLSAgICBBcHBsaWNhdGlvbkNsaWVudEZpbGUgYXBwQ2xpZW50RmlsZTsKLQotICAgIHB1YmxpYyBBcHBDbGllbnRFTUZFZGl0VGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWpiRmFjdG9yeSBnZXRFamJGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBBcHBsaWNhdGlvbkZhY3RvcnkgZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2ViYXBwbGljYXRpb25GYWN0b3J5IGdldFdlYkFwcEZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYmFwcGxpY2F0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFN0cmluZ1tdIGNsYXNzTmFtZSA9IHsgImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5BcHBDbGllbnRFTUZFZGl0VGVzdCIsICItbm9sb2FkaW5nIiB9OwotICAgICAgICBUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBBcHBDbGllbnRFTUZFZGl0VGVzdCgidGVzdEFwcGxpY2F0aW9uQ2xpZW50RWRpdCIpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBsaWNhdGlvbkNsaWVudEVkaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0QXBwQ2xpZW50KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiMS4zIiwgYXBwQ2xpZW50RmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFZlcnNpb24oKSk7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSBERCA9IChBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlKSBhcHBDbGllbnRGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXNldE1vZHVsZVR5cGUoQVBQX0NMSUVOVCk7Ci0gICAgICAgIGVkaXRSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0gICAgICAgIFN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLSAgICAgICAgU3RyaW5nIG91dCA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L0VNRk1vZGVsQ3JlYXRpb25UZXN0cy9FZGl0QXBwRUFSIjsKLSAgICAgICAgYXBwQ2xpZW50RmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotICAgICAgICBhcHBDbGllbnRGaWxlLmNsb3NlKCk7Ci0KLSAgICAgICAgLy9Db21wYXJlCi0gICAgICAgIAotICAgICAgICBTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAiRU1GVGVzdHMvYXBwbGljYXRpb24tY2xpZW50LnhtbCI7Ci0gICAgICAgIFN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgb3V0ICsgIi9BcHBDbGllbnRmb28vTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbCI7Ci0JCXNldElnbm9yZUF0dChpZ25vcmFibGVBdHRyaWJ1dGVzKCkpOwotICAgICAgICAvL2NvbXBhcmVDb250ZW50cyhjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2V0QXBwQ2xpZW50KCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJsb29zZV9tb2R1bGVfd29ya3NwYWNlL0xvb3NlRUFSQXBwL2Zvb0FQUC8iOwotICAgICAgICBhcHBDbGllbnRGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXBwbGljYXRpb25DbGllbnRGaWxlKGluKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIEhhc2hTZXQgaWdub3JhYmxlQXR0cmlidXRlcygpewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoImlkIik7Ci0JCXJldHVybiBzZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9BcHBDbGllbnRFTUZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FwcENsaWVudEVNRlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5ZjRmZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0FwcENsaWVudEVNRlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRFTUZUZXN0IGV4dGVuZHMgR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0IHsKLSAgICBFQVJGaWxlIGVhckZpbGU7Ci0gICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhcHBDbGllbnRGaWxlOwotCUVBUkZpbGUgZWFyRmlsZTE0OwotCUFwcGxpY2F0aW9uQ2xpZW50RmlsZSBhcHBDbGllbnRGaWxlMTQ7Ci0KLSAgICBwdWJsaWMgQXBwQ2xpZW50RU1GVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0V2ViQXBwRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LkFwcENsaWVudEVNRlRlc3QiLCAiLW5vbG9hZGluZyIgfTsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgQXBwQ2xpZW50RU1GVGVzdCgidGVzdEFwcGxpY2F0aW9uQ2xpZW50UG9wdWxhdGlvbiIpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgQXBwQ2xpZW50RU1GVGVzdCgidGVzdDE0QXBwbGljYXRpb25DbGllbnRQb3B1bGF0aW9uIikpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uQ2xpZW50UG9wdWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0gICAgICAgIGNyZWF0ZUVBUigpOwotICAgICAgICBjcmVhdGVBcHBDbGllbnQoKTsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UpIGFwcENsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotICAgICAgICBzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLSAgICAgICAgc2V0TW9kdWxlVHlwZShBUFBfQ0xJRU5UKTsKLSAgICAgICAgcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0KLQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9UZXN0QXBwRUFSIjsKLSAgICAgICAgZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotICAgICAgICBlYXJGaWxlLmNsb3NlKCk7Ci0KLSAgICAgICAgLy9Db21wYXJlCi0gICAgICAgIFN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgIkVNRlRlc3ROb0lEL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiOwotICAgICAgICBTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RBcHBFQVIvZm9vQVBQL01FVEEtSU5GL2FwcGxpY2F0aW9uLWNsaWVudC54bWwiOwotCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgdGVzdDE0QXBwbGljYXRpb25DbGllbnRQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQlFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLnJlc2V0KCk7Ci0JCQljcmVhdGVFQVIoKTsKLQkJCWNyZWF0ZUFwcENsaWVudCgpOwotCi0JCQlBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UpIGFwcENsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkJREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLQkJCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQkJc2V0TW9kdWxlVHlwZShBUFBfQ0xJRU5UKTsKLQkJCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCi0JCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RBcHBFQVIxNCI7Ci0JCQllYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQkJCWdldEFwcDE0Q2xpZW50KCk7Ci0JCQlhc3NlcnRFcXVhbHMoIjEuNCIsIGFwcENsaWVudEZpbGUxNC5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFZlcnNpb24oKSk7Ci0JCQlvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdEFwcEVBUjE0XzIiOwotCQkJYXBwQ2xpZW50RmlsZTE0LmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCQlhcHBDbGllbnRGaWxlMTQuY2xvc2UoKTsKLQkJCQotCQkJLy9Db21wYXJlCi0JCQlTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0JCQlTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RBcHBFQVIxNC9mb29BUFAvTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbCI7Ci0JCQlTdHJpbmcgc2Vjb25kRGVwbG95bWVudERlc1VSSSA9IG91dCArICIvTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtbCI7Ci0JCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJCWNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoY3VyRGVwbG95bWVudERlc1VSSSwgc2Vjb25kRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUFwcENsaWVudCgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotICAgICAgICBhcHBDbGllbnRGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVJbml0aWFsaXplZCgiZm9vQVBQIik7Ci0gICAgICAgIGFwcENsaWVudEZpbGUgPSAoQXBwbGljYXRpb25DbGllbnRGaWxlKSBlYXJGaWxlLmFkZENvcHkoYXBwQ2xpZW50RmlsZSk7Ci0gICAgICAgIGFwcENsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5zZXREaXNwbGF5TmFtZSgiZm9vQVBQIik7Ci0gICAgICAgIGFzc2VydFRydWUoYXBwQ2xpZW50RmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUVBUigpIHsKLSAgICAgICAgU3RyaW5nIGVhck5hbWUgPSAiVGVzdC5lYXIiOwotICAgICAgICBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoZWFyTmFtZSk7Ci0gICAgICAgIGFzc2VydFRydWUoZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotICAgIH0KLSAgICAKLSAgICAKLQlwdWJsaWMgdm9pZCBnZXRBcHAxNENsaWVudCgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9UZXN0QXBwRUFSMTQvZm9vQVBQIjsKLQkJYXBwQ2xpZW50RmlsZTE0ID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXBwbGljYXRpb25DbGllbnRGaWxlKGluKTsKLQl9Ci0gICAgCi0gICAgcHVibGljIEhhc2hTZXQgaWdub3JhYmxlQXR0cmlidXRlcygpewotICAgIAlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgCXNldC5hZGQoImlkIik7Ci0gICAgCXJldHVybiBzZXQ7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FYXJFTUZFZGl0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FYXJFTUZFZGl0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDExNjBlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvRWFyRU1GRWRpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgRWFyRU1GRWRpdFRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GRWRpdGluZ1Rlc3QgewotICAgIEVBUkZpbGUgZWFyRmlsZTsKLSAgICBpbnQgY3JlYXRlZE1vZHVsZXMgPSAwOwotCi0gICAgcHJpdmF0ZSBpbnQgTlVNX01PRFVMRVMgPSA0OwotCi0gICAgcHVibGljIEVhckVNRkVkaXRUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0V2ViQXBwRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LkVhckVNRkVkaXRUZXN0IiwgIi1ub2xvYWRpbmciIH07Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IEVhckVNRkVkaXRUZXN0KCJ0ZXN0RUFSRWRpdCIpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFQVJFZGl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldEVBUigpOwotCi0JCWFzc2VydEVxdWFscygiMS4yIiwgZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFZlcnNpb24oKSk7Ci0KLSAgICAgICAgQXBwbGljYXRpb25SZXNvdXJjZSBERCA9IChBcHBsaWNhdGlvblJlc291cmNlKSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXNldE1vZHVsZVR5cGUoQVBQSUNBVElPTik7IAotICAgICAgICBlZGl0Um9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgb3V0ID0gY3VyRGlyICsidGVzdE91dHB1dC9FZGl0T3V0cHV0L0VNRk1vZGVsQ3JlYXRpb25UZXN0cy9FZGl0RUFSIjsKLSAgICAgICAgZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotICAgICAgICBlYXJGaWxlLmNsb3NlKCk7Ci0KLSAgICAgICAgLy9Db21wYXJlIHdvcmsgaW4gcHJvZ3Jlc3MKLSAgICAgICAKLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgIkVNRlRlc3RzL2FwcGxpY2F0aW9uLnhtbCI7Ci0gICAgICAgIFN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgb3V0ICsgIi9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiOwotICAgICAgICAvL2NvbXBhcmVDb250ZW50cyhjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZ2V0RUFSKCkgdGhyb3dzIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAibG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUi8iOwotICAgICAgICBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShpbik7Ci0gICAgICAgIGFzc2VydFRydWUoZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotICAgIH0KLSAgICAKLQlwdWJsaWMgSGFzaFNldCBpZ25vcmFibGVBdHRyaWJ1dGVzKCl7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJc2V0LmFkZCgiaWQiKTsKLQkJcmV0dXJuIHNldDsKLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIk1vZHVsZSIpKSB7Ci0JCQljcmVhdGVkTW9kdWxlcysrOwotCQkJc3dpdGNoIChjcmVhdGVkTW9kdWxlcykgewotCQkJCWNhc2UgKDEpIDoKLQkJCQkJcmV0dXJuIGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQkJY2FzZSAoMikgOgotCQkJCQlyZXR1cm4gY3JlYXRlRUpCTW9kdWxlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJCWNhc2UgKDMpIDoKLQkJCQkJcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCQljYXNlICg0KSA6Ci0JCQkJCXJldHVybiBjcmVhdGVDb25uZXRvck1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlQ29ubmV0b3JNb2R1bGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoQXBwbGljYXRpb25GYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlQ29ubmVjdG9yTW9kdWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVdlYk1vZHVsZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChBcHBsaWNhdGlvbkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVXZWJNb2R1bGUoKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlRUpCTW9kdWxlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiAoKEFwcGxpY2F0aW9uRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZUVqYk1vZHVsZSgpOwotCX0KLQotCXByaXZhdGUgRU9iamVjdCBjcmVhdGVKYXZhTW9kdWxlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCXJldHVybiAoKEFwcGxpY2F0aW9uRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZUphdmFDbGllbnRNb2R1bGUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFNoYXJlZE9iamVjdEJ5VHlwZShFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoIm1vZHVsZSIpKQotCQkJcmV0dXJuIGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZSgoRUNsYXNzKSByZWYuZ2V0RVR5cGUoKSk7Ci0JCXJldHVybiBzdXBlci5nZXRTaGFyZWRPYmplY3RCeVR5cGUob3duZXIsIHJlZik7Ci0JfQotCi0JcHVibGljIGludCBnZXREZXB0aEZvckF0dHJpYnV0ZShFUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoIm1vZHVsZXMiKSkKLQkJCXJldHVybiBOVU1fTU9EVUxFUzsKLQkJcmV0dXJuIHN1cGVyLmdldERlcHRoRm9yQXR0cmlidXRlKHJlZik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FYXJFTUZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VhckVNRlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRmOTY0OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VhckVNRlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBFYXJFTUZUZXN0IGV4dGVuZHMgR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0IHsKLSAgICBwcm90ZWN0ZWQgRUFSRmlsZSBlYXJGaWxlOwotICAgIGludCBjcmVhdGVkTW9kdWxlcyA9IDA7Ci0KLSAgICBwcml2YXRlIGludCBOVU1fTU9EVUxFUyA9IDU7Ci0KLSAgICBwdWJsaWMgRWFyRU1GVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRWpiRmFjdG9yeSBnZXRFamJGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBBcHBsaWNhdGlvbkZhY3RvcnkgZ2V0QXBwbGljYXRpb25GYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gQXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgV2ViYXBwbGljYXRpb25GYWN0b3J5IGdldFdlYkFwcEZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYmFwcGxpY2F0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFN0cmluZ1tdIGNsYXNzTmFtZSA9IHsgImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5FYXJFTUZUZXN0IiwgIi1ub2xvYWRpbmciIH07Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IEVhckVNRlRlc3QoInRlc3RFQVJQb3B1bGF0aW9uIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFYXJFTUZUZXN0KCJ0ZXN0MTRFQVJQb3B1bGF0aW9uIikpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVBUlBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotICAgICAgICBjcmVhdGVFQVIoKTsKLSAgICAgICAgLy9jcmVhdGVBcHBDbGllbnQoKTsKLQotICAgICAgICBBcHBsaWNhdGlvblJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uUmVzb3VyY2UpIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCURELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlzZXRNb2R1bGVUeXBlKEFQUElDQVRJT04pOwotICAgICAgICBwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RFQVIiOwotICAgICAgICBlYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIGVhckZpbGUuY2xvc2UoKTsKLQotICAgICAgICAvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotICAgICAgICBTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0gICAgICAgIFN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJFTUZUZXN0Tm9JRC9hcHBsaWNhdGlvbi54bWwiOwotICAgICAgICBTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RFQVIvTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIjsKLQkJc2V0SWdub3JlQXR0KGlnbm9yYWJsZUF0dHJpYnV0ZXMoKSk7Ci0JCWNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkksIG51bGwpOwotICAgIH0KLSAgICAKLQlwdWJsaWMgdm9pZCB0ZXN0MTRFQVJQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJY3JlYXRlRUFSKCk7Ci0JCS8vY3JlYXRlQXBwQ2xpZW50KCk7Ci0KLQkJQXBwbGljYXRpb25SZXNvdXJjZSBERCA9IChBcHBsaWNhdGlvblJlc291cmNlKSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJc2V0TW9kdWxlVHlwZShBUFBJQ0FUSU9OKTsKLQkJcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0KLQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9UZXN0RUFSMTQiOwotCQllYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCWVhckZpbGUuY2xvc2UoKTsKLQotCQlnZXRFQVIoKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjQiLCBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLQkJb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RFQVIxNF8yIjsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQkKLQkJZWFyRmlsZS5jbG9zZSgpOwotCi0JCS8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0JCVN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLQkJU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gb3V0ICsgIi9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiOwotCQlTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RFQVIxNC9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwiOwotCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0JfQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUVBUigpIHsKLSAgICAgICAgU3RyaW5nIGVhck5hbWUgPSAiVGVzdC5lYXIiOwotICAgICAgICBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoZWFyTmFtZSk7Ci0gICAgICAgIGFzc2VydFRydWUoZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotICAgIH0KLQotCXB1YmxpYyB2b2lkIGdldEVBUigpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBpbiA9QXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RFQVIxNCI7Ci0JCWVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKGluKTsKLQkJYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBIYXNoU2V0IGlnbm9yYWJsZUF0dHJpYnV0ZXMoKXsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlzZXQuYWRkKCJpZCIpOwotCQlyZXR1cm4gc2V0OwotCX0KLQotICAgIHB1YmxpYyBFT2JqZWN0IGNyZWF0ZUluc3RhbmNlKEVSZWZlcmVuY2UgcmVmLCBFT2JqZWN0IGVPYmplY3QpIHsKLQkJRUNsYXNzIGVDbGFzc2lmaWVyID0gKEVDbGFzcylyZWYuZ2V0RVR5cGUoKTsKLSAgICAgICAgaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIk1vZHVsZSIpKSB7Ci0gICAgICAgICAgICBjcmVhdGVkTW9kdWxlcysrOwotICAgICAgICAgICAgc3dpdGNoIChjcmVhdGVkTW9kdWxlcykgewotICAgICAgICAgICAgICAgIGNhc2UgKDEpIDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0gICAgICAgICAgICAgICAgY2FzZSAoMikgOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRUpCTW9kdWxlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgICAgICAgICAgICAgIGNhc2UgKDMpIDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVdlYk1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICAgICAgICAgICAgICBjYXNlICg0KSA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVDb25uZXRvck1vZHVsZUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUluc3RhbmNlKHJlZixlT2JqZWN0KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVPYmplY3QgY3JlYXRlQ29ubmV0b3JNb2R1bGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLSAgICAgICAgcmV0dXJuICgoQXBwbGljYXRpb25GYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlQ29ubmVjdG9yTW9kdWxlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVdlYk1vZHVsZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotICAgICAgICByZXR1cm4gKChBcHBsaWNhdGlvbkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVXZWJNb2R1bGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEVPYmplY3QgY3JlYXRlRUpCTW9kdWxlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIHJldHVybiAoKEFwcGxpY2F0aW9uRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZUVqYk1vZHVsZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRU9iamVjdCBjcmVhdGVKYXZhTW9kdWxlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIHJldHVybiAoKEFwcGxpY2F0aW9uRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZUphdmFDbGllbnRNb2R1bGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFNoYXJlZE9iamVjdEJ5VHlwZShFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZikgewotICAgICAgICBpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoIm1vZHVsZSIpKQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUphdmFNb2R1bGVJbnN0YW5jZSgoRUNsYXNzKSByZWYuZ2V0RVR5cGUoKSk7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRTaGFyZWRPYmplY3RCeVR5cGUob3duZXIsIHJlZik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXREZXB0aEZvckF0dHJpYnV0ZShFU3RydWN0dXJhbEZlYXR1cmUgcmVmKSB7Ci0gICAgICAgIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygibW9kdWxlcyIpKQotICAgICAgICAgICAgcmV0dXJuIE5VTV9NT0RVTEVTOwotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGVwdGhGb3JBdHRyaWJ1dGUocmVmKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VqYkVNRkVkaXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0VqYkVNRkVkaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjM2U0ODcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FamJFTUZFZGl0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RQZXJtaXNzaW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeU1ldGhvZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyU0FYUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgRWpiRU1GRWRpdFRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GRWRpdGluZ1Rlc3QgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFamJQYWNrYWdlIEVKQl9QS0cgPSBFamJQYWNrYWdlLmVJTlNUQU5DRTsKLQlFQVJGaWxlIGVhckZpbGU7Ci0JRUpCSmFyRmlsZSBlamJGaWxlOwotCUVPYmplY3QgbWVzQmVhbiwgZW50aXR5QmVhbjsKLQlTZWN1cml0eUlkZW50aXR5IHNlY0lEOwotCVJvbGVTb3VyY2Ugcm9sZVNvdXJjZTsKLQlpbnQgTlVNX0JFQU5TID0gMTA7Ci0JZmluYWwgaW50IE5VTV9SRUxBVElPTl9ST0xFUyA9IDI7Ci0JaW50IGNyZWF0ZWRCZWFucyA9IDA7Ci0JaW50IGNyZWF0ZWRTZWNSb2xlcyA9IDA7Ci0JcHJvdGVjdGVkIGludCBjcmVhdGVkU2VjdXJpdHlJZGVudGl0aWVzID0gMDsKLQlib29sZWFuIG1wRmxhZyA9IGZhbHNlOwotCi0gICAgcHVibGljIEVqYkVNRkVkaXRUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0V2ViQXBwRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJanVuaXQudGV4dHVpLlRlc3RSdW5uZXIubWFpbihuZXcgU3RyaW5nW10geyBFamJFTUZFZGl0VGVzdC5jbGFzcy5nZXROYW1lKCkgfSk7IAotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIAotICAgICAgICAvKlN5c3RlbS5vdXQucHJpbnRsbigiU3dpdGNoaW5nIHRvIFNBWCBSZW5kZXJlciBpbiAiICsgRWpiRU1GRWRpdFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQWxsU0FYVGVzdHMoInRlc3RTd2l0Y2hSZW5kZXJlciIpKTsqLwotCQkKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgRWpiRU1GRWRpdFRlc3QoInRlc3RFSkJKYXJFZGl0IikpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBFamJFTUZFZGl0VGVzdCgidGVzdFdDQ01KYXIiKSk7Ci0gICAgICAgIC8qc3VpdGUuYWRkVGVzdChuZXcgRWpiRU1GRWRpdFRlc3QoInRlc3RXQ0NNUHJvdmlkZWRDYXNlIikpOyovCi0gICAgICAgIAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVKQkphckVkaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0RUpCKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIyLjAiLCBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJc2V0TW9kdWxlVHlwZShFSkIpOyAKLSAgICAgICAgZWRpdFJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotICAgICAgICBTdHJpbmcgb3V0ID0gY3VyRGlyICsgInRlc3RPdXRwdXQvRU1GTW9kZWxDcmVhdGlvblRlc3RzL0VkaXRFamJFQVIiOwotICAgICAgICBlamJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIGVqYkZpbGUuY2xvc2UoKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gbnVsbDsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7Ci0gICAgICAgIGlmIChSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpIGluc3RhbmNlb2YgRU1GMlNBWFJlbmRlcmVyRmFjdG9yeSl7Ci0gICAgICAgICAgICBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJFTUZUZXN0cy9lamItamFyMi0wc2F4LnhtbCI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAiRU1GVGVzdHMvZWpiLWphcjItMC54bWwiOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRmlsZTogIiArIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJKTsKLSAgICAgICAgU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBvdXQgKyAiL01FVEEtSU5GL2VqYi1qYXIueG1sIjsKLSAgICAgICAgY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSwgIiIpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXQ0NNSmFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIi4uL3Rlc3REYXRhL2VqYiI7Ci0JCUFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLQkJb3B0aW9ucy5zZXRJc1JlYWRPbmx5KHRydWUpOwotCQllamJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUpCSmFyRmlsZShvcHRpb25zLCBpbik7IAotCQkgCi0gICAgICAgIEVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJREQuZ2V0Um9vdE9iamVjdCgpOwotCi0gICAgICAgIFN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICIuLi90ZXN0RGF0YS90ZXN0T3V0cHV0IjsKLSAgICAgICAgZWpiRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotICAgICAgICBlamJGaWxlLmNsb3NlKCk7Ci0KLSAgICAgICAgLypERC5zYXZlKFN5c3RlbS5vdXQsIG51bGwpOyAqLwotICAgICAgICAKLSAgICAgICAgLy9Db21wYXJlIHdvcmsgaW4gcHJvZ3Jlc3MKLSAgICAgICAgU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotICAgICAgICBTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBpbiArICIvTUVUQS1JTkYvZWpiLWphci54bWwiOwotICAgICAgICBTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IG91dCArICIvTUVUQS1JTkYvZWpiLWphci54bWwiOwotCi0gICAgICAgIGNvbXBhcmVDb250ZW50cyhjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFJlcXVpcmVzIGoyZWUuY29yZS53cy5leHQgdG8gYmUgb24gdGhlIGNsYXNzcGF0aAotICAgICAqIEB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uCi0gICAgICogQHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbgotICAgICAqLwotLyogICAgcHVibGljIHZvaWQgdGVzdFdDQ01Qcm92aWRlZENhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICIuLi93Y2NtL2VhciI7Ci0gICAgICAgIEVBUkZpbGUgZWFyRmlsZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gCi0gICAgICAgICAgICBDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5ID0KLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmdldEFjdGl2ZUZhY3RvcnkoKTsKLSAgICAgICAgICAgIEFyY2hpdmVPcHRpb25zIG9wdCA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotICAgICAgICAgICAgb3B0LnNldElzUmVhZE9ubHkgKHRydWUpOwotICAgICAgICAgICAgb3B0LnNldFVzZUphdmFSZWZsZWN0aW9uIChmYWxzZSk7Ci0gCi0gICAgICAgICAgICBlYXJGaWxlID0gZmFjdG9yeS5vcGVuRUFSRmlsZSAob3B0LCBpbik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCJ1cmk6ICIgKyBlYXJGaWxlLmdldFVSSSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiAoIm9yaWd1cmk6ICIgKyBlYXJGaWxlLmdldE9yaWdpbmFsVVJJKCkpOwotIAotICAgICAgICAgICAgQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICBBcHBsaWNhdGlvbkJpbmRpbmcgYXBwQmluZGluZ3MgPSBlYXJGaWxlLmdldEJpbmRpbmdzKCk7Ci0gICAgICAgICAgICBBcHBsaWNhdGlvbkV4dGVuc2lvbiBhcHBFeHRlbnNpb25zID0gZWFyRmlsZS5nZXRFeHRlbnNpb25zKCk7Ci0gCi0KLSAgICAgICAgSXRlcmF0b3IgcnMgPSBlYXJGaWxlLmdldExvYWRlZE1vZlJlc291cmNlcygpLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChycy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlc291cmNlIHIgPSAoUmVzb3VyY2UpIHJzLm5leHQoKTsKLSAKLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm8gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSAoci5nZXRVUkkoKS50b1N0cmluZygpLnJlcGxhY2UoJy8nLCAnLScpKTsKLSAgICAgICAgICAgIHIuc2F2ZSAoZm8sIG5ldyBIYXNoTWFwKCkpOwotICAgICAgICAgICAgZm8uZmx1c2goKTsKLSAgICAgICAgICAgIGZvLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PTxEb25lIEFwcCBERD49PT09PT09PT09Iik7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4gKCIiKTsKLSAKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmKGVhckZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgIGVhckZpbGUuY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgfSovCi0KLSAgICBwdWJsaWMgdm9pZCBnZXRFSkIoKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uLCBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImxvb3NlX21vZHVsZV93b3Jrc3BhY2UvTG9vc2VFQVJFamIvZWpiTW9kdWxlLyI7Ci0JCSBlamJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUpCSmFyRmlsZShpbik7Ci0gICAgICAgIGFzc2VydFRydWUoZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotICAgIH0KLQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiRW50ZXJwcmlzZUJlYW4iKSkgewotCQkJY3JlYXRlZEJlYW5zKys7Ci0JCQlzd2l0Y2ggKGNyZWF0ZWRCZWFucykgewotCQkJCWNhc2UgKDMpIDoKLQkJCQkJcmV0dXJuIGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQkJY2FzZSAoNykgOgotCQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZUJlYW5JbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQkJY2FzZSAoNCkgOgotCQkJCWNhc2UgKDgpIDoKLQkJCQkJcmV0dXJuIGNyZWF0ZVNlc3Npb25CZWFuSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gY3JlYXRlRW50aXR5QmVhbkluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlQ2xhc3NpZmllci5nZXROYW1lKCkuZXF1YWxzKCJTZWN1cml0eUlkZW50aXR5IikpCi0JCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlJZGVudGl0aXlJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCWVsc2UgaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIlJvbGVTb3VyY2UiKSkKLQkJCXJldHVybiBjcmVhdGVSb2xlU291cmNlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQllbHNlIGlmIChlQ2xhc3NpZmllciA9PSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVBdHRyaWJ1dGUoKSkKLQkJCXJldHVybiBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVNlY3VyaXR5SWRlbnRpdGl5SW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCS8qIEFsdGVybmF0ZSB0eXBlcyAqLwotCQljcmVhdGVkU2VjUm9sZXMrKzsKLQkJaWYgKChjcmVhdGVkU2VjUm9sZXMgJiAxKSA9PSAwKQotCQkJcmV0dXJuIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVzZUNhbGxlcklkZW50aXR5KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5KCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVJvbGVTb3VyY2VJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZVJvbGVTb3VyY2UoKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlTWVzc2FnZUJlYW5JbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZU1lc3NhZ2VEcml2ZW4oKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlU2Vzc2lvbkJlYW5JbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZVNlc3Npb24oKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlRW50aXR5QmVhbkluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlRW50aXR5KCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdC5HZW5lcmFsRU1GVGVzdCNnZXREZXB0aEZvckF0dHJpYnV0ZShFUmVmZXJlbmNlKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVwdGhGb3JBdHRyaWJ1dGUoRVJlZmVyZW5jZSByZWYpIHsKLQkJaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKCJlbnRlcnByaXNlQmVhbnMiKSkKLQkJCXJldHVybiBOVU1fQkVBTlM7Ci0JCWVsc2UgaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKCJlbnRpdHlCZWFucyIpKQotCQkJcmV0dXJuIE5VTV9CRUFOUzsKLQkJZWxzZSBpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoInJlbGF0aW9uc2hpcFJvbGVzIikpCi0JCQlyZXR1cm4gTlVNX1JFTEFUSU9OX1JPTEVTOwotCQlyZXR1cm4gc3VwZXIuZ2V0RGVwdGhGb3JBdHRyaWJ1dGUocmVmKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdC5HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QjcG9wdWxhdGVGZWF0dXJlcyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkqLwotCXB1YmxpYyB2b2lkIHBvcHVsYXRlRmVhdHVyZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0LmVDbGFzcygpID09IEVKQl9QS0cuZ2V0Q01QQXR0cmlidXRlKCkpIHsKLQkJCSgoQ01QQXR0cmlidXRlKSBlT2JqZWN0KS5zZXROYW1lKChTdHJpbmcpIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlQXR0cmlidXRlKEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RU5hbWVkRWxlbWVudF9OYW1lKCksZU9iamVjdCkpOwotCQkJKChDTVBBdHRyaWJ1dGUpIGVPYmplY3QpLnNldEVUeXBlKChFQ2xhc3NpZmllcikgY3JlYXRlSmF2YUNsYXNzUHJveHkobnVsbCkpOwotCQl9IGVsc2UKLQkJCXN1cGVyLmVkaXRGZWF0dXJlcyhlT2JqZWN0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmVtZnRlc3QuR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0I3BvcHVsYXRlQXR0cmlidXRlcyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUF0dHJpYnV0ZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgUXVlcnlNZXRob2RJbXBsKSB7Ci0JCQlMaXN0IGF0dHJpYnV0ZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFQXR0cmlidXRlIGF0dCA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLQkJCQlPYmplY3QgdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCQkJCWlmIChhdHQuZ2V0TmFtZSgpLmVxdWFscygicGFybXMiKSAmJiB2YWx1ZSA9PSBudWxsKXsKLQkJCQkJdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCQkJCX0KLQkJCQlpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpKQotCQkJCQllT2JqZWN0LmVTZXQoYXR0LCB2YWx1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZU9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb25JbXBsKSB7Ci0JCQlMaXN0IGF0dHJpYnV0ZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFQXR0cmlidXRlIGF0dCA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLQkJCQlpZihhdHQuZ2V0TmFtZSgpLmVxdWFscygidW5jaGVja2VkIikgJiYgbXBGbGFnKXsKLQkJCQkJY29udGludWU7CQkJCQkKLQkJCQl9CQotCQkJCQotCQkJCU9iamVjdCB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCQkJaWYgKGF0dC5pc0NoYW5nZWFibGUoKSkKLQkJCQkJZU9iamVjdC5lU2V0KGF0dCwgdmFsdWUpOwotCQkJfSAKLQkJCW1wRmxhZyA9ICFtcEZsYWc7Ci0JCX0gZWxzZQotCQkJc3VwZXIuZWRpdEF0dHJpYnV0ZXMoZU9iamVjdCk7Ci0JfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoRU9iamVjdCBlT2JqZWN0LCBFUmVmZXJlbmNlIHJlZikgewotCQlpZihlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGVybWlzc2lvbkltcGwgJiYgcmVmLmdldE5hbWUoKS5lcXVhbHMoInJvbGVzIikpewotCQkJbXBGbGFnID0gIW1wRmxhZzsKLQkJCS8vaWYgbWV0aG9kIHBlcm1pc3Npb24gdW5jaGVja2VkIGlnbm9yZSByb2xlcwotCQkJaWYoIW1wRmxhZyl7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLnBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKGVPYmplY3QsIHJlZik7Ci0JfQotCi0JcHVibGljIEhhc2hTZXQgaWdub3JhYmxlQXR0cmlidXRlcygpewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoImlkIik7Ci0JCXJldHVybiBzZXQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQllYXJGaWxlID0gbnVsbDsKLQkJZWpiRmlsZSA9IG51bGw7Ci0JCW1lc0JlYW4gPSBudWxsOwotCQllbnRpdHlCZWFuID0gbnVsbDsKLQkJc2VjSUQgID0gbnVsbDsKLQkJcm9sZVNvdXJjZSA9IG51bGw7Ci0KLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvRWpiRU1GVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FamJFTUZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxODFiNTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9FamJFTUZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5FSkJSZWxhdGlvbnNoaXBSb2xlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5NZXRob2RQZXJtaXNzaW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuaW50ZXJuYWwuaW1wbC5RdWVyeU1ldGhvZEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUluaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgRWpiRU1GVGVzdCBleHRlbmRzIEdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCB7Ci0Jc3RhdGljIHsKLQkJLy9UZW1wb3Jhcnkgd29ya2Fyb3VuZCB0byBrZWVwIHBhY2thZ2VzIGZyb20gYmVpbmcgcmVnaXN0ZXJlZCB0d2ljZQotCQlKMkVFSW5pdC5pbml0KCk7Ci0JfQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRWpiUGFja2FnZSBFSkJfUEtHID0gRWpiUGFja2FnZS5lSU5TVEFOQ0U7Ci0JRUFSRmlsZSBlYXJGaWxlOwotCXByb3RlY3RlZCBFSkJKYXJGaWxlIGVqYkZpbGU7Ci0JRU9iamVjdCBtZXNCZWFuLCBlbnRpdHlCZWFuOwotCVNlY3VyaXR5SWRlbnRpdHkgc2VjSUQ7Ci0JUm9sZVNvdXJjZSByb2xlU291cmNlOwotCWludCBOVU1fQkVBTlMgPSAxMDsKLQlmaW5hbCBpbnQgTlVNX1JFTEFUSU9OX1JPTEVTID0gMjsKLQlpbnQgY3JlYXRlZEJlYW5zID0gMDsKLQlpbnQgY3JlYXRlZFNlY1JvbGVzID0gMDsKLQlwcm90ZWN0ZWQgaW50IGNyZWF0ZWRTZWN1cml0eUlkZW50aXRpZXMgPSAwOwotCWJvb2xlYW4gbXBGbGFnID0gZmFsc2U7Ci0JYm9vbGVhbiBmaXJzdFJldHVyblR5cGVNYXBwaW5nID0gdHJ1ZTsKLQlwdWJsaWMgRWpiRU1GVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgRWpiRmFjdG9yeSBnZXRFamJGYWN0b3J5KCkgewotCQlyZXR1cm4gRUpCX1BLRy5nZXRFamJGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0V2ViQXBwRmFjdG9yeSgpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJanVuaXQudGV4dHVpLlRlc3RSdW5uZXIubWFpbihuZXcgU3RyaW5nW10geyBFamJFTUZUZXN0LmNsYXNzLmdldE5hbWUoKX0pOwotCX0KLQlwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0KLQkJLypTeXN0ZW0ub3V0LnByaW50bG4oIlN3aXRjaGluZyB0byBTQVggUmVuZGVyZXIgaW4gIiArIEVqYkVNRlRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQWxsU0FYVGVzdHMoInRlc3RTd2l0Y2hSZW5kZXJlciIpKTsqLwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFamJFTUZUZXN0KCJ0ZXN0RUpCSmFyUG9wdWxhdGlvbiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRWpiRU1GVGVzdCgidGVzdDE0RUpCSmFyUG9wdWxhdGlvbiIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFSkJKYXJQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJY3JlYXRlRUFSKCk7Ci0JCWNyZWF0ZUVKQigpOwotCi0JCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJc2V0TW9kdWxlVHlwZShFSkIpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RFSkJFQVIiOwotCQllYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCWVhckZpbGUuY2xvc2UoKTsKLQkJc2V0RXF1aXZhbGVudExpbmVzKGdldEVxdWl2YWxlbnRMaW5lc01hcCgpKTsKLQkJLy9Db21wYXJlIHdvcmsgaW4gcHJvZ3Jlc3MKLQkJU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotCQlTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAiL0VNRlRlc3ROb0lEL2VqYi1qYXIueG1sIjsKLQkJU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9UZXN0RUpCRUFSL2Zvb0VKQi9NRVRBLUlORi9lamItamFyLnhtbCI7Ci0JCXNldElnbm9yZUF0dChpZ25vcmFibGVBdHRyaWJ1dGVzKCkpOwotCQljb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJLCBudWxsKTsKLS8vCQlERC51bmxvYWQoKTsKLS8vCQlERC5sb2FkKG5ldyBIYXNoTWFwKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MTRFSkJKYXJQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJY3JlYXRlRUFSKCk7Ci0JCWNyZWF0ZUVKQigpOwotCi0JCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJc2V0TW9kdWxlVHlwZShFSkIpOwotCQkvL3NldEdlbmVyYWxEZXB0aCgyKTsKLQkJcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvVGVzdEVKQkVBUjE0IjsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0JCQotCQlzZXRFcXVpdmFsZW50TGluZXMoZ2V0RXF1aXZhbGVudExpbmVzTWFwKCkpOwotCQlnZXRFSkIoKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjEiLCBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLQkJb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RFSkJFQVIxNF8yIjsKLQkJZWpiRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllamJGaWxlLmNsb3NlKCk7Ci0KLQkJLy9Db21wYXJlIHdvcmsgaW4gcHJvZ3Jlc3MKLQkJU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotCQlTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBvdXQgKyAiL01FVEEtSU5GL2VqYi1qYXIueG1sIjsKLQkJU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9UZXN0RUpCRUFSMTQvZm9vRUpCL01FVEEtSU5GL2VqYi1qYXIueG1sIjsKLQkJc2V0SWdub3JlQXR0KGlnbm9yYWJsZUF0dHJpYnV0ZXMoKSk7Ci0JCWNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkksIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBNYXAgZ2V0RXF1aXZhbGVudExpbmVzTWFwKCkgewotCQlNYXAgbGluZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlsaW5lcy5wdXQoIjxjYXNjYWRlLWRlbGV0ZT48L2Nhc2NhZGUtZGVsZXRlPiIsICI8Y2FzY2FkZS1kZWxldGUvPiIpOwotCQlsaW5lcy5wdXQoIjxtZXRob2QtcGFyYW1zPjwvbWV0aG9kLXBhcmFtcz4iLCI8bWV0aG9kLXBhcmFtcy8+Iik7Ci0JCWxpbmVzLnB1dCgiPHVuY2hlY2tlZD48L3VuY2hlY2tlZD4iLCI8dW5jaGVja2VkLz4iKTsgCi0JCWxpbmVzLnB1dCgiPHVzZS1jYWxsZXItaWRlbnRpdHk+PC91c2UtY2FsbGVyLWlkZW50aXR5PiIsIjx1c2UtY2FsbGVyLWlkZW50aXR5Lz4iKTsKLQkJcmV0dXJuIGxpbmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGdldEVKQigpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RFSkJFQVIxNC9mb29FSkIiOwotCQllamJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUpCSmFyRmlsZShpbik7Ci0JCWFzc2VydFRydWUoZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUVKQigpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotCQllamJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFSkJKYXJGaWxlSW5pdGlhbGl6ZWQoImZvb0VKQiIpOwotCQllamJGaWxlID0gKEVKQkphckZpbGUpIGVhckZpbGUuYWRkQ29weShlamJGaWxlKTsKLQkJZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLnNldERpc3BsYXlOYW1lKCJmb29FSkIiKTsKLQkJYXNzZXJ0VHJ1ZShlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRUFSKCkgewotCQlTdHJpbmcgZWFyTmFtZSA9ICJUZXN0LmVhciI7Ci0JCWVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChlYXJOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIEVPYmplY3QgY3JlYXRlSW5zdGFuY2UoRVJlZmVyZW5jZSByZWYsIEVPYmplY3QgZU9iamVjdCkgewotCQlFQ2xhc3MgZUNsYXNzaWZpZXIgPSAoRUNsYXNzKXJlZi5nZXRFVHlwZSgpOwotCQlpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiRW50ZXJwcmlzZUJlYW4iKSkgewotCQkJY3JlYXRlZEJlYW5zKys7Ci0JCQlzd2l0Y2ggKGNyZWF0ZWRCZWFucykgewotCQkJCWNhc2UgKDMpIDoKLQkJCQkJcmV0dXJuIGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQkJY2FzZSAoNykgOgotCQkJCQlyZXR1cm4gY3JlYXRlTWVzc2FnZUJlYW5JbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCQkJY2FzZSAoNCkgOgotCQkJCWNhc2UgKDgpIDoKLQkJCQkJcmV0dXJuIGNyZWF0ZVNlc3Npb25CZWFuSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gY3JlYXRlRW50aXR5QmVhbkluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlQ2xhc3NpZmllci5nZXROYW1lKCkuZXF1YWxzKCJTZWN1cml0eUlkZW50aXR5IikpCi0JCQlyZXR1cm4gY3JlYXRlU2VjdXJpdHlJZGVudGl0aXlJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0JCWVsc2UgaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIlJvbGVTb3VyY2UiKSkKLQkJCXJldHVybiBjcmVhdGVSb2xlU291cmNlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCQllbHNlIGlmIChlQ2xhc3NpZmllciA9PSBFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVBdHRyaWJ1dGUoKSkKLQkJCXJldHVybiBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVJbnN0YW5jZShyZWYsZU9iamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVNlY3VyaXR5SWRlbnRpdGl5SW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0JCS8qIEFsdGVybmF0ZSB0eXBlcyAqLwotCQljcmVhdGVkU2VjUm9sZXMrKzsKLQkJaWYgKChjcmVhdGVkU2VjUm9sZXMgJiAxKSA9PSAwKQotCQkJcmV0dXJuIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVVzZUNhbGxlcklkZW50aXR5KCk7Ci0JCWVsc2UKLQkJCXJldHVybiBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5KCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVJvbGVTb3VyY2VJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZVJvbGVTb3VyY2UoKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlTWVzc2FnZUJlYW5JbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZU1lc3NhZ2VEcml2ZW4oKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlU2Vzc2lvbkJlYW5JbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZVNlc3Npb24oKTsKLQl9Ci0KLQlwcml2YXRlIEVPYmplY3QgY3JlYXRlRW50aXR5QmVhbkluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotCQlyZXR1cm4gKChFamJGYWN0b3J5KSBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKSkuY3JlYXRlRW50aXR5KCk7Ci0JfQotCi0JcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHlJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJcmV0dXJuIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdC5HZW5lcmFsRU1GVGVzdCNnZXREZXB0aEZvckF0dHJpYnV0ZShFUmVmZXJlbmNlKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVwdGhGb3JBdHRyaWJ1dGUoRVN0cnVjdHVyYWxGZWF0dXJlIHJlZikgewotCQlpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoImVudGVycHJpc2VCZWFucyIpKQotCQkJcmV0dXJuIE5VTV9CRUFOUzsKLQkJZWxzZSBpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoImVudGl0eUJlYW5zIikpCi0JCQlyZXR1cm4gTlVNX0JFQU5TOwotCQllbHNlIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygicmVsYXRpb25zaGlwUm9sZXMiKSkKLQkJCXJldHVybiBOVU1fUkVMQVRJT05fUk9MRVM7Ci0JCXJldHVybiBzdXBlci5nZXREZXB0aEZvckF0dHJpYnV0ZShyZWYpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0LkdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCNwb3B1bGF0ZUZlYXR1cmVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSovCi0JcHVibGljIHZvaWQgcG9wdWxhdGVGZWF0dXJlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QuZUNsYXNzKCkgPT0gRUpCX1BLRy5nZXRDTVBBdHRyaWJ1dGUoKSkgewotCQkJKChDTVBBdHRyaWJ1dGUpIGVPYmplY3QpLnNldE5hbWUoKFN0cmluZykgRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVBdHRyaWJ1dGUoRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKSxlT2JqZWN0KSk7Ci0JCQkoKENNUEF0dHJpYnV0ZSkgZU9iamVjdCkuc2V0RVR5cGUoKEVDbGFzc2lmaWVyKSBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUphdmFDbGFzc1Byb3h5KEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RVR5cGVkRWxlbWVudF9FVHlwZSgpLGVPYmplY3QpKTsKLQkJfSBlbHNlIGlmIChlT2JqZWN0LmVDbGFzcygpID09IEVKQl9QS0cuZ2V0Q01SRmllbGQoKSkgewotCQkJKChDTVJGaWVsZCkgZU9iamVjdCkuc2V0TmFtZSgoU3RyaW5nKSBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUF0dHJpYnV0ZShFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmdldEVOYW1lZEVsZW1lbnRfTmFtZSgpLGVPYmplY3QpKTsKLQkJCXBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKGVPYmplY3QsIEVKQl9QS0cuZ2V0Q01SRmllbGRfQ29sbGVjdGlvblR5cGUoKSk7Ci0JCQlwb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShlT2JqZWN0LCBFSkJfUEtHLmdldENNUkZpZWxkX1JvbGUoKSk7CQkKLQkJfSBlbHNlCi0JCQlzdXBlci5wb3B1bGF0ZUZlYXR1cmVzKGVPYmplY3QpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdC5HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QjcG9wdWxhdGVBdHRyaWJ1dGVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQXR0cmlidXRlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBRdWVyeU1ldGhvZEltcGwpIHsKLQkJCUxpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgeyAKLQkJCQlFQXR0cmlidXRlIGF0dCA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLQkJCQlpZiAoYXR0LmVxdWFscyhFSkJfUEtHLmdldE1ldGhvZEVsZW1lbnRfRGVzY3JpcHRpb24oKSkgfHwgYXR0LmVxdWFscyhFSkJfUEtHLmdldE1ldGhvZEVsZW1lbnRfRW50ZXJwcmlzZUJlYW4oKSkgfHwgYXR0LmVxdWFscyhFSkJfUEtHLmdldE1ldGhvZEVsZW1lbnRfVHlwZSgpKSApCi0JCQkJCWNvbnRpbnVlOwotCQkJCU9iamVjdCB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCQkJaWYgKGF0dC5nZXROYW1lKCkuZXF1YWxzKCJwYXJtcyIpICYmIHZhbHVlID09IG51bGwpewotCQkJCQl2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCQkJfQotCQkJCWlmIChhdHQuaXNDaGFuZ2VhYmxlKCkpCi0JCQkJCWVPYmplY3QuZVNldChhdHQsIHZhbHVlKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChlT2JqZWN0IGluc3RhbmNlb2YgTWV0aG9kUGVybWlzc2lvbkltcGwpIHsKLQkJCUxpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotCQkJCUVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJCWlmKGF0dC5nZXROYW1lKCkuZXF1YWxzKCJ1bmNoZWNrZWQiKSAmJiBtcEZsYWcpewotCQkJCQljb250aW51ZTsJCQkJCQotCQkJCX0JCi0JCQkJCi0JCQkJT2JqZWN0IHZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJCQlpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpKQotCQkJCQllT2JqZWN0LmVTZXQoYXR0LCB2YWx1ZSk7Ci0JCQl9IAotCQkJbXBGbGFnID0gIW1wRmxhZzsKLQkJfSBlbHNlIGlmIChlT2JqZWN0IGluc3RhbmNlb2YgRUpCUmVsYXRpb25zaGlwUm9sZUltcGwpIHsKLQkJCUxpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLQkJCUVBdHRyaWJ1dGUgbGFzdEF0dHIgPSBudWxsOwotCQkJT2JqZWN0IHZhbHVlID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotCQkJCUVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotCQkJCWlmIChhdHQuZ2V0TmFtZSgpLmVxdWFscygiY2FzY2FkZURlbGV0ZSIpICYmIChsYXN0QXR0ci5nZXROYW1lKCkuZXF1YWxzKCJtdWx0aXBsaWNpdHkiKSAmJiAhdmFsdWUudG9TdHJpbmcoKS5lcXVhbHMoIk1hbnkiKSkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCQkJCWlmIChhdHQuaXNDaGFuZ2VhYmxlKCkpCi0JCQkJCWVPYmplY3QuZVNldChhdHQsIHZhbHVlKTsKLQkJCQlsYXN0QXR0ciA9IGF0dDsKLQkJfQotCQkJbXBGbGFnID0gIW1wRmxhZzsKLQkJfSBlbHNlCi0JCQlzdXBlci5wb3B1bGF0ZUF0dHJpYnV0ZXMoZU9iamVjdCk7Ci0JfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoRU9iamVjdCBlT2JqZWN0LCBFUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmID09IEVKQl9QS0cuZ2V0Q01SRmllbGRfQ29sbGVjdGlvblR5cGUoKSkgewotCQkJc2V0UmVmZXJlbmNlVmFsdWUoZU9iamVjdCwgcmVmLCBKYXZhQ2xhc3NJbXBsLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpKTsKLQkJCXJldHVybjsKLQkJfSBlbHNlIGlmKGVPYmplY3QgaW5zdGFuY2VvZiBNZXRob2RQZXJtaXNzaW9uICYmIHJlZi5nZXROYW1lKCkuZXF1YWxzKCJyb2xlcyIpKXsKLQkJCS8vaWYgbWV0aG9kIHBlcm1pc3Npb24gdW5jaGVja2VkIGlnbm9yZSByb2xlcwotCQkJaWYobXBGbGFnKXsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQltcEZsYWcgPSAhbXBGbGFnOwotCQl9Ci0JCXN1cGVyLnBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKGVPYmplY3QsIHJlZik7Ci0JfQotCi0JcHVibGljIEhhc2hTZXQgaWdub3JhYmxlQXR0cmlidXRlcygpewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoImlkIik7Ci0JCXJldHVybiBzZXQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0LkdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCNjcmVhdGVBdHRyaWJ1dGVWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZSwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShFQXR0cmlidXRlIGF0dCwgRU9iamVjdCBlT2JqZWN0KSB7Ci0JCS8vZWF0IHRoZSBmaXJzdCByZXR1cm4gdHlwZSBtYXBwaW5nIGJlY2F1c2UgdGhlIG9yZGVyIHdhcyBjaGFuZ2VkLgotCQlpZiAoZmlyc3RSZXR1cm5UeXBlTWFwcGluZyAmJiBhdHQuZXF1YWxzKEVKQl9QS0cuZ2V0UXVlcnlfUmV0dXJuVHlwZU1hcHBpbmcoKSkpewotCQkJc3VwZXIuY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LGVPYmplY3QpOwotCQkJZmlyc3RSZXR1cm5UeXBlTWFwcGluZyA9IGZhbHNlOwotCQl9IGVsc2UgaWYgKGF0dC5lcXVhbHMoRUpCX1BLRy5nZXRFbnRlcnByaXNlQmVhbl9OYW1lKCkpKQotCQkJcmV0dXJuIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlQXR0cmlidXRlKGF0dCxFSkJfUEtHLmdldEVudGl0eSgpKTsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQllYXJGaWxlID0gbnVsbDsKLQkJZWpiRmlsZSA9IG51bGw7Ci0JCW1lc0JlYW4gPSBudWxsOwotCQllbnRpdHlCZWFuID0gbnVsbDsKLQkJc2VjSUQgPSBudWxsOwotCQlyb2xlU291cmNlID0gbnVsbDsKLQotCQkKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvR2VuZXJhbEVNRkVkaXRpbmdUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0dlbmVyYWxFTUZFZGl0aW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmUzZGY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvR2VuZXJhbEVNRkVkaXRpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5KMkVFVmVyc2lvbkNoZWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5UZXN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkJhc2VUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJhbEVNRkVkaXRpbmdUZXN0IGV4dGVuZHMgQmFzZVRlc3RDYXNlIHsKLQkvL2lubmVyIGNsYXNzIHRvIGhhbmRsZSBkZWZmZXJlZCBzaGFyZWQgcmVmZXJlbmNlcwotCXByb3RlY3RlZCBjbGFzcyBEZWZlcnJlZFNoYXJlZFJlZmVyZW5jZUFjdGlvbiB7Ci0JCUVPYmplY3Qgb3duZXI7Ci0JCUVSZWZlcmVuY2UgcmVmOwotCi0JCXB1YmxpYyBEZWZlcnJlZFNoYXJlZFJlZmVyZW5jZUFjdGlvbihFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZikgewotCQkJdGhpcy5vd25lciA9IG93bmVyOwotCQkJdGhpcy5yZWYgPSByZWY7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgewotCQkJT2JqZWN0IHZhbHVlID0gZ2V0U2hhcmVkT2JqZWN0QnlUeXBlKG93bmVyLCByZWYpOwotCQkJc2V0UmVmZXJlbmNlVmFsdWUob3duZXIsIHJlZiwgdmFsdWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE1hcCBlcXVpdmFsZW50TGluZXM7Ci0JcHVibGljIExpc3QgZGVmZXJlZFJlZmVyZW5jZXM7Ci0JcHVibGljIHN0YXRpYyBpbnQgZ2VuRGVwdGggPSA1OwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IHNoYXJlZFZhbHVlOwotCXB1YmxpYyBpbnQgY2xhc3NJbmRleCA9IDA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXZDbGFzc1tdOwotCXB1YmxpYyBzdGF0aWMgSGFzaFNldCBpZ25vcmVBdHQ7Ci0KLQlwdWJsaWMgaW50IHZlcnNpb247Ci0JcHVibGljIGludCBtb2R1bGVUeXBlOwotCS8vc3RhdGljIHZlcnNpb25zCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzIgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8zID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfNCA9IDI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBJQ0FUSU9OID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUFBfQ0xJRU5UID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUT1IgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVKQiA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VCID0gNDsKLQotCXB1YmxpYyBHZW5lcmFsRU1GRWRpdGluZ1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZWRpdFJvb3QoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWVkaXRGZWF0dXJlcyhlT2JqZWN0KTsKLQkJLy9pZiAoZGVmZXJlZFJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkvLwlmb3IgKGludCBpID0gMDsgaSA8IGRlZmVyZWRSZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0JCS8vCQkoKERlZmVycmVkU2hhcmVkUmVmZXJlbmNlQWN0aW9uKSBkZWZlcmVkUmVmZXJlbmNlcy5nZXQoaSkpLnBlcmZvcm1BY3Rpb24oKTsKLQkJLy8JfQotCQkvL30KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlZGl0RmVhdHVyZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UgewotCQkJZWRpdEF0dHJpYnV0ZXMoZU9iamVjdCk7Ci0JCQllZGl0UmVmZXJlbmNlcyhlT2JqZWN0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVkaXRSZWZlcmVuY2VzKEVPYmplY3QgZU9iamVjdCkgewotCQlMaXN0IHJlZmVyZW5jZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotCQkJRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQlpZiAoIXJlZi5pc01hbnkoKSAmJiBlT2JqZWN0LmVHZXQocmVmKSAhPSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHJlZi5pc0NvbnRhaW5tZW50KCkpCi0JCQkJcG9wdWxhdGVDb250YWlubWVudFJlZmVyZW5jZShlT2JqZWN0LCByZWYpOwotCQkJZWxzZQotCQkJCXBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKGVPYmplY3QsIHJlZik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmIChyZWYuZ2V0RVR5cGUoKSA9PSBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzKCkpCi0JCQlzZXRSZWZlcmVuY2VWYWx1ZShlT2JqZWN0LCByZWYsIGNyZWF0ZUphdmFDbGFzc1Byb3h5KChFQ2xhc3MpIHJlZi5nZXRFVHlwZSgpKSk7Ci0JCWVsc2UgewotCQkJRVBhY2thZ2UgcGtnID0gcmVmLmdldEVUeXBlKCkuZ2V0RVBhY2thZ2UoKTsKLQkJCWlmIChwa2cgPT0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpIHx8IHBrZyA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSkgewotCQkJCWlmIChlT2JqZWN0LmVDbGFzcygpLmdldE5hbWUoKS5lcXVhbHMoIkVBbm5vdGF0aW9uIikgfHwgZU9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJFQW5ub3RhdGlvbkltcGwiKSB8fCAhSjJFRVZlcnNpb25DaGVjay5jaGVja1JlZmVyZW5jZVZlcnNpb24ocmVmLCB2ZXJzaW9uLCBtb2R1bGVUeXBlKSkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChkZWZlcmVkUmVmZXJlbmNlcyA9PSBudWxsKQotCQkJCQlkZWZlcmVkUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlkZWZlcmVkUmVmZXJlbmNlcy5hZGQobmV3IERlZmVycmVkU2hhcmVkUmVmZXJlbmNlQWN0aW9uKGVPYmplY3QsIHJlZikpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVDb250YWlubWVudFJlZmVyZW5jZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0RGVwdGhGb3JBdHRyaWJ1dGUocmVmKTsgaSsrKSB7Ci0JCQlFT2JqZWN0IGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UoKEVDbGFzcykgcmVmLmdldEVUeXBlKCkpOwotCQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJaWYgKCFKMkVFVmVyc2lvbkNoZWNrLmNoZWNrUmVmZXJlbmNlVmVyc2lvbihyZWYsIHZlcnNpb24sIG1vZHVsZVR5cGUpKQotCQkJCWNvbnRpbnVlOwotCQkJc2V0UmVmZXJlbmNlVmFsdWUoZU9iamVjdCwgcmVmLCBpbnN0YW5jZSk7Ci0JCQlpZiAoKChJbnRlcm5hbEVPYmplY3QpIGluc3RhbmNlKS5lSXNQcm94eSgpKQotCQkJCXJldHVybjsKLQkJCWlmIChyZWYuZ2V0RVR5cGUoKSA9PSBlT2JqZWN0LmVDbGFzcygpKQotCQkJCWVkaXRBdHRyaWJ1dGVzKGluc3RhbmNlKTsKLQkJCWVsc2UKLQkJCQllZGl0RmVhdHVyZXMoaW5zdGFuY2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVmZXJlbmNlVmFsdWUoRU9iamVjdCBlT2JqZWN0LCBFUmVmZXJlbmNlIHJlZiwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygiRUFubm90YXRpb24iKSB8fCByZWYuZ2V0TmFtZSgpLmVxdWFscygiRUFubm90YXRpb25JbXBsIikgfHwgIUoyRUVWZXJzaW9uQ2hlY2suY2hlY2tSZWZlcmVuY2VWZXJzaW9uKHJlZiwgdmVyc2lvbiwgbW9kdWxlVHlwZSkpCi0JCQlyZXR1cm47Ci0JCWlmIChyZWYuaXNNYW55KCkpIHsKLQkJCUxpc3QgbGlzdCA9IChMaXN0KSBlT2JqZWN0LmVHZXQocmVmKTsKLQkJCWlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pCi0JCQkJbGlzdC5hZGRBbGwoKENvbGxlY3Rpb24pIHZhbHVlKTsKLQkJCWVsc2UKLQkJCQlsaXN0LmFkZCh2YWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQllT2JqZWN0LmVTZXQocmVmLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQkJaWYgKGVDbGFzc2lmaWVyID09IEphdmFSZWZQYWNrYWdlLmVJTlNUQU5DRS5nZXRKYXZhQ2xhc3MoKSkKLQkJCXJldHVybiBjcmVhdGVKYXZhQ2xhc3NQcm94eShlQ2xhc3NpZmllcik7Ci0JCXJldHVybiBlQ2xhc3NpZmllci5nZXRFUGFja2FnZSgpLmdldEVGYWN0b3J5SW5zdGFuY2UoKS5jcmVhdGUoZUNsYXNzaWZpZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVkaXRBdHRyaWJ1dGVzKEVPYmplY3QgZU9iamVjdCkgewotCQlMaXN0IGF0dHJpYnV0ZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotCQkJRUF0dHJpYnV0ZSBhdHQgPSAoRUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0JCQlpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpICYmIEoyRUVWZXJzaW9uQ2hlY2suY2hlY2tBdHRyaWJ1dGVWZXJzaW9uKGF0dCwgdmVyc2lvbiwgbW9kdWxlVHlwZSkpIHsKLQkJCQlPYmplY3QgdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCQkJCWVPYmplY3QuZVNldChhdHQsIHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgY3JlYXRlQXR0cmlidXRlVmFsdWUoRUF0dHJpYnV0ZSBhdHQsIEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoYXR0LmdldEVUeXBlKCkgPT0gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFDbGFzcygpKSB7Ci0JCQlyZXR1cm4gY3JlYXRlSmF2YUNsYXNzUHJveHkoYXR0LmVDbGFzcygpKS5nZXRDbGFzcygpOwotCQl9IAotCQkvLyBpZiAobW9kdWxlVHlwZSA9PSBXRUIpCi0JCQlyZXR1cm4gRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVBdHRyaWJ1dGUoYXR0LCBlT2JqZWN0LCB0cnVlLCB2ZXJzaW9uLCBtb2R1bGVUeXBlKTsKLQkJLy9yZXR1cm4gRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5jcmVhdGVBdHRyaWJ1dGUoYXR0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU9iamVjdCBjcmVhdGVKYXZhQ2xhc3NQcm94eShFQ2xhc3MgbWV0YUNsYXNzKSB7Ci0JCWlmIChhdkNsYXNzID09IG51bGwpIHsKLQkJCWF2Q2xhc3MgPSBuZXcgU3RyaW5nW10geyAiamF2YS51dGlsLkhhc2hUYWJsZSIsICJqYXZhLnV0aWwuTGlzdCIsICJqYXZhLnNxbC5EYXRhIiwgImphdmEubGFuZy5JbnRlZ2VyIiwgImphdmEubGFuZy5TdHJpbmciIH07Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSBhdkNsYXNzW2NsYXNzSW5kZXhdOwotCQljbGFzc0luZGV4Kys7Ci0JCWlmIChjbGFzc0luZGV4ID09IDUpCi0JCQljbGFzc0luZGV4ID0gMDsKLQkJcmV0dXJuIEphdmFDbGFzc0ltcGwuY3JlYXRlQ2xhc3NSZWYobmFtZSk7Ci0JfQotCi0JLy8gT2xkIENvbXBhcmUgbWV0aG9kLi4uLm5vdyB1c2luZyBET01Db21wYXJhdG9yLi4ucmVtb3ZlIG9uY2Ugc3RhYmxlCi0JcHVibGljIHZvaWQgY29tcGFyZUNvbnRlbnRzKFN0cmluZyBmaWxlMSwgU3RyaW5nIGZpbGUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyMSA9IG51bGw7Ci0JICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcjIgPSBudWxsOwotCQl0cnkgewotCQkJaW50IGxpbmVubyA9IDE7Ci0JCQlyZWFkZXIxID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihnZXRGaWxlSW5wdXRTdHJlYW0oZmlsZTEpKSk7Ci0JCQlyZWFkZXIyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihnZXRGaWxlSW5wdXRTdHJlYW0oZmlsZTIpKSk7Ci0JCQlTdHJpbmcgbGluZTEgPSAiIiwgbGluZTIgPSAiIjsKLQkJCXdoaWxlIChyZWFkZXIxLnJlYWR5KCkgJiYgcmVhZGVyMi5yZWFkeSgpKSB7Ci0JCQkJbGluZTEgPSByZWFkTGluZVRyaW1Db21tZW50cyhyZWFkZXIxKTsgCi0JCQkJbGluZTIgPSByZWFkTGluZVRyaW1Db21tZW50cyhyZWFkZXIyKTsKLQkJCQlpZiAobGluZTEgPT0gbnVsbCAmJiBsaW5lMiA9PSBudWxsICYmIGxpbmVubyAhPSAwKQotCQkJCQlyZXR1cm47Ci0JCQkJCQkJICAgIAotCQkJCWlmICghbGluZTEudHJpbSgpLmVxdWFscyhsaW5lMi50cmltKCkpKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gIkVycm9yIGF0IGxpbmUgIzogIiArIGxpbmVubyArICdcbicgKyBsaW5lMSArICdcbicgKyBsaW5lMiArICdcbic7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihtZXNzYWdlKTsKLQkJCQkJLy9hc3NlcnRUcnVlKG1lc3NhZ2UsIGZhbHNlKTsKLQkJCQl9Ci0JCQkJbGluZW5vKys7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKCJUaGUgZmlsZXMgaGF2ZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgbGluZXM6IiArIGxpbmVubyArICdcbicgKyBsaW5lMSArICdcbicgKyBsaW5lMiArICdcbicsICghcmVhZGVyMS5yZWFkeSgpICYmICFyZWFkZXIyLnJlYWR5KCkpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiSU8gZmFpbGVkIiwgZmFsc2UpOwotCQl9IGZpbmFsbHkgewotCQkgICAgaWYocmVhZGVyMSAhPSBudWxsKQotCQkgICAgICAgIHJlYWRlcjEuY2xvc2UoKTsKLQkJICAgIGlmKHJlYWRlcjIgIT0gbnVsbCkKLQkJICAgICAgICByZWFkZXIyLmNsb3NlKCk7Ci0JCX0KLQl9IAotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHN0cmluZwotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyByZWFkTGluZVRyaW1Db21tZW50cyhCdWZmZXJlZFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSByZWFkZXIucmVhZExpbmUoKTsgCi0gICAgICAgIGlmKHJlc3VsdC5pbmRleE9mKCI8IS0tIikgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpbnQgZW5kQ29tbWVudEluZHggPSAwOwotICAgICAgICAgICAgd2hpbGUocmVhZGVyLnJlYWR5KCkpIHsKLSAgICAgICAgICAgICAgICBpZiggKGVuZENvbW1lbnRJbmR4ID0gcmVzdWx0LmluZGV4T2YoIi0tPiIpKSA+PSAwKSAKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoU3RyaW5nIGZpbGUxLCBTdHJpbmcgZmlsZTIsIFN0cmluZyBpZGVudGlmaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlMaW5lTnVtYmVyUmVhZGVyIHJlYWRlcjEgPSBuZXcgTGluZU51bWJlclJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUxKSkpOwotCQlMaW5lTnVtYmVyUmVhZGVyIHJlYWRlcjIgPSBuZXcgTGluZU51bWJlclJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUyKSkpOwotCQljb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKHJlYWRlcjEsIHJlYWRlcjIsIGlkZW50aWZpZXIpOwotCi0JfQotCi0JcHVibGljIHZvaWQgY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShMaW5lTnVtYmVyUmVhZGVyIHJlYWRlcjEsIExpbmVOdW1iZXJSZWFkZXIgcmVhZGVyMiwgU3RyaW5nIGlkZW50aWZpZXIpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXdoaWxlIChyZWFkZXIxLnJlYWR5KCkgfHwgcmVhZGVyMi5yZWFkeSgpKSB7Ci0JCQlTdHJpbmcgbGluZTEgPSAiIiwgbGluZTIgPSAiIjsKLQkJCXdoaWxlIChyZWFkZXIxLnJlYWR5KCkgJiYgbGluZTEuZXF1YWxzKCIiKSkgewotCQkJCWxpbmUxID0gcmVhZGVyMS5yZWFkTGluZSgpLnRyaW0oKTsKLQkJCX0KLQkJCXdoaWxlIChyZWFkZXIyLnJlYWR5KCkgJiYgbGluZTIuZXF1YWxzKCIiKSkgewotCQkJCWxpbmUyID0gcmVhZGVyMi5yZWFkTGluZSgpLnRyaW0oKTsKLQkJCX0KLQkJCWlmICghaXNFcXVpdmFsZW50TGluZXMobGluZTEsIGxpbmUyKSkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWJ1ZmYuYXBwZW5kKCJEaWZmZXJlbmNlIGZvdW5kIGluIHRlc3QgIik7Ci0KLQkJCQlidWZmLmFwcGVuZChpZGVudGlmaWVyKTsKLQkJCQlidWZmLmFwcGVuZCgiXG5Tb3VyY2UgbGluZSAjOiAiKTsKLQkJCQlidWZmLmFwcGVuZChyZWFkZXIxLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJYnVmZi5hcHBlbmQoJ1xuJyk7Ci0JCQkJYnVmZi5hcHBlbmQobGluZTEpOwotCQkJCWJ1ZmYuYXBwZW5kKCJcbkRlc3RpbmF0aW9uIGxpbmUgIzogIik7Ci0JCQkJYnVmZi5hcHBlbmQocmVhZGVyMi5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCWJ1ZmYuYXBwZW5kKCdcbicpOwotCQkJCWJ1ZmYuYXBwZW5kKGxpbmUyKTsKLQkJCQlhc3NlcnRUcnVlKGJ1ZmYudG9TdHJpbmcoKSwgZmFsc2UpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBsaW5lRXF1YWxzKFN0cmluZyBsaW5lMSwgU3RyaW5nIGxpbmUyKSB7Ci0JCXJldHVybiBsaW5lMS5lcXVhbHMobGluZTIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRXF1aXZhbGVudExpbmVzKFN0cmluZyBsaW5lMSwgU3RyaW5nIGxpbmUyKSB7Ci0JCWlmIChsaW5lRXF1YWxzKGxpbmUxLCBsaW5lMikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGVxdWFsVGFncyhsaW5lMSwgbGluZTIpKQotCQkJcmV0dXJuIHRydWU7Ci0JCVN0cmluZyBlcXVpdiA9IChTdHJpbmcpIGdldEVxdWl2YWxlbnRMaW5lcygpLmdldChsaW5lMSk7Ci0JCXJldHVybiBlcXVpdiAhPSBudWxsICYmIGVxdWl2LmVxdWFscyhsaW5lMik7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGVxdWFsVGFncyhTdHJpbmcgbGluZTEsIFN0cmluZyBsaW5lMil7Ci0JCS8vZGF0YSBjaGVjaywgdGhlcmUgc2hvdWxkIGJlIG5vIGRhdGEgZm9yIHRoaXMgdGVzdCB0byByZXR1cm4gdHJ1ZQotCQlpbnQgc2hvcnRFbmRJbmRleDEgPSBsaW5lMS5pbmRleE9mKCIvPiIpOwotCQlpbnQgc2hvcnRFbmRJbmRleDIgPSBsaW5lMi5pbmRleE9mKCIvPiIpOwotCQlpZiAoc2hvcnRFbmRJbmRleDEgPT0gLTEgJiYgc2hvcnRFbmRJbmRleDIgPT0gLTEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UgaWYgKHNob3J0RW5kSW5kZXgxICE9IC0xKXsKLQkJCVN0cmluZyB0YWdOYW1lMSA9IGxpbmUxLnN1YnN0cmluZygxLHNob3J0RW5kSW5kZXgxKTsKLQkJCVN0cmluZyB0YWdOYW1lMiA9IGV4dHJhY3RUYWdOYW1lKGxpbmUyKTsKLQkJCWlmIChjaGVja05vRGF0YShsaW5lMikgJiYgdGFnTmFtZTEuZXF1YWxzKHRhZ05hbWUyKSl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc2hvcnRFbmRJbmRleDIgIT0gLTEpewotCQkJU3RyaW5nIHRhZ05hbWUxID0gZXh0cmFjdFRhZ05hbWUobGluZTEpOyAKLQkJCVN0cmluZyB0YWdOYW1lMiA9IGxpbmUyLnN1YnN0cmluZygxLHNob3J0RW5kSW5kZXgyKTsKLQkJCWlmIChjaGVja05vRGF0YShsaW5lMSkgJiYgdGFnTmFtZTEuZXF1YWxzKHRhZ05hbWUyKSl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gbGluZTIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZXh0cmFjdFRhZ05hbWUoU3RyaW5nIGxpbmUpIHsKLQkJaW50IGVuZE9wZW5UYWcgPSBsaW5lLmluZGV4T2YoIj4iKTsKLQkJcmV0dXJuIGxpbmUuc3Vic3RyaW5nKDEsZW5kT3BlblRhZyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpbmUyCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja05vRGF0YShTdHJpbmcgbGluZSkgewotCQlpbnQgZW5kT3BlblRhZyA9IGxpbmUuaW5kZXhPZigiPiIpOwotCQlpbnQgc3RhcnRFbmRUYWcgPSBsaW5lLmxhc3RJbmRleE9mKCI8Iik7Ci0JCWlmIChlbmRPcGVuVGFnID09IGxpbmUubGVuZ3RoKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoZW5kT3BlblRhZysxID09IHN0YXJ0RW5kVGFnKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgTWFwIGdldEVxdWl2YWxlbnRMaW5lcygpIHsKLQkJaWYgKGVxdWl2YWxlbnRMaW5lcyA9PSBudWxsKQotCQkJZXF1aXZhbGVudExpbmVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGVxdWl2YWxlbnRMaW5lczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcXVpdmFsZW50TGluZXMoTWFwIGVxdWl2YWxlbnRMaW5lcykgewotCQl0aGlzLmVxdWl2YWxlbnRMaW5lcyA9IGVxdWl2YWxlbnRMaW5lczsKLQl9Ci0JLyoKLQkJcHVibGljIHZvaWQgY29tcGFyZUNvbnRlbnRzKFN0cmluZyBmaWxlMSwgU3RyaW5nIGZpbGUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCUlucHV0U3RyZWFtIGlzMSwgaXMyOwotCQkJaXMxID0gZ2V0RmlsZUlucHV0U3RyZWFtKGZpbGUxKTsKLQkJCWlzMiA9IGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMik7Ci0JCQlJbnB1dFNvdXJjZSBpbnB1dDEgPSBuZXcgSW5wdXRTb3VyY2UoaXMxKTsKLQkJCUlucHV0U291cmNlIGlucHV0MiA9IG5ldyBJbnB1dFNvdXJjZShpczIpOwotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgcmVzdWx0czsKLQkJCQlpZihpZ25vcmVBdHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0cyA9IERvbUNvbXBhcml0b3IuY29tcGFyZURvbXMoaW5wdXQxLCBpbnB1dDIpOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0cyA9IERvbUNvbXBhcml0b3IuY29tcGFyZURvbXMoaW5wdXQxLCBpbnB1dDIsIGlnbm9yZUF0dCk7Ci0JCQkJaWYgKHJlc3VsdHMgIT0gbnVsbCkgewotCQkJCQlhc3NlcnRUcnVlKCJVbmVxdWFsIGRvbXMgY29tcGFyZWQgYXMgZXF1YWwgIiArIGZpbGUxICsgIiAiICsgZmlsZTIgKyAiRGV0YWlsczogIiArIHJlc3VsdHMsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlzMS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUFzc2VydC5mYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJaXMyLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCSovCi0JcHVibGljIElucHV0U3RyZWFtIGdldEZpbGVJbnB1dFN0cmVhbShTdHJpbmcgcGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgpOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyBmaWxlTmFtZSkgewotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCUNsYXNzTG9hZGVyIGxvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKLQkJaWYgKGxvYWRlciA9PSBudWxsKSB7Ci0JCQlpbiA9IENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUpOwotCQl9IGVsc2UgewotCQkJaW4gPSBsb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShmaWxlTmFtZSk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIGZpbmQgcmVzb3VyY2U6ICIgKyBmaWxlTmFtZSwgaW4gIT0gbnVsbCk7Ci0JCXJldHVybiBpbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmFsRGVwdGgoaW50IGRlcHRoKSB7Ci0JCUdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdC5nZW5EZXB0aCA9IGRlcHRoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZHVsZVR5cGUoaW50IHR5cGUpIHsKLQkJbW9kdWxlVHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihpbnQgdmVyc2lvbikgewotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVwdGhGb3JBdHRyaWJ1dGUoRVJlZmVyZW5jZSByZWYpIHsKLQkJaWYgKHJlZi5pc01hbnkoKSkKLQkJCXJldHVybiBnZW5EZXB0aDsKLQkJZWxzZQotCQkJcmV0dXJuIDE7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRTaGFyZWRPYmplY3RCeVR5cGUoRU9iamVjdCBvd25lciwgRVJlZmVyZW5jZSByZWYpIHsKLQkJc2hhcmVkVmFsdWUgPSBUZXN0VXRpbGl0aWVzLmdldE9iamVjdEJ5VHlwZShvd25lci5lUmVzb3VyY2UoKSwgcmVmLmdldEVUeXBlKCksIHJlZi5pc01hbnkoKSk7Ci0JCXJldHVybiBzaGFyZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldElnbm9yZUF0dChIYXNoU2V0IHNldCkgewotCQlpZ25vcmVBdHQgPSBzZXQ7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0LyI7Ci0JCQlGaWxlIGRlbCA9IG5ldyBGaWxlKG91dCk7Ci0JCQlkZWxldGVEaXJlY3RvcnkoZGVsKTsKLQkJCWRlbC5kZWxldGUoKTsKLQkJCW91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIi4uL3Rlc3REYXRhL3Rlc3RPdXRwdXQvIjsKLQkJCWRlbCA9IG5ldyBGaWxlKG91dCk7Ci0JCQlkZWxldGVEaXJlY3RvcnkoZGVsKTsKLQkJCWRlbC5kZWxldGUoKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVEaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpCi0JICAgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlpZiAoZGlyZWN0b3J5LmV4aXN0cygpKXsKLQkJICAgRmlsZVtdIGRlbEZpbGVzID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotCQotCQkgICBmb3IoaW50IGk9MDsgaTxkZWxGaWxlcy5sZW5ndGg7ICsraSkKLQkJICAgewotCQkgICAgICBpZihkZWxGaWxlc1tpXS5pc0RpcmVjdG9yeSgpKQotCQkgICAgICAgICBkZWxldGVEaXJlY3RvcnkoZGVsRmlsZXNbaV0pOwotCQkgICAgICBkZWxGaWxlc1tpXS5kZWxldGUoKTsKLQkJICAgfSAgCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0dlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxZTMxMS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL0dlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uTGluZU51bWJlclJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkoyRUVWZXJzaW9uQ2hlY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLlRlc3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVKQkxvY2FsUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzQXV0aFR5cGVCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5CYXNlVGVzdENhc2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCBleHRlbmRzIEJhc2VUZXN0Q2FzZSB7Ci0gICAgLy9pbm5lciBjbGFzcyB0byBoYW5kbGUgZGVmZmVyZWQgc2hhcmVkIHJlZmVyZW5jZXMKLSAgICBwcm90ZWN0ZWQgY2xhc3MgRGVmZXJyZWRTaGFyZWRSZWZlcmVuY2VBY3Rpb24gewotICAgICAgICBFT2JqZWN0IG93bmVyOwotICAgICAgICBFUmVmZXJlbmNlIHJlZjsKLQotICAgICAgICBwdWJsaWMgRGVmZXJyZWRTaGFyZWRSZWZlcmVuY2VBY3Rpb24oRU9iamVjdCBvd25lciwgRVJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKLSAgICAgICAgICAgIHRoaXMucmVmID0gcmVmOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcGVyZm9ybUFjdGlvbigpIHsKLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGdldFNoYXJlZE9iamVjdEJ5VHlwZShvd25lciwgcmVmKTsKLSAgICAgICAgICAgIHNldFJlZmVyZW5jZVZhbHVlKG93bmVyLCByZWYsIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBNYXAgZXF1aXZhbGVudExpbmVzOwotICAgIHB1YmxpYyBMaXN0IGRlZmVyZWRSZWZlcmVuY2VzOwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdlbkRlcHRoID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBzaGFyZWRWYWx1ZTsKLSAgICBwdWJsaWMgc3RhdGljIEhhc2hTZXQgaWdub3JlQXR0OwotCi0gICAgcHVibGljIGludCB2ZXJzaW9uOwotICAgIHB1YmxpYyBpbnQgbW9kdWxlVHlwZTsKLSAgICAvL3N0YXRpYyB2ZXJzaW9ucwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8yID0gMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfMyA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzQgPSAyOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQSUNBVElPTiA9IDA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQX0NMSUVOVCA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVE9SID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFSkIgPSAzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFQiA9IDQ7Ci0KLSAgICBwdWJsaWMgR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlUm9vdChFT2JqZWN0IGVPYmplY3QpIHsKLSAgICAgICAgcG9wdWxhdGVGZWF0dXJlcyhlT2JqZWN0KTsKLSAgICAgICAgaWYgKGRlZmVyZWRSZWZlcmVuY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVmZXJlZFJlZmVyZW5jZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAoKERlZmVycmVkU2hhcmVkUmVmZXJlbmNlQWN0aW9uKSBkZWZlcmVkUmVmZXJlbmNlcy5nZXQoaSkpLnBlcmZvcm1BY3Rpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcHVsYXRlRmVhdHVyZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0gICAgICAgIGlmIChlT2JqZWN0ID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcG9wdWxhdGVBdHRyaWJ1dGVzKGVPYmplY3QpOwotICAgICAgICAgICAgcG9wdWxhdGVSZWZlcmVuY2VzKGVPYmplY3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVSZWZlcmVuY2VzKEVPYmplY3QgZU9iamVjdCkgewotICAgICAgICBMaXN0IHJlZmVyZW5jZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxSZWZlcmVuY2VzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgRVJlZmVyZW5jZSByZWYgPSAoRVJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoIXJlZi5pc01hbnkoKSAmJiBlT2JqZWN0LmVHZXQocmVmKSAhPSBudWxsKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBNZXNzYWdlRHJpdmVuICYmIChyZWYuZXF1YWxzKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0hvbWVJbnRlcmZhY2UoKSkgfHwgcmVmLmVxdWFscyhFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9SZW1vdGVJbnRlcmZhY2UoKSkgfHwgcmVmLmVxdWFscyhFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRlcnByaXNlQmVhbl9Mb2NhbEludGVyZmFjZSgpKSB8fCByZWYuZXF1YWxzKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX0xvY2FsSG9tZUludGVyZmFjZSgpKSB8fCByZWYuZXF1YWxzKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVudGVycHJpc2VCZWFuX1NlY3VyaXR5Um9sZVJlZnMoKSkpKQotCQkJCWNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKHJlZi5pc0NvbnRhaW5tZW50KCkpCi0gICAgICAgICAgICAgICAgcG9wdWxhdGVDb250YWlubWVudFJlZmVyZW5jZShlT2JqZWN0LCByZWYpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKGVPYmplY3QsIHJlZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgIGlmIChyZWYuZ2V0RVR5cGUoKSA9PSBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzKCkpCi0gICAgICAgICAgICBzZXRSZWZlcmVuY2VWYWx1ZShlT2JqZWN0LCByZWYsIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlSmF2YUNsYXNzUHJveHkocmVmLGVPYmplY3QpKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBFUGFja2FnZSBwa2cgPSByZWYuZ2V0RVR5cGUoKS5nZXRFUGFja2FnZSgpOwotICAgICAgICAgICAgLy9pZiAocGtnID09IGVPYmplY3QuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSB8fCBwa2cgPT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UpIHsKLSAgICAgICAgICAgICAgICBpZiAoZU9iamVjdC5lQ2xhc3MoKS5nZXROYW1lKCkuZXF1YWxzKCJFQW5ub3RhdGlvbiIpIHx8IGVPYmplY3QuZUNsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscygiRUFubm90YXRpb25JbXBsIikgfHwgIUoyRUVWZXJzaW9uQ2hlY2suY2hlY2tSZWZlcmVuY2VWZXJzaW9uKHJlZiwgdmVyc2lvbiwgbW9kdWxlVHlwZSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBpZiAoZGVmZXJlZFJlZmVyZW5jZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgZGVmZXJlZFJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgZGVmZXJlZFJlZmVyZW5jZXMuYWRkKG5ldyBEZWZlcnJlZFNoYXJlZFJlZmVyZW5jZUFjdGlvbihlT2JqZWN0LCByZWYpKTsKLSAgICAgICAgICAgIC8vfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVDb250YWlubWVudFJlZmVyZW5jZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0RGVwdGhGb3JBdHRyaWJ1dGUocmVmKTsgaSsrKSB7Ci0gICAgICAgICAgICBFT2JqZWN0IGluc3RhbmNlID0gY3JlYXRlSW5zdGFuY2UocmVmLGVPYmplY3QpOwotICAgICAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgaWYgKCFKMkVFVmVyc2lvbkNoZWNrLmNoZWNrUmVmZXJlbmNlVmVyc2lvbihyZWYsIHZlcnNpb24sIG1vZHVsZVR5cGUpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgc2V0UmVmZXJlbmNlVmFsdWUoZU9iamVjdCwgcmVmLCBpbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoKChJbnRlcm5hbEVPYmplY3QpIGluc3RhbmNlKS5lSXNQcm94eSgpKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGlmIChyZWYuZ2V0RVR5cGUoKSA9PSBlT2JqZWN0LmVDbGFzcygpKQotICAgICAgICAgICAgICAgIHBvcHVsYXRlQXR0cmlidXRlcyhpbnN0YW5jZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcG9wdWxhdGVGZWF0dXJlcyhpbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRSZWZlcmVuY2VWYWx1ZShFT2JqZWN0IGVPYmplY3QsIEVTdHJ1Y3R1cmFsRmVhdHVyZSByZWYsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAocmVmLmdldE5hbWUoKS5lcXVhbHMoIkVBbm5vdGF0aW9uIikgfHwgcmVmLmdldE5hbWUoKS5lcXVhbHMoIkVBbm5vdGF0aW9uSW1wbCIpIHx8ICFKMkVFVmVyc2lvbkNoZWNrLmNoZWNrUmVmZXJlbmNlVmVyc2lvbihyZWYsIHZlcnNpb24sIG1vZHVsZVR5cGUpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAocmVmLmlzTWFueSgpKSB7Ci0gICAgICAgICAgICBMaXN0IGxpc3QgPSAoTGlzdCkgZU9iamVjdC5lR2V0KHJlZik7Ci0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKQotICAgICAgICAgICAgICAgIGxpc3QuYWRkQWxsKChDb2xsZWN0aW9uKSB2YWx1ZSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbGlzdC5hZGQodmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZU9iamVjdC5lU2V0KHJlZiwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEVPYmplY3QgY3JlYXRlSW5zdGFuY2UoRVJlZmVyZW5jZSByZWYsIEVPYmplY3QgZU9iamVjdCkgewotICAgICAgICBpZiAocmVmLmdldEVUeXBlKCkgPT0gSmF2YVJlZlBhY2thZ2UuZUlOU1RBTkNFLmdldEphdmFDbGFzcygpKQotICAgICAgICAgICAgcmV0dXJuIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IuY3JlYXRlSmF2YUNsYXNzUHJveHkocmVmLCBlT2JqZWN0KTsKLSAgICAgICAgcmV0dXJuIHJlZi5nZXRFVHlwZSgpLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpLmNyZWF0ZSgoRUNsYXNzKXJlZi5nZXRFVHlwZSgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUF0dHJpYnV0ZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0gICAgCWlmIChlT2JqZWN0LmVDbGFzcygpID09IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldFFOYW1lKCkpIHsKLSAgICAJCXBvcHVsYXRlQXR0cmlidXRlc1FOYW1lKGVPYmplY3QpOwotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgICAgIExpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBFQXR0cmlidXRlIGF0dCA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChlT2JqZWN0IGluc3RhbmNlb2YgRUpCTG9jYWxSZWYgJiYgKGF0dC5lcXVhbHMoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiUmVmX0hvbWUoKSkgfHwgYXR0LmVxdWFscyhDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfUmVtb3RlKCkpKSkKLSAgICAgICAgICAgIAljb250aW51ZTsKLSAgICAgICAgICAgIHByaW1Qb3B1bGF0ZUF0dHJidXRlKGVPYmplY3QsIGF0dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbVBvcHVsYXRlQXR0cmJ1dGUoRU9iamVjdCBlT2JqZWN0LCBFQXR0cmlidXRlIGF0dCkgewotICAgICAgICAgICAgaWYgKGF0dC5pc0NoYW5nZWFibGUoKSAmJiBKMkVFVmVyc2lvbkNoZWNrLmNoZWNrQXR0cmlidXRlVmVyc2lvbihhdHQsIHZlcnNpb24sIG1vZHVsZVR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDAgOyBqIDwgZ2V0RGVwdGhGb3JBdHRyaWJ1dGUoYXR0KTtqKyspewotCSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCSAgICAgICAgICAgICAgICBzZXRSZWZlcmVuY2VWYWx1ZShlT2JqZWN0LGF0dCx2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgCi0gICAgCi0KLSAgICAvKioKLQkgKiBAcGFyYW0gZU9iamVjdAotCSAqLwotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUF0dHJpYnV0ZXNRTmFtZShFT2JqZWN0IGVPYmplY3QpIHsKLQkJU3RyaW5nIHByZWZpeCA9IChTdHJpbmcpY3JlYXRlQXR0cmlidXRlVmFsdWUoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UU5hbWVfSW50ZXJuYWxQcmVmaXhPck5zVVJJKCksIGVPYmplY3QpOwotCQlTdHJpbmcgbG9jYWxQYXJ0ID0gKFN0cmluZyljcmVhdGVBdHRyaWJ1dGVWYWx1ZShDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRRTmFtZV9Mb2NhbFBhcnQoKSwgZU9iamVjdCk7Ci0JCSgoUU5hbWUpZU9iamVjdCkuc2V0VmFsdWVzKHByZWZpeCwgImh0dHA6Ly93d3cuaWJtLmNvbSIsIGxvY2FsUGFydCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShFQXR0cmlidXRlIGF0dCwgRU9iamVjdCBlT2JqZWN0KSB7Ci0gICAgICAgIGlmIChhdHQuZ2V0RVR5cGUoKSA9PSBKYXZhUmVmUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmF2YUNsYXNzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUphdmFDbGFzc1Byb3h5KGF0dCxlT2JqZWN0KS5nZXRDbGFzcygpOwotICAgICAgICB9IGVsc2UgaWYgKGF0dCA9PSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRSZXNvdXJjZVJlZl9BdXRoKCkpCi0JCQlyZXR1cm4gY3JlYXRlUmVzQXV0aChhdHQsIGVPYmplY3QpOwotCQllbHNlIGlmIChhdHQgPT0gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0TWV0aG9kRWxlbWVudF9UeXBlKCkpCi0JCQlyZXR1cm4gY3JlYXRlTWV0aG9kRWxlbWVudFR5cGUoYXR0LCBlT2JqZWN0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIHByaW1DcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotICAgICAgICAvL3JldHVybiBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUF0dHJpYnV0ZShhdHQpOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHByaW1DcmVhdGVBdHRyaWJ1dGVWYWx1ZShFQXR0cmlidXRlIGF0dCwgRU9iamVjdCBlT2JqZWN0KSB7Ci0JCXJldHVybiBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUF0dHJpYnV0ZShhdHQsIGVPYmplY3QsIHRydWUsIHZlcnNpb24sIG1vZHVsZVR5cGUpOwotICAgIH0KLQotICAgIC8vIE9sZCBDb21wYXJlIG1ldGhvZC4uLi5ub3cgdXNpbmcgRE9NQ29tcGFyYXRvci4uLnJlbW92ZSBvbmNlIHN0YWJsZQotICAgIHB1YmxpYyB2b2lkIGNvbXBhcmVDb250ZW50cyhTdHJpbmcgZmlsZTEsIFN0cmluZyBmaWxlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgbGluZW5vID0gMTsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcjEgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMSkpKTsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlcjIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMikpKTsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lMSA9ICIiLCBsaW5lMiA9ICIiOwotICAgICAgICAgICAgd2hpbGUgKHJlYWRlcjEucmVhZHkoKSAmJiByZWFkZXIyLnJlYWR5KCkpIHsKLSAgICAgICAgICAgICAgICBsaW5lMSA9IHJlYWRlcjEucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICBsaW5lMiA9IHJlYWRlcjIucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICBpZiAobGluZTEgPT0gbnVsbCAmJiBsaW5lMiA9PSBudWxsICYmIGxpbmVubyAhPSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgaWYgKCFsaW5lMS5lcXVhbHMobGluZTIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIkVycm9yIGF0IGxpbmUgIzogIiArIGxpbmVubyArICdcbicgKyBsaW5lMSArICdcbicgKyBsaW5lMiArICdcbic7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUobWVzc2FnZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gYWRkZWQgdG8gZXNjYXBlIGNvbXBhcmUgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmVubysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIGZpbGVzIGhhdmUgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGxpbmVzOiIgKyBsaW5lbm8gKyAnXG4nICsgbGluZTEgKyAnXG4nICsgbGluZTIgKyAnXG4nLCAoIXJlYWRlcjEucmVhZHkoKSAmJiAhcmVhZGVyMi5yZWFkeSgpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJJTyBmYWlsZWQiLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShTdHJpbmcgZmlsZTEsIFN0cmluZyBmaWxlMiwgU3RyaW5nIGlkZW50aWZpZXIpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIExpbmVOdW1iZXJSZWFkZXIgcmVhZGVyMSA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihnZXRGaWxlSW5wdXRTdHJlYW0oZmlsZTEpKSk7Ci0gICAgICAgIExpbmVOdW1iZXJSZWFkZXIgcmVhZGVyMiA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihnZXRGaWxlSW5wdXRTdHJlYW0oZmlsZTIpKSk7Ci0gICAgICAgIGNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UocmVhZGVyMSwgcmVhZGVyMiwgaWRlbnRpZmllcik7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKExpbmVOdW1iZXJSZWFkZXIgcmVhZGVyMSwgTGluZU51bWJlclJlYWRlciByZWFkZXIyLCBTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3QgZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmcgbXNnID0gbnVsbDsKLSAgICAgICAgd2hpbGUgKHJlYWRlcjEucmVhZHkoKSB8fCByZWFkZXIyLnJlYWR5KCkpIHsKLSAgICAgICAgICAgIFN0cmluZyBsaW5lMSA9ICIiLCBsaW5lMiA9ICIiOwotICAgICAgICAgICAgd2hpbGUgKHJlYWRlcjEucmVhZHkoKSAmJiBsaW5lMSAhPSBudWxsICYmIGxpbmUxLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICBsaW5lMSA9IHJlYWRlcjEucmVhZExpbmUoKTsKLSAgICAgICAgICAgICAgICBpZiAobGluZTEgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAJbGluZTEgPSBsaW5lMS50cmltKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAocmVhZGVyMi5yZWFkeSgpICYmIGxpbmUyICE9IG51bGwgJiYgbGluZTIuZXF1YWxzKCIiKSkgewotICAgICAgICAgICAgICAgIGxpbmUyID0gcmVhZGVyMi5yZWFkTGluZSgpOwotICAgICAgICAgICAgICAgIGlmIChsaW5lMiAhPSBudWxsKQotICAgICAgICAgICAgICAgIAlsaW5lMiA9IGxpbmUyLnRyaW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaW5lMSAhPSBudWxsICYmIGxpbmUyICE9IG51bGwgJiYgIWlzRXF1aXZhbGVudExpbmVzKGxpbmUxLCBsaW5lMikpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWZmZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICIpOwotICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKCJcblNvdXJjZSBsaW5lICM6ICIpOwotICAgICAgICAgICAgICAgIGJ1ZmYuYXBwZW5kKHJlYWRlcjEuZ2V0TGluZU51bWJlcigpKTsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZCgnXG4nKTsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZChsaW5lMSk7Ci0gICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoIlxuRGVzdGluYXRpb24gbGluZSAjOiAiKTsKLSAgICAgICAgICAgICAgICBidWZmLmFwcGVuZChyZWFkZXIyLmdldExpbmVOdW1iZXIoKSk7Ci0gICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgICAgICAgICAgYnVmZi5hcHBlbmQobGluZTIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihidWZmLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGVycm9ycy5hZGQoYnVmZik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKQotCQkJYXNzZXJ0VHJ1ZSgiRXJyb3JzIEZvdW5kLCBDaGVjayBDb25zb2xlLiIsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBsaW5lRXF1YWxzKFN0cmluZyBsaW5lMSwgU3RyaW5nIGxpbmUyKSB7Ci0gICAgICAgIHJldHVybiBsaW5lMSAhPSBudWxsICYmIGxpbmUxLmVxdWFscyhsaW5lMik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFcXVpdmFsZW50TGluZXMoU3RyaW5nIGxpbmUxLCBTdHJpbmcgbGluZTIpIHsKLSAgICAgICAgaWYgKGxpbmVFcXVhbHMobGluZTEsIGxpbmUyKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgIFN0cmluZyBlcXVpdiA9IChTdHJpbmcpIGdldEVxdWl2YWxlbnRMaW5lcygpLmdldChsaW5lMSk7Ci0gICAgICAgIGlmIChlcXVpdiA9PSBudWxsKXsKLSAgICAgICAgCWVxdWl2ID0gKFN0cmluZylnZXRFcXVpdmFsZW50TGluZXMoKS5nZXQobGluZTIpOwotICAgICAgICAJaWYgKGVxdWl2ICE9IG51bGwpCi0gICAgICAgIAkJcmV0dXJuIGVxdWl2LmVxdWFscyhsaW5lMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGVxdWl2ICE9IG51bGwgJiYgZXF1aXYuZXF1YWxzKGxpbmUyKTsKLSAgICB9Ci0gICAgcHVibGljIE1hcCBnZXRFcXVpdmFsZW50TGluZXMoKSB7Ci0gICAgICAgIGlmIChlcXVpdmFsZW50TGluZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIGVxdWl2YWxlbnRMaW5lcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIHJldHVybiBlcXVpdmFsZW50TGluZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXF1aXZhbGVudExpbmVzKE1hcCBlcXVpdmFsZW50TGluZXMpIHsKLSAgICAgICAgdGhpcy5lcXVpdmFsZW50TGluZXMgPSBlcXVpdmFsZW50TGluZXM7Ci0gICAgfQotICAgIC8qCi0gICAgCXB1YmxpYyB2b2lkIGNvbXBhcmVDb250ZW50cyhTdHJpbmcgZmlsZTEsIFN0cmluZyBmaWxlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCQlJbnB1dFN0cmVhbSBpczEsIGlzMjsKLSAgICAJCWlzMSA9IGdldEZpbGVJbnB1dFN0cmVhbShmaWxlMSk7Ci0gICAgCQlpczIgPSBnZXRGaWxlSW5wdXRTdHJlYW0oZmlsZTIpOwotICAgIAkJSW5wdXRTb3VyY2UgaW5wdXQxID0gbmV3IElucHV0U291cmNlKGlzMSk7Ci0gICAgCQlJbnB1dFNvdXJjZSBpbnB1dDIgPSBuZXcgSW5wdXRTb3VyY2UoaXMyKTsKLSAgICAJCXRyeSB7Ci0gICAgCQkJU3RyaW5nIHJlc3VsdHM7Ci0gICAgCQkJaWYoaWdub3JlQXR0ID09IG51bGwpCi0gICAgCQkJCXJlc3VsdHMgPSBEb21Db21wYXJpdG9yLmNvbXBhcmVEb21zKGlucHV0MSwgaW5wdXQyKTsKLSAgICAJCQllbHNlCi0gICAgCQkJCXJlc3VsdHMgPSBEb21Db21wYXJpdG9yLmNvbXBhcmVEb21zKGlucHV0MSwgaW5wdXQyLCBpZ25vcmVBdHQpOwotICAgIAkJCWlmIChyZXN1bHRzICE9IG51bGwpIHsKLSAgICAJCQkJYXNzZXJ0VHJ1ZSgiVW5lcXVhbCBkb21zIGNvbXBhcmVkIGFzIGVxdWFsICIgKyBmaWxlMSArICIgIiArIGZpbGUyICsgIkRldGFpbHM6ICIgKyByZXN1bHRzLCBmYWxzZSk7Ci0gICAgCQkJfQotICAgIAkJfSBmaW5hbGx5IHsKLSAgICAJCQl0cnkgewotICAgIAkJCQlpczEuY2xvc2UoKTsKLSAgICAJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgIAkJCQlBc3NlcnQuZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0gICAgCQkJfQotICAgIAkJCXRyeSB7Ci0gICAgCQkJCWlzMi5jbG9zZSgpOwotICAgIAkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQkJCUFzc2VydC5mYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAJCQl9Ci0gICAgCQl9Ci0gICAgCX0KLSAgICAqLwotICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRGaWxlSW5wdXRTdHJlYW0oU3RyaW5nIHBhdGgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcgZmlsZU5hbWUpIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0gICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaW4gPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZUFzU3RyZWFtKGZpbGVOYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGluID0gbG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oZmlsZU5hbWUpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoIlVuYWJsZSB0byBmaW5kIHJlc291cmNlOiAiICsgZmlsZU5hbWUsIGluICE9IG51bGwpOwotICAgICAgICByZXR1cm4gaW47Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0R2VuZXJhbERlcHRoKGludCBkZXB0aCkgewotICAgICAgICBHZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QuZ2VuRGVwdGggPSBkZXB0aDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGVUeXBlKGludCB0eXBlKSB7Ci0gICAgICAgIG1vZHVsZVR5cGUgPSB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oaW50IHZlcnNpb24pIHsKLSAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERlcHRoRm9yQXR0cmlidXRlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0gICAgICAgIGlmIChmZWF0dXJlLmlzTWFueSgpKQotICAgICAgICAgICAgcmV0dXJuIGdlbkRlcHRoOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFNoYXJlZE9iamVjdEJ5VHlwZShFT2JqZWN0IG93bmVyLCBFUmVmZXJlbmNlIHJlZikgewotICAgICAgICBzaGFyZWRWYWx1ZSA9IFRlc3RVdGlsaXRpZXMuZ2V0T2JqZWN0QnlUeXBlKG93bmVyLmVSZXNvdXJjZSgpLCByZWYuZ2V0RVR5cGUoKSwgcmVmLmlzTWFueSgpKTsKLSAgICAgICAgcmV0dXJuIHNoYXJlZFZhbHVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBzZXQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SWdub3JlQXR0KEhhc2hTZXQgc2V0KSB7Ci0gICAgICAgIGlnbm9yZUF0dCA9IHNldDsKLSAgICB9Ci0gICAgCi0JCi0JCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVSZXNBdXRoKEVBdHRyaWJ1dGUgYXR0LCBFT2JqZWN0IGVPYmplY3QpIHsKLQkJT2JqZWN0IGF1dGggPSBudWxsOwotCQlkbyB7Ci0JCQlhdXRoID0gcHJpbUNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0JCX0gd2hpbGUgKCFpc1ZhbGlkQXV0aCgoUmVzQXV0aFR5cGVCYXNlKWF1dGgpKTsKLQkJcmV0dXJuIGF1dGg7Ci0JfQotCQotCS8qKgotCSAqIFdlYiB3aWxsIG5lZWQgdG8gb3ZlcnJpZGUgIGZvciBKMkVFIDEuMi8xLzMKLQkgKiBAcGFyYW0gYXV0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkQXV0aChSZXNBdXRoVHlwZUJhc2UgYXV0aCkgewotCQlyZXR1cm4gYXV0aCA9PSBSZXNBdXRoVHlwZUJhc2UuQVBQTElDQVRJT05fTElURVJBTCB8fCBhdXRoID09IFJlc0F1dGhUeXBlQmFzZS5DT05UQUlORVJfTElURVJBTDsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVNZXRob2RFbGVtZW50VHlwZShFQXR0cmlidXRlIGF0dCwgRU9iamVjdCBlT2JqZWN0KSB7Ci0JCU9iamVjdCB0eXBlID0gbnVsbDsKLQkJZG8gewotCQkJdHlwZSA9IHByaW1DcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCQl9IHdoaWxlICghaXNWYWxpZE1ldGhvZEVsZW1lbnRUeXBlKChNZXRob2RFbGVtZW50S2luZCl0eXBlKSk7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFdlYiB3aWxsIG5lZWQgdG8gb3ZlcnJpZGUgIGZvciBKMkVFIDEuMi8xLzMKLQkgKiBAcGFyYW0gYXV0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkTWV0aG9kRWxlbWVudFR5cGUoTWV0aG9kRWxlbWVudEtpbmQgdHlwZSkgewotCQlpZiAgKHZlcnNpb24gPT0gVkVSU0lPTl8xXzQpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHZlcnNpb24gIT0gVkVSU0lPTl8xXzQgJiYgdHlwZSAhPSBNZXRob2RFbGVtZW50S2luZC5TRVJWSUNFX0VORFBPSU5UX0xJVEVSQUw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0LyI7Ci0JCQlGaWxlIGRlbCA9IG5ldyBGaWxlKG91dCk7Ci0JCQlkZWxldGVEaXJlY3RvcnkoZGVsKTsKLQkJCWRlbC5kZWxldGUoKTsKLQkJCW91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIi4uL3Rlc3REYXRhL3Rlc3RPdXRwdXQvIjsKLQkJCWRlbCA9IG5ldyBGaWxlKG91dCk7Ci0JCQlkZWxldGVEaXJlY3RvcnkoZGVsKTsKLQkJCWRlbC5kZWxldGUoKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVEaXJlY3RvcnkoRmlsZSBkaXJlY3RvcnkpCi0JICAgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlpZiAoZGlyZWN0b3J5LmV4aXN0cygpKXsKLQkJICAgRmlsZVtdIGRlbEZpbGVzID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotCQotCQkgICBmb3IoaW50IGk9MDsgaTxkZWxGaWxlcy5sZW5ndGg7ICsraSkKLQkJICAgewotCQkgICAgICBpZihkZWxGaWxlc1tpXS5pc0RpcmVjdG9yeSgpKQotCQkgICAgICAgICBkZWxldGVEaXJlY3RvcnkoZGVsRmlsZXNbaV0pOwotCQkgICAgICBkZWxGaWxlc1tpXS5kZWxldGUoKTsKLQkJICAgfSAgCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvUmFyRU1GRWRpdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvUmFyRU1GRWRpdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhNmNlMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1JhckVNRkVkaXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlJBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBSYXJFTUZFZGl0VGVzdCBleHRlbmRzIEdlbmVyYWxFTUZFZGl0aW5nVGVzdCB7Ci0gICAgUkFSRmlsZSByYXJGaWxlOwotCi0gICAgcHVibGljIFJhckVNRkVkaXRUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0V2ViQXBwRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LlJhckVNRkVkaXRUZXN0IiwgIi1ub2xvYWRpbmciIH07Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFJhckVNRkVkaXRUZXN0KCJ0ZXN0UkFSRWRpdCIpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSQVJFZGl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGdldFJhcigpOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRTcGVjVmVyc2lvbigpKTsKLQotCQlDb25uZWN0b3JSZXNvdXJjZSBERCA9IChDb25uZWN0b3JSZXNvdXJjZSkgcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgICAgCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotICAgICAgIAlzZXRNb2R1bGVUeXBlKENPTk5FQ1RPUik7ICAgICAgIAotICAgICAgICBlZGl0Um9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgb3V0ID0gY3VyRGlyICsgInRlc3RPdXRwdXQvRU1GTW9kZWxDcmVhdGlvblRlc3RzL0VkaXRSYXJFQVIiOwotICAgICAgICByYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIHJhckZpbGUuY2xvc2UoKTsKLQotICAgICAgICAvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgIkVNRlRlc3RzL3JhLnhtbCI7Ci0gICAgICAgIFN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgb3V0ICsgIi9mb29SQVIvTUVUQS1JTkYvcmEueG1sIjsKLSAgICAgICAgLy9jb21wYXJlQ29udGVudHMoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldFJhcigpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAibG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUNvbm5lY3Rvci9mb29SQVIvIjsKLSAgICAgICAgcmFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlblJBUkZpbGUoaW4pOwotICAgICAgICBhc3NlcnRUcnVlKHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLSAgICB9Ci0JcHVibGljIEhhc2hTZXQgaWdub3JhYmxlQXR0cmlidXRlcygpewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoImlkIik7Ci0JCXJldHVybiBzZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9SYXJFTUZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1JhckVNRlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhkYmJmZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1JhckVNRlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUkFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotcHVibGljIGNsYXNzIFJhckVNRlRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QgewotCUVBUkZpbGUgZWFyRmlsZTsKLQlwcm90ZWN0ZWQgUkFSRmlsZSByYXJGaWxlOwotCi0JcHVibGljIFJhckVNRlRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIEVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXZWJBcHBGYWN0b3J5KCkgewotCQlyZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuUmFyRU1GVGVzdCIsICItbm9sb2FkaW5nIiB9OwotCQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBSYXJFTUZUZXN0KCJ0ZXN0UkFSUG9wdWxhdGlvbiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgUmFyRU1GVGVzdCgidGVzdDE0UkFSUG9wdWxhdGlvbiIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSQVJQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJY3JlYXRlRUFSKCk7Ci0JCWNyZWF0ZVJBUigpOwotCi0JCUNvbm5lY3RvclJlc291cmNlIEREID0gKENvbm5lY3RvclJlc291cmNlKSByYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJc2V0TW9kdWxlVHlwZShDT05ORUNUT1IpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9UZXN0UmFyRUFSIjsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQkJLy9Db21wYXJlIHdvcmsgaW4gcHJvZ3Jlc3MKLQkJU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotCQlTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAiRU1GVGVzdE5vSUQvcmEueG1sIjsKLQkJU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9UZXN0UmFyRUFSL2Zvb1JBUi9NRVRBLUlORi9yYS54bWwiOwotCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3QxNFJBUlBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlUkFSKCk7Ci0KLQkJQ29ubmVjdG9yUmVzb3VyY2UgREQgPSAoQ29ubmVjdG9yUmVzb3VyY2UpIHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCURELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlzZXRNb2R1bGVUeXBlKENPTk5FQ1RPUik7Ci0JCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1Rlc3QxNFJhckVBUiI7Ci0JCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJZWFyRmlsZS5jbG9zZSgpOwotCi0JCWdldFJhcigpOwotCQlhc3NlcnRUcnVlKCIxLjUiLmVxdWFscyhyYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0U3BlY1ZlcnNpb24oKSkpOwotCQlvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1Rlc3QxNFJhckVBUjIiOwotCQlyYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0JCXJhckZpbGUuY2xvc2UoKTsKLQotCQkvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotCQlTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0JCVN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3QxNFJhckVBUjIvTUVUQS1JTkYvcmEueG1sIjsKLQkJU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9UZXN0MTRSYXJFQVIvZm9vUkFSL01FVEEtSU5GL3JhLnhtbCI7Ci0JCXNldElnbm9yZUF0dChpZ25vcmFibGVBdHRyaWJ1dGVzKCkpOwotCQljb21wYXJlQ29udGVudHNJZ25vcmVXaGl0ZXNwYWNlKGN1ckRlcGxveW1lbnREZXNVUkksIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZXRSYXIoKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uLCBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvVGVzdDE0UmFyRUFSL2Zvb1JBUiI7Ci0JCXJhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5SQVJGaWxlKGluKTsKLQkJYXNzZXJ0VHJ1ZShyYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlUkFSKCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiB7Ci0JCXJhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVJBUkZpbGVJbml0aWFsaXplZCgiZm9vUkFSIik7Ci0JCXJhckZpbGUgPSAoUkFSRmlsZSkgZWFyRmlsZS5hZGRDb3B5KHJhckZpbGUpOwotCQlyYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuc2V0RGlzcGxheU5hbWUoImZvb1JBUiIpOwotCQlhc3NlcnRUcnVlKHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVFQVIoKSB7Ci0JCVN0cmluZyBlYXJOYW1lID0gIlRlc3QuZWFyIjsKLQkJZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKGVhck5hbWUpOwotCQlhc3NlcnRUcnVlKGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSGFzaFNldCBpZ25vcmFibGVBdHRyaWJ1dGVzKCkgewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoImlkIik7Ci0JCXJldHVybiBzZXQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMuYXJjaGl2ZS5lbWZ0ZXN0LkdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCNjcmVhdGVBdHRyaWJ1dGVWYWx1ZShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKEVBdHRyaWJ1dGUgYXR0LCBFT2JqZWN0IGVPYmplY3QpIHsKLQkJLy9UT0RPOiBkZWxldGUgdGhpcyBhZnRlciB0aGUgbW9kZWwgaXMgZml4ZWQKLQkJaWYgKGF0dCA9PSBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25maWdQcm9wZXJ0eV9UeXBlKCkpCi0JCQlyZXR1cm4gImphdmEubGFuZy5TdHJpbmciOwotCQllbHNlIGlmIChhdHQgPT0gSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21fQ3JlZGVudGlhbEludGVyZmFjZSgpKQotCQkJcmV0dXJuICJqYXZheC5yZXNvdXJjZS5zcGkuc2VjdXJpdHkuUGFzc3dvcmRDcmVkZW50aWFsIjsKLQkJZWxzZSBpZiAoYXR0ID09IEpjYVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbm5lY3Rvcl9TcGVjVmVyc2lvbigpICYmIHZlcnNpb24gPT0gVkVSU0lPTl8xXzMpCi0JCQlyZXR1cm4gIjEuMCI7Ci0JCWVsc2UKLQkJCXJldHVybiBzdXBlci5jcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9SZXNvbHZlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvUmVzb2x2ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNTBkY2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9SZXNvbHZlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVBBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLk1ldGhvZFBlcm1pc3Npb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5pbnRlcm5hbC5pbXBsLlF1ZXJ5TWV0aG9kSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgUmVzb2x2ZXJUZXN0IGV4dGVuZHMgR2VuZXJhbEVNRkVkaXRpbmdUZXN0IHsKLQotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIF9NRVRBX0lORl9FSkJfSkFSX1hNTCA9ICIvTUVUQS1JTkYvZWpiLWphci54bWwiOwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFamJQYWNrYWdlIEVKQl9QS0cgPSBFamJQYWNrYWdlLmVJTlNUQU5DRTsKLQotICAgIEVBUkZpbGUgZWFyRmlsZTsKLQotICAgIEVKQkphckZpbGUgZWpiRmlsZTsKLQotICAgIEVPYmplY3QgbWVzQmVhbiwgZW50aXR5QmVhbjsKLQotICAgIFNlY3VyaXR5SWRlbnRpdHkgc2VjSUQ7Ci0KLSAgICBSb2xlU291cmNlIHJvbGVTb3VyY2U7Ci0KLSAgICBpbnQgTlVNX0JFQU5TID0gMTA7Ci0KLSAgICBmaW5hbCBpbnQgTlVNX1JFTEFUSU9OX1JPTEVTID0gMjsKLQotICAgIGludCBjcmVhdGVkQmVhbnMgPSAwOwotCi0gICAgaW50IGNyZWF0ZWRTZWNSb2xlcyA9IDA7Ci0KLSAgICBwcm90ZWN0ZWQgaW50IGNyZWF0ZWRTZWN1cml0eUlkZW50aXRpZXMgPSAwOwotCi0gICAgYm9vbGVhbiBtcEZsYWcgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBSZXNvbHZlclRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVqYkZhY3RvcnkgZ2V0RWpiRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXBwbGljYXRpb25GYWN0b3J5IGdldEFwcGxpY2F0aW9uRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRXZWJBcHBGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJhcHBsaWNhdGlvbkZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotICAgICAgICBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lci5tYWluKG5ldyBTdHJpbmdbXSB7IFJlc29sdmVyVGVzdC5jbGFzcy5nZXROYW1lKCl9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIC8qc3VpdGUuYWRkVGVzdChuZXcgQWxsU0FYVGVzdHMoInRlc3RTd2l0Y2hSZW5kZXJlciIpKTsqLwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBSZXNvbHZlclRlc3QoInRlc3RSZXNvbHZlciIpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgUmVzb2x2ZXJUZXN0KCJ0ZXN0UmVzb2x2ZXJOb1NjaGVtYUxvY2F0aW9uIikpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIi4uL3Rlc3REYXRhL3NsIjsKLSAgICAgICAgZ2V0RUpCKGluKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIjIuMSIsIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRWZXJzaW9uKCkpOwotICAgICAgICBFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgICAgIHNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotICAgICAgICBzZXRNb2R1bGVUeXBlKEVKQik7Ci0KLSAgICAgICAgU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIi4uL3Rlc3REYXRhL3Rlc3RPdXRwdXQvc2wiOwotICAgICAgICBlamJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIGVqYkZpbGUuY2xvc2UoKTsKLQotICAgICAgICBTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBpbiArIF9NRVRBX0lORl9FSkJfSkFSX1hNTDsKLSAgICAgICAgU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBvdXQgKyBfTUVUQV9JTkZfRUpCX0pBUl9YTUw7Ci0gICAgICAgIGNvbXBhcmVDb250ZW50cyhjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVyTm9TY2hlbWFMb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIGJvb2xlYW4gdmFsaWRhdGluZyA9IFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkuaXNWYWxpZGF0aW5nKCk7Ci0gICAgICAgIHRyeSB7IAotICAgICAgICAgICAgUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiLi4vdGVzdERhdGEvbm8tc2wiOwotICAgICAgICAgICAgZ2V0RUpCKGluKTsKLQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIyLjEiLCBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0VmVyc2lvbigpKTsKLSAgICAgICAgICAgIEVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAgICAgICAgIHNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotICAgICAgICAgICAgc2V0TW9kdWxlVHlwZShFSkIpOwotCi0gICAgICAgICAgICBTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiLi4vdGVzdERhdGEvdGVzdE91dHB1dC9uby1zbCI7Ci0gICAgICAgICAgICBlamJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgICAgICBlamJGaWxlLmNsb3NlKCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGluICsgX01FVEFfSU5GX0VKQl9KQVJfWE1MOwotICAgICAgICAgICAgU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBvdXQgKyBfTUVUQV9JTkZfRUpCX0pBUl9YTUw7Ci0gICAgICAgICAgICBjb21wYXJlQ29udGVudHMoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkkpOwotICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0gICAgICAgICAgICByZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkuc2V0VmFsaWRhdGluZyh2YWxpZGF0aW5nKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldEVKQihTdHJpbmcgaW4pIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLSAgICAgICAgZWpiRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVKQkphckZpbGUoaW4pOwotICAgICAgICBhc3NlcnRUcnVlKGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRU9iamVjdCBjcmVhdGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLSAgICAgICAgaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIkVudGVycHJpc2VCZWFuIikpIHsKLSAgICAgICAgICAgIGNyZWF0ZWRCZWFucysrOwotICAgICAgICAgICAgc3dpdGNoIChjcmVhdGVkQmVhbnMpIHsKLSAgICAgICAgICAgIGNhc2UgKDMpOgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5SW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgICAgICAgICAgY2FzZSAoNyk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2VCZWFuSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgICAgICAgICAgY2FzZSAoNCk6Ci0gICAgICAgICAgICBjYXNlICg4KToKLSAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlU2Vzc2lvbkJlYW5JbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVFbnRpdHlCZWFuSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGVDbGFzc2lmaWVyLmdldE5hbWUoKS5lcXVhbHMoIlNlY3VyaXR5SWRlbnRpdHkiKSkKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVTZWN1cml0eUlkZW50aXRpeUluc3RhbmNlKGVDbGFzc2lmaWVyKTsKLSAgICAgICAgZWxzZSBpZiAoZUNsYXNzaWZpZXIuZ2V0TmFtZSgpLmVxdWFscygiUm9sZVNvdXJjZSIpKQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJvbGVTb3VyY2VJbnN0YW5jZShlQ2xhc3NpZmllcik7Ci0gICAgICAgIGVsc2UgaWYgKGVDbGFzc2lmaWVyID09IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUF0dHJpYnV0ZSgpKSByZXR1cm4gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgRU9iamVjdCBjcmVhdGVTZWN1cml0eUlkZW50aXRpeUluc3RhbmNlKEVDbGFzcyBlQ2xhc3NpZmllcikgewotICAgICAgICAvKiBBbHRlcm5hdGUgdHlwZXMgKi8KLSAgICAgICAgY3JlYXRlZFNlY1JvbGVzKys7Ci0gICAgICAgIGlmICgoY3JlYXRlZFNlY1JvbGVzICYgMSkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVc2VDYWxsZXJJZGVudGl0eSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRU9iamVjdCBjcmVhdGVSb2xlU291cmNlSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIHJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVSb2xlU291cmNlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZU1lc3NhZ2VCZWFuSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIHJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVNZXNzYWdlRHJpdmVuKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZVNlc3Npb25CZWFuSW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIHJldHVybiAoKEVqYkZhY3RvcnkpIGVDbGFzc2lmaWVyLmdldEVQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFT2JqZWN0IGNyZWF0ZUVudGl0eUJlYW5JbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLSAgICAgICAgcmV0dXJuICgoRWpiRmFjdG9yeSkgZUNsYXNzaWZpZXIuZ2V0RVBhY2thZ2UoKS5nZXRFRmFjdG9yeUluc3RhbmNlKCkpLmNyZWF0ZUVudGl0eSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRU9iamVjdCBjcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5SW5zdGFuY2UoRUNsYXNzIGVDbGFzc2lmaWVyKSB7Ci0gICAgICAgIHJldHVybiBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3QuR2VuZXJhbEVNRlRlc3QjZ2V0RGVwdGhGb3JBdHRyaWJ1dGUoRVJlZmVyZW5jZSkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldERlcHRoRm9yQXR0cmlidXRlKEVSZWZlcmVuY2UgcmVmKSB7Ci0gICAgICAgIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygiZW50ZXJwcmlzZUJlYW5zIikpCi0gICAgICAgICAgICByZXR1cm4gTlVNX0JFQU5TOwotICAgICAgICBlbHNlIGlmIChyZWYuZ2V0TmFtZSgpLmVxdWFscygiZW50aXR5QmVhbnMiKSkKLSAgICAgICAgICAgIHJldHVybiBOVU1fQkVBTlM7Ci0gICAgICAgIGVsc2UgaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKCJyZWxhdGlvbnNoaXBSb2xlcyIpKSByZXR1cm4gTlVNX1JFTEFUSU9OX1JPTEVTOwotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGVwdGhGb3JBdHRyaWJ1dGUocmVmKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdC5HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QjcG9wdWxhdGVGZWF0dXJlcyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwb3B1bGF0ZUZlYXR1cmVzKEVPYmplY3QgZU9iamVjdCkgewotICAgICAgICBpZiAoZU9iamVjdC5lQ2xhc3MoKSA9PSBFSkJfUEtHLmdldENNUEF0dHJpYnV0ZSgpKSB7Ci0gICAgICAgICAgICAoKENNUEF0dHJpYnV0ZSkgZU9iamVjdCkuc2V0TmFtZSgoU3RyaW5nKSBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmNyZWF0ZUF0dHJpYnV0ZSgKLSAgICAgICAgICAgICAgICAgICAgRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFTmFtZWRFbGVtZW50X05hbWUoKSwgZU9iamVjdCkpOwotICAgICAgICAgICAgKChDTVBBdHRyaWJ1dGUpIGVPYmplY3QpLnNldEVUeXBlKChFQ2xhc3NpZmllcikgY3JlYXRlSmF2YUNsYXNzUHJveHkobnVsbCkpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHN1cGVyLmVkaXRGZWF0dXJlcyhlT2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdC5HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QjcG9wdWxhdGVBdHRyaWJ1dGVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQXR0cmlidXRlcyhFT2JqZWN0IGVPYmplY3QpIHsKLSAgICAgICAgaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBRdWVyeU1ldGhvZEltcGwpIHsKLSAgICAgICAgICAgIExpc3QgYXR0cmlidXRlcyA9IGVPYmplY3QuZUNsYXNzKCkuZ2V0RUFsbEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIEVBdHRyaWJ1dGUgYXR0ID0gKEVBdHRyaWJ1dGUpIGF0dHJpYnV0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNyZWF0ZUF0dHJpYnV0ZVZhbHVlKGF0dCwgZU9iamVjdCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF0dC5nZXROYW1lKCkuZXF1YWxzKCJwYXJtcyIpICYmIHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpKSBlT2JqZWN0LmVTZXQoYXR0LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZU9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb25JbXBsKSB7Ci0gICAgICAgICAgICBMaXN0IGF0dHJpYnV0ZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBFQXR0cmlidXRlIGF0dCA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoYXR0LmdldE5hbWUoKS5lcXVhbHMoInVuY2hlY2tlZCIpICYmIG1wRmxhZykgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotICAgICAgICAgICAgICAgIGlmIChhdHQuaXNDaGFuZ2VhYmxlKCkpIGVPYmplY3QuZVNldChhdHQsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1wRmxhZyA9ICFtcEZsYWc7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgc3VwZXIuZWRpdEF0dHJpYnV0ZXMoZU9iamVjdCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVTaGFyZWRSZWZlcmVuY2UoRU9iamVjdCBlT2JqZWN0LCBFUmVmZXJlbmNlIHJlZikgewotICAgICAgICBpZiAoZU9iamVjdCBpbnN0YW5jZW9mIE1ldGhvZFBlcm1pc3Npb25JbXBsICYmIHJlZi5nZXROYW1lKCkuZXF1YWxzKCJyb2xlcyIpKSB7Ci0gICAgICAgICAgICBtcEZsYWcgPSAhbXBGbGFnOwotICAgICAgICAgICAgLy9pZiBtZXRob2QgcGVybWlzc2lvbiB1bmNoZWNrZWQgaWdub3JlIHJvbGVzCi0gICAgICAgICAgICBpZiAoIW1wRmxhZykgeyByZXR1cm47IH0KLSAgICAgICAgfQotICAgICAgICBzdXBlci5wb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShlT2JqZWN0LCByZWYpOwotICAgIH0KLQotICAgIHB1YmxpYyBIYXNoU2V0IGlnbm9yYWJsZUF0dHJpYnV0ZXMoKSB7Ci0gICAgICAgIEhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgICAgc2V0LmFkZCgiaWQiKTsKLSAgICAgICAgcmV0dXJuIHNldDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZWFyRmlsZSA9IG51bGw7Ci0gICAgICAgIGVqYkZpbGUgPSBudWxsOwotICAgICAgICBtZXNCZWFuID0gbnVsbDsKLSAgICAgICAgZW50aXR5QmVhbiA9IG51bGw7Ci0gICAgICAgIHNlY0lEID0gbnVsbDsKLSAgICAgICAgcm9sZVNvdXJjZSA9IG51bGw7Ci0KLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1dhckVNRkVkaXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1dhckVNRkVkaXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2M2UzOGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9XYXJFTUZFZGl0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHBSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uaW50ZXJuYWwuaW1wbC5GaWx0ZXJNYXBwaW5nSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgV2FyRU1GRWRpdFRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GRWRpdGluZ1Rlc3QgewotCXByb3RlY3RlZCBFQVJGaWxlIGVhckZpbGU7CQotCXByb3RlY3RlZCBXQVJGaWxlIHdhckZpbGU7Ci0JcHJvdGVjdGVkIGludCBjcmVhdGVkV2ViVHlwZXMgPSAwOwotCXByb3RlY3RlZCBpbnQgY3JlYXRlZEVycm9yUGFnZXMgPSAwOwotCXByb3RlY3RlZCBib29sZWFuIGZtRmxhZyA9IGZhbHNlOwotCi0gICAgcHVibGljIFdhckVNRkVkaXRUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0V2ViQXBwRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LldhckVNRlRlc3QiLCAiLW5vbG9hZGluZyIgfTsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgV2FyRU1GRWRpdFRlc3QoInRlc3RXQVJFZGl0IikpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdBUkVkaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgZ2V0V0FSQ2xpZW50KCk7Ci0KLSAgICAgICAgV2ViQXBwUmVzb3VyY2UgREQgPSAoV2ViQXBwUmVzb3VyY2UpIHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJc2V0TW9kdWxlVHlwZShXRUIpOyAKLSAgICAgICAgZWRpdFJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgU3RyaW5nIGN1ckRpciA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5OwotICAgICAgICBTdHJpbmcgb3V0ID0gY3VyRGlyICsgInRlc3RPdXRwdXQvRU1GTW9kZWxDcmVhdGlvblRlc3RzL0VkaXRXYXJFQVIiOwotICAgICAgICB3YXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIHdhckZpbGUuY2xvc2UoKTsKLQotICAgICAgICAvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotICAgICAgIAotICAgICAgICBTdHJpbmcgZXhhbXBsZURlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAiRU1GVGVzdHMvd2ViLnhtbCI7Ci0gICAgICAgIFN0cmluZyBjdXJEZXBsb3ltZW50RGVzVVJJID0gY3VyRGlyICsgb3V0ICsgIi9mb29XQVIvV0VCLUlORi93ZWIueG1sIjsKLSAgICAgICAgLy9jb21wYXJlQ29udGVudHMoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdldFdBUkNsaWVudCgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAibG9vc2VfbW9kdWxlX3dvcmtzcGFjZS9Mb29zZUVBUldlYi93ZWJBcHBsaWNhdGlvbi8iOwotICAgICAgICB3YXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuV0FSRmlsZShpbik7Ci0gICAgICAgIGFzc2VydFRydWUod2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotICAgIH0KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGVJbnN0YW5jZShFQ2xhc3MgZUNsYXNzaWZpZXIpIHsKLQotCQlpZiAoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJUeXBlKCkuZXF1YWxzKGVDbGFzc2lmaWVyKSkKLQkJCXJldHVybiBjcmVhdGVXZWJUeXBlKCk7Ci0JCWVsc2UgaWYgKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXJyb3JQYWdlKCkuZXF1YWxzKGVDbGFzc2lmaWVyKSkKLQkJCXJldHVybiBjcmVhdGVFcnJvclBhZ2UoKTsKLQotCQlyZXR1cm4gc3VwZXIuY3JlYXRlSW5zdGFuY2UoZUNsYXNzaWZpZXIpOwotCX0KLQkvKiBUaGUgd2ViIHR5cGUgaXMgYWJzdHJhY3QuICBBbHRlcm5hdGUgYmV0d2VlbiBzZXJ2bGV0LWNsYXNzCi0JICogYW5kIGpzcC1maWxlCi0JICovCi0JcHVibGljIFdlYlR5cGUgY3JlYXRlV2ViVHlwZSgpIHsKLQkJY3JlYXRlZFdlYlR5cGVzKys7Ci0JCWlmICgoY3JlYXRlZFdlYlR5cGVzICYgMSkgPT0gMCkKLQkJCXJldHVybiBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlcnZsZXRUeXBlKCk7Ci0JCWVsc2UKLQkJCXJldHVybiBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUpTUFR5cGUoKTsKLQotCX0KLQkvKiBUaGUgZXJyb3IgcGFnZSBpcyBhYnN0cmFjdC4gIEFsdGVybmF0ZSBiZXR3ZWVuIGV4Y2VwdGlvbnR5cGUKLQkgKiBhbmQgZXJyb3IgY29kZQotCSAqLwotCXB1YmxpYyBFcnJvclBhZ2UgY3JlYXRlRXJyb3JQYWdlKCkgewotCQljcmVhdGVkRXJyb3JQYWdlcysrOwotCQlpZiAoKGNyZWF0ZWRFcnJvclBhZ2VzICYgMSkgPT0gMCkKLQkJCXJldHVybiBXZWJhcHBsaWNhdGlvbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVycm9yQ29kZUVycm9yUGFnZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUuZW1mdGVzdC5HZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QjcG9wdWxhdGVBdHRyaWJ1dGVzKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQXR0cmlidXRlcyhFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBGaWx0ZXJNYXBwaW5nSW1wbCl7Ci0JCQlMaXN0IGF0dHJpYnV0ZXMgPSBlT2JqZWN0LmVDbGFzcygpLmdldEVBbGxBdHRyaWJ1dGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlFQXR0cmlidXRlIGF0dCA9IChFQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLQkJCQlpZihhdHQuZ2V0TmFtZSgpLmVxdWFscygidXJsUGF0dGVybiIpICYmIGZtRmxhZyl7Ci0JCQkJCWNvbnRpbnVlOwkJCQkJCi0JCQkJfQkKLQkJCQkKLQkJCQlPYmplY3QgdmFsdWUgPSBjcmVhdGVBdHRyaWJ1dGVWYWx1ZShhdHQsIGVPYmplY3QpOwotCQkJCWlmIChhdHQuaXNDaGFuZ2VhYmxlKCkpCi0JCQkJCWVPYmplY3QuZVNldChhdHQsIHZhbHVlKTsKLQkJCX0gCi0JCQlmbUZsYWcgPSAhZm1GbGFnOwotCQl9Ci0JCWVsc2UgCi0JCQlzdXBlci5lZGl0QXR0cmlidXRlcyhlT2JqZWN0KTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShFT2JqZWN0IGVPYmplY3QsIEVSZWZlcmVuY2UgcmVmKSB7Ci0JCWlmKGVPYmplY3QgaW5zdGFuY2VvZiBGaWx0ZXJNYXBwaW5nSW1wbCAmJiByZWYuZ2V0TmFtZSgpLmVxdWFscygic2VydmxldCIpKXsKLQkJCWZtRmxhZyA9ICFmbUZsYWc7Ci0JCQkvL2lmIG1ldGhvZCBwZXJtaXNzaW9uIHVuY2hlY2tlZCBpZ25vcmUgcm9sZXMKLQkJCWlmKCFmbUZsYWcpewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzdXBlci5wb3B1bGF0ZVNoYXJlZFJlZmVyZW5jZShlT2JqZWN0LCByZWYpOwotCX0KLQkKLQlwdWJsaWMgSGFzaFNldCBpZ25vcmFibGVBdHRyaWJ1dGVzKCl7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJc2V0LmFkZCgiaWQiKTsKLQkJcmV0dXJuIHNldDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1dhckVNRlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvV2FyRU1GVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTVjYmFlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvZW1mdGVzdHMvV2FyRU1GVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzQXV0aFR5cGVCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLmludGVybmFsLmltcGwuRmlsdGVyTWFwcGluZ0ltcGw7Ci0KLQotcHVibGljIGNsYXNzIFdhckVNRlRlc3QgZXh0ZW5kcyBHZW5lcmFsRU1GUG9wdWxhdGlvblRlc3QgewotICAgIHByb3RlY3RlZCBFQVJGaWxlIGVhckZpbGU7Ci0gICAgcHJvdGVjdGVkIFdBUkZpbGUgd2FyRmlsZTsKLSAgICBwcm90ZWN0ZWQgaW50IGNyZWF0ZWRXZWJUeXBlcyA9IDA7Ci0gICAgcHJvdGVjdGVkIGludCBjcmVhdGVkRXJyb3JQYWdlcyA9IDA7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZm1GbGFnID0gZmFsc2U7Ci0gICAgcHVibGljIFdhckVNRlRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0V2ViQXBwRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgCi0gICAgICAgIGp1bml0LnRleHR1aS5UZXN0UnVubmVyLm1haW4obmV3IFN0cmluZ1tdeyBXYXJFTUZUZXN0LmNsYXNzLmdldE5hbWUoKSB9KTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBXYXJFTUZUZXN0KCJ0ZXN0V0FSUG9wdWxhdGlvbiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgV2FyRU1GVGVzdCgidGVzdDE0V0FSUG9wdWxhdGlvbiIpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXQVJQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLSAgICAgICAgY3JlYXRlRUFSKCk7Ci0gICAgICAgIGNyZWF0ZVdBUkNsaWVudCgpOwotCi0gICAgICAgIFdlYkFwcFJlc291cmNlIEREID0gKFdlYkFwcFJlc291cmNlKSB3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJc2V0TW9kdWxlVHlwZShXRUIpOwotICAgICAgICBwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RXYXJFQVIiOwotICAgICAgICBlYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgICAgIGVhckZpbGUuY2xvc2UoKTsKLQotICAgICAgICAvL0NvbXBhcmUgd29yayBpbiBwcm9ncmVzcwotICAgICAgICBTdHJpbmcgY3VyRGlyID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3Rvcnk7Ci0gICAgICAgIFN0cmluZyBleGFtcGxlRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJFTUZUZXN0Tm9JRC93ZWIueG1sIjsKLSAgICAgICAgU3RyaW5nIGN1ckRlcGxveW1lbnREZXNVUkkgPSBjdXJEaXIgKyAidGVzdE91dHB1dC9UZXN0V2FyRUFSL2Zvb1dBUi9XRUItSU5GL3dlYi54bWwiOwotCQlzZXRJZ25vcmVBdHQoaWdub3JhYmxlQXR0cmlidXRlcygpKTsKLQkJc2V0RXF1aXZhbGVudExpbmVzKGdldEVxdWl2YWxlbnRMaW5lc01hcCgpKTsKLQkJY29tcGFyZUNvbnRlbnRzSWdub3JlV2hpdGVzcGFjZShjdXJEZXBsb3ltZW50RGVzVVJJLCBleGFtcGxlRGVwbG95bWVudERlc1VSSSwgbnVsbCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyB2b2lkIHRlc3QxNFdBUlBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlV0FSQ2xpZW50KCk7Ci0KLQkJV2ViQXBwUmVzb3VyY2UgREQgPSAoV2ViQXBwUmVzb3VyY2UpIHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlzZXRNb2R1bGVUeXBlKFdFQik7Ci0JCS8vc2V0R2VuZXJhbERlcHRoKDIpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQotCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJ0ZXN0T3V0cHV0L1Rlc3RXYXJFQVIxNCI7Ci0JCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJZWFyRmlsZS5jbG9zZSgpOwotCQkKLQkJZ2V0V0FSQ2xpZW50KCk7Ci0JCWFzc2VydEVxdWFscygiMi40Iiwgd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFZlcnNpb24oKSk7Ci0JCW91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9UZXN0V2FyRUFSMTRfMiI7Ci0JCXdhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJd2FyRmlsZS5jbG9zZSgpOwotCi0JCS8vQ29tcGFyZSB3b3JrIGluIHByb2dyZXNzCi0JCVN0cmluZyBjdXJEaXIgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLQkJU3RyaW5nIGV4YW1wbGVEZXBsb3ltZW50RGVzVVJJID0gb3V0ICsgIi9XRUItSU5GL3dlYi54bWwiOwotCQlTdHJpbmcgY3VyRGVwbG95bWVudERlc1VSSSA9IGN1ckRpciArICJ0ZXN0T3V0cHV0L1Rlc3RXYXJFQVIxNC9mb29XQVIvV0VCLUlORi93ZWIueG1sIjsKLQkJc2V0SWdub3JlQXR0KGlnbm9yYWJsZUF0dHJpYnV0ZXMoKSk7Ci0JCWNvbXBhcmVDb250ZW50c0lnbm9yZVdoaXRlc3BhY2UoY3VyRGVwbG95bWVudERlc1VSSSwgZXhhbXBsZURlcGxveW1lbnREZXNVUkksIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBNYXAgZ2V0RXF1aXZhbGVudExpbmVzTWFwKCkgewotCQlNYXAgbGluZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlsaW5lcy5wdXQoIjxkaXN0cmlidXRhYmxlPjwvZGlzdHJpYnV0YWJsZT4iLCAiPGRpc3RyaWJ1dGFibGUvPiIpOyAKLQkJcmV0dXJuIGxpbmVzOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVdBUkNsaWVudCgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24gewotICAgICAgICB3YXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVXQVJGaWxlSW5pdGlhbGl6ZWQoImZvb1dBUiIpOwotICAgICAgICB3YXJGaWxlID0gKFdBUkZpbGUpIGVhckZpbGUuYWRkQ29weSh3YXJGaWxlKTsKLSAgICAgICAgd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLnNldERpc3BsYXlOYW1lKCJmb29XQVIiKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSh3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlRUFSKCkgewotICAgICAgICBTdHJpbmcgZWFyTmFtZSA9ICJUZXN0LmVhciI7Ci0gICAgICAgIGVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChlYXJOYW1lKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0gICAgfQotICAgIAotCXB1YmxpYyB2b2lkIGdldFdBUkNsaWVudCgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIE9wZW5GYWlsdXJlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9UZXN0V2FyRUFSMTQvZm9vV0FSIjsKLQkJd2FyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbldBUkZpbGUoaW4pOwotCQlhc3NlcnRUcnVlKHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0KLSAgICBwdWJsaWMgRU9iamVjdCBjcmVhdGVJbnN0YW5jZShFUmVmZXJlbmNlIHJlZixFT2JqZWN0IGVPYmplY3QpIHsKLQotICAgICAgICBpZiAoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJUeXBlKCkuZXF1YWxzKHJlZi5nZXRFVHlwZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVXZWJUeXBlKCk7Ci0gICAgICAgIGVsc2UgaWYgKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RXJyb3JQYWdlKCkuZXF1YWxzKHJlZi5nZXRFVHlwZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVFcnJvclBhZ2UoKTsKLQotICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlSW5zdGFuY2UocmVmLCBlT2JqZWN0KTsKLSAgICB9Ci0gICAgLyogVGhlIHdlYiB0eXBlIGlzIGFic3RyYWN0LiAgQWx0ZXJuYXRlIGJldHdlZW4gc2VydmxldC1jbGFzcwotICAgICAqIGFuZCBqc3AtZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBXZWJUeXBlIGNyZWF0ZVdlYlR5cGUoKSB7Ci0gICAgICAgIGNyZWF0ZWRXZWJUeXBlcysrOwotICAgICAgICBpZiAoKGNyZWF0ZWRXZWJUeXBlcyAmIDEpID09IDApCi0gICAgICAgICAgICByZXR1cm4gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXJ2bGV0VHlwZSgpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKU1BUeXBlKCk7Ci0KLSAgICB9Ci0gICAgLyogVGhlIGVycm9yIHBhZ2UgaXMgYWJzdHJhY3QuICBBbHRlcm5hdGUgYmV0d2VlbiBleGNlcHRpb250eXBlCi0gICAgICogYW5kIGVycm9yIGNvZGUKLSAgICAgKi8KLSAgICBwdWJsaWMgRXJyb3JQYWdlIGNyZWF0ZUVycm9yUGFnZSgpIHsKLSAgICAgICAgY3JlYXRlZEVycm9yUGFnZXMrKzsKLSAgICAgICAgaWYgKChjcmVhdGVkRXJyb3JQYWdlcyAmIDEpID09IDApCi0gICAgICAgICAgICByZXR1cm4gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFcnJvckNvZGVFcnJvclBhZ2UoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIFdlYmFwcGxpY2F0aW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZSgpOwotICAgIH0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy5hcmNoaXZlLmVtZnRlc3QuR2VuZXJhbEVNRlBvcHVsYXRpb25UZXN0I3BvcHVsYXRlQXR0cmlidXRlcyhvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZUF0dHJpYnV0ZXMoRU9iamVjdCBlT2JqZWN0KSB7Ci0JCWlmIChlT2JqZWN0IGluc3RhbmNlb2YgRmlsdGVyTWFwcGluZ0ltcGwpewotCQkJTGlzdCBhdHRyaWJ1dGVzID0gZU9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsQXR0cmlidXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRUF0dHJpYnV0ZSBhdHQgPSAoRUF0dHJpYnV0ZSkgYXR0cmlidXRlcy5nZXQoaSk7Ci0JCQkJaWYoYXR0LmdldE5hbWUoKS5lcXVhbHMoInVybFBhdHRlcm4iKSAmJiBmbUZsYWcpewotCQkJCQljb250aW51ZTsJCQkJCQotCQkJCX0JCi0JCQkJCi0JCQkJT2JqZWN0IHZhbHVlID0gY3JlYXRlQXR0cmlidXRlVmFsdWUoYXR0LCBlT2JqZWN0KTsKLQkJCQlpZiAoYXR0LmlzQ2hhbmdlYWJsZSgpKQotCQkJCQllT2JqZWN0LmVTZXQoYXR0LCB2YWx1ZSk7Ci0JCQl9IAotCQkJZm1GbGFnID0gIWZtRmxhZzsKLQkJfQotCQllbHNlIAotCQkJc3VwZXIucG9wdWxhdGVBdHRyaWJ1dGVzKGVPYmplY3QpOwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKEVPYmplY3QgZU9iamVjdCwgRVJlZmVyZW5jZSByZWYpIHsKLQkJaWYoZU9iamVjdCBpbnN0YW5jZW9mIEZpbHRlck1hcHBpbmdJbXBsICYmIHJlZi5nZXROYW1lKCkuZXF1YWxzKCJzZXJ2bGV0IikpewotCQkJZm1GbGFnID0gIWZtRmxhZzsKLQkJCS8vaWYgbWV0aG9kIHBlcm1pc3Npb24gdW5jaGVja2VkIGlnbm9yZSByb2xlcwotCQkJaWYoIWZtRmxhZyl7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXN1cGVyLnBvcHVsYXRlU2hhcmVkUmVmZXJlbmNlKGVPYmplY3QsIHJlZik7Ci0JfQotCQotCXB1YmxpYyBIYXNoU2V0IGlnbm9yYWJsZUF0dHJpYnV0ZXMoKXsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlzZXQuYWRkKCJpZCIpOwotCQlyZXR1cm4gc2V0OwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZEF1dGgoUmVzQXV0aFR5cGVCYXNlIGF1dGgpIHsKLQkJaWYgKHZlcnNpb24gPT0gVkVSU0lPTl8xXzIpCi0JCQlyZXR1cm4gYXV0aCA9PSBSZXNBdXRoVHlwZUJhc2UuU0VSVkxFVF9MSVRFUkFMIHx8IGF1dGggPT0gUmVzQXV0aFR5cGVCYXNlLkNPTlRBSU5FUl9MSVRFUkFMOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuaXNWYWxpZEF1dGgoYXV0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1dlYlNlcnZpY2VzRU1GVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS9lbWZ0ZXN0cy9XZWJTZXJ2aWNlc0VNRlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUxODY3Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL2VtZnRlc3RzL1dlYlNlcnZpY2VzRU1GVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEF1ZyA2LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllcy5FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5PcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5JbnRlcmZhY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkphdmFXU0RMTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLmpheHJwY21hcC5KYXhycGNtYXBGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2UuamF4cnBjbWFwLkpheHJwY21hcFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NjbGllbnQuV2ViU2VydmljZXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldzZGRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5SZW5kZXJlckZhY3Rvcnk7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGRmaG9sdHRwCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYlNlcnZpY2VzRU1GVGVzdCBleHRlbmRzIEdlbmVyYWxFTUZQb3B1bGF0aW9uVGVzdCB7Ci0JRUFSRmlsZSBlYXJGaWxlOwotCUVKQkphckZpbGUgZWpiRmlsZTsKLQlpbnQgY3VycmVudFZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQlwcml2YXRlIGludCBjcmVhdGVkSW50ZXJmYWNlTWFwcyA9IDA7Ci0KLQlwdWJsaWMgV2ViU2VydmljZXNFTUZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBFamJGYWN0b3J5IGdldEVqYkZhY3RvcnkoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRBcHBsaWNhdGlvbkZhY3RvcnkoKSB7Ci0JCXJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBXZWJhcHBsaWNhdGlvbkZhY3RvcnkgZ2V0V2ViQXBwRmFjdG9yeSgpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0JfQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZUluc3RhbmNlKEVSZWZlcmVuY2UgcmVmLEVPYmplY3QgZU9iamVjdCkgewotCi0gICAgICAgIGlmIChKYXhycGNtYXBQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbnRlcmZhY2VNYXBwaW5nKCkuZXF1YWxzKHJlZi5nZXRFVHlwZSgpKSkKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnRlcmZhY2VNYXAoKTsKLQotICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlSW5zdGFuY2UocmVmLCBlT2JqZWN0KTsKLSAgICB9Ci0gICAgLyogVGhlIHdlYiB0eXBlIGlzIGFic3RyYWN0LiAgQWx0ZXJuYXRlIGJldHdlZW4gc2VydmxldC1jbGFzcwotICAgICAqIGFuZCBqc3AtZmlsZQotICAgICAqLwotICAgIHB1YmxpYyBJbnRlcmZhY2VNYXBwaW5nIGNyZWF0ZUludGVyZmFjZU1hcCgpIHsKLSAgICAgICAgY3JlYXRlZEludGVyZmFjZU1hcHMrKzsKLSAgICAgICAgaWYgKChjcmVhdGVkSW50ZXJmYWNlTWFwcyAmIDEpID09IDApCi0gICAgICAgICAgICByZXR1cm4gSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZygpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gSmF4cnBjbWFwRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VydmljZUVuZHBvaW50SW50ZXJmYWNlTWFwcGluZygpOwotCi0gICAgfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LldlYlNlcnZpY2VzRU1GVGVzdCIsICItbm9sb2FkaW5nIiB9OwotCQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBXZWJTZXJ2aWNlc0VNRlRlc3QoInRlc3QxM1dlYlNlcnZpY2VzQ2xpZW50UG9wdWxhdGlvbiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgV2ViU2VydmljZXNFTUZUZXN0KCJ0ZXN0MTNXZWJTZXJ2aWNlc0REUG9wdWxhdGlvbiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgV2ViU2VydmljZXNFTUZUZXN0KCJ0ZXN0MTRXZWJTZXJ2aWNlc0REUG9wdWxhdGlvbiIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgV2ViU2VydmljZXNFTUZUZXN0KCJ0ZXN0SmF4UlBDTWFwUG9wdWxhdGlvbiIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MTNXZWJTZXJ2aWNlc0NsaWVudFBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3VycmVudFZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlRUpCKCk7Ci0JCQotCi0JCVdlYlNlcnZpY2VzUmVzb3VyY2Ugd2Vic2VyREQgPSAoV2ViU2VydmljZXNSZXNvdXJjZSllamJGaWxlLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiTUVUQS1JTkYvd2Vic2VydmljZXNjbGllbnQueG1sIikpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCXdlYnNlckRELnNldFZlcnNpb25JRChjdXJyZW50VmVyc2lvbik7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlwb3B1bGF0ZVJvb3Qod2Vic2VyREQuZ2V0Um9vdE9iamVjdCgpKTsKLQkJCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArZ2V0UHJvamVjdExvY2F0aW9uKCk7Ci0JCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJZWFyRmlsZS5jbG9zZSgpOwotCi0JfQotCXB1YmxpYyB2b2lkIHRlc3RKYXhSUENNYXBQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWN1cnJlbnRWZXJzaW9uID0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQ7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJY3JlYXRlRUFSKCk7Ci0JCWNyZWF0ZUVKQigpOwotCQlTdHJpbmcgbWFwcGluZ0ZpbGVQYXRoVVJJID0gIk1FVEEtSU5GL3Rlc3RtYXAueG1sIjsKLQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVVUkkobWFwcGluZ0ZpbGVQYXRoVVJJKTsKLQkJUmVzb3VyY2VTZXQgcmVzU2V0ID0gZWpiRmlsZS5nZXRSZXNvdXJjZVNldCgpOwotCQlKMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSAoSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KSByZXNTZXQuZ2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkoKTsKLQkJcmVnaXN0cnkucmVnaXN0ZXJMYXN0RmlsZVNlZ21lbnQodXJpLmxhc3RTZWdtZW50KCksIG5ldyBKYXhycGNtYXBSZXNvdXJjZUZhY3RvcnkoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSkpOwotCQlyZXNTZXQgPSBlYXJGaWxlLmdldFJlc291cmNlU2V0KCk7Ci0JCXJlZ2lzdHJ5ID0gKEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSkgcmVzU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCXJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KHVyaS5sYXN0U2VnbWVudCgpLCBuZXcgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeS5nZXREZWZhdWx0UmVuZGVyZXJGYWN0b3J5KCkpKTsKLQotCQlKYXhycGNtYXBSZXNvdXJjZSBqYXhycGNtYXBSZXMgPSAoSmF4cnBjbWFwUmVzb3VyY2UpIHJlc1NldC5jcmVhdGVSZXNvdXJjZSh1cmkpOwotCQkKLQkJamF4cnBjbWFwUmVzLnNldFZlcnNpb25JRChjdXJyZW50VmVyc2lvbik7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQkKLQkJSmF2YVdTRExNYXBwaW5nIG1hcCA9IEpheHJwY21hcEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFXU0RMTWFwcGluZygpOwotCQlqYXhycGNtYXBSZXMuZ2V0Q29udGVudHMoKS5hZGQobWFwKTsKLQkJcG9wdWxhdGVSb290KGpheHJwY21hcFJlcy5nZXRSb290T2JqZWN0KCkpOwotCQkKLQkJU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICtnZXRQcm9qZWN0TG9jYXRpb24oKTsKLQkJZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9BTEwpOwotCQllYXJGaWxlLmNsb3NlKCk7Ci0KLQl9Ci0JCi0JCi0JCi0JcHVibGljIHZvaWQgdGVzdDEzV2ViU2VydmljZXNERFBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljdXJyZW50VmVyc2lvbiA9IEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlRUpCKCk7Ci0KLQkJV3NkZFJlc291cmNlIHdlYnNlckREID0gKFdzZGRSZXNvdXJjZSllamJGaWxlLmdldFJlc291cmNlU2V0KCkuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiTUVUQS1JTkYvd2Vic2VydmljZXMueG1sIikpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCXdlYnNlckRELnNldFZlcnNpb25JRChjdXJyZW50VmVyc2lvbik7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlwb3B1bGF0ZVJvb3Qod2Vic2VyREQuZ2V0Um9vdE9iamVjdCgpKTsKLQkJCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArZ2V0UHJvamVjdExvY2F0aW9uKCk7Ci0JCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJZWFyRmlsZS5jbG9zZSgpOwotCi0JfQotCXB1YmxpYyB2b2lkIHRlc3QxNFdlYlNlcnZpY2VzRERQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJY3VycmVudFZlcnNpb24gPSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDsKLQkJY3JlYXRlRUFSKCk7Ci0JCWNyZWF0ZUVKQigpOwotCi0JCVdzZGRSZXNvdXJjZSB3ZWJzZXJERCA9IChXc2RkUmVzb3VyY2UpZWpiRmlsZS5nZXRSZXNvdXJjZVNldCgpLmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoIk1FVEEtSU5GL3dlYnNlcnZpY2VzLnhtbCIpKTsKLQkJd2Vic2VyREQuZ2V0Q29udGVudHMoKS5hZGQoV3NkZEZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVdlYlNlcnZpY2VzKCkpOwotCQkvL1RPRE86IGluZGl2aWR1YWwgdGVzdCBmb3IgZWFjaCB2ZXJzaW9uCi0JCXdlYnNlckRELnNldFZlcnNpb25JRChjdXJyZW50VmVyc2lvbik7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlwb3B1bGF0ZVJvb3Qod2Vic2VyREQuZ2V0Um9vdE9iamVjdCgpKTsKLQkJCi0JCVN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArZ2V0UHJvamVjdExvY2F0aW9uKCk7Ci0JCWVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQkJZWFyRmlsZS5jbG9zZSgpOwotCi0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdExvY2F0aW9uKCkgewotCQlpZiAoY3VycmVudFZlcnNpb24gPT0gSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpCi0JCQlyZXR1cm4gInRlc3RPdXRwdXQvVGVzdFdlYlNlcnZpY2VzIjsKLQkJZWxzZQotCQkJcmV0dXJuICJ0ZXN0T3V0cHV0L1Rlc3RXZWJTZXJ2aWNlczE0IjsKLQl9Ci0JcHVibGljIHZvaWQgZ2V0RUpCKCkgdGhyb3dzIER1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbiwgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArZ2V0UHJvamVjdExvY2F0aW9uKCkgKyIvZm9vV2ViU2VydmljZXMiOwotCQllamJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUpCSmFyRmlsZShpbik7Ci0JCWFzc2VydFRydWUoZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IG51bGwpOwotCX0KLQlwdWJsaWMgdm9pZCBjcmVhdGVFSkIoKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uIHsKLQkJZWpiRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUpCSmFyRmlsZUluaXRpYWxpemVkKCJmb29XZWJTZXJ2aWNlcyIpOwotCQllamJGaWxlID0gKEVKQkphckZpbGUpIGVhckZpbGUuYWRkQ29weShlamJGaWxlKTsKLQkJZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLnNldERpc3BsYXlOYW1lKCJmb29XZWJTZXJ2aWNlcyIpOwotCQlhc3NlcnRUcnVlKGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBudWxsKTsKLQl9Ci0JcHVibGljIHZvaWQgY3JlYXRlRUFSKCkgewotCQlTdHJpbmcgZWFyTmFtZSA9ICJUZXN0LmVhciI7Ci0JCWVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChlYXJOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JfQotICAgIAotCXB1YmxpYyBIYXNoU2V0IGlnbm9yYWJsZUF0dHJpYnV0ZXMoKXsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlzZXQuYWRkKCJpZCIpOwotCQlyZXR1cm4gc2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BYnN0cmFjdEFyY2hpdmVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQWJzdHJhY3RBcmNoaXZlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTFhMzE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BYnN0cmFjdEFyY2hpdmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotIC8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMDIvMDcvMDEgMTo0ODoxOCBQTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0QXJjaGl2ZVRlc3QgZXh0ZW5kcyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMS4iOy8vJE5PTi1OTFMtMSQKLS8qKgotICogQWJzdHJhY3RBcmNoaXZlVGVzdCBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgQWJzdHJhY3RBcmNoaXZlVGVzdChTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIFNldCBnZXRBbGxVbnJlc29sdmVkUHJveGllcyhFT2JqZWN0IHJvb3QpIHsKLQlTZXQgdmlzaXRlZCA9IG5ldyBIYXNoU2V0KCk7Ci0JU2V0IHByb3hpZXMgPSBuZXcgSGFzaFNldCgpOwotCWdldEFsbFVucmVzb2x2ZWRQcm94aWVzKHJvb3QsIHByb3hpZXMsIHZpc2l0ZWQsIHJvb3QuZVJlc291cmNlKCkpOwotCXJldHVybiBwcm94aWVzOwotfQotcHVibGljIHZvaWQgZ2V0QWxsVW5yZXNvbHZlZFByb3hpZXMoRU9iamVjdCBvYmplY3QsIFNldCBwcm94aWVzLCBTZXQgdmlzaXRlZE9iamVjdHMsIFJlc291cmNlIG9yaWdpbmFsUmVzb3VyY2UpIHsKLQotCWlmICh2aXNpdGVkT2JqZWN0cy5jb250YWlucyhvYmplY3QpKQotCQlyZXR1cm47Ci0JZWxzZQotCQl2aXNpdGVkT2JqZWN0cy5hZGQob2JqZWN0KTsKLQotCWlmIChvYmplY3QuZVJlc291cmNlKCkgIT0gb3JpZ2luYWxSZXNvdXJjZSkgewotCQlpZiAoKChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IClvYmplY3QpLmVJc1Byb3h5KCkpIHsKLQkJCXByb3hpZXMuYWRkKG9iamVjdCk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCUxpc3QgcmVmcyA9IG9iamVjdC5lQ2xhc3MoKS5nZXRFQWxsUmVmZXJlbmNlcygpOwotCWlmIChyZWZzICE9IG51bGwpIHsKLQkJSXRlcmF0b3IgaXIgPSByZWZzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpci5oYXNOZXh0KCkpIHsKLQkJCUVSZWZlcmVuY2UgciA9IChFUmVmZXJlbmNlKSBpci5uZXh0KCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBvYmplY3QuZUdldChyKTsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoci5pc01hbnkoKSkgewotCQkJCUNvbGxlY3Rpb24gYyA9IChDb2xsZWN0aW9uKSB2YWx1ZTsKLQkJCQlJdGVyYXRvciBpcjIgPSBjLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGlyMi5oYXNOZXh0KCkpIHsKLQkJCQkJRU9iamVjdCByZWZPYmogPSAoRU9iamVjdCkgaXIyLm5leHQoKTsKLQkJCQkJZ2V0QWxsVW5yZXNvbHZlZFByb3hpZXMocmVmT2JqLCBwcm94aWVzLCB2aXNpdGVkT2JqZWN0cywgb3JpZ2luYWxSZXNvdXJjZSk7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQkJZ2V0QWxsVW5yZXNvbHZlZFByb3hpZXMoKEVPYmplY3QpIHZhbHVlLCBwcm94aWVzLCB2aXNpdGVkT2JqZWN0cywgb3JpZ2luYWxSZXNvdXJjZSk7Ci0JCX0KLQl9Ci19Ci1wdWJsaWMgc3RhdGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLX0KLXB1YmxpYyB2b2lkIHZlcmlmeVByb3hpZXMoRU9iamVjdCByb290KSB7Ci0KLQlTZXQgcHJveGllcyA9IGdldEFsbFVucmVzb2x2ZWRQcm94aWVzKHJvb3QpOwotCWFzc2VydFRydWUoIlNvbWUgcHJveGllcyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQiLCBwcm94aWVzLmlzRW1wdHkoKSk7Ci19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQWxsQXJjaGl2ZVRlc3RzRWNsaXBzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0FsbEFyY2hpdmVUZXN0c0VjbGlwc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5ZmM2ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQWxsQXJjaGl2ZVRlc3RzRWNsaXBzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDE4LCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFsbEFyY2hpdmVUZXN0c0VjbGlwc2UgZXh0ZW5kcyBBbGxBcmNoaXZlVGVzdHNKYXZhIHsKLQotICAgIHB1YmxpYyBBbGxBcmNoaXZlVGVzdHNFY2xpcHNlKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BbGxBcmNoaXZlVGVzdHNKYXZhLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQWxsQXJjaGl2ZVRlc3RzSmF2YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTZjOGViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9BbGxBcmNoaXZlVGVzdHNKYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotIC8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSAqLwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzE5LzAwIDQ6NDQ6MDQgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxBcmNoaXZlVGVzdHNKYXZhIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMS4iOy8vJE5PTi1OTFMtMSQKLS8qKgotICogQWxsVGVzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIEFsbEFyY2hpdmVUZXN0c0phdmEoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLS8qKgotICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5BbGxUZXN0cyIsICItbm9sb2FkaW5nIn07Ci0JVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIGNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdCIpOwotCXN1aXRlLmFkZFRlc3QoRGlzY3JpbWluYXRvclRlc3Quc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChMb29zZUFyY2hpdmVUZXN0cy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KEluaXRpYWxpemF0aW9uVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChTaW1wbGVUZXN0cy5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KENvcHlUZXN0cy5zdWl0ZSgpKTsKLS8vCXN1aXRlLmFkZFRlc3QoRUpCSmFyQ29udmVyc2lvblRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoV0FSRmlsZVRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoU2F2ZVRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoSmF2YVRlc3RzLnN1aXRlKCkpOwotLy8Jc3VpdGUuYWRkVGVzdChJRFRlc3RzLnN1aXRlKCkpOwotCS8vc3VpdGUuYWRkVGVzdChBbHRERFRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoU2VjdXJpdHlSb2xlVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChSYXJGaWxlVGVzdHMuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChSZXNvdXJjZVRlc3RzLnN1aXRlKCkpOwotCXN1aXRlLmFkZFRlc3QoQ2xpZW50Q29udGFpbmVyUmVzb3VyY2VMb2FkVGVzdC5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KFRlc3RNb2R1bGVDbGFzc0xvYWRpbmcuc3VpdGUoKSk7Ci0Jc3VpdGUuYWRkVGVzdChUZXN0SW52YWxpZFhtbE11bHRpcGxpY2l0eS5zdWl0ZSgpKTsKLQlzdWl0ZS5hZGRUZXN0KERlZmVjdFZlcmlmaWNhdGlvblRlc3RzLnN1aXRlKCkpOwotCQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9DbGllbnRDb250YWluZXJSZXNvdXJjZUxvYWRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvQ2xpZW50Q29udGFpbmVyUmVzb3VyY2VMb2FkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWQ4MTk4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9DbGllbnRDb250YWluZXJSZXNvdXJjZUxvYWRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUluaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5Db21tb25hcmNoaXZlRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotCi0KLQotcHVibGljIGNsYXNzIENsaWVudENvbnRhaW5lclJlc291cmNlTG9hZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZXsKLQlwdWJsaWMgc3RhdGljIEVBUkZpbGUgZWFyRmlsZSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBTaW1wbGVUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ2xpZW50Q29udGFpbmVyUmVzb3VyY2VMb2FkVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnNldFVwKCk7Ci0JCUFyY2hpdmVJbml0LmluaXQoKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShDbGllbnRDb250YWluZXJSZXNvdXJjZUxvYWRUZXN0LmNsYXNzKTsKLQl9Ci0JLyoqCi0JICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LkNsaWVudENvbnRhaW5lclJlc291cmNlTG9hZFRlc3QiLCAiLW5vbG9hZGluZyIgfTsKLQkJVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDbGllbnRDb250YWluZXJMb2FkICgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXRyeSB7Ci0KLQkJCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkgPSBDb21tb25hcmNoaXZlRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpOwotCQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAibXRhcHAyLmVhciI7Ci0JCQlTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAibXRhcHAyRmluaXNoZWQuZWFyIjsKLQkJCWVhckZpbGUgPSBmYWN0b3J5Lm9wZW5FQVJGaWxlIChpbik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4gKCJ1cmk6ICIgKyBlYXJGaWxlLmdldFVSSSgpKTsKLQotCQkJTGlzdCBhcHBDbGllbnRzID0gZWFyRmlsZS5nZXRBcHBsaWNhdGlvbkNsaWVudEZpbGVzKCk7Ci0JCQlib29sZWFuIGV4Rm91bmQxID0gZmFsc2U7Ci0JCQlib29sZWFuIGV4Rm91bmQyID0gZmFsc2U7Ci0JCQkKLQkJCWZvcihpbnQgaSA9IDA7IGk8YXBwQ2xpZW50cy5zaXplKCk7IGkrKyl7Ci0JCQkJQXBwbGljYXRpb25DbGllbnRGaWxlIGZpbGUgPSAoQXBwbGljYXRpb25DbGllbnRGaWxlKWFwcENsaWVudHMuZ2V0KDApOwotCQkJCVJlc291cmNlIHJlczsKLQotCQkJCXRyeXsKLQkJCQkJcmVzID0gZmlsZS5nZXRNb2ZSZXNvdXJjZSgiTUVUQS1JTkYvRk9PY2xpZW50LXJlc291cmNlLnhtaSIpOwotCQkJCX0gY2F0Y2goRXhjZXB0aW9uIGUpewkKLQkJCQkJZXhGb3VuZDEgPSB0cnVlOwotCQkJCQlpZighKGUgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24pKXsKLQkJCQkJCWFzc2VydFRydWUoIkV4cGVjdGVkIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiIsIGZhbHNlKTsKLQkJCQkJfQkJCi0JCQkJfQotCQkJCQotCQkJCXRyeSB7Ci0JCQkJCXJlcyA9IGZpbGUuZ2V0TW9mUmVzb3VyY2UoIk1FVEEtSU5GL2NsaWVudC1yZXNvdXJjZS54bWkiKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlleEZvdW5kMiA9IHRydWU7Ci0JCQkJCWlmKCEoZSBpbnN0YW5jZW9mIFJlc291cmNlTG9hZEV4Y2VwdGlvbikpewotCQkJCQkJYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgUmVzb3VyY2VMb2FkRXhjZXB0aW9uIiwgZmFsc2UpOwotCQkJCQl9CQotCQkJCX0KLQkJCX0KLQkJCWFzc2VydFRydWUoIk5vIGV4Y2VwdGlvbiBsb2dnZWQgZm9yIG5vbi1leGlzdGluZyBmaWxlIiwgZXhGb3VuZDEpOwotCQkJYXNzZXJ0VHJ1ZSgiTm8gZXhjZXB0aW9uIGxvZ2dlZCBmb3IgZXhpc3RpbmciLCBleEZvdW5kMik7Ci0KLQkJCQotCQkJZWFyRmlsZS5zYXZlQXMob3V0KTsKLQkJCWVhckZpbGUuY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0NvcHlUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0NvcHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWU2MTY3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9Db3B5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotLyoKLSogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0KLSogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0qIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0qLwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUmVhZE9ubHlEaXJlY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKiBDcmVhdGlvbiBkYXRlOiAoMTIvMTQvMDAgMTI6MTA6MzYgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3B5VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBDb3B5VGVzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENvcHlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0JfQotCXB1YmxpYyBFamJGYWN0b3J5IGdldEVKQkZhY3RvcnkoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIEVqYlBhY2thZ2UgZ2V0RUpCUGFja2FnZSgpIHsKLQkJcmV0dXJuIEVqYlBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQlwdWJsaWMgV2ViYXBwbGljYXRpb25GYWN0b3J5IGdldFdlYkZhY3RvcnkoKSB7Ci0JCXJldHVybiBXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYmFwcGxpY2F0aW9uRmFjdG9yeSgpOwotCX0KLQkvKioKLQkgKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotCSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuQ29weVRlc3RzIiwgIi1ub2xvYWRpbmciIH07Ci0JCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotCX0KLQlwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShDb3B5VGVzdHMuY2xhc3MpOwotCX0KLQkvKioKLQkgKiBUZXN0cyB0aGUgYWRkQ29weShSZWFkT25seURpcmVjdG9yeSkgYXBpIG9uIGFyY2hpdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29weURpcmVjdG9yeSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVdBUkZpbGUgYVdhckZpbGUgPSAoV0FSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJleGFtcGxlMi53YXIiKTsKLQotCQlSZWFkT25seURpcmVjdG9yeSBzYW1wbGVEaXJlY3RvcnkgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5SZWFkT25seURpcmVjdG9yeShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJXYXJUZXN0Q2xhc3NlcyIpOwotCQkKLQkJaW50IGluaXRpYWxTaXplID0gYVdhckZpbGUuZ2V0RmlsZXMoKS5zaXplKCk7Ci0KLQkJYVdhckZpbGUuYWRkQ29weShzYW1wbGVEaXJlY3RvcnkpOwotCQlJdGVyYXRvciBpdGVyID0gYVdhckZpbGUuZ2V0RmlsZXMoKS5pdGVyYXRvcigpOwotCQkvL0ZvciBydW5uaW5nIGluc2lkZSBlY2xpcHNlCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHVyaSA9ICgoRmlsZSlpdGVyLm5leHQoKSkuZ2V0VVJJKCk7Ci0JCQlpZiAodXJpLmluZGV4T2YoIkNWUyIpID49IDApIAotCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGZpbGVzICIsIGFXYXJGaWxlLmdldEZpbGVzKCkuc2l6ZSgpID09IGluaXRpYWxTaXplICsgNyk7Ci0JCWFXYXJGaWxlLnNhdmVBc05vUmVvcGVuKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvQ29weVRlc3RzL2FkZENvcHlEaXIud2FyIik7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29weU1vZHVsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotCQlFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0JCUxpc3QgbW9kdWxlcyA9IGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCk7Ci0JCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IG51bGw7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGUgYU1vZHVsZSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJaWYgKGFNb2R1bGUuaXNFamJNb2R1bGUoKSkgewotCQkJCWVqYkphckZpbGUgPSAoRUpCSmFyRmlsZSkgZWFyRmlsZS5nZXRGaWxlKGFNb2R1bGUuZ2V0VXJpKCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZSgiRUpCSmFyRmlsZSBzaG91bGQgbm90IGJlIG51bGwiLCBlamJKYXJGaWxlICE9IG51bGwpOwotCQllamJKYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQkJRUFSRmlsZSBuZXdFYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9Db3B5VGVzdHMvbmV3RWFyV2l0aENvcGllZE1vZHVsZS5lYXIiKTsKLQkJbmV3RWFyRmlsZS5hZGRDb3B5KGVqYkphckZpbGUpOwotCQlFSkJKYXJGaWxlIGNvcGllZCA9IChFSkJKYXJGaWxlKSBuZXdFYXJGaWxlLmdldE1vZHVsZUZpbGVzKCkuZ2V0KDApOwotCQlhc3NlcnRUcnVlKGNvcGllZC5pc0RlcGxveW1lbnREZXNjcmlwdG9yU2V0KCkpOwotCQlhc3NlcnRUcnVlKGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpID09IGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5nZXQoMCkpOwotCQlhc3NlcnRUcnVlKGNvcGllZC5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpICE9IGVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSk7Ci0JCWFzc2VydFRydWUoZWpiSmFyRmlsZS5nZXRGaWxlcygpLnNpemUoKSA9PSBjb3BpZWQuZ2V0RmlsZXMoKS5zaXplKCkpOwotCi0JCW5ld0VhckZpbGUuc2F2ZU5vUmVvcGVuKCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBwZXIgQ01WQyBkZWZlY3QgcmVwb3J0IDk2MTk3Ci0JICogQ3JlYXRlIGEgbmV3IGFwcGxpY2F0aW9uLCBvcGVuIGVqYiBqYXIgZmlsZSwgdXNlIGFkZGNvcHkgdG8gYWRkIHRoZSBtb2R1bGUsIGFuZCBzYXZlCi0JICogdXNpbmcgb3JpZ2luYWwgZWFyLCBnZXQgdGhlIGVqYiBqYXIsIGFuZCBtb2RpZnkgYmluZGluZ3MKLQkgKiBzYXZlIGFnYWluCi0JICogUmVzdWx0OiAgYmluZGluZ3Mgbm90IHVwZGF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29weU1vZHVsZUZpbGVzVG9FQVIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHVyaSA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvQ29weVRlc3RzL3Rlc3RBZGRDb3B5TW9kdWxlRmlsZXNUb0VBUi5lYXIiOwotCQkvL0NyZWF0ZSBhIG5ldyBlYXIgZmlsZSwgYWRkIGEgc3RhbmRhbG9uZSBlamIgamFyIGZpbGUgYW5kIHN0YW5kYWxvbmUgd2FyIGZpbGUsIGFuZCBzYXZlCi0JCUVBUkZpbGUgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKHVyaSk7Ci0JCWVhckZpbGUuc2V0SjJFRVZlcnNpb24oSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQllYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuc2V0RGlzcGxheU5hbWUodXJpKTsKLQkJRUpCSmFyRmlsZSBlamJKYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUpCSmFyRmlsZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJiYW5rZWpicy5qYXIiKTsKLQkJZWFyRmlsZS5hZGRDb3B5KGVqYkphckZpbGUpOwotCQlXQVJGaWxlIHdhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5XQVJGaWxlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImV4YW1wbGUyLndhciIpOwotCQllYXJGaWxlLmFkZENvcHkod2FyRmlsZSk7Ci0JCSgoV2ViTW9kdWxlKSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0Rmlyc3RNb2R1bGUod2FyRmlsZS5nZXRVUkkoKSkpLnNldENvbnRleHRSb290KCIvIik7Ci0JCWVhckZpbGUuc2F2ZSgpOwotCi0JCWVqYkphckZpbGUgPSAoRUpCSmFyRmlsZSkgZWFyRmlsZS5nZXRFSkJKYXJGaWxlcygpLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZSgiZWpiIGRkIHJlc291cmNlIG5vdCByaWdodCIsIGVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5lUmVzb3VyY2UoKSA9PSBlamJKYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSk7Ci0KLQkJCi0KLQkJd2FyRmlsZSA9IChXQVJGaWxlKSBlYXJGaWxlLmdldFdBUkZpbGVzKCkuZ2V0KDApOwotCQlhc3NlcnRUcnVlKCJ3YXIgZGQgcmVzb3VyY2Ugbm90IHJpZ2h0Iiwgd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmVSZXNvdXJjZSgpID09IHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpKTsKLQotCQkKLQkJZWFyRmlsZS5zYXZlTm9SZW9wZW4oKTsKLQotCQkKLQkJZWFyRmlsZS5jbG9zZSgpOwotCi0JfQotCS8qKgotCSAqIFRlc3RzIG9wZW5pbmcgYSBzdGFuZGFsb25lIG1vZHVsZSB3aXRoIGFuIGFic29sdXRlIHBhdGgsIGFuZCBhZGRpbmcgdGhhdCB0byBhIG5ldyBlYXIgZmlsZSwgcGVyIGRlZmVjdCByZXBvcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29weVN0YW5kYWxvbmVNb2R1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiYmFua2VqYnMuamFyIjsKLQotCQlFSkJKYXJGaWxlIGVqYkphckZpbGUgPSAoRUpCSmFyRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShmaWxlTmFtZSk7Ci0JCWVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQlFQVJGaWxlIG5ld0VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L0NvcHlUZXN0cy9uZXdFYXJXaXRoU3RhbmRBbG9uZU1vZHVsZS1vdXQuZWFyIik7Ci0JCW5ld0VhckZpbGUuYWRkQ29weShlamJKYXJGaWxlKTsKLQkJRUpCSmFyRmlsZSBjb3BpZWQgPSAoRUpCSmFyRmlsZSkgbmV3RWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpLmdldCgwKTsKLQkJYXNzZXJ0VHJ1ZShjb3BpZWQuaXNEZXBsb3ltZW50RGVzY3JpcHRvclNldCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb3BpZWQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSA9PSBjb3BpZWQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0VHJ1ZShjb3BpZWQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSBlamJKYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkpOwotCQlhc3NlcnRUcnVlKGVqYkphckZpbGUuZ2V0RmlsZXMoKS5zaXplKCkgPT0gY29waWVkLmdldEZpbGVzKCkuc2l6ZSgpKTsKLQotCQluZXdFYXJGaWxlLnNhdmVOb1Jlb3BlbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW5hbWVBbmREZWxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIjsKLQkJRUFSRmlsZSBlYXJGaWxlID0gKEVBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotCQlMaXN0IG1vZHVsZXMgPSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpOwotCQlFSkJKYXJGaWxlIGVqYkphckZpbGUgPSBudWxsOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJTW9kdWxlIGFNb2R1bGUgPSAoTW9kdWxlKSBtb2R1bGVzLmdldChpKTsKLQkJCWlmIChhTW9kdWxlLmlzRWpiTW9kdWxlKCkpIHsKLQkJCQllamJKYXJGaWxlID0gKEVKQkphckZpbGUpIGVhckZpbGUuZ2V0RmlsZShhTW9kdWxlLmdldFVyaSgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydFRydWUoIkVKQkphckZpbGUgc2hvdWxkIG5vdCBiZSBudWxsIiwgZWpiSmFyRmlsZSAhPSBudWxsKTsKLQkJZWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCUVBUkZpbGUgbmV3RWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvQ29weVRlc3RzL25ld0VhcldpdGhDb3BpZWRNb2R1bGUuZWFyIik7Ci0JCUVKQk1vZHVsZVJlZiBhZGRlZENvcHkgPSAoRUpCTW9kdWxlUmVmKSBuZXdFYXJGaWxlLmFkZENvcHlSZWYoZWpiSmFyRmlsZSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZSBmaWxlcyBzaG91bGQgbm90IGJlIGVtcHR5IiwgIW5ld0VhckZpbGUuZ2V0TW9kdWxlRmlsZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGVzIHNob3VsZCBub3QgYmUgZW1wdHkiLCAhbmV3RWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGUgc2hvdWxkIGJlIGFjY2Vzc2libGUgYW5kIGhhdmUgdGhlIHNhbWUgdXJpIGFzIGZpbGUiLCBhZGRlZENvcHkuZ2V0TW9kdWxlKCkuZ2V0VXJpKCkuZXF1YWxzKGFkZGVkQ29weS5nZXRNb2R1bGVGaWxlKCkuZ2V0VVJJKCkpKTsKLQotCQlTdHJpbmcgbmV3VVJJID0gInRlbXAvZm9vYmFyLmphciI7Ci0JCWFkZGVkQ29weS5zZXRVUkkobmV3VVJJKTsKLQkJYXNzZXJ0VHJ1ZSgiTW9kdWxlIHNob3VsZCBiZSBhY2Nlc3NpYmxlIGFuZCBoYXZlIHRoZSBuZXcgcmVuYW1lZCB1cmkgYXMgd2VsbCBhcyB0aGUgZmlsZSIsIGFkZGVkQ29weS5nZXRNb2R1bGUoKS5nZXRVcmkoKS5lcXVhbHMoYWRkZWRDb3B5LmdldE1vZHVsZUZpbGUoKS5nZXRVUkkoKSkgJiYgYWRkZWRDb3B5LmdldE1vZHVsZSgpLmdldFVyaSgpLmVxdWFscyhuZXdVUkkpKTsKLQkJbmV3RWFyRmlsZS5yZW1vdmUoYWRkZWRDb3B5KTsKLQkJYXNzZXJ0VHJ1ZSgiTW9kdWxlIGZpbGVzIHNob3VsZCBiZSBlbXB0eSIsIG5ld0VhckZpbGUuZ2V0TW9kdWxlRmlsZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGVzIHNob3VsZCBiZSBlbXB0eSIsIG5ld0VhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCkuaXNFbXB0eSgpKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW5hbWVBbmREZWxldGVTdGFuZGFsb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIGZpbGVOYW1lID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiYmFua2VqYnMuamFyIjsKLQotCQlFSkJKYXJGaWxlIGVqYkphckZpbGUgPSAoRUpCSmFyRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShmaWxlTmFtZSk7Ci0KLQkJRUFSRmlsZSBuZXdFYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9Db3B5VGVzdHMvbmV3RWFyV2l0aENvcGllZE1vZHVsZS5lYXIiKTsKLQkJRUpCTW9kdWxlUmVmIGFkZGVkQ29weSA9IChFSkJNb2R1bGVSZWYpIG5ld0VhckZpbGUuYWRkQ29weVJlZihlamJKYXJGaWxlKTsKLQkJYXNzZXJ0VHJ1ZSgiTW9kdWxlIGZpbGVzIHNob3VsZCBub3QgYmUgZW1wdHkiLCAhbmV3RWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZXMgc2hvdWxkIG5vdCBiZSBlbXB0eSIsICFuZXdFYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0TW9kdWxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZSBzaG91bGQgYmUgYWNjZXNzaWJsZSBhbmQgaGF2ZSB0aGUgc2FtZSB1cmkgYXMgZmlsZSIsIGFkZGVkQ29weS5nZXRNb2R1bGUoKS5nZXRVcmkoKS5lcXVhbHMoYWRkZWRDb3B5LmdldE1vZHVsZUZpbGUoKS5nZXRVUkkoKSkpOwotCi0JCVN0cmluZyBuZXdVUkkgPSAidGVtcC9mb29iYXIuamFyIjsKLQkJYWRkZWRDb3B5LnNldFVSSShuZXdVUkkpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGUgc2hvdWxkIGJlIGFjY2Vzc2libGUgYW5kIGhhdmUgdGhlIG5ldyByZW5hbWVkIHVyaSBhcyB3ZWxsIGFzIHRoZSBmaWxlIiwgYWRkZWRDb3B5LmdldE1vZHVsZSgpLmdldFVyaSgpLmVxdWFscyhhZGRlZENvcHkuZ2V0TW9kdWxlRmlsZSgpLmdldFVSSSgpKSAmJiBhZGRlZENvcHkuZ2V0TW9kdWxlKCkuZ2V0VXJpKCkuZXF1YWxzKG5ld1VSSSkpOwotCQluZXdFYXJGaWxlLnJlbW92ZShhZGRlZENvcHkpOwotCQlhc3NlcnRUcnVlKCJNb2R1bGUgZmlsZXMgc2hvdWxkIGJlIGVtcHR5IiwgbmV3RWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoIk1vZHVsZXMgc2hvdWxkIGJlIGVtcHR5IiwgbmV3RWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKS5pc0VtcHR5KCkpOwotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9EZWZlY3RWZXJpZmljYXRpb25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0RlZmVjdFZlcmlmaWNhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MzkzZjcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0RlZmVjdFZlcmlmaWNhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDIwLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldlYk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5XcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlck1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLQotICogUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERlZmVjdFZlcmlmaWNhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBEZWZlY3RWZXJpZmljYXRpb25UZXN0cygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBEZWZlY3RWZXJpZmljYXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCSAgICAvKlRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkgICAgc3VpdGUuYWRkVGVzdChuZXcgRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMoInRlc3RGaWx0ZXJNYXBwaW5nVHJhbnNsYXRvciIpKTsKLQkgICAgcmV0dXJuIHN1aXRlOyovCi0JCXJldHVybiBuZXcgVGVzdFN1aXRlKERlZmVjdFZlcmlmaWNhdGlvblRlc3RzLmNsYXNzKTsgCi0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlck1hcHBpbmdUcmFuc2xhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vKgkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQlvcHRpb25zLnNldFJlbmRlcmVyVHlwZShBcmNoaXZlT3B0aW9ucy5ET00pOwotCQlmaW5hbCBTdHJpbmcgZWFyUGF0aCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotCQlDb21tb25hcmNoaXZlUGFja2FnZSBwa2cgPSBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUVBUkZpbGUgZWFyRmlsZSA9IHBrZy5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKG9wdGlvbnMsCi0JCQkJZWFyUGF0aCk7Ci0JCS8vIG9wZW4gdGhlIGVhcgotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm9wZW5pbmcgIiArIGFyY2hpdmUgKyAiIC4uLiAiKTsqLwotCSAgICAKLQkgICAgU3RyaW5nIGFyY2hpdmUgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJRSURlZmVjdHNOZXcuZWFyIjsKLQkgICAgU3RyaW5nIG5hbWUgPSAiUUlEZWZlY3RzLndhciI7Ci0JCSAgLyoKLQkJICAgKiBjcmFjayBvcGVuIHRoZSBlYXIgZmlsZSB1c2luZyB0aGUgY29tbW9uIGFyY2hpdmU6Ci0JCSAgICovCi0JCSAgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgYXJjaGl2ZUZhY3RvcnkgPSAoQ29tbW9uYXJjaGl2ZUZhY3RvcnkpIENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JCSAgQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQkgIG9wdGlvbnMuc2V0UmVuZGVyZXJUeXBlKEFyY2hpdmVPcHRpb25zLlNBWCk7Ci0JCSAgb3B0aW9ucy5zZXRVc2VKYXZhUmVmbGVjdGlvbihmYWxzZSk7Ci0JCSAgLy8gICBvcHRpb25zLnNldERpc2NyaW1pbmF0ZU5lc3RlZEFyY2hpdmVzKGV4dHJhUHJvY2Vzc2luZyk7Ci0JCSAgCQkKLQkJICAJCUVBUkZpbGUgZWFyRmlsZSA9IGFyY2hpdmVGYWN0b3J5Lm9wZW5FQVJGaWxlKG9wdGlvbnMsIGFyY2hpdmUpOwotCQkJCVdlYk1vZHVsZVJlZiB3YXJGaWxlID0gbnVsbDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBlYXJGaWxlLmdldE1vZHVsZVJlZnMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkgICAgTW9kdWxlUmVmIG1yZWYgPSAoTW9kdWxlUmVmKSBpLm5leHQoKTsKLQkJCQkgICAgaWYgKG5hbWUuZXF1YWxzKG1yZWYuZ2V0VXJpKCkpKSB7IAotCQkJCSAgICAgICAgd2FyRmlsZSA9ICAoV2ViTW9kdWxlUmVmKSBtcmVmOwotCQkJCSAgICB9Ci0JCQkJfQotICAgCi0JCQkJV2ViQXBwIGRkID0gKFdlYkFwcCl3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0gICAKLQkJCQlFTGlzdCBmaWx0ZXJNYXBwaW5ncyA9IGRkLmdldEZpbHRlck1hcHBpbmdzKCk7Ci0JCQkJYXNzZXJ0VHJ1ZSgiVGhlIHRlc3QgcmVxdWlyZXMgdHdvIGZpbHRlciBtYXBwaW5ncy4iLCBmaWx0ZXJNYXBwaW5ncy5zaXplKCkgPT0gMik7IAotCQkJCUZpbHRlck1hcHBpbmcgZmlsdGVyTWFwcGluZzEgPSAoRmlsdGVyTWFwcGluZylmaWx0ZXJNYXBwaW5ncy5nZXQoMCk7Ci0JCQkJYXNzZXJ0Tm90TnVsbCgiQSBVUkwgUGF0dGVybiB3YXMgbm90IGZvdW5kIGZvciBmaWx0ZXIgd2l0aCBuYW1lICIgKyBmaWx0ZXJNYXBwaW5nMS5nZXRGaWx0ZXIoKS5nZXROYW1lKCksZmlsdGVyTWFwcGluZzEuZ2V0VXJsUGF0dGVybigpKTsKLQkJCQlGaWx0ZXJNYXBwaW5nIGZpbHRlck1hcHBpbmcyID0gKEZpbHRlck1hcHBpbmcpZmlsdGVyTWFwcGluZ3MuZ2V0KDEpOwotCQkJCWFzc2VydE5vdE51bGwoIkEgU2VydmxldCBuYW1lIHdhcyBub3QgZm91bmQgZm9yIGZpbHRlciB3aXRoIG5hbWUgIiArIGZpbHRlck1hcHBpbmcyLmdldEZpbHRlcigpLmdldE5hbWUoKSxmaWx0ZXJNYXBwaW5nMi5nZXRTZXJ2bGV0TmFtZSgpKTsKLQkJCQlhc3NlcnROb3ROdWxsKCJBIFNlcnZsZXQgd2FzIG5vdCBmb3VuZCBmb3IgZmlsdGVyIHdpdGggbmFtZSAiICsgZmlsdGVyTWFwcGluZzIuZ2V0RmlsdGVyKCkuZ2V0TmFtZSgpLGZpbHRlck1hcHBpbmcyLmdldFNlcnZsZXQoKSk7Ci0JCQkJICAgICAgCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZvcm1lckRlZmVjdDI5NygpIHRocm93cyBFeGNlcHRpb24gewotCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCW9wdGlvbnMuc2V0UmVuZGVyZXJUeXBlKEFyY2hpdmVPcHRpb25zLkRPTSk7Ci0JCWZpbmFsIFN0cmluZyBlYXJQYXRoID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0JCUNvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJRUFSRmlsZSBlYXJGaWxlID0gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUob3B0aW9ucywKLQkJCQllYXJQYXRoKTsKLQkJZWFyRmlsZS5leHRyYWN0Tm9SZW9wZW4oQXJjaGl2ZS5FWFBBTkRfQUxMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Rm9ybWVyRGVmZWN0MTQ1OSgpIHRocm93cyBFeGNlcHRpb24gewotCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCW9wdGlvbnMuc2V0UmVuZGVyZXJUeXBlKEFyY2hpdmVPcHRpb25zLkRPTSk7Ci0JCUNvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeSA9IHBrZy5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCi0JCUVBUkZpbGUgZWFyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKG9wdGlvbnMsICJUZXN0LmVhciIpOwotCQllYXJGaWxlLnNhdmVBcygiQzpcXFRlc3QuZWFyIik7Ci0JfQotCi0JLyoKLQkgKiBwdWJsaWMgdm9pZCB0ZXN0Q29ycnVwdGVkRUFSKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IEFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPQotCSAqIG5ldyBBcmNoaXZlT3B0aW9ucygpOyBvcHRpb25zLnNldFJlbmRlcmVyVHlwZShBcmNoaXZlT3B0aW9ucy5ET00pOyBmaW5hbAotCSAqIFN0cmluZyBlYXJQYXRoID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAib2NjYW0uZWFyIjsKLQkgKiBDb21tb25hcmNoaXZlUGFja2FnZSBwa2cgPSBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JICogQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeSA9IHBrZy5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotCSAqIAotCSAqIEVBUkZpbGUgZWFyRmlsZSA9IGZhY3Rvcnkub3BlbkVBUkZpbGUob3B0aW9ucywgZWFyUGF0aCk7Ci0JICogCi0JICogTGlzdCBmaWxlcyA9IGVhckZpbGUuZ2V0RmlsZXMoKTsKLQkgKiAKLQkgKiBmb3IoaW50IGk9MDsgaSA8ZmlsZXMuc2l6ZSgpOyBpKyspIHsgU3lzdGVtLmVyci5wcmludGxuKGZpbGVzLmdldChpKSk7Ci0JICogcmVhZEZpbGUoIChGaWxlKSBmaWxlcy5nZXQoaSkpOyBpZihmaWxlcy5nZXQoaSkgaW5zdGFuY2VvZiBXQVJGaWxlKSB7Ci0JICogV0FSRmlsZSB3YXIgPSAoV0FSRmlsZSkgZmlsZXMuZ2V0KGkpOyBMaXN0IHdhckZpbGVzID0gd2FyLmdldEZpbGVzKCk7Ci0JICogZm9yKGludCBqPTA7IGogPHdhckZpbGVzLnNpemUoKTsgaisrKSB7Ci0JICogU3lzdGVtLmVyci5wcmludGxuKHdhckZpbGVzLmdldChqKSk7IHJlYWRGaWxlKChGaWxlKXdhckZpbGVzLmdldChqKSk7IH0gfSB9Ci0JICogU3lzdGVtLm91dC5wcmludGxuKCJEb25lIik7IH0KLQkgKi8KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlCi0JICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYWRGaWxlKEZpbGUgZmlsZSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpcyA9IGZpbGUuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJWmlwSW5wdXRTdHJlYW0gemlzID0gbmV3IFppcElucHV0U3RyZWFtKGlzKTsKLQkJdHJ5IHsKLQkJCXdoaWxlICh6aXMuZ2V0TmV4dEVudHJ5KCkgIT0gbnVsbCk7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpcyAhPSBudWxsKQotCQkJCWlzLmNsb3NlKCk7Ci0JCQlpZiAoemlzICE9IG51bGwpCi0JCQkJemlzLmNsb3NlKCk7Ci0JCQlpcyA9IG51bGw7Ci0JCQl6aXMgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNhdmluZ0VBUldoaWxlRGVwbG95aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlBcmNoaXZlT3B0aW9ucyBvcHRpb25zID0gbmV3IEFyY2hpdmVPcHRpb25zKCk7Ci0JCQlvcHRpb25zLnNldFJlbmRlcmVyVHlwZShBcmNoaXZlT3B0aW9ucy5TQVgpOwotCQkJb3B0aW9ucy5zZXRVc2VKYXZhUmVmbGVjdGlvbih0cnVlKTsKLQkJCWZpbmFsIFN0cmluZyBlYXJQYXRoID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkKLQkJCQkJKyAiQXVjdGlvbkFwcC5lYXIiOwotCQkJQ29tbW9uYXJjaGl2ZVBhY2thZ2UgcGtnID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFOwotCQkJRUFSRmlsZSBlYXJGaWxlID0gcGtnLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoCi0JCQkJCW9wdGlvbnMsIGVhclBhdGgpOwotCQkJcHJpbnRGaWxlcyhlYXJGaWxlKTsKLQkJCWVhckZpbGUuc2F2ZSgpOwotCi0JCQllYXJGaWxlLnJlb3BlbigpOwotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIHdlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UpOwotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldE1lc3NhZ2UoKSk7Ci0JCQlpZiAod2UuZ2V0Q2F1c2UoKSAhPSBudWxsKQotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXRDYXVzZSgpKTsKLQkJCWlmICh3ZS5nZXROZXN0ZWRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXROZXN0ZWRFeGNlcHRpb24oKSk7Ci0JCQlpZiAod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0Q29uY2F0ZW5hdGVkTWVzc2FnZXMoKSk7Ci0JCQl0aHJvdyB3ZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGluZ0VBUkZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21tb25hcmNoaXZlUGFja2FnZSBwa2cgPSBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0U7Ci0JCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkgPSBwa2cuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQkJZmluYWwgU3RyaW5nIGVhclBhdGggPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeQotCQkJCSsgIkluaXRpYWxpemVkRUFSLmVhciI7Ci0KLQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQlvcHRpb25zLnNldElzUmVhZE9ubHkodHJ1ZSk7Ci0JCW9wdGlvbnMuc2V0UmVuZGVyZXJUeXBlKEFyY2hpdmVPcHRpb25zLkRPTSk7Ci0KLQkJLy8gbmV3IGVhciBmaWxlCi0JCUVBUkZpbGUgZWFyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKG9wdGlvbnMsIGVhclBhdGgpOwotCi0JCUFwcGxpY2F0aW9uIGFwcGwgPSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VydmljZVFOYW1lVHJhbnNsYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgewotCQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQkJb3B0aW9ucy5zZXRSZW5kZXJlclR5cGUoQXJjaGl2ZU9wdGlvbnMuU0FYKTsgCi0JCQlmaW5hbCBTdHJpbmcgZWFyUGF0aCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIldTU2VjdXJlZF9JbnN1cmFuY2VTZXJ2aWNlc19FSkJfV1MuZWFyIjsKLQkJCUNvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCUNvbW1vbmFyY2hpdmVGYWN0b3J5IGZhY3RvcnkgPSBwa2cuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQkJCUVBUkZpbGUgZWFyRmlsZSA9IGZhY3Rvcnkub3BlbkVBUkZpbGUob3B0aW9ucywgZWFyUGF0aCk7Ci0JCQlwcmludEZpbGVzKGVhckZpbGUpOwotCQkJU3RyaW5nIHRtcCA9ICJDOlxcdGVtcFxcIitTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWVhckZpbGUuZXh0cmFjdFRvKHRtcCwgMCk7ICAKLQkJCQkKLQkJCUxpc3QgZWpiTW9kdWxlUmVmcyA9IGVhckZpbGUuZ2V0RUpCTW9kdWxlUmVmcygpOwotCi0JCQlmb3IoaW50IGk9MDsgaTxlamJNb2R1bGVSZWZzLnNpemUoKTsgaSsrKSB7Ci0JCQkJRUpCTW9kdWxlUmVmIGVqYm1vZHJlZiA9IChFSkJNb2R1bGVSZWYpIGVqYk1vZHVsZVJlZnMuZ2V0KGkpOwotCQkJCWlmKGVqYm1vZHJlZi5nZXRVcmkoKS5lcXVhbHMoIldTSW5zU2Vzc2lvbjIwRUpCLmphciIpKSB7Ci0JCQkJCVJlc291cmNlIHJlcyA9IGVqYm1vZHJlZi5nZXRNb2ZSZXNvdXJjZSgiTUVUQS1JTkYvd2Vic2VydmljZXNjbGllbnQueG1sIik7IAotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4ocmVzLmdldFVSSSgpKTsKLQkJCQkJIAotCQkJCX0KLQkJCX0KLQkJCS8qCi0JCQkgKiBBcHBsaWNhdGlvbiBhcHAgPSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7IExpc3QgbW9kdWxlcyA9Ci0JCQkgKiBhcHAuZ2V0TW9kdWxlcygpOyBmb3IoaW50IGk9MDsgaSA8bW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJICogU3lzdGVtLmVyci5wcmludGxuKG1vZHVsZXMuZ2V0KGkpKTsgTW9kdWxlCi0JCQkgKiBtb2Q9KE1vZHVsZSltb2R1bGVzLmdldChpKTsgaWYoIG1vZC5pc0VqYk1vZHVsZSgpICkgeyBFamJNb2R1bGUKLQkJCSAqIGVqYk1vZHVsZSA9IChFamJNb2R1bGUpIG1vZDsgRUpCSmFyRmlsZSBlamJKYXJGaWxlID0KLQkJCSAqIGZhY3Rvcnkub3BlbkVKQkphckZpbGUob3B0aW9ucywgIldTSW5zU2Vzc2lvbjIwRUpCLmphciIpOyBFSkJKYXIKLQkJCSAqIGVqYmphciA9IGVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsgfQotCQkJICogIH0KLQkJCSAqLwotCQl9IGNhdGNoIChXcmFwcGVkRXhjZXB0aW9uIHdlKSB7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UpOwotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldE1lc3NhZ2UoKSk7Ci0JCQlpZih3ZS5nZXRDYXVzZSgpICE9IG51bGwpIAotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXRDYXVzZSgpKTsKLQkJCWlmKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpKTsKLQkJCWlmKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKCkpOwotCQkJdGhyb3cgd2U7Ci0JCX0gIAotICAgIH0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFJlYWRDcmltc29uQ2FzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQkJb3B0aW9ucy5zZXRSZW5kZXJlclR5cGUoQXJjaGl2ZU9wdGlvbnMuRE9NKTsgCi0JCQlmaW5hbCBTdHJpbmcgZWFyUGF0aCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5Ci0JCQkJCSsgImVqYl9zYW1fSGVsbG8uZWFyIjsKLQkJCUNvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCUVBUkZpbGUgZWFyRmlsZSA9IHBrZy5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKAotCQkJCQlvcHRpb25zLCBlYXJQYXRoKTsKLQkJCUFwcGxpY2F0aW9uIGFwcCA9IGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJCWFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCByZWFkIGRlcGxveW1lbnQgZGVzY3JpcHRvci4iLCBhcHApOwotCQkJU3lzdGVtLmVyci5wcmludGxuKCJcblxuKioqKioqKioqKioqKioqKioqUHJpbnRpbmcgZmlsZXMgZnJvbSAiICsgYXBwLmdldERpc3BsYXlOYW1lKCkpOwotCQkJYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IHJlYWQgZGlzcGxheSBuYW1lIGZyb20gZGVwbG95bWVudCBkZXNjcmlwdG9yLiIsIGFwcC5nZXREaXNwbGF5TmFtZSgpKTsKLQkJCXByaW50RmlsZXMoZWFyRmlsZSk7Ci0JCQllYXJGaWxlLmV4dHJhY3RUbyhBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L3RlbXAiLCAwKTsKLQkJCWVhckZpbGUucmVvcGVuKCk7Ci0JCX0gY2F0Y2ggKFdyYXBwZWRFeGNlcHRpb24gd2UpIHsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZSk7Ci0JCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0TWVzc2FnZSgpKTsKLQkJCWlmICh3ZS5nZXRDYXVzZSgpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldENhdXNlKCkpOwotCQkJaWYgKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpKTsKLQkJCWlmICh3ZS5nZXROZXN0ZWRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXRDb25jYXRlbmF0ZWRNZXNzYWdlcygpKTsKLQkJCXRocm93IHdlOwotCQl9Ci0JfQotCQotCS8qcHVibGljIHZvaWQgdGVzdFJlYWRJbml0UGFybXMxMygpIHRocm93cyBFeGNlcHRpb24gewotCSAgICByZWFkSW5pdFBhcm1zKHRydWUpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVhZEluaXRQYXJtczE0KCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkgICAgcmVhZEluaXRQYXJtcyhmYWxzZSk7Ci0JfQkqLwotCQotCS8qcHVibGljIHZvaWQgcmVhZEluaXRQYXJtcyhib29sZWFuIGlzMTMpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgeyAKLQkJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNpbmcgSjJFRSAiICsgKGlzMTM/IjEuMyIgOiIxLjQiKSApOwotCQkJQXJjaGl2ZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQkJb3B0aW9ucy5zZXRSZW5kZXJlclR5cGUoQXJjaGl2ZU9wdGlvbnMuRE9NKTsgCi0JCQlmaW5hbCBTdHJpbmcgZWFyUGF0aCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5Ci0JCQkJCSsgKChpczEzKSA/ICJmaWx0ZXIxM3dhci5lYXIiIDogICJzZXJ2bGV0X2pzX2ZpbHRlci5lYXIiKTsKLQkJCUNvbW1vbmFyY2hpdmVQYWNrYWdlIHBrZyA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRTsKLQkJCUVBUkZpbGUgZWFyRmlsZSA9IHBrZy5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKAotCQkJCQlvcHRpb25zLCBlYXJQYXRoKTsKLQkJCVdBUkZpbGUgd2FyRmlsZSA9IChXQVJGaWxlKSAoaXMxMyA/IGVhckZpbGUuZ2V0RmlsZSgiRmlsdGVyV2FyLndhciIpIDplYXJGaWxlLmdldEZpbGUoInNlcnZsZXRfanNfZmlsdGVyX3dlYi53YXIiKSk7Ci0JCQlXZWJBcHAgd2ViYXBwID0gd2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOyAKLQkJCWFzc2VydE5vdE51bGwoIlRoZSB3ZWIgYXBwIEREIGNvdWxkIG5vdCBiZSBsb2NhdGVkIiwgd2ViYXBwKTsKLQkJCUVMaXN0IGZpbHRlcnMgPSB3ZWJhcHAuZ2V0RmlsdGVycygpOwotCQkJRmlsdGVyIGYgPSBudWxsOwotCQkJRUxpc3QgcGFybXMsIHBhcmFtVmFsdWVzOwotCQkJZm9yKGludCBpPTA7IGk8ZmlsdGVycy5zaXplKCk7IGkrKykgewotCQkJICAgIGYgPSAoRmlsdGVyKSBmaWx0ZXJzLmdldChpKTsKLQkJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oZik7Ci0JCQkgICAgRUxpc3QgcGFybXMgPSBmLmdldEluaXRQYXJhbXMoKTsKLQkJCSAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZXJlIGFyZSAiICsgcGFybXMuc2l6ZSgpICsgIiBJbml0UGFyYW1zIik7Ci0JCQkgICAgZm9yKGludCBqPTA7IGo8cGFybXMuc2l6ZSgpOyBqKyspIHsKLQkJCSAgICAgICAgSW5pdFBhcmFtIHAgPSAoSW5pdFBhcmFtKSBwYXJtcy5nZXQoaik7Ci0JCQkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwKTsKLQkJCSAgICB9Ci0JCQkgICAgRUxpc3QgcGFyYW1WYWx1ZXMgPSBmLmdldEluaXRQYXJhbVZhbHVlcygpOwotCQkJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlcmUgYXJlICIgKyBwYXJhbVZhbHVlcy5zaXplKCkgKyAiIEluaXRQYXJhbVZhbHVlcyIpOwotCQkJICAgIGZvcihpbnQgaj0wOyBqPHBhcmFtVmFsdWVzLnNpemUoKTsgaisrKSB7Ci0JCQkgICAgICAgIFBhcmFtVmFsdWUgcCA9IChQYXJhbVZhbHVlKSBwYXJhbVZhbHVlcy5nZXQoaik7Ci0JCQkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwKTsKLQkJCSAgICB9Ci0JCQkgICAgCi0JCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJEZW1vIHZlcnNpb24gY2FzZSIpOwotCQkJICAgIAotCQkJICAgIAotCQkJICAgIFdlYkFwcCBjb250YWluZXIgPSAoV2ViQXBwKSBmLmVDb250YWluZXIoKTsKLQkJCSAgICBzd2l0Y2goY29udGFpbmVyLmdldEoyRUVWZXJzaW9uSUQoKSkgewotCQkJICAgICAgICBjYXNlIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEOiAKLQkJCSAgICAgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRDoKLQotCQkJCQkgICAgcGFybXMgPSBmLmdldEluaXRQYXJhbXMoKTsKLQkJCQkJICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlcmUgYXJlICIgKyBwYXJtcy5zaXplKCkgKyAiIEluaXRQYXJhbXMiKTsKLQkJCQkJICAgIGFzc2VydEVxdWFscygiVGhlcmUgbXVzdCBiZSAyIEZpbHRlciBJbml0IFBhcmFtcyIsIHBhcm1zLnNpemUoKSwgMik7Ci0JCQkJCSAgICBmb3IoaW50IGo9MDsgajxwYXJtcy5zaXplKCk7IGorKykgewotCQkJCQkgICAgICAgIEluaXRQYXJhbSBpcCA9IChJbml0UGFyYW0pIHBhcm1zLmdldChqKTsKLQkJCQkJICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocCk7Ci0JCQkJCSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHBhcmFtIG5hbWVzIG11Y2ggbWF0Y2giLCAoInBhcmFtIitqKyJuYW1lIikuZXF1YWxzKGlwLmdldFBhcmFtTmFtZSgpKSk7Ci0JCQkJCSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHBhcmFtIHZhbHVlcyBtdWNoIG1hdGNoIiwgKCJwYXJhbSIraisidmFsdWUiKS5lcXVhbHMoaXAuZ2V0UGFyYW1WYWx1ZSgpKSk7Ci0JCQkJCSAgICB9Ci0JCQkJCSAgICBicmVhazsKLQkJCSAgICAgICAgY2FzZSBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRDogZGVmYXVsdDogewotCi0JCQkJCSAgICBwYXJhbVZhbHVlcyA9IGYuZ2V0SW5pdFBhcmFtVmFsdWVzKCk7Ci0JCQkgICAgICAgIAlhc3NlcnRFcXVhbHMoIlRoZXJlIG11c3QgYmUgMSBGaWx0ZXIgSW5pdCBQYXJhbSBWYWx1ZXMiLCBwYXJhbVZhbHVlcy5zaXplKCksIDEpOwotCQkJCQkgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGVyZSBhcmUgIiArIHBhcmFtVmFsdWVzLnNpemUoKSArICIgSW5pdFBhcmFtVmFsdWVzIik7Ci0JCQkJCSAgICAKLQkJCQkgICAgICAgIFBhcmFtVmFsdWUgcHYgPSAoUGFyYW1WYWx1ZSkgcGFyYW1WYWx1ZXMuZ2V0KDApOyAKLQkJCQkgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwdik7IAotCQkJCSAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHBhcmFtIG5hbWVzIG11Y2ggbWF0Y2giLCAoImF0dHJpYnV0ZSIpLmVxdWFscyhwdi5nZXROYW1lKCkpKTsKLQkJCQkgICAgICAgIFN0cmluZyBleHBlY3RlZFZhbHVlID0gKGkgPT0gMCkgPyAiY29tLnN1bi50cy50ZXN0cy5zZXJ2bGV0LmFwaS5qYXZheF9zZXJ2bGV0LmZpbHRlci5Eb0ZpbHRlcl9GaWx0ZXIuU0VSVkxFVF9NQVBQRUQiIDogImNvbS5zdW4udHMudGVzdHMuc2VydmxldC5hcGkuamF2YXhfc2VydmxldC5maWx0ZXIuSW5pdEZpbHRlcl9GaWx0ZXIuU0VSVkxFVF9NQVBQRUQiOyAKLQkJCQkgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHBhcmFtIHZhbHVlcyBtdWNoIG1hdGNoIiwgZXhwZWN0ZWRWYWx1ZSAsIHB2LmdldFZhbHVlKCkpOwotCQkJICAgICAgICB9Ci0JCQkJCSAgICBicmVhazsKLQkJCSAgICB9Ci0JCQl9Ci0JCQkKLQkJCSAgICAKLQkJfSBjYXRjaCAoV3JhcHBlZEV4Y2VwdGlvbiB3ZSkgewotCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlKTsKLQkJCUxvZ2dlci5nZXRMb2dnZXIoKS5sb2dFcnJvcih3ZS5nZXRNZXNzYWdlKCkpOwotCQkJaWYgKHdlLmdldENhdXNlKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0Q2F1c2UoKSk7Ci0JCQlpZiAod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3Iod2UuZ2V0TmVzdGVkRXhjZXB0aW9uKCkpOwotCQkJaWYgKHdlLmdldE5lc3RlZEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmdldExvZ2dlcigpLmxvZ0Vycm9yKHdlLmdldENvbmNhdGVuYXRlZE1lc3NhZ2VzKCkpOwotCQkJdGhyb3cgd2U7Ci0JCX0KLQl9Ki8KLQkgCi0JCi0JcHJpdmF0ZSB2b2lkIHByaW50RmlsZXMoQ29udGFpbmVyIGFyKSB7Ci0JCUxpc3QgZmlsZXMgPSBhci5nZXRGaWxlcygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihmaWxlcy5nZXQoaSkpOwotCQkJaWYgKGZpbGVzLmdldChpKSBpbnN0YW5jZW9mIENvbnRhaW5lcikgewotCQkJCUNvbnRhaW5lciB0YWluZXIgPSAoQ29udGFpbmVyKSBmaWxlcy5nZXQoaSk7Ci0JCQkJcHJpbnRGaWxlcyh0YWluZXIpOwotCQkJfQotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0Rpc2NyaW1pbmF0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvRGlzY3JpbWluYXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0Nzg2ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvRGlzY3JpbWluYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci0KLQotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSwgMjAwMiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqLwotCi0vKioKLSAqIEBhdXRob3IgbWRlbGRlcgotICogIAotICovCi1wdWJsaWMgY2xhc3MgRGlzY3JpbWluYXRvclRlc3QKLSAgICAgICAgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhc3NlcnRCYXJGaWxlID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgRGlzY3JpbWluYXRvclRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJEaXNjcmltaW5hdG9yVGVzdCIpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBEaXNjcmltaW5hdG9yVGVzdCgidGVzdERpc2NyaW1pbmF0b3IiKSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPIEltcGxlbWVudCB1bml0IHRlc3QgZm9yIGRpc2NyaW1pbmF0b3IgZnJhbWV3b3JrCi0gICAgcHVibGljIHZvaWQgdGVzdERpc2NyaW1pbmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0QmFyRmlsZSA9IHRydWU7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3JSZWdpc3RyeS5yZWdpc3RvckRpc2NyaW1pbmF0b3IobmV3IEJldmVyYWdlQXJjaGl2ZURpc2NyaW1pbmF0b3IoKSk7Ci0gICAgICAgICAgICBBcmNoaXZlIGFyY2hpdmUgPSBDb21tb25hcmNoaXZlRmFjdG9yeS5lSU5TVEFOQ0Uub3BlbkFyY2hpdmUoIEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgRmlsZS5zZXBhcmF0b3IgKyAibXkuYmFyIik7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJUaGUgYXJjaGl2ZSB3YXMgbm90IGZvdW5kISIsIGFyY2hpdmUpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgYXJjaGl2ZSBleHRlbnNpb24gKC5iYXIpIHdhcyBub3QgcmVjb2duaXplZCBhcyBhIGN1c3RvbSBleHRlbnNpb24hIiwgYXJjaGl2ZS5pc05lc3RlZEFyY2hpdmUoIm15LmJhciIpKTsKLQotICAgICAgICAgICAgYm9vbGVhbiB0eXBlQ29udHJpYnV0ZWRTdWNjZXNzZnVsbHkgPSBmYWxzZTsKLSAgICAgICAgICAgIEVMaXN0IHR5cGVzID0gYXJjaGl2ZS5nZXRUeXBlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICh0eXBlcy5nZXQoaSkuZXF1YWxzKEJldmVyYWdlQXJjaGl2ZURpc2NyaW1pbmF0b3IuQkVWRVJBR0VfQVJDSElWRV9UWVBFX0tFWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZUNvbnRyaWJ1dGVkU3VjY2Vzc2Z1bGx5ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIEJFVkVSQUdFX0FSQ0hJVkVfVFlQRV9LRVkgd2FzIG5vdCBmb3VuZCBpbiB0aGUgbGlzdCBvZiB0eXBlcyBvZiB0aGUgYXJjaGl2ZSEiLCB0eXBlQ29udHJpYnV0ZWRTdWNjZXNzZnVsbHkpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgYXNzZXJ0QmFyRmlsZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEJldmVyYWdlQXJjaGl2ZURpc2NyaW1pbmF0b3IKLSAgICAgICAgICAgIGV4dGVuZHMgVGVzdENhc2UgaW1wbGVtZW50cyBHZW5lcmljQXJjaGl2ZVR5cGVEaXNjcmltaW5hdG9yIHsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRVZFUkFHRV9BUkNISVZFX1RZUEVfS0VZID0gImNvbS5pYm0uYmV2ZXJhZ2UuYXJjaGl2ZSI7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLkdlbmVyaWNBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IjZGlzY3JpbWluYXRlKGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuQXJjaGl2ZSkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2NyaW1pbmF0ZShBcmNoaXZlIGFuQXJjaGl2ZSkgewotICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBhbkFyY2hpdmUuY29udGFpbnNGaWxlKCJNRVRBLUlORi9hZHVsdC1iZXZlcmFnZS1pbWJpYmVtZW50LW9wdGlvbnMueG1sIik7Ci0gICAgICAgICAgICBpZiAoYXNzZXJ0QmFyRmlsZSkKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIEJldmVyYWdlQXJjaGl2ZURpc2NyaW1pbmF0b3IgZGlkIG5vdCByZWNvZ25pWmUgdGhlIGZpbGUhIChFbnN1cmUgaXQgY29udGFpbnMgYSBmaWxlIG5hbWVkIE1FVEEtSU5GL2FkdWx0LWJldmVyYWdlLWltYmliZW1lbnQtdmVudWVzLnhtbCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBjb20uaWJtLmV0b29scy5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLkdlbmVyaWNBcmNoaXZlVHlwZURpc2NyaW1pbmF0b3IjZ2V0Q3VzdG9tRmlsZUV4dGVuc2lvbnMoKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldEN1c3RvbUZpbGVFeHRlbnNpb25zKCkgewotCi0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgImJhciJ9OwotCi0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuR2VuZXJpY0FyY2hpdmVUeXBlRGlzY3JpbWluYXRvciNnZXRUeXBlS2V5KCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZUtleSgpIHsKLQotICAgICAgICAgICAgcmV0dXJuIEJFVkVSQUdFX0FSQ0hJVkVfVFlQRV9LRVk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0RvbUNvbXBhcml0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9Eb21Db21wYXJpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NGMxZTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0RvbUNvbXBhcml0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMTcsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLQotLyoqCi0gKiBUSEUgTUFTVEVSIENPUFkgb2YgdGhpcyBjbGFzcyBpcyBpbiBjb20uaWJtLmV0b29scy5jb21tb250ZXN0cwotICogUGxlYXNlIHVwZGF0ZSB0aGUgY29weSBpbiBjb21tb250ZXN0cyBhbmQgdGhlbiBjb3B5IHRoaXMgY2xhc3MgdG8KLSAqIHdoZXJlIHlvdSBuZWVkIGl0IGlmIHlvdSBhcmUgbG9va2luZyBhdCBhIGRpZmZlcmVudCBjb3B5Ci0gKiAKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIERvbUNvbXBhcml0b3IgewotCXByaXZhdGUgc3RhdGljIEVudGl0eVJlc29sdmVyIGVudGl0eVJlc29sdmVyOwotCXByaXZhdGUgc3RhdGljIEhhc2hTZXQgYXR0cmlidXRlTGlzdDsKLS8vIFRPRE8gcmVwbGFjZSB0aGlzIHdpdGggbm9uIHhlcmNlcwkKLS8vICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBhcmVEb21zKElucHV0U291cmNlIHNvdXJjZTEsIElucHV0U291cmNlIHNvdXJjZTIsIEhhc2hTZXQgaWdub3JhYmxlQXR0cykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAJYXR0cmlidXRlTGlzdCA9IGlnbm9yYWJsZUF0dHM7Ci0vLyAgICAJRE9NUGFyc2VyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTsKLS8vICAgIAlpZiAoZW50aXR5UmVzb2x2ZXIgPT0gbnVsbCkgewotLy8gICAgICAgICBwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IEVudGl0eVJlc29sdmVyKCkgewotLy8JICAgICAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIGFyZzAsIFN0cmluZyBhcmcxKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0vLwkgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0vLwkgICAgICAgICAgICB9Ci0vLwkKLS8vCSAgICAgICAgfSk7Ci0vLyAgICAJfSBlbHNlIHsKLS8vICAgIAkJcGFyc2VyLnNldEVudGl0eVJlc29sdmVyKGVudGl0eVJlc29sdmVyKTsKLS8vICAgIAl9Ci0vLyAgICAgICAgcGFyc2VyLnBhcnNlKHNvdXJjZTEpOwotLy8gICAgICAgIERvY3VtZW50IGRvYzEgPSBwYXJzZXIuZ2V0RG9jdW1lbnQoKTsKLS8vICAgICAgICBwYXJzZXIucGFyc2Uoc291cmNlMik7Ci0vLyAgICAgICAgRG9jdW1lbnQgZG9jMiA9IHBhcnNlci5nZXREb2N1bWVudCgpOwotLy8gICAgICAgIHJldHVybiBjb21wYXJlTm9kZXMoZG9jMSwgZG9jMik7Ci0vLyAgICB9Ci0KLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBhcmVEb21zKElucHV0U291cmNlIHNvdXJjZTEsIElucHV0U291cmNlIHNvdXJjZTIpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXJldHVybiBjb21wYXJlRG9tcyhzb3VyY2UxLCBzb3VyY2UyLCBudWxsKTsKLS8vCX0KLQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcGFyZU5vZGVzKE5vZGUgbm9kZTEsIE5vZGUgbm9kZTIpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjaGVja2luZyBBOiIgKyBub2RlMSk7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNoZWNraW5nIEI6IiArIG5vZGUyKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibm9kZVR5cGU9IiArIG5vZGUxLmdldE5vZGVUeXBlKCkpOwotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXROb2RlTmFtZT0iICsgbm9kZTEuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIC8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldE5vZGVWYWx1ZT0iICsgbm9kZTEuZ2V0Tm9kZVZhbHVlKCkpOwotCi0gICAgICAgIC8vR2VuZXJpYyBOb2RlIFRlc3RpbmcgCi0gICAgICAgIGlmIChub2RlMSA9PSBudWxsICYmIG5vZGUyID09IG51bGwpCi0gICAgICAgIAlyZXR1cm4gbnVsbDsgCi0gICAgICAgIGVsc2UgaWYgKChub2RlMSAhPSBudWxsICYmIG5vZGUyID09IG51bGwpIHx8IG5vZGUxID09IG51bGwgJiYgbm9kZTIgIT0gbnVsbCkKLSAgICAgICAgCXJldHVybiBudWxsTm9kZUVuY291bnRlcmVkKG5vZGUxLCBub2RlMik7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGVsc2UgaWYgKG5vZGUxLmdldE5vZGVUeXBlKCkgIT0gbm9kZTIuZ2V0Tm9kZVR5cGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmdldE5vZGVUeXBlKCkgIiArIG5vZGUxLmdldE5vZGVUeXBlKCkgKyAiICIgKyBub2RlMi5nZXROb2RlVHlwZSgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICB9IGVsc2UgaWYgKG5vZGUxLmdldE5vZGVOYW1lKCkgIT0gbm9kZTIuZ2V0Tm9kZU5hbWUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmdldE5vZGVOYW1lKCkgPCIgKyBub2RlMS5nZXROb2RlTmFtZSgpICsgIj4gPCIgKyBub2RlMi5nZXROb2RlTmFtZSgpICsgIj4iLCBub2RlMSwgbm9kZTIpOwotICAgICAgICB9IGVsc2UgaWYgKCEobm9kZTEuZ2V0Tm9kZVZhbHVlKCkgPT0gbnVsbCAmJiBub2RlMi5nZXROb2RlVmFsdWUoKSA9PSBudWxsKSkgewotICAgICAgICAgICAgaWYgKG5vZGUxLmdldE5vZGVWYWx1ZSgpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIk5vZGUuZ2V0Tm9kZVZhbHVlKCkgbm9kZSBBIGlzIG51bGwiLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlMi5nZXROb2RlVmFsdWUoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmdldE5vZGVWYWx1ZSgpIG5vZGUgQiBpcyBudWxsIiwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIW5vZGUxLmdldE5vZGVWYWx1ZSgpLmVxdWFscyhub2RlMi5nZXROb2RlVmFsdWUoKSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIk5vZGUuZ2V0Tm9kZVZhbHVlKCkgPCIgKyBub2RlMS5nZXROb2RlVmFsdWUoKSArICI+IDwiICsgbm9kZTIuZ2V0Tm9kZVZhbHVlKCkgKyAiPiIsIG5vZGUxLCBub2RlMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobm9kZTEuaGFzQXR0cmlidXRlcygpICE9IG5vZGUyLmhhc0F0dHJpYnV0ZXMoKSkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJOb2RlLmhhc0F0dHJpYnV0ZXMoKSAiICsgbm9kZTEuaGFzQXR0cmlidXRlcygpICsgIiAiICsgbm9kZTIuaGFzQXR0cmlidXRlcygpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICB9IGVsc2UgaWYgKG5vZGUxLmhhc0NoaWxkTm9kZXMoKSAhPSBub2RlMi5oYXNDaGlsZE5vZGVzKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiTm9kZS5oYXNDaGlsZE5vZGVzKCkgIiArIG5vZGUxLmhhc0NoaWxkTm9kZXMoKSArICIgIiArIG5vZGUyLmhhc0NoaWxkTm9kZXMoKSwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgfQotCQkvL1RPRE8gc3RyZW5ndGhlbiBub2RlIGNvbXBhcmlzb25zIGFzIG5lY2Vzc2FyeQotICAgICAgICAvL1NwZWNpYWxpemVkIE5vZGUgVGVzdGluZwotICAgICAgICBzd2l0Y2ggKG5vZGUxLmdldE5vZGVUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgotICAgICAgICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0gICAgICAgICAgICAgICAgQ2hhcmFjdGVyRGF0YSBjZGF0YTEgPSAoQ2hhcmFjdGVyRGF0YSkgbm9kZTE7Ci0gICAgICAgICAgICAgICAgQ2hhcmFjdGVyRGF0YSBjZGF0YTIgPSAoQ2hhcmFjdGVyRGF0YSkgbm9kZTI7Ci0gICAgICAgICAgICAgICAgaWYgKCFjZGF0YTEuZ2V0RGF0YSgpLmVxdWFscyhjZGF0YTIuZ2V0RGF0YSgpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIkNoYXJhY3RlckRhdGEuZ2V0RGF0YSgpICIgKyBjZGF0YTEuZ2V0RGF0YSgpICsgIiAiICsgY2RhdGEyLmdldERhdGEoKSwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgotICAgICAgICAgICAgICAgIEF0dHIgYXR0cjEgPSAoQXR0cikgbm9kZTE7Ci0gICAgICAgICAgICAgICAgQXR0ciBhdHRyMiA9IChBdHRyKSBub2RlMjsKLSAgICAgICAgICAgICAgICAJaWYgKCFhdHRyMS5nZXROYW1lKCkuZXF1YWxzKGF0dHIyLmdldE5hbWUoKSkpIHsKLQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiQXR0ci5nZXROYW1lKCkgIiArIGF0dHIxLmdldE5hbWUoKSArICIgIiArIGF0dHIyLmdldE5hbWUoKSwgbm9kZTEsIG5vZGUyKTsKLQkgICAgICAgICAgICAgICAgfSAKLQkgICAgICAgICAgICAgICAgZWxzZSBpZiggYXR0cmlidXRlTGlzdCAhPSBudWxsICYmICFhdHRyaWJ1dGVMaXN0LmNvbnRhaW5zKGF0dHIxLmdldE5hbWUoKSkgJiYgIWF0dHJpYnV0ZUxpc3QuY29udGFpbnMoYXR0cjIuZ2V0TmFtZSgpKSkgewotCQkJCQkJaWYgKCFhdHRyMS5nZXRWYWx1ZSgpLmVxdWFscyhhdHRyMi5nZXRWYWx1ZSgpKSkgewotCQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBtaXNtYXRjaCgiQXR0ci5nZXRWYWx1ZSgpICIgKyBhdHRyMS5nZXRWYWx1ZSgpICsgIiAiICsgYXR0cjIuZ2V0VmFsdWUoKSwgbm9kZTEsIG5vZGUyKTsKLQkJICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cjEuZ2V0U3BlY2lmaWVkKCkgIT0gYXR0cjIuZ2V0U3BlY2lmaWVkKCkpIHsKLQkJICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goIkF0dHIuZ2V0U3BlY2lmaWVkKCkgIiArIGF0dHIxLmdldFNwZWNpZmllZCgpICsgIiAiICsgYXR0cjIuZ2V0U3BlY2lmaWVkKCksIG5vZGUxLCBub2RlMik7Ci0JCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDoKLSAgICAgICAgICAgIAlEb2N1bWVudCBkb2MxID0gKERvY3VtZW50KW5vZGUxOwotCQkJCURvY3VtZW50IGRvYzIgPSAoRG9jdW1lbnQpbm9kZTI7Ci0JCQkJU3RyaW5nIHJlc3VsdCA9IGNvbXBhcmVOb2Rlcyhkb2MxLmdldERvY3R5cGUoKSwgZG9jMi5nZXREb2N0eXBlKCkpOwotCQkJCWlmKHJlc3VsdCAhPSBudWxsKXsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgotCQkJCURvY3VtZW50VHlwZSBkb2NUeXBlMSA9IChEb2N1bWVudFR5cGUpbm9kZTE7Ci0JCQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUyID0gKERvY3VtZW50VHlwZSlub2RlMjsKLQkJCQlpZighZG9jVHlwZTEuZ2V0UHVibGljSWQoKS5lcXVhbHMoZG9jVHlwZTIuZ2V0UHVibGljSWQoKSkpewotCQkJCQlyZXR1cm4gbWlzbWF0Y2goIkRvY3VtZW50VHlwZS5nZXRQdWJsaWNJZCgpICIrZG9jVHlwZTEuZ2V0UHVibGljSWQoKSsgIiAiK2RvY1R5cGUyLmdldFB1YmxpY0lkKCksIG5vZGUxLCBub2RlMik7Ci0JCQkJfQotCQkJCWJyZWFrOwotICAgICAgICAgICAgY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0gICAgICAgICAgICAJUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBJbnN0MSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pbm9kZTE7Ci0JCQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBJbnN0MiA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pbm9kZTI7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NpbmdJbnN0cnVjdGlvbiB0b2RvIik7Ci0gICAgICAgICAgICAJYnJlYWs7Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSA6Ci0JCQkJRG9jdW1lbnRGcmFnbWVudCBmcmFnMSA9IChEb2N1bWVudEZyYWdtZW50KW5vZGUxOwotCQkJCURvY3VtZW50RnJhZ21lbnQgZnJhZzIgPSAoRG9jdW1lbnRGcmFnbWVudClub2RlMjsKLQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiRG9jdW1lbnRGcmFnbWVudCB0b2RvIik7Ci0gICAgICAgICAgICAJYnJlYWs7Ci0JCQkKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0gICAgICAgICAgICBjYXNlIE5vZGUuRU5USVRZX05PREUgOgotCQkJY2FzZSBOb2RlLk5PVEFUSU9OX05PREUgOgotCQkJCWJyZWFrOwotCi0gICAgICAgIH0KLQotICAgICAgICAvL1JlY3Vyc2lvbgotICAgICAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlczEgPSBub2RlMS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzMiA9IG5vZGUyLmdldEF0dHJpYnV0ZXMoKTsKLQotICAgICAgICBpZiAoYXR0cmlidXRlczEgIT0gbnVsbCAmJiBhdHRyaWJ1dGVzMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlczEuZ2V0TGVuZ3RoKCkgIT0gYXR0cmlidXRlczIuZ2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goImdldEF0dHJpYnV0ZXMoKS5nZXRMZW5ndGgoKSAiICsgYXR0cmlidXRlczEuZ2V0TGVuZ3RoKCkgKyAiICIgKyBhdHRyaWJ1dGVzMi5nZXRMZW5ndGgoKSwgbm9kZTEsIG5vZGUyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlczEuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUF0dHIgYXR0cjEgPSAoQXR0cikgYXR0cmlidXRlczEuaXRlbShpKTsKLQkJCQlBdHRyIGF0dHIyID0gKEF0dHIpIGF0dHJpYnV0ZXMyLml0ZW0oaSk7Ci0JCQkJaWYoIWF0dHIxLmdldE5hbWUoKS5lcXVhbHMoYXR0cjIuZ2V0TmFtZSgpKSl7Ci0JCQkJCXJldHVybiBtaXNtYXRjaCgiQXR0ci5nZXROYW1lKCkgIiArIGF0dHIxLmdldE5hbWUoKSArICIgIiArIGF0dHIyLmdldE5hbWUoKSwgYXR0cjEsIGF0dHIyKTsKLQkJCQl9Ci0JCQkJaWYoYXR0cmlidXRlTGlzdCAhPSBudWxsICYmICFhdHRyaWJ1dGVMaXN0LmNvbnRhaW5zKGF0dHIxLmdldE5hbWUoKSkgJiYgIWF0dHJpYnV0ZUxpc3QuY29udGFpbnMoYXR0cjIuZ2V0TmFtZSgpKSkgewotCSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0cyA9IGNvbXBhcmVOb2RlcyhhdHRyMSwgYXR0cjIpOwotCSAgICAgICAgICAgICAgICBpZiAobnVsbCAhPSByZXN1bHRzKSB7Ci0JICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKLQkgICAgICAgICAgICAgICAgfQotCQkJCX0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9IGVsc2UgaWYgKGF0dHJpYnV0ZXMxICE9IG51bGwgfHwgYXR0cmlidXRlczIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1pc21hdGNoKCJnZXRBdHRyaWJ1dGVzKCkgbnVsbCIsIG5vZGUxLCBub2RlMik7Ci0gICAgICAgIH0KLQotICAgICAgICBOb2RlTGlzdCBjaGlsZHJlbjEgPSBub2RlMS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuMiA9IG5vZGUyLmdldENoaWxkTm9kZXMoKTsKLQotICAgICAgICAvLyAgICAgICAgaWYgKGNoaWxkcmVuMS5nZXRMZW5ndGgoKSAhPSBjaGlsZHJlbjIuZ2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgLy8gICAgICAgICAgICByZXR1cm4gbWlzbWF0Y2goImdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSAiK2NoaWxkcmVuMS5nZXRMZW5ndGgoKSsiICIrY2hpbGRyZW4yLmdldExlbmd0aCgpLCBub2RlMSwgbm9kZTIpOwotICAgICAgICAvLyAgICAgICAgfQotCi0gICAgICAgIGludCBjb3VudDEgPSAwOwotICAgICAgICBpbnQgY291bnQyID0gMDsKLQotICAgICAgICAvL2NvbXBhcmUgYWxsIGNoaWxkcmVuLCBza2lwcGluZyBlbXB0eSB0ZXh0IG5vZGVzCi0gICAgICAgIHdoaWxlIChjb3VudDEgPCBjaGlsZHJlbjEuZ2V0TGVuZ3RoKCkgJiYgY291bnQyIDwgY2hpbGRyZW4yLmdldExlbmd0aCgpKSB7Ci0gICAgICAgICAgICBOb2RlIGNoaWxkMSA9IGNoaWxkcmVuMS5pdGVtKGNvdW50MSk7Ci0gICAgICAgICAgICBOb2RlIGNoaWxkMiA9IGNoaWxkcmVuMi5pdGVtKGNvdW50Mik7Ci0gICAgICAgICAgICBpZiAoY2hpbGQxLmdldE5vZGVUeXBlKCkgIT0gY2hpbGQyLmdldE5vZGVUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGQxLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgKGNoaWxkMS5nZXROb2RlVmFsdWUoKSA9PSBudWxsIHx8IGNoaWxkMS5nZXROb2RlVmFsdWUoKS50cmltKCkuZXF1YWxzKCIiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnQxKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQyLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgKGNoaWxkMi5nZXROb2RlVmFsdWUoKSAhPSBudWxsIHx8IGNoaWxkMi5nZXROb2RlVmFsdWUoKS50cmltKCkuZXF1YWxzKCIiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY291bnQyKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvdW50MSsrOwotICAgICAgICAgICAgY291bnQyKys7Ci0gICAgICAgICAgICBTdHJpbmcgcmVzdWx0cyA9IGNvbXBhcmVOb2RlcyhjaGlsZDEsIGNoaWxkMik7Ci0gICAgICAgICAgICBpZiAobnVsbCAhPSByZXN1bHRzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy9UT0RPIHRoZXJlIG11c3QgYmUgYSB3YXkgdG8gdGVsbCB0aGUgcGFyc2VyIHRvIGlnbm9yZSB3aGl0ZXNwYWNlLgotICAgICAgICAvL2JlIHN1cmUgc2tpcCBhbnkgZW1wdHkgdGV4dCBub2RlcyBhdCB0aGUgZW5kCi0gICAgICAgIHdoaWxlIChjb3VudDEgPCBjaGlsZHJlbjEuZ2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQxID0gY2hpbGRyZW4xLml0ZW0oY291bnQxKTsKLSAgICAgICAgICAgIGlmIChjaGlsZDEuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZDEuZ2V0Tm9kZVZhbHVlKCkgPT0gbnVsbCB8fCBjaGlsZDEuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICBjb3VudDErKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBub2RlTm90Q29tcGFyZWQoY2hpbGQxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChjb3VudDIgPCBjaGlsZHJlbjIuZ2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIE5vZGUgY2hpbGQyID0gY2hpbGRyZW4yLml0ZW0oY291bnQyKTsKLSAgICAgICAgICAgIGlmIChjaGlsZDIuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZDIuZ2V0Tm9kZVZhbHVlKCkgPT0gbnVsbCB8fCBjaGlsZDIuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmVxdWFscygiIikpIHsKLSAgICAgICAgICAgICAgICBjb3VudDIrKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBub2RlTm90Q29tcGFyZWQoY2hpbGQyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuMS5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIC8vICAgICAgICAgICAgTm9kZSBjaGlsZDEgPSBjaGlsZHJlbjEuaXRlbShpKTsKLSAgICAgICAgLy8gICAgICAgICAgICBOb2RlIGNoaWxkMiA9IGNoaWxkcmVuMi5pdGVtKGkpOwotICAgICAgICAvLyAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG51bGxOb2RlRW5jb3VudGVyZWQoTm9kZSBub2RlMSwgTm9kZSBub2RlMikgewotCQlTdHJpbmcgbWVzc2FnZSA9ICJOdWxsIG5vZGUgZW5jb3VudGVyZWQiOwotCQlOb2RlIG5vbk51bGxOb2RlID0gbm9kZTEgPT0gbnVsbCA/IG5vZGUyIDogbm9kZTE7Ci0JCWNoYXIgc291cmNlID0gbm9kZTEgPT0gbnVsbCA/ICdCJyA6ICdBJzsKLQkJd2hpbGUgKG5vbk51bGxOb2RlICE9IG51bGwpIHsKLQkJCW1lc3NhZ2UgKz0gc291cmNlICsgbm9uTnVsbE5vZGUuZ2V0Tm9kZU5hbWUoKSArICJcbiI7Ci0JCQlub25OdWxsTm9kZSA9IG5vbk51bGxOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZTsKLQotCQkKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub2RlTm90Q29tcGFyZWQoTm9kZSBub2RlKSB7Ci0gICAgICAgIFN0cmluZyBtZXNzYWdlID0gIk5vZGUgbm9kZSBjb21wYXJlZDoiOwotICAgICAgICB3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlICs9IG5vZGUuZ2V0Tm9kZU5hbWUoKSArICJcbiI7Ci0gICAgICAgICAgICBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtaXNtYXRjaChTdHJpbmcgbWlzbWF0Y2h0eXBlLCBOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiTm9kZXMgQSBhbmQgQiBkbyBub3QgbWF0Y2ggYmVjYXVzZSBvZiBub2RlLiIgKyBtaXNtYXRjaHR5cGUgKyAiXG4iOwotICAgICAgICB3aGlsZSAobm9kZTEgIT0gbnVsbCAmJiBub2RlMiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtZXNzYWdlICs9ICJBOiIgKyBub2RlMS5nZXROb2RlTmFtZSgpICsgIlxuIjsKLSAgICAgICAgICAgIG1lc3NhZ2UgKz0gIkI6IiArIG5vZGUyLmdldE5vZGVOYW1lKCkgKyAiXG4iOwotICAgICAgICAgICAgbm9kZTEgPSBub2RlMS5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgICAgICBub2RlMiA9IG5vZGUyLmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICB9Ci0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKSB7Ci0JCXJldHVybiBlbnRpdHlSZXNvbHZlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb2x2ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RW50aXR5UmVzb2x2ZXIoRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLQkJZW50aXR5UmVzb2x2ZXIgPSByZXNvbHZlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9Jbml0aWFsaXphdGlvblRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvSW5pdGlhbGl6YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTRjNGY4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9Jbml0aWFsaXphdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotIC8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcHBsaWNhdGlvbkNsaWVudEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldlYk1vZHVsZVJlZjsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8xOC8wMCA3OjQxOjM5IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSW5pdGlhbGl6YXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uIDIwMDEuIjsvLyROT04tTkxTLTEkCi0vKioKLSAqIEluaXRpYWxpemF0aW9uVGVzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIEluaXRpYWxpemF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci19Ci0vKioKLSAqIFN0YXJ0cyB0aGUgYXBwbGljYXRpb24uCi0gKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JU3RyaW5nW10gY2xhc3NOYW1lID0geyJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuSW5pdGlhbGl6YXRpb25UZXN0cyIsICItbm9sb2FkaW5nIn07Ci0JVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgVGVzdFN1aXRlKEluaXRpYWxpemF0aW9uVGVzdHMuY2xhc3MpOwotfQotcHVibGljIHZvaWQgdGVzdE5ld0FyY2hpdmVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLS8vICAgICAgICBSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgiKiIsIG5ldyBYTUlSZXNvdXJjZUZhY3RvcnlJbXBsKCkpOwotCUFwcGxpY2F0aW9uQ2xpZW50RmlsZSBjbGllbnRGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVJbml0aWFsaXplZCgiZm9vIik7Ci0JYXNzZXJ0VHJ1ZShjbGllbnRGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JCi0KLQljbGllbnRGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudEZpbGVJbml0aWFsaXplZCgiZm9vIik7Ci0KLQlFSkJKYXJGaWxlIGVqYkphckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVKQkphckZpbGVJbml0aWFsaXplZCgiZm9vIik7Ci0JYXNzZXJ0VHJ1ZShlamJKYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JCi0JLy9UaGUgbmV4dCBwaWVjZSBpcyB0byB2ZXJpZnkgbm8gZXhjZXB0aW9ucyBvY2N1cgotCWVqYkphckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVKQkphckZpbGVJbml0aWFsaXplZCgiZm9vIik7Ci0JRUpCTW9kdWxlUmVmIGVqYk1vZHVsZVJlZiA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUpCTW9kdWxlUmVmKCk7Ci0JZWpiTW9kdWxlUmVmLnNldE1vZHVsZUZpbGUoZWpiSmFyRmlsZSk7Ci0JCi0KLQlFQVJGaWxlIGVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZCgiZm9vIik7Ci0JCi0JYXNzZXJ0VHJ1ZShlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JCi0KLQlXQVJGaWxlIHdhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVdBUkZpbGVJbml0aWFsaXplZCgiZm9vIik7Ci0JCi0JYXNzZXJ0VHJ1ZSh3YXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkgIT0gbnVsbCk7Ci0JCi0KLQl3YXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVXQVJGaWxlSW5pdGlhbGl6ZWQoImZvbyIpOwotCVdlYk1vZHVsZVJlZiB3ZWJNb2R1bGVSZWYgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZVdlYk1vZHVsZVJlZigpOwotCXdlYk1vZHVsZVJlZi5zZXRNb2R1bGVGaWxlKHdhckZpbGUpOwotCQotCi19Ci0JCi0JCi0KLQotCQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0phdmFUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0phdmFUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTMzYmQ4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9KYXZhVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0gLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICovCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxLzE3LzIwMDEgMTA6MTc6MjkgQU0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7Ly8kTk9OLU5MUy0xJAotLyoqCi0gKiBKYXZhVGVzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAqLwotcHVibGljIEphdmFUZXN0cyhTdHJpbmcgbmFtZSkgewotCXN1cGVyKG5hbWUpOwotfQotcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLX0KLS8qKgotICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5KYXZhVGVzdHMiLCAiLW5vbG9hZGluZyJ9OwotCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotfQotcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShKYXZhVGVzdHMuY2xhc3MpOwotfQotLyoqCi0gKiBUaGlzIG1ldGhvZCB2ZXJpZmllcyB0aGF0IGphdmEgcmVmbGVjdGlvbiB3b3JrcyBvbiBhcmNoaXZlcywgYW5kIHRoYXQKLSAqIGNsYXNzIGxvYWRpbmcgYW5kIGphdmEgcmVmbGVjdGlvbiBpcyBkeW5hbWljIHdpdGggY2hhbmdlcyB0byB0aGUgY2xhc3MKLSAqIHBhdGggb2YgdGhlIGFyY2hpdmUKLSAqLwotcHVibGljIHZvaWQgdGVzdEphdmFSZWZsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vKgotCUFyY2hpdmUgYW5BcmNoaXZlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5wcmltT3BlbkFyY2hpdmUoImJhbmszNWRlcGxveWVkLmphciIpOwotCUphdmFDbGFzcyBjbHMgPSAoSmF2YUNsYXNzKW9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhLmltcGwuSmF2YUNsYXNzSW1wbC5yZWZsZWN0KCJjb20uaWJtLmVqYi5iYW5rLlZhcEFjY291bnRCZWFuIiwgYW5BcmNoaXZlLmdldENvbnRleHQoKSk7Ci0JLy9JZ25vcmUgdGhlIGNvbnN0cnVjdG9yCi0JYXNzZXJ0VHJ1ZSgiU2hvdWxkIG5vdCBoYXZlIGJlZW4gYWJsZSB0byByZWZsZWN0IG1ldGhvZHMiICxjbHMuZ2V0TWV0aG9kcygpLnNpemUoKSA9PSAxICYmICgoTWV0aG9kKWNscy5nZXRNZXRob2RzKCkuZ2V0KDApKS5nZXROYW1lKCkuZXF1YWxzKGNscy5nZXROYW1lKCkpKTsKLQotCWFuQXJjaGl2ZS5zZXRFeHRyYUNsYXNzcGF0aCgiaXZqZWpiMzUuamFyIik7Ci0KLQlhc3NlcnRUcnVlKCJNZXRob2RzIHNob3VsZCBoYXZlIGJlZW4gcmVmbGVjdGVkIiwgY2xzLmdldE1ldGhvZHMoKS5zaXplKCkgPiAxKTsKLSovCQotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L0xvb3NlQXJjaGl2ZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvTG9vc2VBcmNoaXZlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlYjM3YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvTG9vc2VBcmNoaXZlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLk1vZHVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlSW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLlJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VDb25maWdSZWdpc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2VMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmxvb3NlY29uZmlnLmludGVybmFsLkxvb3NlV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5sb29zZWNvbmZpZy5pbnRlcm5hbC5Mb29zZWNvbmZpZ0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUubG9vc2Vjb25maWcuaW50ZXJuYWwuTG9vc2Vjb25maWdQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLQotCi1wdWJsaWMgY2xhc3MgTG9vc2VBcmNoaXZlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFyY2hpdmVUZXN0IHsKLQotCS8qKiBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY3dkOwotCXByb3RlY3RlZCBVUkkgbG9vc2VDb25maWdMb2M7Ci0JcHJvdGVjdGVkIFVSSSBsb29zZUFwcExvYzsKLQlwcm90ZWN0ZWQgU3RyaW5nIGxvb3NlTW9kdWxlV29ya3NwYWNlOwotCXByb3RlY3RlZCBTdHJpbmcgbG9vc2VFQVJVcmk7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX0pBUl9VUkkgPSAiTG9vc2VFQVJFamIuamFyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJfVVJJID0gIkxvb3NlRUFSV2ViLndhciI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRJTF9KQVJfVVJJID0gInV0aWwuamFyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJMSUJfVVJJID0gIldFQi1JTkYvbGliL2xpYnJhcnkuamFyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJMSUJfRlVMTF9VUkkgPSAiV0VCLUlORi9saWIvbGlicmFyeS5qYXIiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVFBVVF9FQVJfRklMRV9VUkkgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvTG9vc2VBcmNoaXZlVGVzdHMvTG9vc2VBcHAuZWFyIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGNoYXIgc2VwID0gamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExvb3NlQXJjaGl2ZVRlc3RzLgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIExvb3NlQXJjaGl2ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TG9vc2VDb25maWdDcmVhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RmFjdG9yeShsb29zZUNvbmZpZ0xvYykuY3JlYXRlUmVzb3VyY2UobG9vc2VDb25maWdMb2MpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZChjcmVhdGVMb29zZUNvbmZpZygpKTsKLQkJcmVzb3VyY2Uuc2F2ZShuZXcgamF2YS51dGlsLkhhc2hNYXAoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb29zZUFwcENyZWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRGYWN0b3J5KGxvb3NlQXBwTG9jKS5jcmVhdGVSZXNvdXJjZShsb29zZUFwcExvYyk7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGNyZWF0ZUxvb3NlQXBwbGljYXRpb24oKSk7Ci0JCXJlc291cmNlLnNhdmUobmV3IGphdmEudXRpbC5IYXNoTWFwKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TG9vc2VDb25maWdPcGVuQW5kU2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0uc2V0UHJvcGVydHkoTG9vc2VDb25maWdSZWdpc3Rlci5MT09TRV9DT05GSUdfUFJPUEVSVFksIGxvb3NlQ29uZmlnTG9jLnRvU3RyaW5nKCkpOwotCQlFQVJGaWxlIGVhciA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUobG9vc2VFQVJVcmkpOwotCQl2ZXJpZnkoZWFyKTsKLQkJLy9wcmludENsYXNzcGF0aHMoZWFyKTsKLQkJZWFyLnNhdmVBcyhPVVRQVVRfRUFSX0ZJTEVfVVJJKTsKLQkJZWFyLmNsb3NlKCk7Ci0JCWVhciA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoT1VUUFVUX0VBUl9GSUxFX1VSSSk7Ci0JCXZlcmlmeShlYXIpOwotCQllYXIuY2xvc2UoKTsKLQkJCQotCX0KLQkKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb29zZUNvbmZpZ1VuaW1vZGVPcGVuQW5kU2F2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0uc2V0UHJvcGVydHkoTG9vc2VDb25maWdSZWdpc3Rlci5MT09TRV9DT05GSUdfUFJPUEVSVFksICIiKTsKLQotCQlMb29zZUNvbmZpZ1JlZ2lzdGVyLnNpbmdsZXRvbigpLmFkZExvb3NlTWFwcGluZyhsb29zZUVBUlVyaSwgbG9vc2VBcHBMb2MudG9TdHJpbmcoKSk7Ci0JCUVBUkZpbGUgZWFyID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShsb29zZUVBUlVyaSk7Ci0JCXZlcmlmeShlYXIpOwotCQkvL3ByaW50Q2xhc3NwYXRocyhlYXIpOwotCQllYXIuc2F2ZUFzKE9VVFBVVF9FQVJfRklMRV9VUkkpOwotCQllYXIuY2xvc2UoKTsgCi0KLQkJZWFyID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShPVVRQVVRfRUFSX0ZJTEVfVVJJKTsKLQkJdmVyaWZ5KGVhcik7Ci0JCWVhci5jbG9zZSgpOwotCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMb29zZUNvbmZpZ09wZW5BbmRSZU9wZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLnNldFByb3BlcnR5KExvb3NlQ29uZmlnUmVnaXN0ZXIuTE9PU0VfQ09ORklHX1BST1BFUlRZLCBsb29zZUNvbmZpZ0xvYy50b1N0cmluZygpKTsKLQkJRUFSRmlsZSBlYXIgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKGxvb3NlRUFSVXJpKTsKLQkJZWFyLmNsb3NlKCk7Ci0JCWVhci5yZW9wZW4oKTsKLQkJTGlzdCBqYXJzID0gZWFyLmdldEFyY2hpdmVGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGphcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUFyY2hpdmUgYXJjaGl2ZSA9IChBcmNoaXZlKSBqYXJzLmdldChpKTsKLQkJCWFyY2hpdmUuY2xvc2UoKTsKLQkJCWFyY2hpdmUucmVvcGVuKGVhcik7Ci0JCX0KLQkJZWFyLmNsb3NlKCk7Ci0JCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnkoRUFSRmlsZSBlYXIpIHRocm93cyBFeGNlcHRpb24gewotCQl2ZXJpZnlNb2R1bGVzKGVhcik7Ci0JCXZlcmlmeU1vZHVsZVJlZnMoZWFyKTsKLQkJdmVyaWZ5VXRpbEFuZExpYihlYXIpOwotCX0KLQotCS8qKgotCSAqIEFub3RoZXIgbGV2ZWwgb2YgdmVyaWZpY2F0aW9uIHRoYXQgZm9yIGVhY2ggbW9kdWxlLCB0aGUgbW9kdWxlIGZpbGVzIGV4aXN0cwotCSAqIGFuZCB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yIGNhbiBiZSByZWFkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5TW9kdWxlUmVmcyhFQVJGaWxlIGVhcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3QgbW9kdWxlUmVmcyA9IGVhci5nZXRNb2R1bGVSZWZzKCk7Ci0JCWludCBzaXplID0gbW9kdWxlUmVmcy5zaXplKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIG1vZHVsZXMiLCAyLCBzaXplKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCU1vZHVsZVJlZiByZWYgPSAoTW9kdWxlUmVmKSBtb2R1bGVSZWZzLmdldChpKTsKLQkJCWFzc2VydE5vdE51bGwoIk1vZHVsZVJlZiBzaG91bGQgaGF2ZSBhIG1vZHVsZSBmaWxlOiIrcmVmLmdldE1vZHVsZSgpLmdldFVyaSgpLCByZWYuZ2V0TW9kdWxlRmlsZSgpKTsKLQkJCWFzc2VydE5vdE51bGwoIkRlcGxveW1lbnQgZGVzY3JpcHRvciBzaG91bGQgbm90IGJlIG51bGwiLCByZWYuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSk7CQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmeSB0aGF0IHRoZSB1dGlsIGphciBpbiB0aGUgZWFyIGFuZCB0aGUgbGlicmFyeSBpbiB0aGUgd2FyIGV4aXN0IGFuZCBhcmUgbm90IGVtcHR5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5VXRpbEFuZExpYihFQVJGaWxlIGVhcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXZlcmlmeUpBUihlYXIsIFVUSUxfSkFSX1VSSSk7Ci0JCXZlcmlmeUpBUigoQXJjaGl2ZSllYXIuZ2V0RmlsZShXQVJfVVJJKSwgV0VCTElCX0ZVTExfVVJJKTsKLQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5SkFSKEFyY2hpdmUgcGFyZW50LCBTdHJpbmcgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgiU2hvdWxkIGNvbnRhaW4gSkFSOiAiK3VyaSwgcGFyZW50LmNvbnRhaW5zRmlsZSh1cmkpKTsKLQkJQXJjaGl2ZSBqYXIgPSAoQXJjaGl2ZSlwYXJlbnQuZ2V0RmlsZSh1cmkpOwotCQkvL2F0IGxlYXNlIG9uZSBmaWxlIHBsdXMgdGhlIG1hbmlmZXN0Ci0JCWFzc2VydFRydWUoIkpBUiBzaG91bGQgY29udGFpbiBhIGNsYXNzIGZpbGU6ICIrdXJpLCBjb250YWluc0NsYXNzRmlsZShqYXIpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNDbGFzc0ZpbGUoQXJjaGl2ZSBqYXIpIHsKLQkJTGlzdCBmaWxlcyA9IGphci5nZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlGaWxlIGFGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsKLQkJCWlmIChhRmlsZS5nZXRVUkkoKS5lbmRzV2l0aCgiLmNsYXNzIikpOwotCQkJCXJldHVybiB0cnVlOwkKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIE1ha2Ugc3VyZSB7QGxpbmsgQ29udGFpbmVyI2NvbnRhaW5zRmlsZShTdHJpbmcpIHdvcmtzIGZvciBsb29zZSBtb2R1bGVzCi0JICovCi0JcHVibGljIHZvaWQgdmVyaWZ5TW9kdWxlcyhFQVJGaWxlIGVhcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3QgbW9kdWxlcyA9IGVhci5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKTsKLQkJaW50IHNpemUgPSBtb2R1bGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2R1bGUgbSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotCQkJYXNzZXJ0VHJ1ZSgiRUFSIGZpbGUgc2hvdWxkIGNvbnRhaW4gbW9kdWxlIGZpbGU6ICIrbS5nZXRVcmkoKSwgZWFyLmNvbnRhaW5zRmlsZShtLmdldFVyaSgpKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgbW9kdWxlcyIsIDIsIHNpemUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLQkJCU1vZHVsZSBtID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlhc3NlcnRUcnVlKCJFQVIgZmlsZSBzaG91bGQgY29udGFpbiBtb2R1bGUgZmlsZTogIittLmdldFVyaSgpLCBlYXIuY29udGFpbnNGaWxlKG0uZ2V0VXJpKCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgTG9vc2VDb25maWd1cmF0aW9uIGNyZWF0ZUxvb3NlQ29uZmlnKCkgewotCQlMb29zZUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbG9vc2VDb25maWdGYWN0b3J5KCkuY3JlYXRlTG9vc2VDb25maWd1cmF0aW9uKCk7Ci0JCWNvbmZpZy5nZXRBcHBsaWNhdGlvbnMoKS5hZGQoY3JlYXRlTG9vc2VBcHBsaWNhdGlvbigpKTsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JCi0JcHJvdGVjdGVkIExvb3NlQXBwbGljYXRpb24gY3JlYXRlTG9vc2VBcHBsaWNhdGlvbigpIHsKLQkJTG9vc2VBcHBsaWNhdGlvbiBhcHAgPSBsb29zZUNvbmZpZ0ZhY3RvcnkoKS5jcmVhdGVMb29zZUFwcGxpY2F0aW9uKCk7Ci0JCWFwcC5zZXRVcmkobG9vc2VFQVJVcmkpOwotCQlhcHAuc2V0UmVzb3VyY2VzUGF0aChsb29zZUVBUlVyaSk7Ci0JCWFwcC5zZXRCaW5hcmllc1BhdGgobG9vc2VFQVJVcmkpOwotCQlMaXN0IGxvb3NlQXJjaGl2ZXMgPSBhcHAuZ2V0TG9vc2VBcmNoaXZlcygpOwotCQlsb29zZUFyY2hpdmVzLmFkZChjcmVhdGVMb29zZUVKQigpKTsKLQkJbG9vc2VBcmNoaXZlcy5hZGQoY3JlYXRlTG9vc2VXRUIoKSk7Ci0JCWxvb3NlQXJjaGl2ZXMuYWRkKGNyZWF0ZUxvb3NlVXRpbCgpKTsKLQkJcmV0dXJuIGFwcDsKLQl9Ci0JCi0JcHJvdGVjdGVkIExvb3NlTW9kdWxlIGNyZWF0ZUxvb3NlRUpCKCkgewotCQlMb29zZU1vZHVsZSBtb2QgPSBsb29zZUNvbmZpZ0ZhY3RvcnkoKS5jcmVhdGVMb29zZU1vZHVsZSgpOwotCQltb2Quc2V0VXJpKEVKQl9KQVJfVVJJKTsKLQkJU3RyaW5nIGFic1BhdGggPSBsb29zZU1vZHVsZVdvcmtzcGFjZStzZXArIkxvb3NlRUFSRWpiIitzZXArImJpbiI7Ci0JCW1vZC5zZXRCaW5hcmllc1BhdGgoYWJzUGF0aCk7Ci0JCW1vZC5zZXRSZXNvdXJjZXNQYXRoKGFic1BhdGgpOwotCQlyZXR1cm4gbW9kOwotCX0KLQkKLQlwcm90ZWN0ZWQgTG9vc2VNb2R1bGUgY3JlYXRlTG9vc2VXRUIoKSB7Ci0JCUxvb3NlV0FSRmlsZSBtb2QgPSBsb29zZUNvbmZpZ0ZhY3RvcnkoKS5jcmVhdGVMb29zZVdBUkZpbGUoKTsKLQkJbW9kLnNldFVyaShXQVJfVVJJKTsKLQkJU3RyaW5nIGFic1BhdGggPSBsb29zZU1vZHVsZVdvcmtzcGFjZStzZXArIkxvb3NlRUFSV2ViIitzZXArIndlYkFwcGxpY2F0aW9uIjsKLQkJbW9kLnNldEJpbmFyaWVzUGF0aChhYnNQYXRoKTsKLQkJbW9kLnNldFJlc291cmNlc1BhdGgoYWJzUGF0aCk7Ci0JCW1vZC5nZXRMb29zZUxpYnMoKS5hZGQoY3JlYXRlTG9vc2VXZWJMaWIoKSk7Ci0JCXJldHVybiBtb2Q7Ci0JfQotCQotCXByb3RlY3RlZCBMb29zZUxpYnJhcnkgY3JlYXRlTG9vc2VVdGlsKCkgewotCQlMb29zZUxpYnJhcnkgbGliID0gbG9vc2VDb25maWdGYWN0b3J5KCkuY3JlYXRlTG9vc2VMaWJyYXJ5KCk7Ci0JCWxpYi5zZXRVcmkoVVRJTF9KQVJfVVJJKTsKLQkJU3RyaW5nIGFic1BhdGggPSBsb29zZU1vZHVsZVdvcmtzcGFjZStzZXArIkxvb3NlSmF2YVV0aWwiK3NlcCsiYmluIjsKLQkJbGliLnNldEJpbmFyaWVzUGF0aChhYnNQYXRoKTsKLQkJbGliLnNldFJlc291cmNlc1BhdGgoYWJzUGF0aCk7Ci0JCXJldHVybiBsaWI7Ci0JfQotCQotCXByb3RlY3RlZCBMb29zZUxpYnJhcnkgY3JlYXRlTG9vc2VXZWJMaWIoKSB7Ci0JCUxvb3NlTGlicmFyeSBsaWIgPSBsb29zZUNvbmZpZ0ZhY3RvcnkoKS5jcmVhdGVMb29zZUxpYnJhcnkoKTsKLQkJbGliLnNldFVyaShXRUJMSUJfVVJJKTsKLQkJU3RyaW5nIGFic1BhdGggPSBsb29zZU1vZHVsZVdvcmtzcGFjZStzZXArIkxvb3NlSmF2YVdlYkxpYiIrc2VwKyJiaW4iOwotCQlsaWIuc2V0QmluYXJpZXNQYXRoKGFic1BhdGgpOwotCQlsaWIuc2V0UmVzb3VyY2VzUGF0aChhYnNQYXRoKTsKLQkJcmV0dXJuIGxpYjsKLQl9Ci0JCi0JcHJvdGVjdGVkIExvb3NlY29uZmlnRmFjdG9yeSBsb29zZUNvbmZpZ0ZhY3RvcnkoKSB7Ci0JCXJldHVybiBMb29zZWNvbmZpZ1BhY2thZ2UuZUlOU1RBTkNFLmdldExvb3NlY29uZmlnRmFjdG9yeSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwcmludENsYXNzcGF0aHMoRUFSRmlsZSBlYXIpIHsKLQkJTGlzdCBhcmNoaXZlcyA9IGVhci5nZXRBcmNoaXZlRmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmNoaXZlcy5zaXplKCk7IGkrKykgewotCQkJQXJjaGl2ZSBhcmNoaXZlID0gKEFyY2hpdmUpIGFyY2hpdmVzLmdldChpKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9jYWwgcnVudGltZSBjbGFzc3BhdGggZm9yOiAiK2FyY2hpdmUuZ2V0VVJJKCkpOwotCQkJUnVudGltZUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IGFyY2hpdmUuZ2V0TG9jYWxSdW50aW1lQ2xhc3NQYXRoKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZW50cmllc1tqXSk7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZ1bGwgcnVudGltZSBjbGFzc3BhdGggZm9yOiAiK2FyY2hpdmUuZ2V0VVJJKCkpOwotCQkJZW50cmllcyA9IGFyY2hpdmUuZ2V0RnVsbFJ1bnRpbWVDbGFzc1BhdGgoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7IGorKykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlbnRyaWVzW2pdKTsKLQkJCX0KLQkJfQotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0Lkxvb3NlQXJjaGl2ZVRlc3RzIiwgIi1ub2xvYWRpbmciIH07Ci0JCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiTG9vc2VBcmNoaXZlVGVzdHMiKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgTG9vc2VBcmNoaXZlVGVzdHMoInRlc3RMb29zZUNvbmZpZ0NyZWF0aW9uIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBMb29zZUFyY2hpdmVUZXN0cygidGVzdExvb3NlQXBwQ3JlYXRpb24iKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IExvb3NlQXJjaGl2ZVRlc3RzKCJ0ZXN0TG9vc2VDb25maWdPcGVuQW5kU2F2ZSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgTG9vc2VBcmNoaXZlVGVzdHMoInRlc3RMb29zZUNvbmZpZ09wZW5BbmRSZU9wZW4iKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IExvb3NlQXJjaGl2ZVRlc3RzKCJ0ZXN0TG9vc2VDb25maWdVbmltb2RlT3BlbkFuZFNhdmUiKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCS8qCi0JCSAqIEBzZWUgVGVzdENhc2Ujc2V0VXAoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCXN1cGVyLnNldFVwKCk7Ci0JCQlBcmNoaXZlSW5pdC5pbml0KCk7Ci0JCQlMb29zZUNvbmZpZ1JlZ2lzdGVyLnNpbmdsZXRvbigpLmZsdXNoKCk7Ci0JCQljd2QgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeTsKLQkJCWxvb3NlTW9kdWxlV29ya3NwYWNlID0gY3dkKyJsb29zZV9tb2R1bGVfd29ya3NwYWNlIjsKLQkJCWxvb3NlQ29uZmlnTG9jID0gVVJJLmNyZWF0ZUZpbGVVUkkobG9vc2VNb2R1bGVXb3Jrc3BhY2Urc2VwKyIubWV0YWRhdGEiK3NlcCsiLnBsdWdpbnMiK3NlcCsiY29tLmlibS5ldG9vbHMuajJlZSIrc2VwKyJsb29zZUNvbmZpZy54bWkiKTsKLQkJCWxvb3NlQXBwTG9jID0gVVJJLmNyZWF0ZUZpbGVVUkkobG9vc2VNb2R1bGVXb3Jrc3BhY2Urc2VwKyIubWV0YWRhdGEiK3NlcCsiLnBsdWdpbnMiK3NlcCsiY29tLmlibS5ldG9vbHMuajJlZSIrc2VwKyJsb29zZUFwcC54bWkiKTsKLQkJCWxvb3NlRUFSVXJpID0gQXJjaGl2ZVV0aWwuZ2V0T1NVcmkobG9vc2VNb2R1bGVXb3Jrc3BhY2Urc2VwKyJMb29zZUVBUiIpOwotCQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9SYXJGaWxlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9SYXJGaWxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzNThkMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvUmFyRmlsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3Q7Ci0KLS8qCi0qIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0qIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDEgLSBBbGwgUmlnaHRzIFJlc2VydmVkLgotKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0qIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotKi8KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQXV0aGVudGljYXRpb25NZWNoYW5pc207Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbmZpZ1Byb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25uZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuU2VjdXJpdHlQZXJtaXNzaW9uOwotCi0vKioKLSAqIFRlc3RzIGZvciB2ZXJmaWNhdGlvbiB0aGF0IFJBUiBzdXBwb3J0IHdvcmtzIGNvcnJlY3RseSBpbiBXQ0NNLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzExLzAwIDEwOjI2OjExIEFNKQotICogQGF1dGhvcjogSmFyZWQgSnVya2lld2ljeiwgZXQgYWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBSYXJGaWxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiBTaW1wbGVUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotICAgICAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgUmFyRmlsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LlJhckZpbGVUZXN0cyIsICItbm9sb2FkaW5nIiB9OwotICAgICAgICBUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcHJpbnRSQVJUb0NvbnNvbGUoQ29ubmVjdG9yIGNvbm5lY3RvcikgewotICAgICAgICBSZXNvdXJjZUFkYXB0ZXIgcmEgPSBjb25uZWN0b3IuZ2V0UmVzb3VyY2VBZGFwdGVyKCk7Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZUFkYXB0ZXIgZnJvbSBYTUwgRGVwbG95bWVudCBEZXNjcmlwdG9yIik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oY29ubmVjdG9yLmdldERpc3BsYXlOYW1lKCkgKyAiOiAiICsgY29ubmVjdG9yLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlZlbmRvciA6ICIgKyBjb25uZWN0b3IuZ2V0VmVuZG9yTmFtZSgpKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWZXJzaW9uIDogIiArIGNvbm5lY3Rvci5nZXRWZXJzaW9uKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNwZWMgVmVyc2lvbiA6ICIgKyBjb25uZWN0b3IuZ2V0U3BlY1ZlcnNpb24oKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRUlTIFR5cGUgOiAiICsgY29ubmVjdG9yLmdldEVpc1R5cGUoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVhdXRoZW50aWNhdGlvbiBTdXBwb3J0IDogIiArIHJhLmlzUmVhdXRoZW50aWNhdGlvblN1cHBvcnQoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJhbnNhY3Rpb24gU3VwcG9ydCA6ICIgKyByYS5nZXRUcmFuc2FjdGlvblN1cHBvcnQoKS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKSk7Ci0KLSAgICAgICAgaWYgKGNvbm5lY3Rvci5nZXRMaWNlbnNlKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJMaWNlbnNlIFJlcXVpcmVkIDogIiArIGNvbm5lY3Rvci5nZXRMaWNlbnNlKCkuaXNSZXF1aXJlZCgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTGljZW5zZSBEZXNjcmlwdGlvbiA6ICIgKyBjb25uZWN0b3IuZ2V0TGljZW5zZSgpLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTbWFsbCBJY29uIDogIiArIGNvbm5lY3Rvci5nZXRTbWFsbEljb24oKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTGFyZ2UgSWNvbiA6ICIgKyBjb25uZWN0b3IuZ2V0TGFyZ2VJY29uKCkpOwotCi0gICAgICAgIExpc3QgYXV0aE1lY2hzID0gcmEuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21zKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXV0aE1lY2hzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSBhdXRoID0gKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKSBhdXRoTWVjaHMuZ2V0KGkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkF1dGhlbnRpY2F0aW9uIE1lY2hhbmlzbToiKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVzY3JpcHRpb24gOiAiICsgYXV0aC5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHlwZSA6ICIgKyBhdXRoLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3JlZGVudGlhbCBJbnRlcmZhY2UgOiAiICsgYXV0aC5nZXRDcmVkZW50aWFsSW50ZXJmYWNlKCkpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5SZWdpc3RlcmVkIGNsYXNzZXM6Iik7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgcmEuZ2V0Q29ubmVjdGlvbkZhY3RvcnlJbXBsQ2xhc3MoKSArICIgaW1wbGVtZW50cyAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IiArIHJhLmdldENvbm5lY3Rpb25GYWN0b3J5SW50ZXJmYWNlKCkpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0IiArIHJhLmdldENvbm5lY3Rpb25JbXBsQ2xhc3MoKSArICIgaW1wbGVtZW50cyAiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdFx0IiArIHJhLmdldENvbm5lY3Rpb25JbnRlcmZhY2UoKSk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRNYW5hZ2VkQ29ubmVjdGlvbkZhY3Rvcnk6ICIgKyByYS5nZXRNYW5hZ2VkQ29ubmVjdGlvbkZhY3RvcnlDbGFzcygpKTsKLQotICAgICAgICBMaXN0IGNvbmZpZ3MgPSByYS5nZXRDb25maWdQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5Db25maWctcHJvcGVydGllczoiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBDb25maWdQcm9wZXJ0eSBwcm9wID0gKENvbmZpZ1Byb3BlcnR5KSBjb25maWdzLmdldChpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHRDb25maWctcHJvcGVydHkgOiAiICsgcHJvcC5nZXROYW1lKCkpOwotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdFR5cGUgOiAiICsgcHJvcC5nZXRUeXBlKCkgKyAiIC8gVmFsdWUgOiAiICsgcHJvcC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHREZXNjcmlwdGlvbiA6ICIgKyBwcm9wLmdldERlc2NyaXB0aW9uKCkgKyAiXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Qgc2VjcyA9IHJhLmdldFNlY3VyaXR5UGVybWlzc2lvbnMoKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcblNlY3VyaXR5LVBlcm1pc3Npb25zOiIpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlY3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFNlY3VyaXR5UGVybWlzc2lvbiBwcm9wID0gKFNlY3VyaXR5UGVybWlzc2lvbikgc2Vjcy5nZXQoaSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0Q29uZmlnLURlc2NyaXB0aW9uIDogIiArIHByb3AuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0U3BlY2lmaWNhdGlvbiA6ICIgKyBwcm9wLmdldFNwZWNpZmljYXRpb24oKSArICJcbiIpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmFyRmlsZVRlc3RzLmNsYXNzKTsKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgdGVzdGFkZENvcHlNb2R1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUucmFyIjsKLSAgICAgICAgUkFSRmlsZSByYXJGaWxlID0gKFJBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotCi0gICAgICAgIHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotICAgICAgICBFQVJGaWxlIG5ld0VhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLmNyZWF0ZUVBUkZpbGVJbml0aWFsaXplZChBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L0NvcHlUZXN0cy9uZXdFYXJXaXRoUmFyQ29waWVkTW9kdWxlLmVhciIpOwotCi0gICAgICAgIG5ld0VhckZpbGUuYWRkQ29weShyYXJGaWxlKTsKLSAgICAgICAgUkFSRmlsZSBjb3BpZWQgPSAoUkFSRmlsZSkgbmV3RWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpLmdldCgwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3BpZWQuaXNEZXBsb3ltZW50RGVzY3JpcHRvclNldCgpKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3BpZWQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSA9PSBjb3BpZWQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkuZ2V0KDApKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShjb3BpZWQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKSAhPSByYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJhckZpbGUuZ2V0RmlsZXMoKS5zaXplKCkgPT0gY29waWVkLmdldEZpbGVzKCkuc2l6ZSgpKTsKLQotICAgICAgICBuZXdFYXJGaWxlLnNhdmVOb1Jlb3BlbigpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0ZXhwYW5kUmFyTW9kdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLnJhciI7Ci0gICAgICAgIFJBUkZpbGUgcmFyRmlsZSA9IChSQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLSAgICAgICAgcmFyRmlsZS5zZXRVUkkoInNhbXBsZS5yYXIiKTsKLQotICAgICAgICByYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0KLSAgICAgICAgRUFSRmlsZSBuZXdFYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9SYXJUZXN0cy9uZXdFYXJXaXRoUmFyTW9kdWxlLmVhciIpOwotICAgICAgICBuZXdFYXJGaWxlLmFkZENvcHkocmFyRmlsZSk7Ci0KLSAgICAgICAgbmV3RWFyRmlsZS5zYXZlTm9SZW9wZW4oKTsKLQotICAgICAgICBTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9SYXJUZXN0cy9SYXItY29udGFpbmluZy1lYXItb3V0LmVhciI7Ci0gICAgICAgIG5ld0VhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfUkFSX0ZJTEVTKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVmVyeSBiYXNpYyBtZXRob2QgdG8gb3BlbiBhbiBhcmNoaXZlIGFuZCBzYXZlIGl0IGFzIGEgZGlyZWN0b3J5IHRvIGEgbmV3IGRlc3RpbmF0aW9uLiAgUmVxdWlyZXMgdmlzdWFsIGluc3BlY3Rpb24KLSAgICAgKiBmb3IgdmVyaWZpY2F0aW9uLiAgTmVzdGVkIHdhcnMgYW5kIGVqYiBqYXJzIHdpbGwgYmUgZXhwbG9kZWQgYnV0IG90aGVyIG5lc3RlZCBqYXJzIHdpbGwgbm90Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbmRFeHRyYWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLnJhciI7Ci0gICAgICAgIFJBUkZpbGUgcmFyRmlsZSA9IChSQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLSAgICAgICAgU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvRXhwbG9kZWRfUkFSX0Rpci8iOwotICAgICAgICByYXJGaWxlLmV4dHJhY3RUb0Nvbm5lY3RvckRpcmVjdG9yeShvdXQsIEFyY2hpdmUuRVhQQU5EX0FMTCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIE9wZW5zIGFuIGVhciBmaWxlLCBhbmQgZm9yIGVhY2ggbW9kdWxlLCB3cml0ZXMgaXQncyBkZCBjb21wb25lbnRzIHRvIHRoZSBjb25zb2xlLiAgUmVxdWlyZXMgdmlzdWFsIGluc3BlY3Rpb24KLSAgICAgKiBmb3IgdmVyaWZpY2F0aW9uCi0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFuZFJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUucmFyIjsKLSAgICAgICAgUkFSRmlsZSByYXJGaWxlID0gKFJBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotCi0JCUNvbm5lY3RvciBkZCA9IHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQkJLy9wcmludFJBUlRvQ29uc29sZShkZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RvcGVuUmFyRWFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVBUkZpbGUgZWFyRmlsZSA9IChFQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RyYXIuZWFyIik7Ci0JCWFzc2VydFRydWUoZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEZpcnN0TW9kdWxlKCJzYW1wbGUucmFyIikgIT0gbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlUmFyRWFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5yYXIiOwotCQlSQVJGaWxlIHJhckZpbGUgPSAoUkFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0JCXJhckZpbGUuc2V0VVJJKCJzYW1wbGUucmFyIik7Ci0KLSAgICAgICAgcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0gICAgICAgIEVBUkZpbGUgbmV3RWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvUmFyVGVzdHMvbmV3RWFyV2l0aFJhck1vZHVsZV9zYXZlZC5lYXIiKTsKLSAgICAgICAgbmV3RWFyRmlsZS5hZGRDb3B5KHJhckZpbGUpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIk1vZHVsZSB3YXNuJ3QgZm91bmQhIiwgbmV3RWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEZpcnN0TW9kdWxlKCJzYW1wbGUucmFyIikpOwotCi0gICAgICAgIG5ld0VhckZpbGUuc2F2ZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RKMkNhdXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5yYXIiOwotICAgICAgICBSQVJGaWxlIHJhckZpbGUgPSAoUkFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0KLSAgICAgICAgQ29ubmVjdG9yIGRkID0gcmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0gICAgICAgIFJlc291cmNlQWRhcHRlciByZCA9IGRkLmdldFJlc291cmNlQWRhcHRlcigpOwotCi0gICAgICAgIEVMaXN0IG15QXV0aExpc3QgPSByZC5nZXRBdXRoZW50aWNhdGlvbk1lY2hhbmlzbXMoKTsKLS8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiBhdXRoIG1lY2hhbmlzbXMgaXM6ICIgKyBteUF1dGhMaXN0LnNpemUoKSk7Ci0vLyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBteUF1dGhMaXN0LnNpemUoKTsgaSsrKSB7Ci0vLyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXV0aCB0eXBlIGlzOiAiICsgKChBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSkgbXlBdXRoTGlzdC5nZXQoaSkpLmdldEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtVHlwZSgpKTsKLS8vICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBdXRoIHR5cGUgaXM6ICIgKyAoKEF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtKSBteUF1dGhMaXN0LmdldChpKSkuZ2V0QXV0aGVudGljYXRpb25NZWNoYW5pc21UeXBlKCkuZ2V0TmFtZSgpKTsKLS8vICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvUmVzb3VyY2VUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1Jlc291cmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjljYTUxMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvUmVzb3VyY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxMywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXBwbGljYXRpb25DbGllbnRGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVJbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFyY2hpdmVUZXN0IHsKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIFJlc291cmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgYXBwbGljYXRpb24uCi0JICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JCVN0cmluZ1tdIGNsYXNzTmFtZSA9IHsiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LlJlc291cmNlVGVzdHMiLCAiLW5vbG9hZGluZyJ9OwotCQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVzb3VyY2VUZXN0cy5jbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZmluZE9jY3VycmVuY2VzKExpc3QgcmVzb3VyY2VzLCBTdHJpbmcgdXJpKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVJlc291cmNlIGFSZXNvdXJjZSA9IChSZXNvdXJjZSkgcmVzb3VyY2VzLmdldChpKTsKLQkJCWlmICh1cmkuZXF1YWxzKGFSZXNvdXJjZS5nZXRVUkkoKS50b1N0cmluZygpKSkKLQkJCQlyZXN1bHQuYWRkKGFSZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VDcmVhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdXJpID0gIk1FVEEtSU5GL2NsaWVudC1yZXNvdXJjZS54bWkiOwotCQlBcHBsaWNhdGlvbkNsaWVudEZpbGUgYXBwQ2xpZW50RmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlQXBwbGljYXRpb25DbGllbnRGaWxlSW5pdGlhbGl6ZWQoInRlc3QuamFyIik7Ci0JCVJlc291cmNlIHJlcyA9IG51bGw7Ci0JCWJvb2xlYW4gZXhjZXB0aW9uQ2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlyZXMgPSBhcHBDbGllbnRGaWxlLmdldE1vZlJlc291cmNlKHVyaSk7Ci0JCX0gY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbkNhdWdodCA9IHRydWU7Ci0JCQlMaXN0IGZvdW5kUmVzb3VyY2VzID0gZmluZE9jY3VycmVuY2VzKGFwcENsaWVudEZpbGUuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSwgdXJpKTsKLQkJCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBleGlzdCBleGFjdGx5IG9uZSByZXNvdXJjZSIsIGZvdW5kUmVzb3VyY2VzLnNpemUoKSA9PSAxKTsKLQkJCVJlc291cmNlIGZvdW5kUmVzb3VyY2UgPSAoUmVzb3VyY2UpZm91bmRSZXNvdXJjZXMuZ2V0KDApOwotCQkJYXNzZXJ0RmFsc2UoIlRoZSByZXNvdXJjZSBzaG91bGQgYmUgdW5sb2FkZWQiLCBmb3VuZFJlc291cmNlLmlzTG9hZGVkKCkpOwotCQkJcmVzID0gYXBwQ2xpZW50RmlsZS5tYWtlTW9mUmVzb3VyY2UodXJpKTsKLQkJCWFzc2VydFRydWUoIlJlc291cmNlIHNob3VsZCBub3QgYmUgbnVsbCIsIHJlcyAhPSBudWxsKTsKLQkJCWZvdW5kUmVzb3VyY2VzID0gZmluZE9jY3VycmVuY2VzKGFwcENsaWVudEZpbGUuZ2V0UmVzb3VyY2VTZXQoKS5nZXRSZXNvdXJjZXMoKSwgdXJpKTsKLQkJCWFzc2VydFRydWUoIlRoZXJlIHNob3VsZCBleGlzdCBleGFjdGx5IG9uZSByZXNvdXJjZSIsIGZvdW5kUmVzb3VyY2VzLnNpemUoKSA9PSAxKTsKLQkJCWZvdW5kUmVzb3VyY2UgPSAoUmVzb3VyY2UpZm91bmRSZXNvdXJjZXMuZ2V0KDApOwotCQkJYXNzZXJ0VHJ1ZSgiVGhlIHJlc291cmNlIHNob3VsZCBleGlzdCIsIGZvdW5kUmVzb3VyY2UgIT0gbnVsbCk7Ci0JCQlhc3NlcnRGYWxzZSgiVGhlIHJlc291cmNlIHNob3VsZCBiZSB1bmxvYWRlZCIsIGZvdW5kUmVzb3VyY2UuaXNMb2FkZWQoKSk7CQkKLQkJfQotCQlhc3NlcnRUcnVlKCJFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiBjYXVnaHQiLCBleGNlcHRpb25DYXVnaHQpOwotCQlDb2xsZWN0aW9uIGxvYWRlZFJlc291cmNlcyA9IGFwcENsaWVudEZpbGUuZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCk7Ci0JCWFzc2VydFRydWUoIkxvYWRlZCByZXNvdXJjZXMgc2hvdWxkIGJlIHNpemUgMSIsIGxvYWRlZFJlc291cmNlcy5zaXplKCkgPT0gMSk7Ci0JCUVqYlJlZiBhUmVmID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZUVqYlJlZigpOwotCQlyZXMuZ2V0Q29udGVudHMoKS5hZGQoYVJlZik7Ci0JCWxvYWRlZFJlc291cmNlcyA9IGFwcENsaWVudEZpbGUuZ2V0TG9hZGVkTW9mUmVzb3VyY2VzKCk7Ci0JCWFzc2VydFRydWUoIkxvYWRlZCByZXNvdXJjZXMgc2hvdWxkIGJlIHNpemUgMiIsIGxvYWRlZFJlc291cmNlcy5zaXplKCkgPT0gMik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZURpcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVKQkphckZpbGUgamFyID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUpCMTFKYXJGaWxlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImJhbmtlamJzLmphciIpOwotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gKEVudGVycHJpc2VCZWFuKWphci5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldEVudGVycHJpc2VCZWFucygpLmdldCgwKTsKLQkJCi0JCUVBUkZpbGUgbmV3RWFyID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoInRlc3QiKTsKLQkJRUpCSmFyRmlsZSBjb3B5SmFyID0gKEVKQkphckZpbGUpIG5ld0Vhci5hZGRDb3B5KGphcik7Ci0JCQotCQlhc3NlcnRGYWxzZSgiZGQgc2hvdWxkIG5vdCBiZSBkaXJ0eSIsIGNvcHlKYXIuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmlzTW9kaWZpZWQoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlBcmNoaXZlSW5pdC5pbml0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvU2F2ZVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvU2F2ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NmMxMTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1NhdmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5SZWFkT25seURpcmVjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC51dGlsLkFyY2hpdmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzIxLzAwIDM6MDQ6MzYgUE0pCi0gKiBAYXV0aG9yOiBBZG1pbmlzdHJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXZlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiBTYXZlVGVzdHMgY29uc3RydWN0b3IgY29tbWVudC4KLSAgICAgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFNhdmVUZXN0cyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0gICAgcHVibGljIENvbW1vbmFyY2hpdmVGYWN0b3J5IGdldEFyY2hpdmVGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFN0YXJ0cyB0aGUgYXBwbGljYXRpb24uCi0gICAgICogQHBhcmFtIGFyZ3MgYW4gYXJyYXkgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIFN0cmluZ1tdIGNsYXNzTmFtZSA9IHsgImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5TYXZlVGVzdHMiLCAiLW5vbG9hZGluZyIgfTsKLSAgICAgICAgVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFNhdmVUZXN0cy5jbGFzcyk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFRoaXMgc2NlbmFyaW8gdGVzdHMgdGhlIGNhc2Ugb2Ygb3BlbmluZyBhbiBhcmNoaXZlLCBtb2RpZnlpbmcgaXQncyBjb250ZW50cywgYW5kIHNhdmluZyB0byB0aGUgc2FtZSB1cmkgZnJvbSB3aGljaCBpdCB3YXMKLSAgICAgKiBsb2FkZWQuICBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoZSByZWFkaW5nIG9mIGlucHV0IHN0cmVhbXMgb2YgaW5kaXZpZHVhbCBlbnRyaWVzIGluIGFuIGFyY2hpdmUgaXMgZGVmZXJyZWQgdW50aWwgcmVxdWVzdGVkIHRocm91Z2gKLSAgICAgKiB0aGUgYXBpIG9yIHNhdmUgdGltZTsgdGhlcmVmb3JlLCBhbiBvcGVuIGZpbGUgZXhpc3RzIG9uIHRoZSBzb3VyY2UgZmlsZS4gIFRvIGdldCBhcm91bmQgdGhpcywgdGhlIGltcGxlbWVudGF0aW9uIHNhdmVzIHRoZSBhcmNoaXZlCi0gICAgICogdG8gYSB0ZW1wIGZpbGUsIHRoZW4gZGVsZXRlcyAob3IgcmVuYW1lcywgYmFzZWQgb24gc2V0dGluZywgdG8gYmUgaW1wbGVtZW50ZWQpIHRoZSBvbGQgZmlsZSwgcmVuYW1lcyB0aGUgdGVtcCBmaWxlLCBhbmQgZG9lcyBzb21lCi0gICAgICogaG91c2VrZWVwaW5nIG9uIHRoZSBzYXZlZCBhcmNoaXZlLCB3aXRoIGl0J3MgbG9hZCBzdHJhdGVneSBhbmQgY29udGFpbmVkIGZpbGVzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFNhdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICAvL0ZpcnN0IG1ha2UgYSBjb3B5IG9mIG91ciByZWZlcmVuY2UgZmlsZQotICAgICAgICBBcmNoaXZlIGFuQXJjaGl2ZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiZXhhbXBsZTIud2FyIik7Ci0gICAgICAgIGFuQXJjaGl2ZS5zYXZlQXNOb1Jlb3BlbihBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1NhdmVUZXN0cy9jb3B5LndhciIpOwotICAgICAgICBhbkFyY2hpdmUgPSBudWxsOwotCi0gICAgICAgIFdBUkZpbGUgYVdhckZpbGUgPSAoV0FSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1NhdmVUZXN0cy9jb3B5LndhciIpOwotICAgICAgICBSZWFkT25seURpcmVjdG9yeSBzYW1wbGVEaXJlY3RvcnkgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5SZWFkT25seURpcmVjdG9yeShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJXYXJUZXN0Q2xhc3NlcyIpOwotICAgICAgICBpbnQgaW5pdGlhbFNpemUgPSBhV2FyRmlsZS5nZXRDbGFzc2VzKCkuc2l6ZSgpOwotICAgICAgICBGaWxlIGFGaWxlID0gc2FtcGxlRGlyZWN0b3J5LmdldEZpbGVJblNlbGZPclN1YmRpcmVjdG9yeSgiY29tL2libS9ldG9vbHMvYXJjaGl2ZS90ZXN0L1dBUkZpbGVUZXN0cy5jbGFzcyIpOwotICAgICAgICBhV2FyRmlsZS5hZGRDb3B5Q2xhc3MoYUZpbGUpOwotICAgICAgICBhc3NlcnRUcnVlKGFXYXJGaWxlLmdldENsYXNzZXMoKS5zaXplKCkgPT0gaW5pdGlhbFNpemUgKyAxKTsKLQotICAgICAgICBTdHJpbmcgY2xhc3NVUkkgPSBBcmNoaXZlVXRpbC5jb25jYXRVcmkoQXJjaGl2ZUNvbnN0YW50cy5XRUJBUFBfQ0xBU1NFU19VUkksIGFGaWxlLmdldFVSSSgpLCAnLycpOwotICAgICAgICBhc3NlcnRUcnVlKGFXYXJGaWxlLmNvbnRhaW5zRmlsZShjbGFzc1VSSSkpOwotICAgICAgICBhV2FyRmlsZS5zYXZlKCk7Ci0KLSAgICAgICAgRmlsZSBjbGFzc0ZpbGUgPSBhV2FyRmlsZS5nZXRGaWxlKGNsYXNzVVJJKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRmlsZSBzaG91bGQgbm90IGJlIG51bGwiLCBjbGFzc0ZpbGUgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydFRydWUoIldyb25nIGxvYWRpbmcgYXJjaGl2ZSIsIGNsYXNzRmlsZS5nZXRMb2FkaW5nQ29udGFpbmVyKCkgPT0gYVdhckZpbGUpOwotICAgICAgICBhc3NlcnRUcnVlKCJXcm9uZyBvcmlnaW5hbCBVUkkiLCBjbGFzc0ZpbGUuZ2V0T3JpZ2luYWxVUkkoKS5lcXVhbHMoY2xhc3NVUkkpKTsKLQotICAgICAgICBhV2FyRmlsZS5zYXZlQXMoInRlc3RPdXRwdXQvU2F2ZVRlc3RzL2NvcHkyLndhciIpOwotICAgICAgICBhV2FyRmlsZS5zYXZlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBzY2VuYXJpbyBpcyBzaW1pbGFyIHRvIEBsaW5rICN0ZXN0U2F2ZSwgZXhjZXB0IHRoYXQgaXQgdGVzdHMgd2l0aCBhIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIGEgamFyIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2F2ZURpcmVjdG9yeSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIC8vRmlyc3QgbWFrZSBhIGNvcHkgb2Ygb3VyIHJlZmVyZW5jZSBmaWxlCi0gICAgICAgIEFyY2hpdmUgYW5BcmNoaXZlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIik7Ci0gICAgICAgIGFuQXJjaGl2ZS5zYXZlQXNOb1Jlb3BlbihBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1NhdmVUZXN0cy9zYW1wbGUtY29waWVkLmVhciIpOwotICAgICAgICBhbkFyY2hpdmUgPSBudWxsOwotCi0gICAgICAgIEVBUkZpbGUgYW5FQVJGaWxlID0gKEVBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9TYXZlVGVzdHMvc2FtcGxlLWNvcGllZC5lYXIiKTsKLQotICAgICAgICBhbkVBUkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgICAgICAgCi0KLSAgICAgICAgYW5FQVJGaWxlLmV4dHJhY3ROb1Jlb3BlbihBcmNoaXZlLkVYUEFORF9XQVJfRklMRVMpOwotCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvU2VjdXJpdHlSb2xlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TZWN1cml0eVJvbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWMwZGM0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TZWN1cml0eVJvbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0gLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLgotICovCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnN3aW5ndWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FSkJKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5XQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldlYk1vZHVsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgwMi8wOS8wMSAxMjowNToxOCBBTSkKLSAqIEBhdXRob3I6IEFkbWluaXN0cmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5Um9sZVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RBcmNoaXZlVGVzdCB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7Ly8kTk9OLU5MUy0xJAotLyoqCi0gKiBTZWN1cml0eVJvbGVUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICovCi1wdWJsaWMgU2VjdXJpdHlSb2xlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBDb21tb25GYWN0b3J5IGdldENvbW1vbkZhY3RvcnkoKSB7Ci0JcmV0dXJuIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLX0KLS8qKgotICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLSAqLwotcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ImNvbS5pYm0uZXRvb2xzLmFyY2hpdmUudGVzdC5TZWN1cml0eVJvbGVUZXN0cyIsICItbm9sb2FkaW5nIn07Ci0JVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCXJldHVybiBuZXcgVGVzdFN1aXRlKFNlY3VyaXR5Um9sZVRlc3RzLmNsYXNzKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RQdXNoRG93bkNvcHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCUVBUkZpbGUgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciIpOwotCi0JV0FSRmlsZSB3YXJGaWxlID0gKFdBUkZpbGUpZWFyRmlsZS5nZXRXQVJGaWxlcygpLmdldCgwKTsKLQotCUVKQkphckZpbGUgZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBlYXJGaWxlLmdldEVKQkphckZpbGVzKCkuZ2V0KDApOwotCi0JU2VjdXJpdHlSb2xlIGFSb2xlID0gZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCWFSb2xlLnNldFJvbGVOYW1lKCJhZG1pbmlzdHJhdG9yIik7Ci0JYVJvbGUuc2V0RGVzY3JpcHRpb24oIlRoZSBhbGwgcG93ZXJmdWwiKTsKLQllYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChhUm9sZSk7Ci0JZWFyRmlsZS5wdXNoRG93blJvbGUoYVJvbGUpOwotCi0JYXNzZXJ0VHJ1ZSgiUHVzaCBkb3duIGZhaWxlZCBmb3IgZWpiIGphciIsIGVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKS5nZXRTZWN1cml0eVJvbGVOYW1lZCgiYWRtaW5pc3RyYXRvciIpICE9IG51bGwpOwotCWFzc2VydFRydWUoIlB1c2ggZG93biBmYWlsZWQgZm9yIHdhciIsIHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRTZWN1cml0eVJvbGVOYW1lZCgiYWRtaW5pc3RyYXRvciIpICE9IG51bGwpOwotCi0JZWFyRmlsZS5jbG9zZSgpOwotCi19Ci1wdWJsaWMgdm9pZCB0ZXN0Um9sbHVwQWRkQW5kUHVzaERvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCUVBUkZpbGUgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkVBUkZpbGUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyJzYW1wbGUuZWFyIik7Ci0KLQlXZWJNb2R1bGVSZWYgd2ViUmVmID0gKFdlYk1vZHVsZVJlZillYXJGaWxlLmdldFdlYk1vZHVsZVJlZnMoKS5nZXQoMCk7Ci0KLQlFSkJNb2R1bGVSZWYgZWpiTW9kUmVmID0gKEVKQk1vZHVsZVJlZikgZWFyRmlsZS5nZXRFSkJNb2R1bGVSZWZzKCkuZ2V0KDApOwotCi0JU2VjdXJpdHlSb2xlIGFSb2xlID0gZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCWFSb2xlLnNldFJvbGVOYW1lKCJKb2UiKTsKLQlhUm9sZS5zZXREZXNjcmlwdGlvbigiTmV3IGRlc2NyaXB0aW9uIik7Ci0Jd2ViUmVmLmdldFdlYkFwcCgpLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoYVJvbGUpOwotCi0JYVJvbGUgPSBnZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JYVJvbGUuc2V0Um9sZU5hbWUoImFkbWluaXN0cmF0b3IiKTsKLQlhUm9sZS5zZXREZXNjcmlwdGlvbigiVGhlIGFsbCBwb3dlcmZ1bCIpOwotCQotCXdlYlJlZi5nZXRXZWJBcHAoKS5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKGFSb2xlKTsKLQotCS8vVGVzdCB0aGUgcm9sbHVwCi0JZWFyRmlsZS5yb2xsVXBSb2xlcygpOwotCS8vV2UgY2hlYXRlZCBoZXJlIGJlY2F1c2Ugd2UgYWxyZWFkeSBrbmV3IHRoZXJlIHdlcmUgdHdvIHJvbGVzIGluIHRoZSBlamIgamFyCi0JLy9vbmUgb2Ygd2hpY2ggaXMgbmFtZWQgSm9lLCBhbmQgemVybyByb2xlcyBpbiB0aGUgd2FyIGZpbGUKLQlhc3NlcnRUcnVlKCJSb2xsIHVwIG5vdCByaWdodCIsIGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRTZWN1cml0eVJvbGVzKCkuc2l6ZSgpID09IDUpOwotCi0JYVJvbGUgPSBnZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JYVJvbGUuc2V0Um9sZU5hbWUoIm1hbmFnZXIiKTsKLQlhUm9sZS5zZXREZXNjcmlwdGlvbigidGhlIG1hbmFnZXIiKTsKLQllYXJGaWxlLmFkZENvcHkoYVJvbGUsIHdlYlJlZi5nZXRNb2R1bGUoKSk7Ci0KLQkvL1Rlc3QgdGhlIGFkZCBhbmQgcm9sbHVwCi0JYXNzZXJ0VHJ1ZSgiQWRkIGNvcHkgbm90IHJpZ2h0IiwgZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFNlY3VyaXR5Um9sZXMoKS5zaXplKCkgPT0gNiAKLQkJJiYgZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmNvbnRhaW5zU2VjdXJpdHlSb2xlKGFSb2xlLmdldFJvbGVOYW1lKCkpCi0JCSYmIHdlYlJlZi5nZXRXZWJBcHAoKS5jb250YWluc1NlY3VyaXR5Um9sZShhUm9sZS5nZXRSb2xlTmFtZSgpKSk7Ci0KLQkvL1Rlc3QgdGhlIHB1c2ggZG93bgotCWVhckZpbGUucmVuYW1lU2VjdXJpdHlSb2xlKCJKb2UiLCAiZ3Vlc3QiKTsKLQotCWFzc2VydFRydWUoIlB1c2ggZG93biBub3QgcmlnaHQiLCAhZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmNvbnRhaW5zU2VjdXJpdHlSb2xlKCJKb2UiKQotCQkmJiBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCkuY29udGFpbnNTZWN1cml0eVJvbGUoImd1ZXN0IikKLQkJJiYgIXdlYlJlZi5nZXRXZWJBcHAoKS5jb250YWluc1NlY3VyaXR5Um9sZSgiSm9lIikKLQkJJiYgd2ViUmVmLmdldFdlYkFwcCgpLmNvbnRhaW5zU2VjdXJpdHlSb2xlKCJndWVzdCIpCi0JCSYmICFlamJNb2RSZWYuZ2V0RUpCSmFyKCkuY29udGFpbnNTZWN1cml0eVJvbGUoIkpvZSIpCi0JCSYmIGVqYk1vZFJlZi5nZXRFSkJKYXIoKS5jb250YWluc1NlY3VyaXR5Um9sZSgiZ3Vlc3QiKSk7Ci0KLQllYXJGaWxlLnNhdmVBc05vUmVvcGVuKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsidGVzdE91dHB1dC9TZWN1cml0eVJvbGVUZXN0cy9uZXdTYW1wbGUuZWFyIik7Ci0JCi19Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvU2ltcGxlVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TaW1wbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmE4NzNiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9TaW1wbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi0vKgotKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAxIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZQotKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Nb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUpCTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuTW9kdWxlRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuVmFsaWRhdGVYbWxDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLldBUkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV2ViTW9kdWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLlhtbFZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlNhdmVGYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZUluaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQ3JlYXRpb24gZGF0ZTogKDEyLzExLzAwIDEwOjI2OjExIEFNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGNvcHlyaWdodCA9ICIoYykgQ29weXJpZ2h0IElCTSBDb3Jwb3JhdGlvbiAyMDAxLiI7IC8vJE5PTi1OTFMtMSQKLSAgICAvKioKLSAgICAgKiBTaW1wbGVUZXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotICAgICAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLSAgICAgKi8KLSAgICBwdWJsaWMgU2ltcGxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoQ29sbGVjdGlvbiBhZGFwdGVycykgewotICAgICAgICBpZiAoYWRhcHRlcnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotICAgICAgICAgICAgaWYgKGl0ZXIubmV4dCgpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0gICAgICAgIHJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3RyaW5nW10gY2xhc3NOYW1lID0geyAiY29tLmlibS5ldG9vbHMuYXJjaGl2ZS50ZXN0LlNpbXBsZVRlc3RzIiwgIi1ub2xvYWRpbmciIH07Ci0gICAgICAgIFRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBwcmludEFwcGxUb0NvbnNvbGUoQXBwbGljYXRpb24gYXBwbCkgewotCi0gICAgICAgIExpc3QgbW9kdWxlcyA9IGFwcGwuZ2V0TW9kdWxlcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihtb2R1bGVzLmdldChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcHJpbnRFSkJKYXJUb0NvbnNvbGUoRUpCSmFyIGVqYkphcikgewotCi0gICAgICAgIExpc3QgZWpicyA9IGVqYkphci5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlamJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZWpicy5nZXQoaSkpOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcHJpbnRXZWJBcHBUb0NvbnNvbGUoV2ViQXBwIHdlYkFwcCkgewotICAgICAgICBMaXN0IHNlcnZsZXRzID0gd2ViQXBwLmdldFNlcnZsZXRzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2bGV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNlcnZsZXRzLmdldChpKSk7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShTaW1wbGVUZXN0cy5jbGFzcyk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluZXJNYW5hZ2VkRW50aXR5RXh0ZW5zaW9uUmVhZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0gICAgICAgIEVKQkphckZpbGUgamFyRmlsZSA9IChFSkJKYXJGaWxlKSBmYWN0b3J5Lm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImNtcHNhbXBsZS5qYXIiKTsKLSAgICAgICAgRUpCSmFyIGphciA9IGphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgICAgCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RFSkIxMUphckFkZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBFQVJGaWxlIF9lYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9UZXN0RUFSRUpCQWRkLmVhciIpOwotICAgICAgICBDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci0gICAgICAgIEVKQkphckZpbGUgamFyID0gKEVKQkphckZpbGUpIGZhY3Rvcnkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiZWpiX2NvbXBhdF9lbnRpdHljbXAuamFyIik7Ci0gICAgICAgIGphci5zZXRVUkkoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiZWpiX2NvbXBhdF9lbnRpdHljbXAuamFyIik7Ci0gICAgICAgIF9lYXJGaWxlLmFkZENvcHkoamFyKTsKLSAgICAgICAgX2VhckZpbGUuc2F2ZSgpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RUpCU2V0QWJzdHJhY3RTY2hlbWFOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyB0ZXN0U20gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJUZXN0U2NoZW1hIjsKLSAgICAgICAgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZmFjdG9yeSA9IENvbW1vbmFyY2hpdmVQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25hcmNoaXZlRmFjdG9yeSgpOwotICAgICAgICBFSkJKYXJGaWxlIGphckZpbGUgPSAoRUpCSmFyRmlsZSkgZmFjdG9yeS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJjbXBzYW1wbGUuamFyIik7Ci0gICAgICAgIEVKQkphciBqYXIgPSBqYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0gICAgICAgIExpc3QgbHN0ID0gamFyLmdldENvbnRhaW5lck1hbmFnZWRCZWFucygpOwotCi0gICAgICAgIC8vSSBrbm93IHRoaXMgd2lsbCBiZSBhIENNUCwgc28sIGxldHMgdHJ5IHNldC9nZXQgb24gaXQuLgotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IGNtcCA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBsc3QuZ2V0KDApOwotCi0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJTZXR0aW5nIFNjaGVtYSBuYW1lIHRvOiAiICsgdGVzdFNtKTsKLSAgICAgICAgY21wLnNldEFic3RyYWN0U2NoZW1hTmFtZSh0ZXN0U20pOwotICAgICAgICAvL1JldHJpZXZlIGl0IGFuZCBzZWUgaWYgaXQgbWF0Y2hlcwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiR2V0dGluZyBzY2hlbWEgbmFtZTogIiArIGNtcC5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSk7Ci0gICAgICAgIGFzc2VydFRydWUoY21wLmdldEFic3RyYWN0U2NoZW1hTmFtZSgpLmVxdWFscyh0ZXN0U20pKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGhpcyBleGNlcmNpc2VzIHRoZSBpbmRleCBhZGFwdGVyIG9uIENvbnRhaW5lcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBcmNoaXZlIGFuQXJjaGl2ZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiZm9vLmphciIpOwotICAgICAgICBTdHJpbmcgdXJpID0gImNvbS9pYm0vZXRvb2xzL2FyY2hpdmUvdGVzdC9TaW1wbGVUZXN0cy5qYXZhIjsKLQotICAgICAgICBMaXN0IGZpbGVzID0gYW5BcmNoaXZlLmdldEZpbGVzKCk7Ci0KLSAgICAgICAgRmlsZSBhRmlsZSA9IGFuQXJjaGl2ZS5nZXRGaWxlKHVyaSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkFkYXB0ZXIgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIGFGaWxlIiwgIWlzRW1wdHkoYUZpbGUuZUFkYXB0ZXJzKCkpKTsKLQotICAgICAgICBmaWxlcy5yZW1vdmUoYUZpbGUpOwotCi0gICAgICAgIGFzc2VydFRydWUoIkFkYXB0ZXIgc2hvdWxkIG5vdCBiZSBhdHRhY2hlZCB0byBhRmlsZSIsIGlzRW1wdHkoYUZpbGUuZUFkYXB0ZXJzKCkpKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBzaG91bGQgcmV0dXJuIGZhbHNlIiwgIWFuQXJjaGl2ZS5jb250YWluc0ZpbGUodXJpKSk7Ci0KLSAgICAgICAgRmlsZSBjb3B5ID0gYW5BcmNoaXZlLmFkZENvcHkoYUZpbGUpOwotCi0gICAgICAgIGFzc2VydFRydWUoIkNvbnRhaW5zIHNob3VsZCByZXR1cm4gdHJ1ZSIsIGFuQXJjaGl2ZS5jb250YWluc0ZpbGUodXJpKSk7Ci0KLSAgICAgICAgU3RyaW5nIHJlbmFtZWRVUkkgPSAiY29tL2libS9nb29ibGVkeWdvb2siOwotICAgICAgICBjb3B5LnNldFVSSShyZW5hbWVkVVJJKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBvbGQgdXJpIiwgIWFuQXJjaGl2ZS5jb250YWluc0ZpbGUodXJpKSk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29udGFpbnMgc2hvdWxkIHJldHVybiB0cnVlIGZvciBuZXcgdXJpIiwgYW5BcmNoaXZlLmNvbnRhaW5zRmlsZShyZW5hbWVkVVJJKSk7Ci0KLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGhpcyBleGNlcmNpc2VzIHRoZSBpbmRleCBhZGFwdGVyIG9uIENvbnRhaW5lcgotICAgICAqIFRlc3RzIG5vdGlmaWNhdGlvbnMgd2l0aCBhZGQvcmVtb3ZlIG9mIGxpc3RzLCBhbmQgdGhhdCBhZGFwdGVycyBhcmUgc2V0IHBvc3QgY29weQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleGluZ1dpdGhDb2xsZWN0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBBcmNoaXZlIGFuQXJjaGl2ZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiYmFua2VqYnMuamFyIik7Ci0gICAgICAgIEVBUkZpbGUgZWFyRmlsZSA9IGdldEFyY2hpdmVGYWN0b3J5KCkuY3JlYXRlRUFSRmlsZUluaXRpYWxpemVkKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgImJhci5lYXIiKTsKLSAgICAgICAgZWFyRmlsZS5hZGRDb3B5KGFuQXJjaGl2ZSk7Ci0gICAgICAgIGFuQXJjaGl2ZSA9IChBcmNoaXZlKSBlYXJGaWxlLmdldEZpbGUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiYmFua2VqYnMuamFyIik7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5kZXggb3V0IG9mIHN5bmMiLCAhYW5BcmNoaXZlLmdldEZpbGVzKCkuaXNFbXB0eSgpICYmIGFuQXJjaGl2ZS5pc0luZGV4ZWQoKSk7Ci0gICAgICAgIExpc3QgZmlsZXMgPSBhbkFyY2hpdmUuZ2V0RmlsZXMoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgRmlsZSBhRmlsZSA9IChGaWxlKSBmaWxlcy5nZXQoaSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJJbmRleCBvdXQgb2Ygd2hhY2s7IGNvbnRhaW5tZW50IHNob3VsZCBiZSB0cnVlIiwgYW5BcmNoaXZlLmNvbnRhaW5zRmlsZShhRmlsZS5nZXRVUkkoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQWRhcHRlciBzaG91bGQgYmUgYXR0YWNoZWQgdG8gYUZpbGUiLCAhaXNFbXB0eShhRmlsZS5lQWRhcHRlcnMoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdCBmaWxlc1RvQWRkID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuUmVhZE9ubHlEaXJlY3RvcnkoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiV2FyVGVzdENsYXNzZXMiKS5nZXRGaWxlc1JlY3Vyc2l2ZSgpOwotICAgICAgICBMaXN0IGFkZGVkRmlsZXMgPSBhbkFyY2hpdmUuYWRkQ29weUZpbGVzKGZpbGVzVG9BZGQpOwotCi0gICAgICAgIGFzc2VydFRydWUoIkZpbGVzIGFkZGVkIGluY29ycmVjdGx5IiwgIWZpbGVzVG9BZGQuaXNFbXB0eSgpICYmIGZpbGVzVG9BZGQuc2l6ZSgpID09IGFkZGVkRmlsZXMuc2l6ZSgpKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkZGVkRmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGUgYUZpbGUgPSAoRmlsZSkgYWRkZWRGaWxlcy5nZXQoaSk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJDb250YWlucyBzaG91bGQgYmUgdHJ1ZSIsIGFuQXJjaGl2ZS5jb250YWluc0ZpbGUoYUZpbGUuZ2V0VVJJKCkpKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBiZSBzYW1lIGluc3RhbmNlIiwgYW5BcmNoaXZlLmdldEZpbGUoYUZpbGUuZ2V0VVJJKCkpID09IGFGaWxlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIkFkYXB0ZXIgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIGFGaWxlIiwgIWlzRW1wdHkoYUZpbGUuZUFkYXB0ZXJzKCkpKTsKLSAgICAgICAgfQotICAgICAgICBhbkFyY2hpdmUuZ2V0RmlsZXMoKS5yZW1vdmVBbGwoYWRkZWRGaWxlcyk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRlZEZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBGaWxlIGFGaWxlID0gKEZpbGUpIGFkZGVkRmlsZXMuZ2V0KGkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQWRhcHRlciBzaG91bGQgbm90IGJlIGF0dGFjaGVkIHRvIGFGaWxlIiwgaXNFbXB0eShhRmlsZS5lQWRhcHRlcnMoKSkpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29udGFpbnMgc2hvdWxkIHJldHVybiBmYWxzZSIsICFhbkFyY2hpdmUuY29udGFpbnNGaWxlKGFGaWxlLmdldFVSSSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jbG9zZU9wZW5BcmNoaXZlcygpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBWZXJ5IGJhc2ljIG1ldGhvZCB0byBvcGVuIGFuIGFyY2hpdmUgYW5kIHNhdmUgaXQgYXMgYSBkaXJlY3RvcnkgdG8gYSBuZXcgZGVzdGluYXRpb24uICBSZXF1aXJlcyB2aXN1YWwgaW5zcGVjdGlvbgotICAgICAqIGZvciB2ZXJpZmljYXRpb24uICBOZXN0ZWQgamFycyB3aWxsIG5vdCBiZSBleHBsb2RlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQW5kRXh0cmFjdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIjsKLSAgICAgICAgRUFSRmlsZSBlYXJGaWxlID0gKEVBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoaW4pOwotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiRUFSIHNwZWMgdmVyc2lvbiAiICsgZWFyRmlsZS5nZXRTcGVjVmVyc2lvbigpICsgIiBkZXRlY3RlZC4iKTsKLQotICAgICAgICBTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9TaW1wbGVUZXN0cy9zYW1wbGUtZXhwYW5kZWQtb3V0MS5lYXIiOwotICAgICAgICBlYXJGaWxlLmV4dHJhY3RUbyhvdXQsIEFyY2hpdmUuRVhQQU5EX05PTkUpOwotICAgICAgICBlYXJGaWxlLmNsb3NlKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFZlcnkgYmFzaWMgbWV0aG9kIHRvIG9wZW4gYW4gYXJjaGl2ZSBhbmQgc2F2ZSBpdCBhcyBhIGRpcmVjdG9yeSB0byBhIG5ldyBkZXN0aW5hdGlvbi4gIFJlcXVpcmVzIHZpc3VhbCBpbnNwZWN0aW9uCi0gICAgICogZm9yIHZlcmlmaWNhdGlvbi4gIE5lc3RlZCB3YXJzIHdpbGwgYmUgZXhwbG9kZWQgYnV0IG90aGVyIG5lc3RlZCBqYXJzIHdpbGwgbm90LiAgVGhpcyBtZXRob2QgZW11bGF0ZXMgdGhlIHdlYnNwaGVyZSBpbnN0YWxsLgotICAgICAqIHRoZSBhcmNoaXZlIGlzIG9wZW5lZCBhcyByZWFkIG9ubHk7IHRlc3QgdGhhdCBubyB0ZW1wIGZpbGVzIGFyZSBjcmVhdGVkIGJ5IHB1dHRpbmcgYSBicmVha3BvaW50IGluIEFyY2hpdmVVdGlsI2NyZWF0ZVRlbXBGaWxlKFN0cmluZywgRmlsZSkKLSAgICAgKiBBbHNvIHRoZSBhcmNoaXZlIGlzIG9wZW5lZCB3aXRoIGphdmEgcmVmbGVjdGlvbiBkaXNhYmxlZC4gIFZlcmlmeSBubyByZWZsZWN0aW9uIG9jY3VycyBieSBwdXR0aW5nIGEgYnJlYWtwb2ludHMgaW4gdGhlIGNvbnN0cnVjdG9ycwotICAgICAqIG9mIEphdmFKREtBZGFwdGVyRmFjdG9yeSwgYW5kIHRoZSBtZXRob2QgcmVmbGVjdFZhbHVlcygpIGluIGVhY2ggb2YgdGhlIHN1YmNsYXNzZXMgb2YgSmRrQWRhcHRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFuZEV4dHJhY3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0gICAgICAgIEFyY2hpdmVPcHRpb25zIG9wdGlvbnMgPSBuZXcgQXJjaGl2ZU9wdGlvbnMoKTsKLSAgICAgICAgb3B0aW9ucy5zZXRJc1JlYWRPbmx5KHRydWUpOwotICAgICAgICBvcHRpb25zLnNldFVzZUphdmFSZWZsZWN0aW9uKGZhbHNlKTsKLSAgICAgICAgRUFSRmlsZSBlYXJGaWxlID0gKEVBUkZpbGUpIGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUob3B0aW9ucywgaW4pOwotICAgICAgICAvL1RoZSBmb2xsb3dpbmcgY29kZSBmb3JjZXMgdGhlIGxvYWQgb2YgYWxsIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLCBqdXN0IHRvIG1ha2Ugc3VyZSBqYXZhIHJlZmxlY3Rpb24gZG9lc24ndCBoYXBwZW4KLSAgICAgICAgTGlzdCBtb2R1bGVSZWZzID0gZWFyRmlsZS5nZXRNb2R1bGVSZWZzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlUmVmcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgTW9kdWxlUmVmIG0gPSAoTW9kdWxlUmVmKSBtb2R1bGVSZWZzLmdldChpKTsKLSAgICAgICAgICAgIG0uZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIG91dCA9ICJ0ZXN0T3V0cHV0L1NpbXBsZVRlc3RzL3NhbXBsZS1leHBhbmRlZC1vdXQyLmVhciI7Ci0gICAgICAgIGVhckZpbGUuZXh0cmFjdFRvKG91dCwgQXJjaGl2ZS5FWFBBTkRfV0FSX0ZJTEVTKTsKLSAgICAgICAgZWFyRmlsZS5jbG9zZSgpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBWZXJ5IGJhc2ljIG1ldGhvZCB0byBvcGVuIGFuIGFyY2hpdmUgYW5kIHNhdmUgaXQgYXMgYSBkaXJlY3RvcnkgdG8gYSBuZXcgZGVzdGluYXRpb24uICBSZXF1aXJlcyB2aXN1YWwgaW5zcGVjdGlvbgotICAgICAqIGZvciB2ZXJpZmljYXRpb24uICBOZXN0ZWQgd2FycyBhbmQgZWpiIGphcnMgd2lsbCBiZSBleHBsb2RlZCBidXQgb3RoZXIgbmVzdGVkIGphcnMgd2lsbCBub3QKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkFuZEV4dHJhY3QzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0gICAgICAgIEVBUkZpbGUgZWFyRmlsZSA9IChFQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLSAgICAgICAgU3RyaW5nIG91dCA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInRlc3RPdXRwdXQvU2ltcGxlVGVzdHMvc2FtcGxlLWV4cGFuZGVkLW91dDMuZWFyIjsKLSAgICAgICAgZWFyRmlsZS5leHRyYWN0VG8ob3V0LCBBcmNoaXZlLkVYUEFORF9XQVJfRklMRVMgfCBBcmNoaXZlLkVYUEFORF9FSkJKQVJfRklMRVMpOwotICAgICAgICBlYXJGaWxlLmNsb3NlKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIE9wZW5zIGFuIGVhciBmaWxlLCBhbmQgZm9yIGVhY2ggbW9kdWxlLCB3cml0ZXMgaXQncyBkZCBjb21wb25lbnRzIHRvIHRoZSBjb25zb2xlLiAgUmVxdWlyZXMgdmlzdWFsIGluc3BlY3Rpb24KLSAgICAgKiBmb3IgdmVyaWZpY2F0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE9wZW5BbmRSZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAic2FtcGxlLmVhciI7Ci0gICAgICAgIEVBUkZpbGUgZWFyRmlsZSA9IChFQVJGaWxlKSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKGluKTsKLQotICAgICAgICBBcHBsaWNhdGlvbiBhcHBsID0gZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotICAgICAgICBwcmludEFwcGxUb0NvbnNvbGUoYXBwbCk7Ci0KLSAgICAgICAgTGlzdCBtb2R1bGVSZWZzID0gZWFyRmlsZS5nZXRNb2R1bGVSZWZzKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVSZWZzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBNb2R1bGVSZWYgYU1vZHVsZVJlZiA9IChNb2R1bGVSZWYpIG1vZHVsZVJlZnMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGFNb2R1bGVSZWYuaXNXZWIoKSkgewotICAgICAgICAgICAgICAgIFdlYk1vZHVsZVJlZiB3UmVmID0gKFdlYk1vZHVsZVJlZikgYU1vZHVsZVJlZjsKLSAgICAgICAgICAgICAgICBwcmludFdlYkFwcFRvQ29uc29sZSh3UmVmLmdldFdlYkFwcCgpKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9IGVsc2UgaWYgKGFNb2R1bGVSZWYuaXNFSkIoKSkgewotICAgICAgICAgICAgICAgIEVKQk1vZHVsZVJlZiBlUmVmID0gKEVKQk1vZHVsZVJlZikgYU1vZHVsZVJlZjsKLSAgICAgICAgICAgICAgICBwcmludEVKQkphclRvQ29uc29sZShlUmVmLmdldEVKQkphcigpKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiBWZXJ5IGJhc2ljIG1ldGhvZCB0byBvcGVuIGFuIGFyY2hpdmUgYW5kIHNhdmUgaXQgYXMgYSBqYXIgZmlsZSB0byBhIG5ldyBkZXN0aW5hdGlvbi4gIFJlcXVpcmVzIHZpc3VhbCBpbnNwZWN0aW9uCi0gICAgICogZm9yIHZlcmlmaWNhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RPcGVuQW5kU2F2ZUFzSmFyRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotICAgICAgICBFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0gICAgICAgIFN0cmluZyBvdXQgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJ0ZXN0T3V0cHV0L1NpbXBsZVRlc3RzL3NhbXBsZS1jb3B5LmVhciI7Ci0gICAgICAgIGVhckZpbGUuc2F2ZUFzTm9SZW9wZW4ob3V0KTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogVGVzdCBjYXNlIGNyZWF0ZWQgYXMgYSByZXN1bHQgb2YgYSBkZWZlY3QgcmVwb3J0IHRoYXQgY3VycmVudGx5IGNhbm5vdCBiZSByZXByb2R1Y2VkOyBvcGVuIGFuIGV4cGFuZGVkIGVhciBmaWxlIGFuZCBzYXZlIGl0IG91dAotICAgICAqIGFzIGEgamFyIGZpbGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3BlbkRpcmVjdG9yeUFuZFNhdmVBc0phckZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGVfZXhwYW5kZWQuZWFyIjsKLSAgICAgICAgaW4gPSBuZXcgamF2YS5pby5GaWxlKGluKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oaW4pOwotICAgICAgICBFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSkgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShpbik7Ci0gICAgICAgIC8vQWRkZWQgdGhpcyBsaW5lIHRvIHNlZSBpZiBsb2FkaW5nIHRoZSBkZCB3b3VsZCBtYWtlIGEgZGlmZmVyZW5jZQotICAgICAgICBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0gICAgICAgIFN0cmluZyBvdXQgPSAidGVzdE91dHB1dC9TaW1wbGVUZXN0cy9zYW1wbGUtamFycmVkLmVhciI7Ci0gICAgICAgIG91dCA9IG5ldyBqYXZhLmlvLkZpbGUob3V0KS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4ob3V0KTsKLSAgICAgICAgZWFyRmlsZS5zYXZlQXNOb1Jlb3BlbihvdXQpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAc2VlIEFyY2hpdmUjY2FuQ2xvc2UoKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTYWZlQ2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBTdHJpbmcgaW4gPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJzYW1wbGUuZWFyIjsKLSAgICAgICAgRUFSRmlsZSBlYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuRUFSRmlsZShpbik7Ci0gICAgICAgIExpc3QgbW9kdWxlcyA9IGVhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRNb2R1bGVzKCk7Ci0gICAgICAgIEVKQkphckZpbGUgZWpiSmFyRmlsZSA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2R1bGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBNb2R1bGUgYU1vZHVsZSA9IChNb2R1bGUpIG1vZHVsZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGFNb2R1bGUuaXNFamJNb2R1bGUoKSkgewotICAgICAgICAgICAgICAgIGVqYkphckZpbGUgPSAoRUpCSmFyRmlsZSkgZWFyRmlsZS5nZXRGaWxlKGFNb2R1bGUuZ2V0VXJpKCkpOwotICAgICAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJFSkJKYXIgc3BlYyB2ZXJzaW9uICIgKyBlamJKYXJGaWxlLmdldFNwZWNWZXJzaW9uKCkgKyAiIGRldGVjdGVkLiIpOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCJFSkJKYXJGaWxlIHNob3VsZCBub3QgYmUgbnVsbCIsIGVqYkphckZpbGUgIT0gbnVsbCk7Ci0KLSAgICAgICAgRUFSRmlsZSBuZXdFYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQoInRlc3RPdXRwdXQvU2ltcGxlVGVzdHMvc2FmZUNsb3NlMS5lYXIiKTsKLSAgICAgICAgbmV3RWFyRmlsZS5hZGRDb3B5KGVqYkphckZpbGUpOwotICAgICAgICBhc3NlcnRUcnVlKCFlYXJGaWxlLmdldERlcGVuZGVudE9wZW5BcmNoaXZlcygpLmlzRW1wdHkoKSAmJiAhZWpiSmFyRmlsZS5nZXREZXBlbmRlbnRPcGVuQXJjaGl2ZXMoKS5pc0VtcHR5KCkpOwotCi0gICAgICAgIG5ld0VhckZpbGUuc2F2ZSgpOwotICAgICAgICBhc3NlcnRUcnVlKGVhckZpbGUuZ2V0RGVwZW5kZW50T3BlbkFyY2hpdmVzKCkuaXNFbXB0eSgpICYmIGVqYkphckZpbGUuZ2V0RGVwZW5kZW50T3BlbkFyY2hpdmVzKCkuaXNFbXB0eSgpKTsKLSAgICAgICAgZWFyRmlsZS5jbG9zZSgpOwotICAgICAgICBuZXdFYXJGaWxlLmNsb3NlKCk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIENNVkMgZGVmZWN0IDk5NTQ0IC0gSWYgYSBzYXZlIGZhaWxzIGFuZCB0aGUgZmlsZSBkaWRuJ3QgZXhpc3QsIG9uZSBzaG91bGQgbm90Ci0gICAgICogYmUgY3JlYXRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTYXZlRmFpbHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotICAgICAgICBTdHJpbmcgb3V0ID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAidGVzdE91dHB1dC9TaW1wbGVUZXN0cy9zYXZlRmFpbHVyZS5lYXIiOwotICAgICAgICBFQVJGaWxlIGVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKGluKTsKLSAgICAgICAgTGlzdCBtb2R1bGVzID0gZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldE1vZHVsZXMoKTsKLSAgICAgICAgRUpCSmFyRmlsZSBlamJKYXJGaWxlID0gbnVsbDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZHVsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE1vZHVsZSBhTW9kdWxlID0gKE1vZHVsZSkgbW9kdWxlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoYU1vZHVsZS5pc0VqYk1vZHVsZSgpKSB7Ci0gICAgICAgICAgICAgICAgZWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBlYXJGaWxlLmdldEZpbGUoYU1vZHVsZS5nZXRVcmkoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCJFSkJKYXJGaWxlIHNob3VsZCBub3QgYmUgbnVsbCIsIGVqYkphckZpbGUgIT0gbnVsbCk7Ci0KLSAgICAgICAgRUFSRmlsZSBuZXdFYXJGaWxlID0gZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jcmVhdGVFQVJGaWxlSW5pdGlhbGl6ZWQob3V0KTsKLSAgICAgICAgbmV3RWFyRmlsZS5hZGRDb3B5KGVqYkphckZpbGUpOwotICAgICAgICBlamJKYXJGaWxlLmNsb3NlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBuZXdFYXJGaWxlLnNhdmUoKTsKLSAgICAgICAgfSBjYXRjaCAoU2F2ZUZhaWx1cmVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0ZWQgc2F2ZSBmYWlsdXJlIG9jY3VycmVkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCJGaWxlIHNob3VsZCBub3QgZXhpc3QiLCAhKG5ldyBqYXZhLmlvLkZpbGUob3V0KS5leGlzdHMoKSkpOwotICAgICAgICAgICAgZ2V0QXJjaGl2ZUZhY3RvcnkoKS5jbG9zZU9wZW5BcmNoaXZlcygpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoIlNhdmUgc2hvdWxkIGhhdmUgZmFpbGVkIiwgZmFsc2UpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBPcGVucyBhbiBlYXIgZmlsZSwgbWFrZXMgYSBmZXcgY2hhbmdlcyB0byBlbnN1cmUgdGhlIHhtbCBpcyBub3QgdmFsaWQsIGFuZCB2YWxpZGF0ZXMgdGhlIHhtbCBpbiBhbGwgdGhlIGRkczsgdmVyaWZpZXMgdGhhdAotICAgICAqIHNheCBleGNlcHRpb25zIGFyZSBjb2xsZWN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sVmFsaWRhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBpbiA9IEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgInNhbXBsZS5lYXIiOwotICAgICAgICBFQVJGaWxlIGVhckZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FQVJGaWxlKGluKTsKLQotICAgICAgICBBcHBsaWNhdGlvbiBhcHBsID0gZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotICAgICAgICBhcHBsLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZVNlY3VyaXR5Um9sZSgpKTsKLQotICAgICAgICBMaXN0IG1vZHVsZUZpbGVzID0gZWFyRmlsZS5nZXRNb2R1bGVGaWxlcygpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlRmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE1vZHVsZUZpbGUgYU1vZHVsZUZpbGUgPSAoTW9kdWxlRmlsZSkgbW9kdWxlRmlsZXMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGFNb2R1bGVGaWxlLmlzV0FSRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgV0FSRmlsZSBhV2FyRmlsZSA9IChXQVJGaWxlKSBhTW9kdWxlRmlsZTsKLSAgICAgICAgICAgICAgICBhV2FyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpLmdldFNlcnZsZXRzKCkuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCkuY3JlYXRlU2VydmxldCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYU1vZHVsZUZpbGUuaXNFSkJKYXJGaWxlKCkpIHsKLSAgICAgICAgICAgICAgICBFSkJKYXJGaWxlIGFuRWpiSmFyRmlsZSA9IChFSkJKYXJGaWxlKSBhTW9kdWxlRmlsZTsKLSAgICAgICAgICAgICAgICBhbkVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVudGl0eSgpKTsKLSAgICAgICAgICAgICAgICBhbkVqYkphckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKS5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVTZWN1cml0eVJvbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ29tbWFuZCBjbWQgPSBuZXcgVmFsaWRhdGVYbWxDb21tYW5kKGVhckZpbGUpOwotICAgICAgICBjbWQuZXhlY3V0ZSgpOwotICAgICAgICBMaXN0IGVycm9ycyA9IChMaXN0KSBjbWQuZ2V0UmVzdWx0KCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlRvdGFsIHZhbGlkYXRpb24gZXJyb3JzIHNob3VsZCBiZSAzLCBpbnN0ZWFkIG9mICIrZXJyb3JzLnNpemUoKSwgZXJyb3JzLnNpemUoKSA9PSAzKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIFhtbFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0ID0gKFhtbFZhbGlkYXRpb25SZXN1bHQpIGVycm9ycy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoaSA9PSAxKQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSBlamIgbW9kdWxlIHNob3VsZCBoYXZlIDIgZXJyb3JzIGluc3RlYWQgb2YgIisgcmVzdWx0LmdldENhdWdodEV4Y2VwdGlvbnMoKS5zaXplKCksIHJlc3VsdC5nZXRDYXVnaHRFeGNlcHRpb25zKCkuc2l6ZSgpID09IDIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIlRoZSB3ZWIgbW9kdWxlIHNob3VsZCBoYXZlIDEgZXJyb3IgaW5zdGVhZCBvZiAiKyByZXN1bHQuZ2V0Q2F1Z2h0RXhjZXB0aW9ucygpLnNpemUoKSwgcmVzdWx0LmdldENhdWdodEV4Y2VwdGlvbnMoKS5zaXplKCkgPT0gMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWFyRmlsZS5jbG9zZSgpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBzdXBlci5zZXRVcCgpOwotICAgICAgICBBcmNoaXZlSW5pdC5pbml0KCk7Ci0gICAgfQotICAgIAotICAgCXB1YmxpYyB2b2lkIHRlc3RSZWFkRW1wdHlUYWdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAJCVN0cmluZyB1cmkgPSBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJDSEtKMjgwWC5qYXIiOwotICAgCQlFSkJKYXJGaWxlIGphcmZpbGUgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5FSkJKYXJGaWxlKHVyaSk7Ci0gICAJCUVKQkphciBqYXIgPSBqYXJmaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yKCk7Ci0gICAJCVNlc3Npb24gc2VzcyA9IChTZXNzaW9uKSBqYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuZ2V0KDApOwotICAgCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgamFyLmdldEVudGVycHJpc2VCZWFucygpLmdldCgxKTsKLSAgIAkJYXNzZXJ0RmFsc2UoIlZhbHVlIHNob3VsZCBiZSB1bnNldCIsIGVudGl0eS5pc1NldFJlZW50cmFudCgpKTsKLQkJYXNzZXJ0RmFsc2UoIlZhbHVlIHNob3VsZCBiZSB1bnNldCIsIHNlc3MuaXNTZXRTZXNzaW9uVHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoIlZhbHVlIHNob3VsZCBiZSB1bnNldCIsIHNlc3MuaXNTZXRUcmFuc2FjdGlvblR5cGUoKSk7IAotfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1Rlc3RJbnZhbGlkWG1sTXVsdGlwbGljaXR5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvVGVzdEludmFsaWRYbWxNdWx0aXBsaWNpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4ZGNlZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3QvVGVzdEludmFsaWRYbWxNdWx0aXBsaWNpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIERlYyAyLCAyMDAzCi0gKgotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQuc3dpbmd1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uRGVwbG95bWVudERlc2NyaXB0b3JMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5JV3JhcHBlZEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEBhdXRob3Igc2NoYWNoZXIKLSAqLwotcHVibGljIGNsYXNzIFRlc3RJbnZhbGlkWG1sTXVsdGlwbGljaXR5IGV4dGVuZHMgQWJzdHJhY3RBcmNoaXZlVGVzdCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBUZXN0SW52YWxpZFhtbE11bHRpcGxpY2l0eShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgdGhlIGFwcGxpY2F0aW9uLgotCSAqIEBwYXJhbSBhcmdzIGFuIGFycmF5IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihqYXZhLmxhbmcuU3RyaW5nW10gYXJncykgewotCQlTdHJpbmdbXSBjbGFzc05hbWUgPSB7ICJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuVGVzdEludmFsaWRYbWxNdWx0aXBsaWNpdHkiLCAiLW5vbG9hZGluZyIgfTsKLQkJVGVzdFJ1bm5lci5tYWluKGNsYXNzTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFRlc3RJbnZhbGlkWG1sTXVsdGlwbGljaXR5LmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHVyaSA9ICBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJCYWRKc3BDb25maWcud2FyIjsKLQkJcnVuVGVzdCh1cmkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MigpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdXJpID0gIEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsgIkJhZExvZ2luQ29uZmlnLndhciI7Ci0JCXJ1blRlc3QodXJpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHVyaSA9ICBBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJCYWRTZXNzaW9uQ29uZmlnLndhciI7Ci0JCXJ1blRlc3QodXJpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuVGVzdChTdHJpbmcgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVdyYXBwZWRFeGNlcHRpb24gZXggPSBudWxsOwotCQlXQVJGaWxlIHdhciA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbldBUkZpbGUodXJpKTsKLQkJdHJ5IHsKLQkJCXdhci5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCQl9IGNhdGNoIChEZXBsb3ltZW50RGVzY3JpcHRvckxvYWRFeGNlcHRpb24gZGRleCkgewotCQkJZXggPSBkZGV4OwotCQl9Ci0JCWFzc2VydE5vdE51bGwoIkV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBiZWVuIGNhdWdodCIsIGV4KTsKLQkJRXhjZXB0aW9uIGlubmVyID0gZXguZ2V0TmVzdGVkRXhjZXB0aW9uKCk7Ci0JCQotCQl3aGlsZSAoZXggIT0gbnVsbCkgewotCQkJaWYgKGlubmVyIGluc3RhbmNlb2YgSVdyYXBwZWRFeGNlcHRpb24pIHsKLQkJCQlleCA9IChJV3JhcHBlZEV4Y2VwdGlvbilpbm5lcjsKLQkJCQlpZiAoZXguZ2V0TmVzdGVkRXhjZXB0aW9uKCkgIT0gbnVsbCkKLQkJCQkJaW5uZXIgPSBleC5nZXROZXN0ZWRFeGNlcHRpb24oKTsKLQkJCX0gZWxzZSAKLQkJCQlleCA9IG51bGw7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoIlRoZSBleGNlcHRpb24gc2hvdWxkIGJlIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIsIGlubmVyIGluc3RhbmNlb2YgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKTsKLQkJd2FyLmNsb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1Rlc3RNb2R1bGVDbGFzc0xvYWRpbmcuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9UZXN0TW9kdWxlQ2xhc3NMb2FkaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YzdjZTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1Rlc3RNb2R1bGVDbGFzc0xvYWRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuaW50ZXJuYWwuaW1wbC5KYXZhQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5pbXBsLkNvbW1vbmFyY2hpdmVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RNb2R1bGVDbGFzc0xvYWRpbmcgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gICAgc3RhdGljIFN0cmluZyB0ZXN0Q2xhc3MgPSAiY2xpZW50LlN1YnRyYWN0IjsKLSAgICAKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiAKLSAgICAgKi8KLSAgICBwdWJsaWMgVGVzdE1vZHVsZUNsYXNzTG9hZGluZygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdE1vZHVsZUNsYXNzTG9hZGluZyhTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLQlwdWJsaWMgQ29tbW9uYXJjaGl2ZUZhY3RvcnkgZ2V0QXJjaGl2ZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uYXJjaGl2ZUZhY3RvcnkoKTsKLQl9Ci0JLyoqCi0JICogU3RhcnRzIHRoZSBhcHBsaWNhdGlvbi4KLQkgKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nW10gY2xhc3NOYW1lID0geyJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuVGVzdE1vZHVsZUNsYXNzTG9hZGluZyIsICItbm9sb2FkaW5nIn07Ci0JCVRlc3RSdW5uZXIubWFpbihjbGFzc05hbWUpOwotCX0KLQlwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShUZXN0TW9kdWxlQ2xhc3NMb2FkaW5nLmNsYXNzKTsKLQl9Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIHRlc3RBZGRNb2R1bGVDbGFzc0xvYWRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gZmlsZXMgPSB7ICJQUk9UTy5lYXIiLCJTRUlpbkFub3RoZXJKYXIuZWFyIiwgIlNFSWluV0VCLUlORl9saWJfamFyLmVhciIgfTsKLQotICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IGFyZ3Mgc3BlY2lmeSBmdWxsIHBhdGggdG8gZWFyIGZpbGVzLiIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgIC8vIGNvbS5pYm0ud2Vic3BoZXJlLm1vZGVscy5jb25maWcuaW5pdC5Db25maWdJbml0LmluaXQoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZmlsZXNbaV07ICAgCi0JCQlDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uYXJjaGl2ZUZhY3RvcnlJbXBsLmdldEFjdGl2ZUZhY3RvcnkoKTsKLQotCQkJU3RyaW5nIGluID0gQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyBmaWxlc1tpXTsKLSAgICAgICAgICAgIHRyeSB7Ci0JCQkJRUFSRmlsZSBlYXJGaWxlID0gZmFjdG9yeS5vcGVuRUFSRmlsZSAoaW4pOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbiAoInVyaTogIiArIGVhckZpbGUuZ2V0VVJJKCkpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGVzdGluZyAiICsgZWFyRmlsZS5nZXRVUkkoKSk7Ci0gICAgICAgICAgICAgICAgZG9Nb2R1bGVzKGVhckZpbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZG9Nb2R1bGVzKEVBUkZpbGUgZWFyRmlsZSkgewotCQlMaXN0IG1vZHVsZXMgPSBlYXJGaWxlLmdldE1vZHVsZUZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5zaXplKCk7IGkrKykgewotCQkJQXJjaGl2ZSBtb2R1bGUgPSAoQXJjaGl2ZSkgbW9kdWxlcy5nZXQoaSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCJcdExvb2tpbmcgZm9yIGNsYXNzICIgKyB0ZXN0Q2xhc3MgKyAiIGluIG1vZHVsZSAiICsgbW9kdWxlLmdldFVSSSgpKTsKLQkJCWRvTG9hZChtb2R1bGUsIHRlc3RDbGFzcyk7Ci0JCX0KLQl9IC8vIHZhbGlkYXRlTW9kdWxlcwotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb0xvYWQoQXJjaGl2ZSBtb2R1bGUsIFN0cmluZyB0ZXN0Q2xhc3MpIHsKLQkJdHJ5IHsKLQkJCUphdmFDbGFzcyBqYXZhQ2xhc3MgPQotCQkJCShKYXZhQ2xhc3MpIEphdmFDbGFzc0ltcGwucmVmbGVjdCh0ZXN0Q2xhc3MsIG1vZHVsZS5nZXRSZXNvdXJjZVNldCgpKTsKLQkJCWlmICghKGphdmFDbGFzcykuaXNFeGlzdGluZ1R5cGUoKSkgewotCQkJCS8vIFRoaXMgaXMgd2hhdCBoYXBwZW5zIGlmIHRoZSBjbGFzcyBjYW4ndCBiZSBsb2FkZWQuCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCItIE5PVCBGT1VORCAtIGlzRXhpc3RpbmdUeXBlIHJldHVybnMgZmFsc2UuIik7Ci0JCQl9IGVsc2UgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIC0gZm91bmQ6IGlzRXhpc3RpbmdUeXBlIHJldHVybnMgdHJ1ZS4iKTsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1dBUkZpbGVUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0L1dBUkZpbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2MxMjZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdC9XQVJGaWxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdDsKLQotIC8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTQotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMSAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC5zd2luZ3VpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5BcmNoaXZlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkNvbW1vbmFyY2hpdmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuUmVhZE9ubHlEaXJlY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5oZWxwZXJzLkFyY2hpdmVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwudXRpbC5BcmNoaXZlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQ7Ci0KLS8qKgotICogSW5zZXJ0IHRoZSB0eXBlJ3MgZGVzY3JpcHRpb24gaGVyZS4KLSAqIENyZWF0aW9uIGRhdGU6ICgxMi8xNS8wMCAyOjI2OjA0IFBNKQotICogQGF1dGhvcjogQWRtaW5pc3RyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgV0FSRmlsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24gMjAwMS4iOy8vJE5PTi1OTFMtMSQKLS8qKgotICogV0FSRmlsZVRlc3RzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0gKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLXB1YmxpYyBXQVJGaWxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQlzdXBlcihuYW1lKTsKLX0KLXB1YmxpYyBDb21tb25hcmNoaXZlRmFjdG9yeSBnZXRBcmNoaXZlRmFjdG9yeSgpIHsKLQlyZXR1cm4gQ29tbW9uYXJjaGl2ZVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbmFyY2hpdmVGYWN0b3J5KCk7Ci19Ci0vKioKLSAqIFN0YXJ0cyB0aGUgYXBwbGljYXRpb24uCi0gKiBAcGFyYW0gYXJncyBhbiBhcnJheSBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzCi0gKi8KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGphdmEubGFuZy5TdHJpbmdbXSBhcmdzKSB7Ci0JU3RyaW5nW10gY2xhc3NOYW1lID0geyJjb20uaWJtLmV0b29scy5hcmNoaXZlLnRlc3QuV0FSRmlsZVRlc3RzIiwgIi1ub2xvYWRpbmcifTsKLQlUZXN0UnVubmVyLm1haW4oY2xhc3NOYW1lKTsKLX0KLXB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JcmV0dXJuIG5ldyBUZXN0U3VpdGUoV0FSRmlsZVRlc3RzLmNsYXNzKTsKLX0KLXB1YmxpYyB2b2lkIHRlc3RBZGRDb3B5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCVdBUkZpbGUgYVdhckZpbGUgPSAoV0FSRmlsZSlnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5BcmNoaXZlKEF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ICsiZXhhbXBsZTIud2FyIik7Ci0KLQlSZWFkT25seURpcmVjdG9yeSBzYW1wbGVEaXJlY3RvcnkgPSBnZXRBcmNoaXZlRmFjdG9yeSgpLm9wZW5SZWFkT25seURpcmVjdG9yeShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArIldhclRlc3RDbGFzc2VzIik7Ci0KLQlpbnQgaW5pdGlhbFNpemUgPSBhV2FyRmlsZS5nZXRDbGFzc2VzKCkuc2l6ZSgpOwotCi0JRmlsZSBhRmlsZSA9IHNhbXBsZURpcmVjdG9yeS5nZXRGaWxlSW5TZWxmT3JTdWJkaXJlY3RvcnkoImNvbS9pYm0vZXRvb2xzL2FyY2hpdmUvdGVzdC9XQVJGaWxlVGVzdHMuY2xhc3MiKTsKLQotCWFXYXJGaWxlLmFkZENvcHlDbGFzcyhhRmlsZSk7Ci0JYXNzZXJ0VHJ1ZShhV2FyRmlsZS5nZXRDbGFzc2VzKCkuc2l6ZSgpID09IGluaXRpYWxTaXplKzEpOwotCi0JU3RyaW5nIGNsYXNzVVJJID0gQXJjaGl2ZVV0aWwuY29uY2F0VXJpKEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0NMQVNTRVNfVVJJLCBhRmlsZS5nZXRVUkkoKSwgJy8nKTsKLQlhc3NlcnRUcnVlKGFXYXJGaWxlLmNvbnRhaW5zRmlsZShjbGFzc1VSSSkpOwotCS8vU3lzdGVtLm91dC5wcmludGxuKGFXYXJGaWxlLmdldFVSSSgpKyIgY29udGFpbnMgY2xhc3MgIitjbGFzc1VSSSk7Ci0KLQlhV2FyRmlsZS5zYXZlQXNOb1Jlb3BlbihBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArInRlc3RPdXRwdXQvV2FyVGVzdHMvYWRkQ29weUNsYXNzLndhciIpOwotCi19Ci0JCi1wdWJsaWMgdm9pZCB0ZXN0QWRkQ29weUxpYigpIHRocm93cyBFeGNlcHRpb24gewotCi0JV0FSRmlsZSBhV2FyRmlsZSA9IChXQVJGaWxlKWdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiZXhhbXBsZTIud2FyIik7Ci0KLQlBcmNoaXZlIGxpYiA9IGdldEFyY2hpdmVGYWN0b3J5KCkub3BlbkFyY2hpdmUoQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgKyAiZm9vLmphciIpOwotCi0JaW50IGluaXRpYWxTaXplID0gYVdhckZpbGUuZ2V0TGlicygpLnNpemUoKTsKLQotCWFXYXJGaWxlLmFkZENvcHlMaWIobGliKTsKLQlhc3NlcnRUcnVlKGFXYXJGaWxlLmdldExpYnMoKS5zaXplKCkgPT0gaW5pdGlhbFNpemUrMSk7Ci0KLQlTdHJpbmcgbGliVVJJID0gQXJjaGl2ZVV0aWwuY29uY2F0VXJpKEFyY2hpdmVDb25zdGFudHMuV0VCQVBQX0xJQl9VUkksIGxpYi5nZXRVUkkoKSwgJy8nKTsKLQlhc3NlcnRUcnVlKGFXYXJGaWxlLmNvbnRhaW5zRmlsZShsaWJVUkkpKTsKLQkvL1N5c3RlbS5vdXQucHJpbnRsbihhV2FyRmlsZS5nZXRVUkkoKSsiIGNvbnRhaW5zIGxpYiAiK2xpYlVSSSk7Ci0KLQlhV2FyRmlsZS5zYXZlQXNOb1Jlb3BlbigidGVzdE91dHB1dC9XYXJUZXN0cy9hZGRDb3B5TGliLndhciIpOwotCi19Ci0JCi1wdWJsaWMgdm9pZCB0ZXN0TGlzdENsYXNzZXNBbmRMaWJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQlXQVJGaWxlIGFXYXJGaWxlID0gKFdBUkZpbGUpZ2V0QXJjaGl2ZUZhY3RvcnkoKS5vcGVuQXJjaGl2ZShBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSArICJleGFtcGxlMi53YXIiKTsKLQotCUxpc3QgbGlicyA9IGFXYXJGaWxlLmdldExpYnMoKTsKLQlMaXN0IGNsYXNzZXMgPSBhV2FyRmlsZS5nZXRDbGFzc2VzKCk7Ci0JTGlzdCByZXNvdXJjZXMgPSBhV2FyRmlsZS5nZXRSZXNvdXJjZXMoKTsKLS8vCVN5c3RlbS5vdXQucHJpbnRsbigiV0FSIHNwZWMgdmVyc2lvbiAiK2FXYXJGaWxlLmdldFNwZWNWZXJzaW9uKCkrIiBkZXRlY3RlZC4iKTsKLS8vCVN5c3RlbS5vdXQucHJpbnRsbigiZXhhbXBsZTIud2FyIGNvbnRhaW5zICIrY2xhc3Nlcy5zaXplKCkrICIgZmlsZXMgaW4gY2xhc3NlcyIpOwotLy8JU3lzdGVtLm91dC5wcmludGxuKCJleGFtcGxlMi53YXIgY29udGFpbnMgIitsaWJzLnNpemUoKSsgIiBsaWJzIik7Ci0vLwlTeXN0ZW0ub3V0LnByaW50bG4oImV4YW1wbGUyLndhciBjb250YWlucyAiK3Jlc291cmNlcy5zaXplKCkrICIgcmVzb3VyY2VzIik7Ci0KLX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9FQXR0cmlidXRlRGVzY3JpcHRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL0VBdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NTAwNzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL0VBdHRyaWJ1dGVEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXkgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUudGVzdHV0aWxpdGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLQotLyoqCi0gKiBAYXV0aG9yIGFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRUF0dHJpYnV0ZURlc2NyaXB0b3IgewotCQotCUVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlOwotCUVDbGFzcyBtZXRhQ2xhc3M7Ci0JCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGVEZXNjcmlwdG9yKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBFQ2xhc3MgbWV0YUNsYXNzKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCXRoaXMubWV0YUNsYXNzID0gbWV0YUNsYXNzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldE1ldGFDbGFzcygpIHsKLQkJcmV0dXJuIG1ldGFDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2xhc3MxCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWV0YUNsYXNzKEVDbGFzcyBjbGFzczEpIHsKLQkJbWV0YUNsYXNzID0gY2xhc3MxOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlFQXR0cmlidXRlRGVzY3JpcHRvciBvID0gKEVBdHRyaWJ1dGVEZXNjcmlwdG9yKW9iamVjdDsKLQkJcmV0dXJuIG8uZ2V0RmVhdHVyZSgpID09IGdldEZlYXR1cmUoKSAmJiBvLmdldE1ldGFDbGFzcygpID09IGdldE1ldGFDbGFzcygpOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmZWF0dXJlLmhhc2hDb2RlKCkgXiBtZXRhQ2xhc3MuaGFzaENvZGUoKTsKLQl9Ci0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgRVN0cnVjdHVyYWxGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBhdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKEVBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGF0dHJpYnV0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3R1dGlsaXRpZXMvRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDNmOTE1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FyY2hpdmUvdGVzdHV0aWxpdGllcy9FTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YUNsYXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvblBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBFTUZBdHRyaWJ1dGVGZWF0dXJlR2VuZXJhdG9yIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdkNsYXNzW107Ci0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgY291bnQgPSAwOwotCXByb3RlY3RlZCBzdGF0aWMgUmFuZG9tIHJhbmRvbUdlbmVyYXRvciA9IG5ldyBSYW5kb20oKTsKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBtYXhOdW1iZXJPZlByb2plY3RzQ3JlYXRlZCA9IDEwMDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgZW51bU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgcGFyYW1Db3VudDsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIGxhbmdBcnJheSA9IG5ldyBTdHJpbmdbXSB7ICJFTiIsIkZSIiwiREUiLCJKUCIsIkNOIiwiQlIiLCJTUCJ9OwotCXByb3RlY3RlZCBzdGF0aWMgaW50IGxhbmdDb3VudCA9IDA7ICAKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBib29sZWFuTWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcCBhdHRJbmRleCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHNwZWNpYWxOdW1iZXJHZW4gPSBmYWxzZTsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBodHRwQXJyYXlbXSA9IG51bGw7Ci0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgaHR0cEFycmF5SW5kZXggPSAwOwotCQotCXB1YmxpYyBzdGF0aWMgaW50IHZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBpbnQgbW9kdWxlVHlwZTsKLQkvL3N0YXRpYyB2ZXJzaW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8yID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfMyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzQgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQSUNBVElPTiA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQX0NMSUVOVCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVE9SID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFSkIgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFQiA9IDQ7Ci0JCi0gICAgcHVibGljIEVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldENvdW50KCkgewotICAgIAljb3VudCA9IDA7Ci0gICAgCXJldHVybjsKLSAgICB9Ci0JcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlQXR0cmlidXRlKEVBdHRyaWJ1dGUgYXR0LCBFT2JqZWN0IG9iail7Ci0JCXJldHVybiBjcmVhdGVBdHRyaWJ1dGUobmV3IEVBdHRyaWJ1dGVEZXNjcmlwdG9yKGF0dCxvYmouZUNsYXNzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlQXR0cmlidXRlKEVBdHRyaWJ1dGUgYXR0LCBFQ2xhc3MgZUNsYXNzKXsKLQkJcmV0dXJuIGNyZWF0ZUF0dHJpYnV0ZShuZXcgRUF0dHJpYnV0ZURlc2NyaXB0b3IoYXR0LGVDbGFzcykpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVBdHRyaWJ1dGUoRUF0dHJpYnV0ZSBhdHQsIEVPYmplY3Qgb2JqLCBib29sZWFuIHNwZWNpYWwpewotCQlzcGVjaWFsTnVtYmVyR2VuID0gc3BlY2lhbDsKLQkJcmV0dXJuIGNyZWF0ZUF0dHJpYnV0ZShuZXcgRUF0dHJpYnV0ZURlc2NyaXB0b3IoYXR0LG9iai5lQ2xhc3MoKSkpOwotCX0KLQkJCQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUF0dHJpYnV0ZShFQXR0cmlidXRlIGF0dCwgRU9iamVjdCBvYmosICBib29sZWFuIHNwZWNpYWwsIGludCB2ZXIsIGludCBtb2RUeXBlKSB7Ci0JICAgc3BlY2lhbE51bWJlckdlbiA9IHNwZWNpYWw7Ci0JICAgdmVyc2lvbiA9IHZlcjsKLQkgICBtb2R1bGVUeXBlID0gbW9kVHlwZTsKLQkgICByZXR1cm4gY3JlYXRlQXR0cmlidXRlKG5ldyBFQXR0cmlidXRlRGVzY3JpcHRvcihhdHQsb2JqLmVDbGFzcygpKSk7Ci0gICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBjcmVhdGVBdHRyaWJ1dGUoRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0JCUVDbGFzc2lmaWVyIG1ldGEgPSBhdHQuZ2V0RmVhdHVyZSgpLmdldEVUeXBlKCk7Ci0JCWlmIChtZXRhIGluc3RhbmNlb2YgRUVudW0gJiYgYXR0LmdldEZlYXR1cmUoKS5pc01hbnkoKSl7Ci0JCQlMaXN0IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChjcmVhdGVFbnVtKGF0dCkpOwotCQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JCX0KLQkJZWxzZSBpZiAobWV0YSBpbnN0YW5jZW9mIEVFbnVtKQotCQkJcmV0dXJuIGNyZWF0ZUVudW0oYXR0KTsKLQkJZWxzZSBpZiAoKHZlcnNpb24gPT0gVkVSU0lPTl8xXzMgfHwgdmVyc2lvbiA9PSBWRVJTSU9OXzFfMikgJiYgYXR0LmdldEZlYXR1cmUoKS5lcXVhbHMoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRIVFRQTWV0aG9kVHlwZV9IdHRwTWV0aG9kKCkpKQotCQkJcmV0dXJuIGNyZWF0ZVNwZWNpYWxIdHRwTWV0aG9kc0ZvcjEzKCk7Ci0JCWVsc2UgaWYgKHZlcnNpb24gPT0gVkVSU0lPTl8xXzMgJiYgYXR0LmdldEZlYXR1cmUoKS5lcXVhbHMoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUpCTG9jYWxSZWZfTG9jYWwoKSkpCi0JCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21BdHRyaWJ1dGVTdHJpbmcobmV3IEVBdHRyaWJ1dGVEZXNjcmlwdG9yKENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYlJlZl9SZW1vdGUoKSwgYXR0LmdldE1ldGFDbGFzcygpKSk7Ci0JCWVsc2UgaWYgKHZlcnNpb24gPT0gVkVSU0lPTl8xXzMgJiYgYXR0LmdldEZlYXR1cmUoKS5lcXVhbHMoQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RUpCTG9jYWxSZWZfTG9jYWxIb21lKCkpKQotCQkJcmV0dXJuIGdlbmVyYXRlUmFuZG9tQXR0cmlidXRlU3RyaW5nKG5ldyBFQXR0cmlidXRlRGVzY3JpcHRvcihDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJSZWZfSG9tZSgpLGF0dC5nZXRNZXRhQ2xhc3MoKSkpOwotCQllbHNlIGlmIChhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoInBhcm1zIikpCi0JCQlyZXR1cm4gY3JlYXRlUGFyYW1zKGF0dCk7Ci0JCWVsc2UgaWYgKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImxvY2F0aW9uIikgJiYgdmVyc2lvbiA9PSBWRVJTSU9OXzFfNCkKLQkJCXJldHVybiBjcmVhdGVMb2NhdGlvbihhdHQpOwotCQllbHNlIGlmIChhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJsb2NhbGUiKSAmJiB2ZXJzaW9uID09IFZFUlNJT05fMV80KQotCQkJcmV0dXJuIGNyZWF0ZUxvY2FsZSgpOwotCQllbHNlIGlmIChhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoImxhbmciKSkKLQkJCXJldHVybiBjcmVhdGVMYW5nKGF0dCk7Ci0JCWVsc2UgaWYgKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygidmVyc2lvbiIpKQotCQkJaWYgKGF0dC5nZXRGZWF0dXJlKCkgPT0gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29udGFpbmVyTWFuYWdlZEVudGl0eV9WZXJzaW9uKCkpIAotCQkJCXJldHVybiAiMi54IjsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gY3JlYXRlVmVyc2lvbihhdHQpOwotCQllbHNlIGlmIChhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoIm1pbWVUeXBlIikgJiYgdmVyc2lvbiA9PSBWRVJTSU9OXzFfNCkKLQkJCXJldHVybiAidGV4dC9wbGFpbiI7Ci0JCWVsc2UgaWYgKGF0dC5nZXRGZWF0dXJlKCkuZ2V0TmFtZSgpLmVxdWFscygiZXJyb3JDb2RlIikgJiYgdmVyc2lvbiA9PSBWRVJTSU9OXzFfNCkKLQkJCXJldHVybiAiNDA0IjsKLQkJZWxzZSBpZiAoYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKCJmb3JtTG9naW5QYWdlIikgJiYgdmVyc2lvbiA9PSBWRVJTSU9OXzFfNCkKLQkJCXJldHVybiAiL3Rlc3RGb3JtTG9naW5QYWdlIjsKLQkJZWxzZSBpZiAoYXR0LmdldEZlYXR1cmUoKS5nZXROYW1lKCkuZXF1YWxzKCJmb3JtRXJyb3JQYWdlIikgJiYgdmVyc2lvbiA9PSBWRVJTSU9OXzFfNCkKLQkJCXJldHVybiAiL3Rlc3RGb3JtRXJyb3JwYWdlIjsKLQkJZWxzZSBpZihhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoImxpbmsiKSAmJiB2ZXJzaW9uID09IFZFUlNJT05fMV80KQotCQkJcmV0dXJuICJyb2xlTmFtZV8wIjsKLQkJZWxzZSBpZihhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoInNwZWNWZXJzaW9uIikgJiYgdmVyc2lvbiA9PSBWRVJTSU9OXzFfNCkKLQkJCXJldHVybiAiMS41IjsKLQkJZWxzZSBpZiAoYXR0LmdldEZlYXR1cmUoKS5pc01hbnkoKSkKLQkJCXJldHVybiBjcmVhdGVDb2xsZWN0aW9uKGF0dCk7Ci0JCXN3aXRjaCAobWV0YS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBFY29yZVBhY2thZ2UuRVNUUklORzoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21BdHRyaWJ1dGVTdHJpbmcoYXR0KTsKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVCT09MRUFOX09CSkVDVDoKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVCT09MRUFOOgotCQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbUJvb2xlYW4oYXR0KTsKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVJTlRFR0VSX09CSkVDVDoKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVJTlQ6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlUmFuZG9tSW50ZWdlcihhdHQpOwotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUZMT0FUX09CSkVDVDoKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVGTE9BVDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21GbG9hdChhdHQpOwotCQkJY2FzZSBFY29yZVBhY2thZ2UuRUNIQVJBQ1RFUl9PQkpFQ1Q6Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FQ0hBUjoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21DaGFyKGF0dCk7Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FTE9OR19PQkpFQ1Q6Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FTE9ORzoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21Mb25nKCk7Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FQllURV9PQkpFQ1Q6Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FQllURToKLQkJCQlyZXR1cm4gZ2VuZXJhdGVSYW5kb21CeXRlKCk7Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FRE9VQkxFX09CSkVDVDoKLQkJCWNhc2UgRWNvcmVQYWNrYWdlLkVET1VCTEU6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlUmFuZG9tRG91YmxlKCk7Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FU0hPUlRfT0JKRUNUOgotCQkJY2FzZSBFY29yZVBhY2thZ2UuRVNIT1JUOgotCQkJCXJldHVybiBnZW5lcmF0ZVJhbmRvbVNob3J0KGF0dCk7Ci0JCQljYXNlIEVjb3JlUGFja2FnZS5FSkFWQV9PQkpFQ1Q6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlUmFuZG9tT2JqZWN0KGF0dCk7Ci0JCQl9Ci0JCXJldHVybiBudWxsOwotICAgIH0KLQotCS8qKgotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgY3JlYXRlTG9jYWxlKCkgewotICAgICAgICByZXR1cm4gImVuX1VTIjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gYXR0Ci0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBjcmVhdGVMb2NhdGlvbihFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLSAgICAgICAgU3RyaW5nIHRlbXAgPSBnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhhdHQpOwotICAgICAgICByZXR1cm4gIi8uIiArIHRlbXA7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBFT2JqZWN0IGNyZWF0ZUphdmFDbGFzc1Byb3h5KEVTdHJ1Y3R1cmFsRmVhdHVyZSByZWYsIEVPYmplY3QgZU9iamVjdCkgewotCQlpZiAoYXZDbGFzcyA9PSBudWxsKSB7Ci0JCQlhdkNsYXNzID0gbmV3IFN0cmluZ1tdIHsgImphdmEudXRpbC5IYXNoVGFibGUiLCAiamF2YS51dGlsLkxpc3QiLCAiamF2YS5zcWwuRGF0YSIsICJqYXZhLmxhbmcuSW50ZWdlciIsICJqYXZhLmxhbmcuU3RyaW5nIiB9OwotCQl9Ci0JCUVBdHRyaWJ1dGVEZXNjcmlwdG9yIGZlYXR1cmUgPSBuZXcgRUF0dHJpYnV0ZURlc2NyaXB0b3IocmVmLGVPYmplY3QuZUNsYXNzKCkpOwotCQlpZiAoIWF0dEluZGV4LmNvbnRhaW5zS2V5KGZlYXR1cmUpKQotCQkJYXR0SW5kZXgucHV0KGZlYXR1cmUsIG5ldyBJbnRlZ2VyKDApKTsKLQkJaW50IGNsYXNzSW5kZXggPSAoKEludGVnZXIpYXR0SW5kZXguZ2V0KGZlYXR1cmUpKS5pbnRWYWx1ZSgpOwotCQlTdHJpbmcgbmFtZSA9IGF2Q2xhc3NbY2xhc3NJbmRleF07Ci0JCWNsYXNzSW5kZXgrKzsKLQkJaWYgKGNsYXNzSW5kZXggPT0gNSkKLQkJCWNsYXNzSW5kZXggPSAwOwotCQlhdHRJbmRleC5wdXQoZmVhdHVyZSxuZXcgSW50ZWdlcihjbGFzc0luZGV4KSk7Ci0JCXJldHVybiBKYXZhQ2xhc3NJbXBsLmNyZWF0ZUNsYXNzUmVmKG5hbWUpOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgY3JlYXRlU3BlY2lhbEh0dHBNZXRob2RzRm9yMTMoKSB7Ci0JCWlmIChodHRwQXJyYXkgPT0gbnVsbCkKLQkJCWh0dHBBcnJheSA9IG5ldyBTdHJpbmdbXSB7Ci0JCQkJIkdFVCIsCi0JCQkJIlBPU1QiLAotCQkJCSJQVVQiLAotCQkJCSJERUxFVEUiLAotCQkJCSJIRUFEIiwKLQkJCQkiT1BUSU9OUyIsCi0JCQkJIlRSQUNFIgotCQkJfTsKLQkJaWYgKGh0dHBBcnJheUluZGV4ID49IGh0dHBBcnJheS5sZW5ndGgpCi0JCQlodHRwQXJyYXlJbmRleCA9IDA7Ci0JCU9iamVjdCBob2xkZXIgPSBodHRwQXJyYXlbaHR0cEFycmF5SW5kZXhdOyAJCi0JCWh0dHBBcnJheUluZGV4Kys7Ci0JCXJldHVybiBob2xkZXI7Ci0JfQotCi0JLyoqCi0gICAgICogQHBhcmFtIGF0dAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBjcmVhdGVWZXJzaW9uKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotCQlTdHJpbmcgdmVyc2lvbkhvbGRlciA9ICIiOwotCQlzd2l0Y2ggKG1vZHVsZVR5cGUpIHsKLQkJY2FzZSBBUFBJQ0FUSU9OIDoKLQkJCWlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzIpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuMiI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzMpewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMS4zIjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMS40IjsKLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSBBUFBfQ0xJRU5UIDoKLQkJCWlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzIpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuMiI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzMpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuMyI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuNCI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgRUpCIDoKLQkJCWlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzIpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuMSI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzMpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjIuMCI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjIuMSI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgQ09OTkVDVE9SIDoKLQkJCWlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzIpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuMCI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzMpIHsKLQkJCQl2ZXJzaW9uSG9sZGVyID0gIjEuMCI7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsgCi0JCQkJdmVyc2lvbkhvbGRlciA9ICIxLjUiOwotCQkJCWJyZWFrOwotCQkJfQotCQljYXNlIFdFQiA6Ci0JCQlpZih2ZXJzaW9uID09IFZFUlNJT05fMV8yKSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIyLjIiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZih2ZXJzaW9uID09IFZFUlNJT05fMV8zKSB7Ci0JCQkJdmVyc2lvbkhvbGRlciA9ICIyLjMiOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSB7IAotCQkJCXZlcnNpb25Ib2xkZXIgPSAiMi40IjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHZlcnNpb25Ib2xkZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgY3JlYXRlUGFyYW1zKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotCQlpZiAocGFyYW1Db3VudCA9PSAwKXsKLQkJCXBhcmFtQ291bnQrKzsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKHBhcmFtQ291bnQgPT0gMSl7Ci0JCQlwYXJhbUNvdW50Kys7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJU3RyaW5nIHIgPSAiIjsKLQkJZm9yIChpbnQgaSA9IDEgOyBpIDwgcGFyYW1Db3VudCA7aSsrKXsKLQkJCXIgKz0gZ2VuZXJhdGVSYW5kb21BdHRyaWJ1dGVTdHJpbmcoYXR0KSArICIgIjsKLQkJfQotCQlwYXJhbUNvdW50Kys7Ci0JCWlmIChwYXJhbUNvdW50ID09IDUpCi0JCQlwYXJhbUNvdW50ID0gMDsKLQkJcmV0dXJuIHI7Ci0JCQotCX0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgY3JlYXRlTGFuZyhFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkJU3RyaW5nIG5hbWUgPSBsYW5nQXJyYXlbbGFuZ0NvdW50XTsKLQkJbGFuZ0NvdW50Kys7Ci0JCWlmIChsYW5nQ291bnQgPT0gNykKLQkJCWxhbmdDb3VudCA9IDA7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGNyZWF0ZUNvbGxlY3Rpb24oRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlsaXN0LmFkZChnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhhdHQpKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBnZW5lcmF0ZVJhbmRvbU9iamVjdChFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkgICAgcmV0dXJuIGdlbmVyYXRlUmFuZG9tQXR0cmlidXRlU3RyaW5nKGF0dCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgY3JlYXRlRW51bShFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkJRUVudW0gYW5FbnVtID0gKEVFbnVtKSBhdHQuZ2V0RmVhdHVyZSgpLmdldEVUeXBlKCk7Ci0JCWlmICghZW51bU1hcC5jb250YWluc0tleShhdHQpKXsKLQkJCWlmIChhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKS5lcXVhbHMoImF1dGhNZXRob2QiKSkKLQkJCQllbnVtTWFwLnB1dChhdHQsbmV3IEludGVnZXIoMSkpOwotCQkJZWxzZSAKLQkJCQllbnVtTWFwLnB1dChhdHQsbmV3IEludGVnZXIoMCkpOwotCQl9Ci0JCWludCBwb3MgPSAoKEludGVnZXIpZW51bU1hcC5nZXQoYXR0KSkuaW50VmFsdWUoKTsKLQkJRUxpc3QgbGl0ZXJhbHMgPSBhbkVudW0uZ2V0RUxpdGVyYWxzKCk7Ci0JCWludCBzaXplID0gbGl0ZXJhbHMuc2l6ZSgpOwotCQlpZiAocG9zID09IHNpemUpCi0JCQlwb3MgPSAwOwotCQlPYmplY3QgaG9sZGVyID0gYW5FbnVtLmdldEVFbnVtTGl0ZXJhbChwb3MpLmdldEluc3RhbmNlKCk7Ci0JCXBvcysrOwotCQllbnVtTWFwLnB1dChhdHQsbmV3IEludGVnZXIocG9zKSk7Ci0JCXJldHVybiBob2xkZXI7Ci0JICAgIAotCX0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZW5lcmF0ZVJhbmRvbUNsYXNzbmFtZShFQXR0cmlidXRlRGVzY3JpcHRvciBhdHQpIHsKLQkJcmV0dXJuICJjb20uZm9vLiIgKyBnZW5lcmF0ZVJhbmRvbUF0dHJpYnV0ZVN0cmluZyhhdHQpOwotCX0KLQotCS8vUkVWSVNJVAotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlUmFuZG9tU2hvcnQoRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2hvcnQoZ2VuZXJhdGVSYW5kb21BdHRyaWJ1dGVTdHJpbmcoYXR0KSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZ2VuZXJhdGVSYW5kb21Eb3VibGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRG91YmxlKHJhbmRvbUdlbmVyYXRvci5uZXh0RG91YmxlKCkpOwotICAgIH0KLQkvL1JFVklTSVQKLSAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBnZW5lcmF0ZVJhbmRvbUJ5dGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQnl0ZSgiYnl0ZSIpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlUmFuZG9tTG9uZygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMb25nKHJhbmRvbUdlbmVyYXRvci5uZXh0TG9uZygpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBnZW5lcmF0ZVJhbmRvbUNoYXIoRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2hhcmFjdGVyKGdlbmVyYXRlUmFuZG9tQXR0cmlidXRlU3RyaW5nKGF0dCkuY2hhckF0KDApKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBzdGF0aWMgT2JqZWN0IGdlbmVyYXRlUmFuZG9tRmxvYXQoRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmxvYXQocmFuZG9tR2VuZXJhdG9yLm5leHRGbG9hdCgpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIE9iamVjdCBnZW5lcmF0ZVJhbmRvbUludGVnZXIoRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0gICAgCXJldHVybiBuZXcgSW50ZWdlcihnZW5lcmF0ZU51bWJlcihhdHQpKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBPYmplY3QgZ2VuZXJhdGVSYW5kb21Cb29sZWFuKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotCQlpZiAoIWJvb2xlYW5NYXAuY29udGFpbnNLZXkoYXR0KSl7Ci0JCQlib29sZWFuTWFwLnB1dChhdHQsbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQl9Ci0JCUJvb2xlYW4gaG9sZGVyID0gKEJvb2xlYW4pYm9vbGVhbk1hcC5nZXQoYXR0KTsKLQkJYm9vbGVhbk1hcC5wdXQoYXR0LCBuZXcgQm9vbGVhbighaG9sZGVyLmJvb2xlYW5WYWx1ZSgpKSk7Ci0JCXJldHVybiBob2xkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVSYW5kb21BdHRyaWJ1dGVTdHJpbmcoRUF0dHJpYnV0ZURlc2NyaXB0b3IgYXR0KSB7Ci0JCXJldHVybiBhdHQuZ2V0RmVhdHVyZSgpLmdldE5hbWUoKSArICJfIiArIGdlbmVyYXRlTnVtYmVyKGF0dCk7Ci0JfQotCXByb3RlY3RlZCBzdGF0aWMgaW50IGdlbmVyYXRlTnVtYmVyKEVBdHRyaWJ1dGVEZXNjcmlwdG9yIGF0dCkgewotCQlpZighc3BlY2lhbE51bWJlckdlbikKLQkJCXJldHVybiBjb3VudCArKzsKLQkJZWxzZXsKLQkJCWlmKCFhdHRJbmRleC5jb250YWluc0tleShhdHQpKQotCQkJCWF0dEluZGV4LnB1dChhdHQsIG5ldyBJbnRlZ2VyKDApKTsKLQkJCWludCBob2xkZXIgPSAoKEludGVnZXIpIGF0dEluZGV4LmdldChhdHQpKS5pbnRWYWx1ZSgpOwotCQkJYXR0SW5kZXgucHV0KGF0dCwgbmV3IEludGVnZXIoaG9sZGVyKzEpKTsKLQkJCXJldHVybiBob2xkZXI7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKXsKLQkJY291bnQgPSAwOwotCQllbnVtTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJaHR0cEFycmF5SW5kZXggPSAwOwotCQlwYXJhbUNvdW50ID0gMDsKLQkJbGFuZ0NvdW50ID0gMDsgIAotCQlib29sZWFuTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJYXR0SW5kZXggPSBuZXcgSGFzaE1hcCgpOwotCQlzcGVjaWFsTnVtYmVyR2VuID0gZmFsc2U7Ci0JCVRlc3RVdGlsaXRpZXMucmVzZXQoKTsKLQkJSjJFRVZlcnNpb25DaGVjay5jdXJfVGFncyA9IG51bGw7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3R1dGlsaXRpZXMvSjJFRVZlcnNpb25DaGVjay5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL0oyRUVWZXJzaW9uQ2hlY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgxMTM2Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3R1dGlsaXRpZXMvSjJFRVZlcnNpb25DaGVjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxNCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5DbGllbnRQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5KY2FQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYmFwcGxpY2F0aW9uUGFja2FnZTsKLQotcHVibGljIGNsYXNzIEoyRUVWZXJzaW9uQ2hlY2sgewotCXB1YmxpYyBpbnQgdmVyc2lvbjsKLQkvL3N0YXRpYyB2ZXJzaW9ucwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZFUlNJT05fMV8yID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWRVJTSU9OXzFfMyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl8xXzQgPSAyOwotCQotCS8vbW9kdWxlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUElDQVRJT04gPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFQUF9DTElFTlQgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RPUiA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUpCID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXRUIgPSA0OwotCi0JcHVibGljIHN0YXRpYyBMaXN0IGN1cl9UYWdzOwotCXByaXZhdGUgc3RhdGljIENvbW1vblBhY2thZ2UgQ09NID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0U7Ci0KLSAgICBwdWJsaWMgSjJFRVZlcnNpb25DaGVjaygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrQXR0cmlidXRlVmVyc2lvbihFQXR0cmlidXRlIGF0dCwgaW50IHZlcnNpb24sIGludCB0eXBlKXsKLQkJLy9UT0RPOiBBZGQgdmVyc2lvbiAxLjIgZXhjbHVkZXMKLQkJaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfMyB8fCB2ZXJzaW9uID09IFZFUlNJT05fMV8yKXsKLQkJCWlmKGN1cl9UYWdzID09IG51bGwpewotCQkJCWN1cl9UYWdzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXBvcHVsYXRlXzFfM0xpc3QodHlwZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZih2ZXJzaW9uID09IFZFUlNJT05fMV80KXsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlpZihjdXJfVGFncy5jb250YWlucyhhdHQpIHx8IGN1cl9UYWdzLmNvbnRhaW5zKGF0dC5nZXRFVHlwZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotICAgIAotICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2tSZWZlcmVuY2VWZXJzaW9uKEVTdHJ1Y3R1cmFsRmVhdHVyZSByZWYsIGludCB2ZXJzaW9uLCBpbnQgdHlwZSl7Ci0JCS8vVE9ETzogQWRkIHZlcnNpb24gMS4yIGV4Y2x1ZGVzCi0JCWlmKHZlcnNpb24gPT0gVkVSU0lPTl8xXzMgfHwgdmVyc2lvbiA9PSBWRVJTSU9OXzFfMil7Ci0JCQlpZihjdXJfVGFncyA9PSBudWxsKXsKLQkJCQljdXJfVGFncyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlwb3B1bGF0ZV8xXzNMaXN0KHR5cGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYodmVyc2lvbiA9PSBWRVJTSU9OXzFfNCl7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJaWYoY3VyX1RhZ3MuY29udGFpbnMocmVmKSB8fCBjdXJfVGFncy5jb250YWlucyhyZWYuZ2V0RVR5cGUoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotICAgIH0KLSAgICAgICAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfMkxpc3QoaW50IHR5cGUpIHsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIEFQUElDQVRJT04gOgotCQkJCXBvcHVsYXRlXzFfMkFwcGxpY2F0aW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEFQUF9DTElFTlQgOgotCQkJCXBvcHVsYXRlXzFfMkFwcENsaWVudCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFSkIgOgotCQkJCXBvcHVsYXRlXzFfMkVKQigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDT05ORUNUT1IgOgotCQkJCXBvcHVsYXRlXzFfMkVKQigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXRUIgOgotCQkJCXBvcHVsYXRlXzFfMldlYigpOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZV8xXzNMaXN0KGludCB0eXBlKSB7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBBUFBJQ0FUSU9OIDoKLQkJCQlwb3B1bGF0ZV8xXzNBcHBsaWNhdGlvbigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBBUFBfQ0xJRU5UIDoKLQkJCQlwb3B1bGF0ZV8xXzNBcHBDbGllbnQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRUpCIDoKLQkJCQlwb3B1bGF0ZV8xXzNFSkIoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09OTkVDVE9SIDoKLQkJCQlwb3B1bGF0ZV8xXzNFSkIoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0VCIDoKLQkJCQlwb3B1bGF0ZV8xXzNXZWIoKTsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZV8xXzJBcHBsaWNhdGlvbigpewotCQlwb3B1bGF0ZV8xXzNBcHBsaWNhdGlvbigpOwotICAgIH0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVfMV8yQXBwQ2xpZW50KCl7Ci0JCXBvcHVsYXRlXzFfM0FwcENsaWVudCgpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfMkVKQigpewotCQlwb3B1bGF0ZV8xXzNFSkIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZV8xXzJDb25uZWN0b3IoKXsKLQkJcG9wdWxhdGVfMV8zQ29ubmVjdG9yKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgcG9wdWxhdGVfMV8yV2ViKCl7Ci0JCXBvcHVsYXRlXzFfM1dlYigpOwotCX0KLQotCS8vMS4zCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZV8xXzNBcHBsaWNhdGlvbigpewotCQlDb21tb25QYWNrYWdlIENPTSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCQljdXJfVGFncy5hZGQoQ09NLmdldEljb25UeXBlKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERpc3BsYXlOYW1lKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERlc2NyaXB0aW9uKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0U2VjdXJpdHlJZGVudGl0eV9EZXNjcmlwdGlvbnMoKSk7Ci0JCWN1cl9UYWdzLmFkZChBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uX1ZlcnNpb24oKSk7CQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBvcHVsYXRlXzFfM0FwcENsaWVudCgpewotCQljdXJfVGFncy5hZGQoQ09NLmdldEljb25UeXBlKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERpc3BsYXlOYW1lKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERlc2NyaXB0aW9uKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldERlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JCWN1cl9UYWdzLmFkZChDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9WZXJzaW9uKCkpOwotCQljdXJfVGFncy5hZGQoQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfU2VydmljZVJlZnMoKSk7Ci0JCWN1cl9UYWdzLmFkZChDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpOwotCQljdXJfVGFncy5hZGQoQ2xpZW50UGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25DbGllbnRfTWVzc2FnZURlc3RpbmF0aW9ucygpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXRNZXNzYWdlRGVzdGluYXRpb24oKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmKCkpOwotCQkvL2N1cl9UYWdzLmFkZChDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRBcHBsaWNhdGlvbkNsaWVudF9TZXJ2aWNlUmVmcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZV8xXzNDb25uZWN0b3IoKXsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXRJY29uVHlwZSgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREaXNwbGF5TmFtZSgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREZXNjcmlwdGlvbigpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREZXNjcmlwdGlvbkdyb3VwKCkpOwotCQljdXJfVGFncy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0T3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXIoKSk7Ci0JCWN1cl9UYWdzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRJbmJvdW5kUmVzb3VyY2VBZGFwdGVyKCkpOwotCQljdXJfVGFncy5hZGQoSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWRtaW5PYmplY3QoKSk7Ci0JCWN1cl9UYWdzLmFkZChKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRDb25uZWN0b3JfVmVyc2lvbigpKTsKLQl9Ci0JCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZV8xXzNFSkIoKSB7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0SWNvblR5cGUoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGlzcGxheU5hbWUoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0RGVzY3JpcHRpb25Hcm91cCgpKTsKLQkJY3VyX1RhZ3MuYWRkKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVKQkphcl9WZXJzaW9uKCkpOwotCQljdXJfVGFncy5hZGQoRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0U2Vzc2lvbl9TZXJ2aWNlRW5kcG9pbnQoKSk7Ci0JCWN1cl9UYWdzLmFkZChDT00uZ2V0Sk5ESUVudlJlZnNHcm91cF9NZXNzYWdlRGVzdGluYXRpb25SZWZzKCkpOwotCQljdXJfVGFncy5hZGQoQ09NLmdldEpORElFbnZSZWZzR3JvdXBfU2VydmljZVJlZnMoKSk7Ci0JCWN1cl9UYWdzLmFkZChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuX01lc3NhZ2luZ1R5cGUoKSk7Ci0JCWN1cl9UYWdzLmFkZChFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRNZXNzYWdlRHJpdmVuX01lc3NhZ2VEZXN0aW5hdGlvbigpKTsKLQkJY3VyX1RhZ3MuYWRkKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5fTGluaygpKTsKLQkJY3VyX1RhZ3MuYWRkKEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldE1lc3NhZ2VEcml2ZW5fQWN0aXZhdGlvbkNvbmZpZygpKTsJCi0gICAgfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwb3B1bGF0ZV8xXzNXZWIoKXsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXRJY29uVHlwZSgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREaXNwbGF5TmFtZSgpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREZXNjcmlwdGlvbigpKTsKLQkJY3VyX1RhZ3MuYWRkKENPTS5nZXREZXNjcmlwdGlvbkdyb3VwKCkpOwotCQljdXJfVGFncy5hZGQoV2ViYXBwbGljYXRpb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRXZWJBcHBfVmVyc2lvbigpKTsKLQkJY3VyX1RhZ3MuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX0pzcENvbmZpZygpKTsKLQkJY3VyX1RhZ3MuYWRkKFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViQXBwX01lc3NhZ2VEZXN0aW5hdGlvbnMoKSk7Ci0JCWN1cl9UYWdzLmFkZChXZWJhcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldFdlYkFwcF9Mb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3R1dGlsaXRpZXMvVGVzdFV0aWxpdGllcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXJjaGl2ZS90ZXN0dXRpbGl0aWVzL1Rlc3RVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3NzhlYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcmNoaXZlL3Rlc3R1dGlsaXRpZXMvVGVzdFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAzLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci0KLS8qKgotICogQGF1dGhvciBhZG1pbmlzdHJhdG9yCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljICBjbGFzcyBUZXN0VXRpbGl0aWVzIGV4dGVuZHMgRWNvcmVVdGlsIHsKLQlwcml2YXRlIHN0YXRpYyBNYXAgb2JqZWN0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIHN0YXRpYyBNYXAgc3Vic2V0TWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQotCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBjb2xsZWN0aW9uIG1lbWJlciB0aGF0IHtAbGluayBFQ2xhc3NpZmllciNpc0luc3RhbmNlIGlzIGFuIGluc3RhbmNlfSBvZiB0aGUgdHlwZS4KLQkJICogQHBhcmFtIG9iamVjdHMgYSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdG8gY2hlY2suCi0JCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIG9iamVjdCB0byBmaW5kLgotCQkgKiBAcmV0dXJuIHRoZSBmaXJzdCBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0T2JqZWN0QnlUeXBlKFJlc291cmNlIHJlcywgRUNsYXNzaWZpZXIgdHlwZSwgYm9vbGVhbiBpc01hbnkpIHsKLQkJCWlmIChpc01hbnkpCi0JCQkJcmV0dXJuIGdldENvbnRhaW5lZENvbGxlY3Rpb25CeVR5cGUocmVzLmdldENvbnRlbnRzKCksIHR5cGUpOwotCQkJZWxzZQotCQkJCXJldHVybiBnZXRDb250YWluZWRPYmplY3RCeVR5cGUocmVzLmdldENvbnRlbnRzKCksIHR5cGUpOwotCQl9Ci0KLQkJcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0Q29udGFpbmVkT2JqZWN0QnlUeXBlKExpc3QgbGlzdCwgRUNsYXNzaWZpZXIgdHlwZSkgewotCQkJT2JqZWN0IGZvdW5kOwotCQkJZm91bmQgPSBnZXRPYmplY3RzQnlUeXBlKGxpc3QsIHR5cGUpOwotCQkJaWYgKGZvdW5kICE9IG51bGwgJiYgISgoQ29sbGVjdGlvbilmb3VuZCkuaXNFbXB0eSgpKQotCQkJCXJldHVybiBleHRyYWN0T2JqZWN0KChMaXN0KSBmb3VuZCx0eXBlKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJRU9iamVjdCBvYmogPSAoRU9iamVjdCkgbGlzdC5nZXQoaSk7Ci0JCQkJZm91bmQgPSBnZXRDb250YWluZWRPYmplY3RCeVR5cGUob2JqLmVDb250ZW50cygpLCB0eXBlKTsKLQkJCQlpZiAoZm91bmQgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZvdW5kOwotCQkJfQotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldENvbnRhaW5lZENvbGxlY3Rpb25CeVR5cGUoTGlzdCBsaXN0LCBFQ2xhc3NpZmllciB0eXBlKSB7Ci0JCQlMaXN0IGZvdW5kOwotCQkJZm91bmQgPSAoTGlzdClnZXRPYmplY3RzQnlUeXBlKGxpc3QsIHR5cGUpOwotCQkJaWYgKGZvdW5kICE9IG51bGwgJiYgIWZvdW5kLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gZXh0cmFjdFN1YnNldChmb3VuZCwgdHlwZSk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCUVPYmplY3Qgb2JqID0gKEVPYmplY3QpIGxpc3QuZ2V0KGkpOwotCQkJCWZvdW5kID0gKExpc3QpIGdldENvbnRhaW5lZENvbGxlY3Rpb25CeVR5cGUob2JqLmVDb250ZW50cygpLCB0eXBlKTsKLQkJCQlpZiAoZm91bmQgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZvdW5kOwotCQkJfQotCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCQotCQkKLQkJfQotCQotCQlwdWJsaWMgc3RhdGljIExpc3QgZXh0cmFjdFN1YnNldChMaXN0IGZvdW5kLCBFQ2xhc3NpZmllciB0eXBlKSB7Ci0JCQlpZiAoIXN1YnNldE1hcC5jb250YWluc0tleSh0eXBlKSl7Ci0JCQkJc3Vic2V0TWFwLnB1dCh0eXBlLG5ldyBJbnRlZ2VyKDEpKTsKLQkJCX0KLQkJCWludCBwb3MgPSAoKEludGVnZXIpc3Vic2V0TWFwLmdldCh0eXBlKSkuaW50VmFsdWUoKTsKLQkJCi0JCQlpZiAocG9zID09IGZvdW5kLnNpemUoKSkKLQkJCQlwb3MgPSAxOwotCQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBvczsgaSsrKQotCQkJCXJlc3VsdC5hZGQoZm91bmQuZ2V0KGkpKTsKLQkJCXBvcysrOwotCQkJc3Vic2V0TWFwLnB1dCh0eXBlLG5ldyBJbnRlZ2VyKHBvcykpOwkKLQkJCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCi0JCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4dHJhY3RPYmplY3QoTGlzdCBmb3VuZCwgRUNsYXNzaWZpZXIgdHlwZSkgewotCQkJaWYgKCFvYmplY3RNYXAuY29udGFpbnNLZXkodHlwZSkpewotCQkJCW9iamVjdE1hcC5wdXQodHlwZSxuZXcgSW50ZWdlcigwKSk7Ci0JCQl9Ci0JCQlpbnQgcG9zID0gKChJbnRlZ2VyKW9iamVjdE1hcC5nZXQodHlwZSkpLmludFZhbHVlKCk7Ci0JCQotCQkJaWYgKHBvcyA9PSBmb3VuZC5zaXplKCkpCi0JCQkJcG9zID0gMDsKLQkJCU9iamVjdCBob2xkZXIgPSBmb3VuZC5nZXQocG9zKTsKLQkJCXBvcysrOwotCQkJb2JqZWN0TWFwLnB1dCh0eXBlLG5ldyBJbnRlZ2VyKHBvcykpOwkKLQkJCi0JCQlyZXR1cm4gaG9sZGVyOwotCQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKXsKLQkJc3Vic2V0TWFwLmNsZWFyKCk7Ci0JCW9iamVjdE1hcC5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9idnQvQXV0b21hdGVkQlZULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDY4OWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9idnQvQXV0b21hdGVkQlZULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLkFsbFRlc3RzOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkQlZUIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VEaXJlY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJjb21tb25BcmNoaXZlUmVzb3VyY2VzIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotICAgIAotICAgIHN0YXRpYyB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzIik7Ci0gICAgICAgICAgICBVUkwgdXJsID0gcGx1Z2luRGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCk7IAotICAgICAgICAJQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCkuZ2V0RmlsZSgpICsgImNvbW1vbkFyY2hpdmVSZXNvdXJjZXMiKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgCi0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVzaW5nIHdvcmtpbmcgZGlyZWN0b3J5IHNpbmNlIGEgd29ya3NwYWNlIFVSTCBjb3VsZCBub3QgYmUgbG9jYXRlZC4iKTsKLQkJfSAKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCB1bmltcGxlbWVudGVkTWV0aG9kczsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdW5pbXBsZW1lbnRlZE1ldGhvZHMgPSAwOwotICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgICAgICAgaWYgKHVuaW1wbGVtZW50ZWRNZXRob2RzID4gMCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkNhbGxzIHRvIHdhcm5VbmltcGw6ICIgKyB1bmltcGxlbWVudGVkTWV0aG9kcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQXV0b21hdGVkQlZUKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSAoVGVzdFN1aXRlKSBBdXRvbWF0ZWRCVlQuc3VpdGUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWl0ZS50ZXN0Q291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBhZGRUZXN0KHN1aXRlLnRlc3RBdChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuYnZ0Iik7Ci0gICAgICAgIC8vJEpVbml0LUJFR0lOJAotICAgICAgICAvL1RPRE86IE1ha2UgdGhlIEFyY2hpdmUgVGVzdCBXb3JrCi0gICAgICAgLy8gc3VpdGUuYWRkVGVzdChBbGxBcmNoaXZlVGVzdHNKYXZhLnN1aXRlKCkpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KEFsbFRlc3RzLnN1aXRlKCkpOwotICAgICAgICAvL3N1aXRlLmFkZFRlc3QoQWxsSmF2YVRlc3RzSmF2YS5zdWl0ZSgpKTsKLSAgICAgICAgLy8kSlVuaXQtRU5EJAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9idnQvQXV0b21hdGVkQlZURWNsaXBzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9idnQvQXV0b21hdGVkQlZURWNsaXBzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGIwMDdkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVEVjbGlwc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvbWF0ZWRCVlRFY2xpcHNlIGV4dGVuZHMgQXV0b21hdGVkQlZUIHsKLQkKLQlwdWJsaWMgQXV0b21hdGVkQlZURWNsaXBzZSgpewotCQlzdXBlcigpOwotCQlJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKS5nZXRQbHVnaW5EZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzIik7Ci0gICAgICAgIFVSTCB1cmwgPSBwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCUF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpLmdldEZpbGUoKSArICJjb21tb25BcmNoaXZlUmVzb3VyY2VzIisgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lbWZsb2FkL0xvYWRKYXhSUENNYXBPdXRzaWRlV29ya3NwYWNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL2NvbW1vbkFyY2hpdmVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lbWZsb2FkL0xvYWRKYXhSUENNYXBPdXRzaWRlV29ya3NwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYmYxZGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZW1mbG9hZC9Mb2FkSmF4UlBDTWFwT3V0c2lkZVdvcmtzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lbWZsb2FkOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkRpYWdub3N0aWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uaW50ZXJuYWwuaW1wbC5KMkVFUmVzb3VyY2VGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRUluaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS5qYXhycGNtYXAuSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkVNRjJET01SZW5kZXJlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIExvYWRKYXhSUENNYXBPdXRzaWRlV29ya3NwYWNlIGV4dGVuZHMgVGVzdENhc2UgewotCQotCS8vcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZURpcmVjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSAgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJ0ZXN0RGF0YSIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJ3ZWJzZXJ2aWNlcyIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJNRVRBLUlORiIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLSAgIAotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogTG9hZCBhbGwgdGhlIGFyZ3VtZW50IGZpbGUgcGF0aHMgb3IgVVJJcyBhcyBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSBhcmdzIHRoZSBmaWxlIHBhdGhzIG9yIFVSSXMuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMb2FkRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cyIpOwotICAgICAgICBVUkwgdXJsID0gcGx1Z2luRGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCk7IAotICAgICAgICBTdHJpbmcgYmFzZURpcmVjdG9yeSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKS5nZXRGaWxlKCkgKyAidGVzdERhdGEiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAid2Vic2VydmljZXMiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAiTUVUQS1JTkYiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0JCQotCS8vIENhbGwgSjJFRSBJbml0KCk7Ci0JCQotCUoyRUVJbml0LmluaXQoKTsKLQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQgdG8gaG9sZCB0aGUgcmVzb3VyY2VzLgotCS8vCi0JUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JSjJFRVJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpOwotCXJlc291cmNlU2V0LnNldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKLQlVUklDb252ZXJ0ZXIgY29udiA9IG5ldyBVUklDb252ZXJ0ZXJJbXBsKCk7Ci0JcmVzb3VyY2VTZXQuc2V0VVJJQ29udmVydGVyKGNvbnYpOwotCUVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0Uuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCi0JCQlVUkkgdXJpID0gVVJJLmNyZWF0ZUZpbGVVUkkoYmFzZURpcmVjdG9yeSArICJBbm51aXR5U2VydmljZXNfbWFwcGluZy54bWwiKTsKLQkJCXJlZ2lzdHJ5LnJlZ2lzdGVyTGFzdEZpbGVTZWdtZW50KHVyaS5sYXN0U2VnbWVudCgpLCBuZXcgSmF4cnBjbWFwUmVzb3VyY2VGYWN0b3J5KEVNRjJET01SZW5kZXJlckZhY3RvcnkuSU5TVEFOQ0UpKTsKLQotCQkJdHJ5IHsKLQkJCQkvLyBEZW1hbmQgbG9hZCByZXNvdXJjZSBmb3IgdGhpcyBmaWxlLgotCQkJCS8vCi0JCQkJSmF4cnBjbWFwUmVzb3VyY2UgamF4cnBjbWFwUmVzID0gKEpheHJwY21hcFJlc291cmNlKXJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgdHJ1ZSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2FkZWQgIiArIHVyaSk7Ci0JCQkJamF4cnBjbWFwUmVzLmdldENvbnRlbnRzKCk7Ci0KLQkJCX0KLQkJCWNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvYmxlbSBsb2FkaW5nICIgKyB1cmkpOwotCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogUHJpbnRzIGRpYWdub3N0aWNzIHdpdGggaW5kZW50YXRpb24uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBwYXJhbSBkaWFnbm9zdGljIHRoZSBkaWFnbm9zdGljIHRvIHByaW50LgotICogQHBhcmFtIGluZGVudCB0aGUgaW5kZW50YXRpb24gZm9yIHByaW50aW5nLgotICogQGdlbmVyYXRlZAotICovCi1wcm90ZWN0ZWQgc3RhdGljIHZvaWQgcHJpbnREaWFnbm9zdGljKERpYWdub3N0aWMgZGlhZ25vc3RpYywgU3RyaW5nIGluZGVudCkgewotCVN5c3RlbS5vdXQucHJpbnQoaW5kZW50KTsKLQlTeXN0ZW0ub3V0LnByaW50bG4oZGlhZ25vc3RpYy5nZXRNZXNzYWdlKCkpOwotCWZvciAoSXRlcmF0b3IgaSA9IGRpYWdub3N0aWMuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JCXByaW50RGlhZ25vc3RpYygoRGlhZ25vc3RpYylpLm5leHQoKSwgaW5kZW50ICsgIiAgIik7Ci0JfQotfQotCX0KLQotCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvY29tbW9uQXJjaGl2ZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VtZmxvYWQvTG9hZFdlYlNlcnZpY2VzT3V0c2lkZVdvcmtzcGFjZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZW1mbG9hZC9Mb2FkV2ViU2VydmljZXNPdXRzaWRlV29ya3NwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MmM1YjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9jb21tb25BcmNoaXZlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZW1mbG9hZC9Mb2FkV2ViU2VydmljZXNPdXRzaWRlV29ya3NwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVtZmxvYWQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlVSSUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5EaWFnbm9zdGljaWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5pbnRlcm5hbC5pbXBsLkoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFSW5pdDsKLQotCi1wdWJsaWMgY2xhc3MgTG9hZFdlYlNlcnZpY2VzT3V0c2lkZVdvcmtzcGFjZSBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlRGlyZWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgInRlc3REYXRhIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgIndlYnNlcnZpY2VzIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgIk1FVEEtSU5GIiArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotICAgCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBMb2FkIGFsbCB0aGUgYXJndW1lbnQgZmlsZSBwYXRocyBvciBVUklzIGFzIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIGFyZ3MgdGhlIGZpbGUgcGF0aHMgb3IgVVJJcy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgdGVzdExvYWRGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCS8vIENhbGwgSjJFRSBJbml0KCk7Ci0JCQotCUoyRUVJbml0LmluaXQoKTsKLQkvLyBDcmVhdGUgYSByZXNvdXJjZSBzZXQgdG8gaG9sZCB0aGUgcmVzb3VyY2VzLgotCS8vCi0JUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JcmVzb3VyY2VTZXQuc2V0UmVzb3VyY2VGYWN0b3J5UmVnaXN0cnkobmV3IEoyRUVSZXNvdXJjZUZhY3RvcnlSZWdpc3RyeSgpKTsKLQlVUklDb252ZXJ0ZXIgY29udiA9IG5ldyBVUklDb252ZXJ0ZXJJbXBsKCk7Ci0JcmVzb3VyY2VTZXQuc2V0VVJJQ29udmVydGVyKGNvbnYpOwotCQotCQkJVVJJIHVyaSA9IFVSSS5jcmVhdGVGaWxlVVJJKGJhc2VEaXJlY3RvcnkgKyAid2Vic2VydmljZXMueG1sIik7Ci0KLQkJCXRyeSB7Ci0JCQkJLy8gRGVtYW5kIGxvYWQgcmVzb3VyY2UgZm9yIHRoaXMgZmlsZS4KLQkJCQkvLwotCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvYWRlZCAiICsgdXJpKTsKLQotCQkJCS8vIFZhbGlkYXRlIHRoZSBjb250ZW50cyBvZiB0aGUgbG9hZGVkIHJlc291cmNlLgotCQkJCS8vCi0JCQkJZm9yIChJdGVyYXRvciBqID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTsgKSB7Ci0JCQkJCUVPYmplY3QgZU9iamVjdCA9IChFT2JqZWN0KWoubmV4dCgpOwotCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKGVPYmplY3QpOwotCQkJCQlpZiAoZGlhZ25vc3RpYy5nZXRTZXZlcml0eSgpICE9IERpYWdub3N0aWMuT0spIHsKLQkJCQkJCXByaW50RGlhZ25vc3RpYyhkaWFnbm9zdGljLCAiIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2JsZW0gbG9hZGluZyAiICsgdXJpKTsKLQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFByaW50cyBkaWFnbm9zdGljcyB3aXRoIGluZGVudGF0aW9uLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAcGFyYW0gZGlhZ25vc3RpYyB0aGUgZGlhZ25vc3RpYyB0byBwcmludC4KLSAqIEBwYXJhbSBpbmRlbnQgdGhlIGluZGVudGF0aW9uIGZvciBwcmludGluZy4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHByaW50RGlhZ25vc3RpYyhEaWFnbm9zdGljIGRpYWdub3N0aWMsIFN0cmluZyBpbmRlbnQpIHsKLQlTeXN0ZW0ub3V0LnByaW50KGluZGVudCk7Ci0JU3lzdGVtLm91dC5wcmludGxuKGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpKTsKLQlmb3IgKEl0ZXJhdG9yIGkgPSBkaWFnbm9zdGljLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgewotCQlwcmludERpYWdub3N0aWMoKERpYWdub3N0aWMpaS5uZXh0KCksIGluZGVudCArICIgICIpOwotCX0KLX0KLQl9Ci0KLQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi90ZXN0L0FwcGxpY2F0aW9uRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL3Rlc3QvQXBwbGljYXRpb25GYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWJhODZiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2FwcGxpY2F0aW9uL3Rlc3QvQXBwbGljYXRpb25GYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi50ZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5Db25uZWN0b3JNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uRWpiTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkphdmFDbGllbnRNb2R1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLldlYk1vZHVsZTsKLQotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCl7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKEFwcGxpY2F0aW9uRmFjdG9yeVRlc3QuY2xhc3MpOwotICAgIH0KLQkgIAotICAgIHB1YmxpYyBBcHBsaWNhdGlvbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBBcHBsaWNhdGlvblBhY2thZ2UuZUlOU1RBTkNFLmdldEFwcGxpY2F0aW9uRmFjdG9yeSgpOwotICAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVBcHBsaWNhdGlvbigpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkZhY3Rvcnkgb2JqQXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXBwbGljYXRpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1vZHVsZSgpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkZhY3Rvcnkgb2JqQXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTW9kdWxlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlTW9kdWxlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlV2ViTW9kdWxlKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBXZWJNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVXZWJNb2R1bGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVKYXZhQ2xpZW50TW9kdWxlKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhQ2xpZW50TW9kdWxlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlSmF2YUNsaWVudE1vZHVsZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVqYk1vZHVsZSgpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkZhY3Rvcnkgb2JqQXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRWpiTW9kdWxlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlRWpiTW9kdWxlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQ29ubmVjdG9yTW9kdWxlKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uRmFjdG9yeSBvYmpBcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDb25uZWN0b3JNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVDb25uZWN0b3JNb2R1bGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi90ZXN0L0FwcGxpY2F0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYXBwbGljYXRpb24vdGVzdC9BcHBsaWNhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1M2I3Mi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9hcHBsaWNhdGlvbi90ZXN0L0FwcGxpY2F0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24udGVzdDsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLkFwcGxpY2F0aW9uUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuRWFyRU1GVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmV4Y2VwdGlvbi5EdXBsaWNhdGVPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLlJlc291cmNlTG9hZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uVGVzdCBleHRlbmRzIEVhckVNRlRlc3QgewotCi0JIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbW1vbkZhY3RvcnkgQ09NTU9ORkFDVE9SWSA9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKTsKLQkgcHVibGljIEFwcGxpY2F0aW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIEFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXBwbGljYXRpb25GYWN0b3J5KCk7Ci0gICAgfQotICAgIC8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEFwcGxpY2F0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB0aHJvd3MgRHVwbGljYXRlT2JqZWN0RXhjZXB0aW9uLCBSZXNvdXJjZUxvYWRFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLSAgICAgICAgY3JlYXRlRUFSKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdF9jb250YWluc1NlY3VyaXR5Um9sZSgpIHsKLQkJCi0gICAgICAgIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICBTdHJpbmcgbmFtZSA9InJvbGUxIiA7Ci0gICAgICAgIFN0cmluZyBuYW1lMiA9InJvbGUyIiA7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5jb250YWluc1NlY3VyaXR5Um9sZShuYW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCBmYWxzZSkgOwotICAgICAgICBTZWN1cml0eVJvbGUgcm9sZSA9IENPTU1PTkZBQ1RPUlkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JCXJvbGUuc2V0Um9sZU5hbWUobmFtZSk7Ci0gICAgICAgIG9iakFwcGxpY2F0aW9uLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQocm9sZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uY29udGFpbnNTZWN1cml0eVJvbGUobmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgdHJ1ZSkgOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmNvbnRhaW5zU2VjdXJpdHlSb2xlKG5hbWUyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCBmYWxzZSkgOwotICAgICAgIAotICAgIH0KLQotICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldE1vZHVsZSgpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbiBvYmpBcHBsaWNhdGlvbiA9IGdldEluc3RhbmNlKCkuY3JlYXRlQXBwbGljYXRpb24oKTsKLSAgICAgICAgU3RyaW5nIHVyaSA9ICIiOwotICAgICAgICBNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmdldE1vZHVsZSh1cmkpOwotICAgIH0qLwotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNb2R1bGVfMigpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbiBvYmpBcHBsaWNhdGlvbiA9IGdldEluc3RhbmNlKCkuY3JlYXRlQXBwbGljYXRpb24oKTsKLSAgICAgICAgTW9kdWxlIG1vZHVsZSA9IGdldEluc3RhbmNlKCkuY3JlYXRlTW9kdWxlKCk7Ci0gICAgICAgIFN0cmluZyB1cmkgPSAidXJpMSI7Ci0gICAgICAgIFN0cmluZyBhbHRERCA9ICJhbHRERDEiOwotICAgICAgICBtb2R1bGUuc2V0VXJpKHVyaSk7Ci0gICAgICAgIG1vZHVsZS5zZXRBbHRERChhbHRERCk7Ci0gICAgICAgIG9iakFwcGxpY2F0aW9uLmdldE1vZHVsZXMoKS5hZGQobW9kdWxlKTsKLSAgICAgICAgTW9kdWxlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5nZXRNb2R1bGUodXJpLCBhbHRERCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhtb2R1bGUscmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Rmlyc3RNb2R1bGUoKSB7Ci0KLSAgICAJIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICAgTW9kdWxlIG1vZHVsZSA9IGdldEluc3RhbmNlKCkuY3JlYXRlTW9kdWxlKCk7Ci0gICAgICAgICBNb2R1bGUgbW9kdWxlMiA9IGdldEluc3RhbmNlKCkuY3JlYXRlTW9kdWxlKCk7Ci0gICAgICAgICBNb2R1bGUgbW9kdWxlMyA9IGdldEluc3RhbmNlKCkuY3JlYXRlTW9kdWxlKCk7Ci0gICAgICAgICBTdHJpbmcgdXJpID0gInVyaTEiOwotICAgICAgICAgU3RyaW5nIHVyaTIgPSAidXJpMiIgOwotICAgICAgICAgU3RyaW5nIGFsdEREID0gImFsdEREMSI7Ci0gICAgICAgICBTdHJpbmcgYWx0REQyID0gImFsdEREMiIgOwotICAgICAgICAgCi0gICAgICAgICBtb2R1bGUuc2V0VXJpKHVyaSk7Ci0gICAgICAgICBtb2R1bGUuc2V0QWx0REQoYWx0REQpOwotICAgICAgICAgCi0gICAgICAgICBtb2R1bGUyLnNldFVyaSh1cmkyKTsKLSAgICAgICAgIG1vZHVsZTIuc2V0QWx0REQoYWx0REQyKTsKLSAgICAgICAgIAotICAgICAgICAgbW9kdWxlMy5zZXRVcmkodXJpMik7Ci0gICAgICAgICBtb2R1bGUzLnNldEFsdEREKGFsdEREKTsKLSAgICAgICAgIAotICAgICAgICAgb2JqQXBwbGljYXRpb24uZ2V0TW9kdWxlcygpLmFkZChtb2R1bGUpOwotICAgICAgICAgb2JqQXBwbGljYXRpb24uZ2V0TW9kdWxlcygpLmFkZChtb2R1bGUyKTsKLSAgICAgICAgIG9iakFwcGxpY2F0aW9uLmdldE1vZHVsZXMoKS5hZGQobW9kdWxlMyk7Ci0gICAgICAgICBNb2R1bGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5nZXRGaXJzdE1vZHVsZSh1cmkyKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhtb2R1bGUyLHJldFZhbHVlKTsKLSAgICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9kdWxlSGF2aW5nQWx0REQoKSB7Ci0KLSAgICAJIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICAgTW9kdWxlIG1vZHVsZSA9IGdldEluc3RhbmNlKCkuY3JlYXRlTW9kdWxlKCk7Ci0gICAgICAgICBTdHJpbmcgdXJpID0gInVyaTEiOwotICAgICAgICAgU3RyaW5nIGFsdEREID0gImFsdEREMSI7Ci0gICAgICAgICBtb2R1bGUuc2V0VXJpKHVyaSk7Ci0gICAgICAgICBtb2R1bGUuc2V0QWx0REQoYWx0REQpOwotICAgICAgICAgb2JqQXBwbGljYXRpb24uZ2V0TW9kdWxlcygpLmFkZChtb2R1bGUpOwotICAgICAgICAgTW9kdWxlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uZ2V0TW9kdWxlSGF2aW5nQWx0REQoYWx0REQpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZHVsZSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRTZWN1cml0eVJvbGVOYW1lZCgpIHsKLQotICAgIAkgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgICBTdHJpbmcgbmFtZSA9InJvbGUxIiA7Ci0gICAgICAgICBTdHJpbmcgbmFtZTIgPSJyb2xlMiIgOwotICAgICAgICAgU2VjdXJpdHlSb2xlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uZ2V0U2VjdXJpdHlSb2xlTmFtZWQobmFtZSk7Ci0gICAgICAgICBhc3NlcnROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgIFNlY3VyaXR5Um9sZSByb2xlID0gQ09NTU9ORkFDVE9SWS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLSAJCSByb2xlLnNldFJvbGVOYW1lKG5hbWUpOwotICAgICAgICAgb2JqQXBwbGljYXRpb24uZ2V0U2VjdXJpdHlSb2xlcygpLmFkZChyb2xlKTsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uZ2V0U2VjdXJpdHlSb2xlTmFtZWQobmFtZSk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIHJvbGUpIDsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uZ2V0U2VjdXJpdHlSb2xlTmFtZWQobmFtZTIpOwotICAgICAgICAgYXNzZXJ0TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgIAotICAgIH0KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9pc1ZlcnNpb24xXzJEZXNjcmlwdG9yKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uaXNWZXJzaW9uMV8yRGVzY3JpcHRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNWZXJzaW9uMV8zRGVzY3JpcHRvcigpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbiBvYmpBcHBsaWNhdGlvbiA9IGdldEluc3RhbmNlKCkuY3JlYXRlQXBwbGljYXRpb24oKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmlzVmVyc2lvbjFfM0Rlc2NyaXB0b3IoKTsKLSAgICB9Ki8KLQotIC8qICAgcHVibGljIHZvaWQgdGVzdF9nZXRWZXJzaW9uKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbi5nZXRWZXJzaW9uKCk7Ci0gICAgfSovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnNpb25JRCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbml0KCk7Ci0gICAgCUFwcGxpY2F0aW9uUmVzb3VyY2UgREQgPSAoQXBwbGljYXRpb25SZXNvdXJjZSkgZWFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlzZXRNb2R1bGVUeXBlKEFQUF9DTElFTlQpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgaW50IHJldFZhbHVlID0gMDsKLSAgICAgICAgcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbigpLmdldFZlcnNpb25JRCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzQpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbigpLmdldFZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzMpOwotCSAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8yKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbigpLmdldFZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzIpOyAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRKMkVFVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgUmVzb3VyY2VMb2FkRXhjZXB0aW9uLCBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0KLSAgICAJaW5pdCgpOwotICAgICAJQXBwbGljYXRpb25SZXNvdXJjZSBERCA9IChBcHBsaWNhdGlvblJlc291cmNlKSBlYXJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLSAJCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotIAkJc2V0TW9kdWxlVHlwZShBUFBfQ0xJRU5UKTsKLSAJCXBvcHVsYXRlUm9vdChERC5nZXRSb290T2JqZWN0KCkpOwotICAgICAgICBpbnQgcmV0VmFsdWUgPSAwOwotICAgICAgICByZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uKCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzQpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotIAkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0gCQlyZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uKCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotIAkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8zKTsKLSAJICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk7Ci0gCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8yKTsKLSAJCXJldFZhbHVlID0gREQuZ2V0QXBwbGljYXRpb24oKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0gCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzIpOyAgCi0gCSAgICAKLSAgICAgICAgCi0gICAgfQotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X3NldFZlcnNpb24oKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb24gb2JqQXBwbGljYXRpb24gPSBnZXRJbnN0YW5jZSgpLmNyZWF0ZUFwcGxpY2F0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBuZXdWZXJzaW9uID0gIiI7Ci0gICAgICAgIG9iakFwcGxpY2F0aW9uLnNldFZlcnNpb24obmV3VmVyc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRTZWN1cml0eVJvbGVzKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uIG9iakFwcGxpY2F0aW9uID0gZ2V0SW5zdGFuY2UoKS5jcmVhdGVBcHBsaWNhdGlvbigpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb24uZ2V0U2VjdXJpdHlSb2xlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9kdWxlcygpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbiBvYmpBcHBsaWNhdGlvbiA9IGdldEluc3RhbmNlKCkuY3JlYXRlQXBwbGljYXRpb24oKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uLmdldE1vZHVsZXMoKTsKLSAgICB9Ki8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uVGVzdCgidGVzdF9nZXRWZXJzaW9uSUQiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uVGVzdCgidGVzdF9nZXRKMkVFVmVyc2lvbklEIikpOwotCQkKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXBwbGljYXRpb25UZXN0KCJ0ZXN0X2dldFNlY3VyaXR5Um9sZU5hbWVkIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBcHBsaWNhdGlvblRlc3QoInRlc3RfZ2V0TW9kdWxlSGF2aW5nQWx0REQiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uVGVzdCgidGVzdF9jb250YWluc1NlY3VyaXR5Um9sZSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXBwbGljYXRpb25UZXN0KCJ0ZXN0X2dldE1vZHVsZV8yIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBcHBsaWNhdGlvblRlc3QoInRlc3RfZ2V0Rmlyc3RNb2R1bGUiKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC90ZXN0L0FwcGxpY2F0aW9uQ2xpZW50VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L3Rlc3QvQXBwbGljYXRpb25DbGllbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZTM0MTYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY2xpZW50L3Rlc3QvQXBwbGljYXRpb25DbGllbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQudGVzdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuQXBwQ2xpZW50RU1GVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLkR1cGxpY2F0ZU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uUmVzb3VyY2VMb2FkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25DbGllbnRUZXN0IGV4dGVuZHMgQXBwQ2xpZW50RU1GVGVzdCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBBcHBsaWNhdGlvbkNsaWVudFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCQotCX0KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHRocm93cyBEdXBsaWNhdGVPYmplY3RFeGNlcHRpb24sIFJlc291cmNlTG9hZEV4Y2VwdGlvbiwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotICAgICAgICBjcmVhdGVFQVIoKTsKLSAgICAgICAgY3JlYXRlQXBwQ2xpZW50KCk7Ci0JfQotCXByaXZhdGUgQXBwbGljYXRpb25DbGllbnQgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBDbGllbnRQYWNrYWdlLmVJTlNUQU5DRS5nZXRDbGllbnRGYWN0b3J5KCkuY3JlYXRlQXBwbGljYXRpb25DbGllbnQoKTsKLQl9Ci0gIAotICAKLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uQ2xpZW50VGVzdCgidGVzdF9nZXRWZXJzaW9uSUQiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFwcGxpY2F0aW9uQ2xpZW50VGVzdCgidGVzdF9nZXRKMkVFVmVyc2lvbklEIikpOwotCQkKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXBwbGljYXRpb25DbGllbnRUZXN0KCJ0ZXN0X2dldENhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgQXBwbGljYXRpb25DbGllbnRUZXN0KCJ0ZXN0X3NldENhbGxiYWNrSGFuZGxlckNsYXNzTmFtZSIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUoKSB7Ci0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIGNhbGxCYWNrSGFuZGxlck5hbWUgPSAiVGVzdENhbGxCYWNrSGFuZGxlck5hbWUiIDsKLSAgICAgICAgb2JqQXBwbGljYXRpb25DbGllbnQuc2V0Q2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lKGNhbGxCYWNrSGFuZGxlck5hbWUpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25DbGllbnQuZ2V0Q2FsbGJhY2tIYW5kbGVyQ2xhc3NOYW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjYWxsQmFja0hhbmRsZXJOYW1lLCByZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUoKSB7Ci0KLSAgICAJQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgY2FsbEJhY2tIYW5kbGVyTmFtZSA9ICJUZXN0Q2FsbEJhY2tIYW5kbGVyTmFtZSIgOwotICAgICAgICBvYmpBcHBsaWNhdGlvbkNsaWVudC5zZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUoY2FsbEJhY2tIYW5kbGVyTmFtZSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkNsaWVudC5nZXRDYWxsYmFja0hhbmRsZXJDbGFzc05hbWUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGNhbGxCYWNrSGFuZGxlck5hbWUsIHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnNpb25JRCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlpbml0KCk7Ci0gICAgCUFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UgREQgPSAoQXBwbGljYXRpb25DbGllbnRSZXNvdXJjZSkgYXBwQ2xpZW50RmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzQpOwotCQlzZXRNb2R1bGVUeXBlKEFQUF9DTElFTlQpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgaW50IHJldFZhbHVlID0gMDsKLSAgICAgICAgcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbkNsaWVudCgpLmdldFZlcnNpb25JRCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzQpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8zKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbkNsaWVudCgpLmdldFZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzMpOwotCSAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8yKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbkNsaWVudCgpLmdldFZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzIpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEoyRUVWZXJzaW9uSUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJaW5pdCgpOwotICAgIAlBcHBsaWNhdGlvbkNsaWVudFJlc291cmNlIEREID0gKEFwcGxpY2F0aW9uQ2xpZW50UmVzb3VyY2UpIGFwcENsaWVudEZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJc2V0TW9kdWxlVHlwZShBUFBfQ0xJRU5UKTsKLQkJcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0gICAgICAgIGludCByZXRWYWx1ZSA9IDA7Ci0gICAgICAgIHJldFZhbHVlID0gREQuZ2V0QXBwbGljYXRpb25DbGllbnQoKS5nZXRKMkVFVmVyc2lvbklEKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5WRVJTSU9OXzFfNCk7Ci0gICAgICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzMpOwotCQlyZXRWYWx1ZSA9IERELmdldEFwcGxpY2F0aW9uQ2xpZW50KCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuVkVSU0lPTl8xXzMpOwotCSAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV8yKTsKLQkJcmV0VmFsdWUgPSBERC5nZXRBcHBsaWNhdGlvbkNsaWVudCgpLmdldEoyRUVWZXJzaW9uSUQoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLEoyRUVWZXJzaW9uQ29uc3RhbnRzLlZFUlNJT05fMV8yKTsKLSAgICB9Ci0KLSAvKiAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VmVyc2lvbigpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uQ2xpZW50LmdldFZlcnNpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFZlcnNpb24oKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3VmVyc2lvbiA9ICIiOwotICAgICAgICBvYmpBcHBsaWNhdGlvbkNsaWVudC5zZXRWZXJzaW9uKG5ld1ZlcnNpb24pOwotICAgIH0qLwotCi0gICAgLypwdWJsaWMgdm9pZCB0ZXN0X2dldFJlc291cmNlUmVmcygpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkNsaWVudC5nZXRSZXNvdXJjZVJlZnMoKTsKLSAgICB9Ci0qLwotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRFbnZpcm9ubWVudFByb3BzKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uQ2xpZW50LmdldEVudmlyb25tZW50UHJvcHMoKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRFamJSZWZlcmVuY2VzKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakFwcGxpY2F0aW9uQ2xpZW50LmdldEVqYlJlZmVyZW5jZXMoKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRSZXNvdXJjZUVudlJlZnMoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25DbGllbnQuZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q2FsbGJhY2tIYW5kbGVyKCkgewotCi0gICAgICAgIEFwcGxpY2F0aW9uQ2xpZW50IG9iakFwcGxpY2F0aW9uQ2xpZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSmF2YUNsYXNzIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkNsaWVudC5nZXRDYWxsYmFja0hhbmRsZXIoKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9zZXRDYWxsYmFja0hhbmRsZXIoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhQ2xhc3MgbmV3Q2FsbGJhY2tIYW5kbGVyID0gbnVsbDsKLSAgICAgICAgb2JqQXBwbGljYXRpb25DbGllbnQuc2V0Q2FsbGJhY2tIYW5kbGVyKG5ld0NhbGxiYWNrSGFuZGxlcik7Ci0gICAgfSovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VydmljZVJlZnMoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25DbGllbnQuZ2V0U2VydmljZVJlZnMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE1lc3NhZ2VEZXN0aW5hdGlvblJlZnMoKSB7Ci0KLSAgICAgICAgQXBwbGljYXRpb25DbGllbnQgb2JqQXBwbGljYXRpb25DbGllbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXBwbGljYXRpb25DbGllbnQuZ2V0TWVzc2FnZURlc3RpbmF0aW9uUmVmcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWVzc2FnZURlc3RpbmF0aW9ucygpIHsKLQotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCBvYmpBcHBsaWNhdGlvbkNsaWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBcHBsaWNhdGlvbkNsaWVudC5nZXRNZXNzYWdlRGVzdGluYXRpb25zKCk7Ci0gICAgfSovCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC90ZXN0L0NsaWVudEZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jbGllbnQvdGVzdC9DbGllbnRGYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjU0MWQyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NsaWVudC90ZXN0L0NsaWVudEZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkNsaWVudFBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDbGllbnRGYWN0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgQ2xpZW50RmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIENsaWVudFBhY2thZ2UuZUlOU1RBTkNFLmdldENsaWVudEZhY3RvcnkoKTsKLQl9Ci0gICAgcHVibGljIHZvaWQgdGVzdF9DbGllbnRGYWN0b3J5KCkgewotICAgICAgICBDbGllbnRGYWN0b3J5IHRtcENsaWVudEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcENsaWVudEZhY3RvcnkpOwotICAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpIHsKLQotICAgICAgICBDbGllbnRGYWN0b3J5IG9iakNsaWVudEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBcHBsaWNhdGlvbkNsaWVudCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ2xpZW50RmFjdG9yeS5jcmVhdGVBcHBsaWNhdGlvbkNsaWVudCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShDbGllbnRGYWN0b3J5VGVzdC5jbGFzcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9Db21tb25GYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvQ29tbW9uRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkyODY5Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9Db21tb25GYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRlc2NyaXB0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRWpiUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FbnZFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWNvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLklkZW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uTWVzc2FnZURlc3RpbmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlBhcmFtVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5SWRlbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Vc2VDYWxsZXJJZGVudGl0eTsKLQotcHVibGljIGNsYXNzIENvbW1vbkZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBDb21tb25GYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X0NvbW1vbkZhY3RvcnkoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSB0bXBDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgCi0gICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVqYlJlZigpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVqYlJlZiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVFamJSZWYoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFbnZFbnRyeSgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVudkVudHJ5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZUVudkVudHJ5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUmVzb3VyY2VSZWYoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBSZXNvdXJjZVJlZiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVSZXNvdXJjZVJlZigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlY3VyaXR5Um9sZVJlZigpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlY3VyaXR5Um9sZVJlZiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVTZWN1cml0eVJvbGVSZWYoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTZWN1cml0eVJvbGUoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBTZWN1cml0eVJvbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUmVzb3VyY2VFbnZSZWYoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBSZXNvdXJjZUVudlJlZiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVSZXNvdXJjZUVudlJlZigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVKQkxvY2FsUmVmKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCTG9jYWxSZWYgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlRUpCTG9jYWxSZWYoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5KCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUnVuQXNTcGVjaWZpZWRJZGVudGl0eSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVSdW5Bc1NwZWNpZmllZElkZW50aXR5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlSWRlbnRpdHkoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBJZGVudGl0eSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVJZGVudGl0eSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUljb25UeXBlKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSWNvblR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlSWNvblR5cGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVEaXNwbGF5TmFtZSgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIERpc3BsYXlOYW1lIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZURpc3BsYXlOYW1lKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWVzc2FnZURlc3RpbmF0aW9uUmVmKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWVzc2FnZURlc3RpbmF0aW9uUmVmIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvblJlZigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1lc3NhZ2VEZXN0aW5hdGlvbigpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1lc3NhZ2VEZXN0aW5hdGlvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVQYXJhbVZhbHVlKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUGFyYW1WYWx1ZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVQYXJhbVZhbHVlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRGVzY3JpcHRpb25Hcm91cCgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIERlc2NyaXB0aW9uR3JvdXAgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlRGVzY3JpcHRpb25Hcm91cCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlY3VyaXR5SWRlbnRpdHkoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBTZWN1cml0eUlkZW50aXR5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZVNlY3VyaXR5SWRlbnRpdHkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVVc2VDYWxsZXJJZGVudGl0eSgpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIFVzZUNhbGxlcklkZW50aXR5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZVVzZUNhbGxlcklkZW50aXR5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBEZXNjcmlwdGlvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVEZXNjcmlwdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVFOYW1lKCkgewotCi0gICAgICAgIENvbW1vbkZhY3Rvcnkgb2JqQ29tbW9uRmFjdG9yeSA9Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUU5hbWUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbW1vbkZhY3RvcnkuY3JlYXRlUU5hbWUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVMaXN0ZW5lcigpIHsKLQotICAgICAgICBDb21tb25GYWN0b3J5IG9iakNvbW1vbkZhY3RvcnkgPWdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3RlbmVyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21tb25GYWN0b3J5LmNyZWF0ZUxpc3RlbmVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAoKSB7Ci0KLSAgICAgICAgQ29tbW9uRmFjdG9yeSBvYmpDb21tb25GYWN0b3J5ID1nZXRJbnN0YW5jZSgpOwotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tbW9uRmFjdG9yeS5jcmVhdGVDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0gCi0gICAgCi0gICAgLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ29tbW9uRmFjdG9yeVRlc3QuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZDc2ZjYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwOwotCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCk7Ci0JfQotCQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRTbWFsbEljb24oKSB7Ci0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuZ2V0U21hbGxJY29uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRTbWFsbEljb24oKSB7Ci0KLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSAgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld1NtYWxsSWNvbiA9ICIiOwotICAgICAgICBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5zZXRTbWFsbEljb24obmV3U21hbGxJY29uKTsKLSAgICB9ICovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3Rfc2V0U21hbGxJY29uR2VuKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdTbWFsbEljb24gPSAiIjsKLSAgICAgICAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuc2V0U21hbGxJY29uR2VuKG5ld1NtYWxsSWNvbik7Ci0gICAgfSovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TGFyZ2VJY29uKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLmdldExhcmdlSWNvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TGFyZ2VJY29uKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMYXJnZUljb24gPSAiIjsKLSAgICAgICAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuc2V0TGFyZ2VJY29uKG5ld0xhcmdlSWNvbik7Ci0gICAgfSAqLwotCi0gICAvKnB1YmxpYyB2b2lkIHRlc3Rfc2V0TGFyZ2VJY29uR2VuKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMYXJnZUljb24gPSAiIjsKLSAgICAgICAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuc2V0TGFyZ2VJY29uR2VuKG5ld0xhcmdlSWNvbik7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSAgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5zZXREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbik7Ci0gICAgfQotKi8KLSAgIAotICAgLyogcHVibGljIHZvaWQgdGVzdF9zZXREZXNjcmlwdGlvbkdlbigpIHsKLQotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA9ICBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3RGVzY3JpcHRpb24gPSAiIjsKLSAgICAgICAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAuc2V0RGVzY3JpcHRpb25HZW4obmV3RGVzY3JpcHRpb24pOwotICAgIH0qLwotCi0gICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXREaXNwbGF5TmFtZSgpIHsKLQotICAgICAgICBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cCA9ICBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5nZXREaXNwbGF5TmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGlzcGxheU5hbWUoKSB7Ci0KLSAgICAgICAgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgb2JqQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgPSAgZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0Rpc3BsYXlOYW1lID0gIiI7Ci0gICAgICAgIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwLnNldERpc3BsYXlOYW1lKG5ld0Rpc3BsYXlOYW1lKTsKLSAgICB9Ki8KLQotICAgLypwdWJsaWMgdm9pZCB0ZXN0X3NldERpc3BsYXlOYW1lR2VuKCkgewotCi0gICAgICAgIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwIG9iakNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwID0gIGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEaXNwbGF5TmFtZSA9ICIiOwotICAgICAgICBvYmpDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cC5zZXREaXNwbGF5TmFtZUdlbihuZXdEaXNwbGF5TmFtZSk7Ci0gICAgfSovCi0KLSAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvRWpiUmVmVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvRWpiUmVmVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTEwYWRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0L0VqYlJlZlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRUpCTG9jYWxSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotCi1wdWJsaWMgY2xhc3MgRWpiUmVmVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVqYkZhY3RvcnkgRUpCRkFDVE9SWSA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21tb25GYWN0b3J5IENPTU1PTkZBQ1RPUlkgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCk7Ci0JCi0JcHJpdmF0ZSBFamJSZWYgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBDT01NT05GQUNUT1JZLmNyZWF0ZUVqYlJlZigpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X0VqYlJlZigpIHsKLSAgICAgICAgRWpiUmVmIHRtcEVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG1wRWpiUmVmKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExpbmtlZEVqYigpIHsKLSAgICAJCi0gICAgCUVKQkphciBvYmpFSkJKYXIgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQkphcigpOwotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IEVKQkZBQ1RPUlkuY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRBc3NlbWJseURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgICAKLSAgICAJRWpiUmVmIGVqYlJlZiA9IENPTU1PTkZBQ1RPUlkuY3JlYXRlRWpiUmVmKCk7Ci0gICAgCVNlc3Npb24gc2Vzc2lvbjEgPSBFSkJGQUNUT1JZLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAJU3RyaW5nIG5hbWUxID0gIk5hbWUxIjsKLSAgICAJc2Vzc2lvbjEuc2V0TmFtZShuYW1lMSk7Ci0gICAgCQotICAgIAlTZXNzaW9uIHNlc3Npb24yID0gRUpCRkFDVE9SWS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgCVN0cmluZyBuYW1lMiA9ICJOYW1lMiI7Ci0gICAgCXNlc3Npb24yLnNldE5hbWUobmFtZTIpOwotICAgIAkKLSAgICAJZWpiUmVmLnNldExpbmsobmFtZTIpOwotICAgIAllamJSZWYuc2V0TmFtZSgiRWpiUmVmXyIgKyBuYW1lMik7Ci0gICAgCQotICAgIAlvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24xKTsKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMik7Ci0gICAgICAgIEVudGVycHJpc2VCZWFuIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBlamJSZWYuZ2V0TGlua2VkRWpiKG9iakVKQkphcik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZXNzaW9uMixyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0VxdWl2YWxlbnQoKSB7Ci0KLSAgICAJRUpCSmFyIG9iakVKQkphciA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCSmFyKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gRUpCRkFDVE9SWS5jcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKTsKLSAgICAgICAgb2JqRUpCSmFyLnNldEFzc2VtYmx5RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgIAotICAgIAlFamJSZWYgZWpiUmVmMSA9IENPTU1PTkZBQ1RPUlkuY3JlYXRlRWpiUmVmKCk7Ci0gICAgCUVqYlJlZiBlamJSZWYyID0gQ09NTU9ORkFDVE9SWS5jcmVhdGVFamJSZWYoKTsKLSAgICAJU2Vzc2lvbiBzZXNzaW9uMSA9IEVKQkZBQ1RPUlkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTEgPSAiTmFtZTEiOwotICAgIAlzZXNzaW9uMS5zZXROYW1lKG5hbWUxKTsKLSAgICAJCi0gICAgCVNlc3Npb24gc2Vzc2lvbjIgPSBFSkJGQUNUT1JZLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAJU3RyaW5nIG5hbWUyID0gIk5hbWUyIjsKLSAgICAJc2Vzc2lvbjIuc2V0TmFtZShuYW1lMik7Ci0gICAgCQotICAgIAllamJSZWYxLnNldExpbmsobmFtZTIpOwotICAgIAllamJSZWYxLnNldE5hbWUoIkVqYlJlZl8iICsgbmFtZTIpOwotICAgIAkKLSAgICAJZWpiUmVmMi5zZXRMaW5rKG5hbWUyKTsKLSAgICAJZWpiUmVmMi5zZXROYW1lKCJFamJSZWZfIiArIG5hbWUyKTsKLSAgICAJCi0gICAgCVN0cmluZyBob21lMSA9ICJob21lMSI7Ci0gICAgCVN0cmluZyBob21lMiA9ICJob21lMiIgOwotICAgIAlTdHJpbmcgcmVtb3RlMSA9ICJyZW1vdGUxIiA7Ci0gICAgCVN0cmluZyByZW1vdGUyID0gInJlbW90ZTIiOwotICAgIAkKLSAgICAJZWpiUmVmMS5zZXRIb21lKGhvbWUxKTsKLSAgICAJZWpiUmVmMi5zZXRIb21lKGhvbWUxKTsKLSAgICAJCi0gICAgCWVqYlJlZjEuc2V0UmVtb3RlKHJlbW90ZTEpOwotICAgIAllamJSZWYyLnNldFJlbW90ZShyZW1vdGUxKTsKLSAgICAJCi0gICAgCW9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbjEpOwotICAgIAlvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24yKTsKLSAgICAJCi0gICAgCWJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBlamJSZWYxLmlzRXF1aXZhbGVudChlamJSZWYyKTsJCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIGVqYlJlZjIuc2V0UmVtb3RlKHJlbW90ZTIpOwotICAgICAgICByZXRWYWx1ZSA9IGVqYlJlZjEuaXNFcXVpdmFsZW50KGVqYlJlZjIpOwkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIGVqYlJlZjIuc2V0UmVtb3RlKHJlbW90ZTEpOwotICAgICAgICBlamJSZWYyLnNldEhvbWUoaG9tZTIpOwotICAgICAgICByZXRWYWx1ZSA9IGVqYlJlZjEuaXNFcXVpdmFsZW50KGVqYlJlZjIpOwkKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIGVqYlJlZjIuc2V0SG9tZShob21lMSk7Ci0gICAgICAgIGVqYlJlZjIuc2V0TGluayhuYW1lMSk7Ci0gICAgICAgIHJldFZhbHVlID0gZWpiUmVmMS5pc0VxdWl2YWxlbnQoZWpiUmVmMik7CQotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgZWpiUmVmMi5zZXRMaW5rKG5hbWUyKTsKLSAgICAgICAgZWpiUmVmMi5zZXROYW1lKCJFamJSZWZfIiArIG5hbWUxKTsKLSAgICAgICAgcmV0VmFsdWUgPSBlamJSZWYxLmlzRXF1aXZhbGVudChlamJSZWYyKTsJCi0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNMaW5rZWQoKSB7Ci0KLSAgICAJU2Vzc2lvbiBzZXNzaW9uMSA9IEVKQkZBQ1RPUlkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTEgPSAiTmFtZTEiOwotICAgIAlzZXNzaW9uMS5zZXROYW1lKG5hbWUxKTsKLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgCi0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuaXNMaW5rZWQoc2Vzc2lvbjEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIG9iakVqYlJlZi5zZXRMaW5rKG5hbWUxKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuaXNMaW5rZWQoc2Vzc2lvbjEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIHRydWUpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0xvY2FsKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiUmVmLmlzTG9jYWwoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgRUpCTG9jYWxSZWYgb2JqTG9jYWxSZWYgPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlRUpCTG9jYWxSZWYoKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpMb2NhbFJlZi5pc0xvY2FsKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiUmVmLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE5hbWUoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdOYW1lID0gIiI7Ci0gICAgICAgIG9iakVqYlJlZi5zZXROYW1lKG5ld05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0VHlwZSgpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRWpiUmVmVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiUmVmLmdldFR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFR5cGUoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVqYlJlZlR5cGUgbmV3VHlwZSA9IG51bGw7Ci0gICAgICAgIG9iakVqYlJlZi5zZXRUeXBlKG5ld1R5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5zZXRUeXBlKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpFamJSZWYudW5zZXRUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1NldFR5cGUoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuaXNTZXRUeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRIb21lKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuZ2V0SG9tZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0SG9tZSgpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0hvbWUgPSAiIjsKLSAgICAgICAgb2JqRWpiUmVmLnNldEhvbWUobmV3SG9tZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRSZW1vdGUoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYlJlZi5nZXRSZW1vdGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFJlbW90ZSgpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld1JlbW90ZSA9ICIiOwotICAgICAgICBvYmpFamJSZWYuc2V0UmVtb3RlKG5ld1JlbW90ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRMaW5rKCkgewotCi0gICAgICAgIEVqYlJlZiBvYmpFamJSZWYgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuZ2V0TGluaygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TGluaygpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0xpbmsgPSAiIjsKLSAgICAgICAgb2JqRWpiUmVmLnNldExpbmsobmV3TGluayk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0Rlc2NyaXB0aW9uID0gIiI7Ci0gICAgICAgIG9iakVqYlJlZi5zZXREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBFamJSZWYgb2JqRWpiUmVmID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiUmVmLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbnMoKSB7Ci0KLSAgICAgICAgRWpiUmVmIG9iakVqYlJlZiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJSZWYuZ2V0RGVzY3JpcHRpb25zKCk7Ci0gICAgfSovCi0gICAgCi0gICAgLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRWpiUmVmVGVzdC5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvTGlzdGVuZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9MaXN0ZW5lclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQwODVlYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9MaXN0ZW5lclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIExpc3RlbmVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgTGlzdGVuZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVMaXN0ZW5lcigpOwotCX0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TGlzdGVuZXJDbGFzcygpIHsKLSAgICAgICAgTGlzdGVuZXIgb2JqTGlzdGVuZXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhQ2xhc3MgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakxpc3RlbmVyLmdldExpc3RlbmVyQ2xhc3MoKTsKLSAgICB9IAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRMaXN0ZW5lckNsYXNzKCkgewotCi0gICAgICAgIExpc3RlbmVyIG9iakxpc3RlbmVyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSmF2YUNsYXNzIG5ld0xpc3RlbmVyQ2xhc3MgPSBudWxsOwotICAgICAgICBvYmpMaXN0ZW5lci5zZXRMaXN0ZW5lckNsYXNzKG5ld0xpc3RlbmVyQ2xhc3MpOwotICAgIH0qLwotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldExpc3RlbmVyQ2xhc3NOYW1lKCkgewotCi0gICAgICAgIExpc3RlbmVyIG9iakxpc3RlbmVyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIGxpc3RlbmVyQ2xhc3NOYW1lID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjEiIDsKLSAgICAgICAgb2JqTGlzdGVuZXIuc2V0TGlzdGVuZXJDbGFzc05hbWUobGlzdGVuZXJDbGFzc05hbWUpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpMaXN0ZW5lci5nZXRMaXN0ZW5lckNsYXNzTmFtZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdGVuZXJDbGFzc05hbWUsIHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldExpc3RlbmVyQ2xhc3NOYW1lKCkgewotCi0gICAgICAgIExpc3RlbmVyIG9iakxpc3RlbmVyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIGxpc3RlbmVyQ2xhc3NOYW1lID0gIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5MaXN0ZW5lcjEiOwotICAgICAgICBvYmpMaXN0ZW5lci5zZXRMaXN0ZW5lckNsYXNzTmFtZShsaXN0ZW5lckNsYXNzTmFtZSk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakxpc3RlbmVyLmdldExpc3RlbmVyQ2xhc3NOYW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0ZW5lckNsYXNzTmFtZSwgcmV0VmFsdWUpOwotICAgIH0KLSAgICAKLSAgICAvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShMaXN0ZW5lclRlc3QuY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3QvUU5hbWVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9RTmFtZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI1YmY4MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdC9RTmFtZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLQotcHVibGljIGNsYXNzIFFOYW1lVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIFFOYW1lIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUU5hbWUoKTsKLQl9Ci0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZXNwYWNlVVJJKCkgewotCi0gICAgICAgIFFOYW1lIG9ialFOYW1lID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqUU5hbWUuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgfQotCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE5hbWVzcGFjZVVSSSgpIHsKLQotICAgICAgICBRTmFtZSBvYmpRTmFtZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdOYW1lc3BhY2VVUkkgPSAiIjsKLSAgICAgICAgb2JqUU5hbWUuc2V0TmFtZXNwYWNlVVJJKG5ld05hbWVzcGFjZVVSSSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRMb2NhbFBhcnQoKSB7Ci0KLSAgICAgICAgUU5hbWUgb2JqUU5hbWUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldExvY2FsUGFydCgpIHsKLQotICAgICAgICBRTmFtZSBvYmpRTmFtZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdMb2NhbFBhcnQgPSAiIjsKLSAgICAgICAgb2JqUU5hbWUuc2V0TG9jYWxQYXJ0KG5ld0xvY2FsUGFydCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRDb21iaW5lZFFOYW1lKCkgewotCi0gICAgICAgIFFOYW1lIG9ialFOYW1lID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqUU5hbWUuZ2V0Q29tYmluZWRRTmFtZSgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRDb21iaW5lZFFOYW1lKCkgewotCi0gICAgICAgIFFOYW1lIG9ialFOYW1lID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0NvbWJpbmVkUU5hbWUgPSAiIjsKLSAgICAgICAgb2JqUU5hbWUuc2V0Q29tYmluZWRRTmFtZShuZXdDb21iaW5lZFFOYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEludGVybmFsUHJlZml4T3JOc1VSSSgpIHsKLQotICAgICAgICBRTmFtZSBvYmpRTmFtZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9ialFOYW1lLmdldEludGVybmFsUHJlZml4T3JOc1VSSSgpOwotICAgIH0KLQotICAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKSB7Ci0KLSAgICAgICAgUU5hbWUgb2JqUU5hbWUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3SW50ZXJuYWxQcmVmaXhPck5zVVJJID0gIiI7Ci0gICAgICAgIG9ialFOYW1lLnNldEludGVybmFsUHJlZml4T3JOc1VSSShuZXdJbnRlcm5hbFByZWZpeE9yTnNVUkkpOwotICAgIH0qLwotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFZhbHVlcygpIHsKLQotICAgICAgICBRTmFtZSBvYmpRTmFtZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSAicHJlZml4MSI7Ci0gICAgICAgIFN0cmluZyBuc1VSSSA9ICJuc1VSSTEiOwotICAgICAgICBTdHJpbmcgbG9jYWxQYXJ0ID0gImxvY2FsUGFydDEiOwotICAgICAgICBvYmpRTmFtZS5zZXRWYWx1ZXMocHJlZml4LCBuc1VSSSwgbG9jYWxQYXJ0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHByZWZpeCxvYmpRTmFtZS5nZXRJbnRlcm5hbFByZWZpeE9yTnNVUkkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuc1VSSSxvYmpRTmFtZS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsb2NhbFBhcnQsb2JqUU5hbWUuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIH0KLSAgICAKLSAgICAvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShRTmFtZVRlc3QuY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0NvbW1vbkV4YW1wbGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Db21tb25FeGFtcGxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjOTMwYzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0NvbW1vbkV4YW1wbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbW1vbkV4YW1wbGUuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRGlhZ25vc3RpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRGlhZ25vc3RpY2lhbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWkuaW1wbC5YTUlSZXNvdXJjZUZhY3RvcnlJbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vblBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSBzYW1wbGUgdXRpbGl0eSBmb3IgdGhlICc8ZW0+PGI+Y29tbW9uPC9iPjwvZW0+JyBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25FeGFtcGxlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIExvYWQgYWxsIHRoZSBhcmd1bWVudCBmaWxlIHBhdGhzIG9yIFVSSXMgYXMgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gYXJncyB0aGUgZmlsZSBwYXRocyBvciBVUklzLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCS8vIENyZWF0ZSBhIHJlc291cmNlIHNldCB0byBob2xkIHRoZSByZXNvdXJjZXMuCi0JCS8vCi0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gbmV3IFJlc291cmNlU2V0SW1wbCgpOwotCQkKLQkJLy8gUmVnaXN0ZXIgdGhlIGFwcHJvcHJpYXRlIHJlc291cmNlIGZhY3RvcnkgdG8gaGFuZGxlIGFsbCBmaWxlIGV4dGVudGlvbnMuCi0JCS8vCi0JCXJlc291cmNlU2V0LmdldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0Ci0JCQkoUmVzb3VyY2UuRmFjdG9yeS5SZWdpc3RyeS5ERUZBVUxUX0VYVEVOU0lPTiwgCi0JCQkgbmV3IFhNSVJlc291cmNlRmFjdG9yeUltcGwoKSk7Ci0KLQkJLy8gUmVnaXN0ZXIgdGhlIHBhY2thZ2UgdG8gZW5zdXJlIGl0IGlzIGF2YWlsYWJsZSBkdXJpbmcgbG9hZGluZy4KLQkJLy8KLQkJcmVzb3VyY2VTZXQuZ2V0UGFja2FnZVJlZ2lzdHJ5KCkucHV0Ci0JCQkoQ29tbW9uUGFja2FnZS5lTlNfVVJJLCAKLQkJCSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0gICAgICAgIAotCQkvLyBJZiB0aGVyZSBhcmUgbm8gYXJndW1lbnRzLCBlbWl0IGFuIGFwcHJvcHJpYXRlIHVzYWdlIG1lc3NhZ2UuCi0JCS8vCi0JCWlmIChhcmdzLmxlbmd0aCA9PSAwKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVudGVyIGEgbGlzdCBvZiBmaWxlIHBhdGhzIG9yIFVSSXMgdGhhdCBoYXZlIGNvbnRlbnQgbGlrZSB0aGlzOiIpOwotCQkJdHJ5IHsKLQkJCQlSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKFVSSS5jcmVhdGVVUkkoImh0dHA6Ly8vTXkuY29tbW9uIikpOwotCQkJCUVqYlJlZiByb290ID0gQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRWpiUmVmKCk7Ci0JCQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5hZGQocm9vdCk7Ci0JCQkJcmVzb3VyY2Uuc2F2ZShTeXN0ZW0ub3V0LCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBJdGVyYXRlIG92ZXIgYWxsIHRoZSBhcmd1bWVudHMuCi0JCQkvLwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7Ci0JCQkJLy8gQ29uc3RydWN0IHRoZSBVUkkgZm9yIHRoZSBpbnN0YW5jZSBmaWxlLgotCQkJCS8vIFRoZSBhcmd1bWVudCBpcyB0cmVhdGVkIGFzIGEgZmlsZSBwYXRoIG9ubHkgaWYgaXQgZGVub3RlcyBhbiBleGlzdGluZyBmaWxlLgotCQkJCS8vIE90aGVyd2lzZSwgaXQncyBkaXJlY3RseSB0cmVhdGVkIGFzIGEgVVJMLgotCQkJCS8vCi0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoYXJnc1swXSk7Ci0JCQkJVVJJIHVyaSA9IGZpbGUuaXNGaWxlKCkgPyBVUkkuY3JlYXRlRmlsZVVSSShmaWxlLmdldEFic29sdXRlUGF0aCgpKTogVVJJLmNyZWF0ZVVSSShhcmdzWzBdKTsKLQotCQkJCXRyeSB7Ci0JCQkJCS8vIERlbWFuZCBsb2FkIHJlc291cmNlIGZvciB0aGlzIGZpbGUuCi0JCQkJCS8vCi0JCQkJCVJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VTZXQuZ2V0UmVzb3VyY2UodXJpLCB0cnVlKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2FkZWQgIiArIHVyaSk7Ci0KLQkJCQkJLy8gVmFsaWRhdGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBsb2FkZWQgcmVzb3VyY2UuCi0JCQkJCS8vCi0JCQkJCWZvciAoSXRlcmF0b3IgaiA9IHJlc291cmNlLmdldENvbnRlbnRzKCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7ICkgewotCQkJCQkJRU9iamVjdCBlT2JqZWN0ID0gKEVPYmplY3Qpai5uZXh0KCk7Ci0JCQkJCQlEaWFnbm9zdGljIGRpYWdub3N0aWMgPSBEaWFnbm9zdGljaWFuLklOU1RBTkNFLnZhbGlkYXRlKGVPYmplY3QpOwotCQkJCQkJaWYgKGRpYWdub3N0aWMuZ2V0U2V2ZXJpdHkoKSAhPSBEaWFnbm9zdGljLk9LKSB7Ci0JCQkJCQkJcHJpbnREaWFnbm9zdGljKGRpYWdub3N0aWMsICIiKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9ibGVtIGxvYWRpbmcgIiArIHVyaSk7Ci0JCQkJCWV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBQcmludHMgZGlhZ25vc3RpY3Mgd2l0aCBpbmRlbnRhdGlvbi4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gZGlhZ25vc3RpYyB0aGUgZGlhZ25vc3RpYyB0byBwcmludC4KLQkgKiBAcGFyYW0gaW5kZW50IHRoZSBpbmRlbnRhdGlvbiBmb3IgcHJpbnRpbmcuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBwcmludERpYWdub3N0aWMoRGlhZ25vc3RpYyBkaWFnbm9zdGljLCBTdHJpbmcgaW5kZW50KSB7Ci0JCVN5c3RlbS5vdXQucHJpbnQoaW5kZW50KTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGRpYWdub3N0aWMuZ2V0TWVzc2FnZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZGlhZ25vc3RpYy5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsKLQkJCXByaW50RGlhZ25vc3RpYygoRGlhZ25vc3RpYylpLm5leHQoKSwgaW5kZW50ICsgIiAgIik7Ci0JCX0KLQl9Ci0KLX0gLy9Db21tb25FeGFtcGxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvQ29tbW9uVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Db21tb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjFlOTMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Db21tb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBDb21tb25UZXN0cy5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBzdWl0ZSBmb3IgdGhlICc8ZW0+PGI+Y29tbW9uPC9iPjwvZW0+JyBwYWNrYWdlLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25UZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBDb21tb25UZXN0cygiY29tbW9uIFRlc3RzIik7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQ29tbW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi19IC8vQ29tbW9uVGVzdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY0YWQyNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db21wYXRpYmlsaXR5IERlc2NyaXB0aW9uIEdyb3VwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0IGV4dGVuZHMgRGVzY3JpcHRpb25Hcm91cFRlc3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IENvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXAgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIENvbXBhdGliaWxpdHkgRGVzY3JpcHRpb24gR3JvdXAgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXAgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIChDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cClmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL0NvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0Rlc2NyaXB0aW9uR3JvdXBUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmMDI3MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGVzY3JpcHRpb25Hcm91cFRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uRGVzY3JpcHRpb25Hcm91cDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdGlvbiBHcm91cDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uR3JvdXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIERlc2NyaXB0aW9uIEdyb3VwIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGVzY3JpcHRpb25Hcm91cCBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oRGVzY3JpcHRpb25Hcm91cFRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRGVzY3JpcHRpb24gR3JvdXAgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0aW9uR3JvdXBUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRGVzY3JpcHRpb24gR3JvdXAgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoRGVzY3JpcHRpb25Hcm91cCBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBEZXNjcmlwdGlvbiBHcm91cCB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEZXNjcmlwdGlvbkdyb3VwIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uR3JvdXAoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vRGVzY3JpcHRpb25Hcm91cFRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9EZXNjcmlwdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9EZXNjcmlwdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhM2Q4YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRGVzY3JpcHRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IERlc2NyaXB0aW9uVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5EZXNjcmlwdGlvbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERlc2NyaXB0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBEZXNjcmlwdGlvbiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERlc2NyaXB0aW9uIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihEZXNjcmlwdGlvblRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRGVzY3JpcHRpb24gdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERlc2NyaXB0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIERlc2NyaXB0aW9uIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKERlc2NyaXB0aW9uIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIERlc2NyaXB0aW9uIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERlc2NyaXB0aW9uIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZURlc2NyaXB0aW9uKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL0Rlc2NyaXB0aW9uVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0Rpc3BsYXlOYW1lVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0Rpc3BsYXlOYW1lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjgwMzkxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9EaXNwbGF5TmFtZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRGlzcGxheU5hbWVUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkRpc3BsYXlOYW1lOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc3BsYXkgTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERpc3BsYXlOYW1lVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBEaXNwbGF5IE5hbWUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEaXNwbGF5TmFtZSBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oRGlzcGxheU5hbWVUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IERpc3BsYXkgTmFtZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzcGxheU5hbWVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRGlzcGxheSBOYW1lIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKERpc3BsYXlOYW1lIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIERpc3BsYXkgTmFtZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEaXNwbGF5TmFtZSBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVEaXNwbGF5TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9EaXNwbGF5TmFtZVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9FSkJMb2NhbFJlZlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9FSkJMb2NhbFJlZlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0M2Q0YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRUpCTG9jYWxSZWZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEVKQkxvY2FsUmVmVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FSkJMb2NhbFJlZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FSkIgTG9jYWwgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRUpCTG9jYWxSZWZUZXN0IGV4dGVuZHMgRWpiUmVmVGVzdCB7Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihFSkJMb2NhbFJlZlRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRUpCIExvY2FsIFJlZiB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUpCTG9jYWxSZWZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRUpCIExvY2FsIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFSkJMb2NhbFJlZiBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gKEVKQkxvY2FsUmVmKWZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUpCTG9jYWxSZWYoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vRUpCTG9jYWxSZWZUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRWpiUmVmVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0VqYlJlZlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E1ODdlOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvRWpiUmVmVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBFamJSZWZUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVqYlJlZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FamIgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRWpiUmVmVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBFamIgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRWpiUmVmIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihFamJSZWZUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEVqYiBSZWYgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVqYlJlZlRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBFamIgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKEVqYlJlZiBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBFamIgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVqYlJlZiBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFamJSZWYoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vRWpiUmVmVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0VudkVudHJ5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0VudkVudHJ5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTJjMGJlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9FbnZFbnRyeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogRW52RW50cnlUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkVudkVudHJ5OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudiBFbnRyeTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVudkVudHJ5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBFbnYgRW50cnkgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFbnZFbnRyeSBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oRW52RW50cnlUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IEVudiBFbnRyeSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW52RW50cnlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgRW52IEVudHJ5IHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKEVudkVudHJ5IGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEVudiBFbnRyeSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFbnZFbnRyeSBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVFbnZFbnRyeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9FbnZFbnRyeVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9JY29uVHlwZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9JY29uVHlwZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBiYmZlNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvSWNvblR5cGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEljb25UeXBlVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5JY29uVHlwZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5JY29uIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJY29uVHlwZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgSWNvbiBUeXBlIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSWNvblR5cGUgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKEljb25UeXBlVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBJY29uIFR5cGUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEljb25UeXBlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIEljb24gVHlwZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShJY29uVHlwZSBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBJY29uIFR5cGUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSWNvblR5cGUgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSWNvblR5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vSWNvblR5cGVUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvSWRlbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvSWRlbnRpdHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ODBkZmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0lkZW50aXR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBJZGVudGl0eVRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uSWRlbnRpdHk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SWRlbnRpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBJZGVudGl0eVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgSWRlbnRpdHkgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJZGVudGl0eSBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oSWRlbnRpdHlUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IElkZW50aXR5IHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJZGVudGl0eVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZml4dHVyZSBmb3IgdGhpcyBJZGVudGl0eSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShJZGVudGl0eSBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBJZGVudGl0eSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBJZGVudGl0eSBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVJZGVudGl0eSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9JZGVudGl0eVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9KTkRJRW52UmVmc0dyb3VwVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0pORElFbnZSZWZzR3JvdXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDFjMDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0pORElFbnZSZWZzR3JvdXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IEpORElFbnZSZWZzR3JvdXBUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5KTkRJRW52UmVmc0dyb3VwOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkpOREkgRW52IFJlZnMgR3JvdXA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKTkRJRW52UmVmc0dyb3VwVGVzdCBleHRlbmRzIENvbXBhdGliaWxpdHlEZXNjcmlwdGlvbkdyb3VwVGVzdCB7Ci0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBKTkRJIEVudiBSZWZzIEdyb3VwIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBKTkRJRW52UmVmc0dyb3VwVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIEpOREkgRW52IFJlZnMgR3JvdXAgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgSk5ESUVudlJlZnNHcm91cCBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gKEpORElFbnZSZWZzR3JvdXApZml4dHVyZTsKLQl9Ci0KLX0gLy9KTkRJRW52UmVmc0dyb3VwVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0xpc3RlbmVyVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL0xpc3RlbmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGNiYTU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9MaXN0ZW5lclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTGlzdGVuZXJUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkxpc3RlbmVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxpc3RlbmVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJUZXN0IGV4dGVuZHMgQ29tcGF0aWJpbGl0eURlc2NyaXB0aW9uR3JvdXBUZXN0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKExpc3RlbmVyVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBMaXN0ZW5lciB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTGlzdGVuZXIgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgTGlzdGVuZXIgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIChMaXN0ZW5lcilmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUxpc3RlbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL0xpc3RlbmVyVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL01lc3NhZ2VEZXN0aW5hdGlvblJlZlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9NZXNzYWdlRGVzdGluYXRpb25SZWZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NGE2ODIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL01lc3NhZ2VEZXN0aW5hdGlvblJlZlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWVzc2FnZURlc3RpbmF0aW9uUmVmVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb25SZWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbiBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlRGVzdGluYXRpb25SZWZUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIE1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWVzc2FnZURlc3RpbmF0aW9uUmVmIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihNZXNzYWdlRGVzdGluYXRpb25SZWZUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IE1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25SZWZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTWVzc2FnZSBEZXN0aW5hdGlvbiBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoTWVzc2FnZURlc3RpbmF0aW9uUmVmIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIE1lc3NhZ2UgRGVzdGluYXRpb24gUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE1lc3NhZ2VEZXN0aW5hdGlvblJlZiBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb25SZWYoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vTWVzc2FnZURlc3RpbmF0aW9uUmVmVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL01lc3NhZ2VEZXN0aW5hdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9NZXNzYWdlRGVzdGluYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YmVmNDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL01lc3NhZ2VEZXN0aW5hdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogTWVzc2FnZURlc3RpbmF0aW9uVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5NZXNzYWdlRGVzdGluYXRpb247Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWVzc2FnZSBEZXN0aW5hdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VEZXN0aW5hdGlvblRlc3QgZXh0ZW5kcyBDb21wYXRpYmlsaXR5RGVzY3JpcHRpb25Hcm91cFRlc3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oTWVzc2FnZURlc3RpbmF0aW9uVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBNZXNzYWdlIERlc3RpbmF0aW9uIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNZXNzYWdlRGVzdGluYXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgTWVzc2FnZSBEZXN0aW5hdGlvbiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBNZXNzYWdlRGVzdGluYXRpb24gZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIChNZXNzYWdlRGVzdGluYXRpb24pZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXNzYWdlRGVzdGluYXRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vTWVzc2FnZURlc3RpbmF0aW9uVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1BhcmFtVmFsdWVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUGFyYW1WYWx1ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY2ODMyOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUGFyYW1WYWx1ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUGFyYW1WYWx1ZVRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJhbSBWYWx1ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBhcmFtVmFsdWVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFBhcmFtIFZhbHVlIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUGFyYW1WYWx1ZSBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oUGFyYW1WYWx1ZVRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgUGFyYW0gVmFsdWUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBhcmFtVmFsdWVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUGFyYW0gVmFsdWUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoUGFyYW1WYWx1ZSBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBQYXJhbSBWYWx1ZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBQYXJhbVZhbHVlIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVBhcmFtVmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vUGFyYW1WYWx1ZVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9RTmFtZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9RTmFtZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA4OGIxZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvUU5hbWVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFFOYW1lVGVzdC5qYXZhLHYgMS4xIDIwMDUvMDgvMjMgMDM6MzE6MDAgY2JyaWRnaGEgRXhwICQKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5RTmFtZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5RTmFtZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFFOYW1lVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBRTmFtZSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFFOYW1lIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihRTmFtZVRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgUU5hbWUgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFFOYW1lVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFFOYW1lIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFFOYW1lIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFFOYW1lIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFFOYW1lIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVFOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL1FOYW1lVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1Jlc291cmNlRW52UmVmVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1Jlc291cmNlRW52UmVmVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWJjNDcwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9SZXNvdXJjZUVudlJlZlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVzb3VyY2VFbnZSZWZUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIEVudiBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUVudlJlZlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqCi0JICogVGhlIGZpeHR1cmUgZm9yIHRoaXMgUmVzb3VyY2UgRW52IFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFJlc291cmNlRW52UmVmIGZpeHR1cmUgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlUZXN0UnVubmVyLnJ1bihSZXNvdXJjZUVudlJlZlRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgUmVzb3VyY2UgRW52IFJlZiB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VFbnZSZWZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUmVzb3VyY2UgRW52IFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Rml4dHVyZShSZXNvdXJjZUVudlJlZiBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBSZXNvdXJjZSBFbnYgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFJlc291cmNlRW52UmVmIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlc291cmNlRW52UmVmKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL1Jlc291cmNlRW52UmVmVGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1Jlc291cmNlUmVmVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1Jlc291cmNlUmVmVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWI2MDFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9SZXNvdXJjZVJlZlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogUmVzb3VyY2VSZWZUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlUmVmOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlc291cmNlIFJlZjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlUmVmVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBSZXNvdXJjZSBSZWYgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBSZXNvdXJjZVJlZiBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oUmVzb3VyY2VSZWZUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IFJlc291cmNlIFJlZiB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VSZWZUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgUmVzb3VyY2UgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFJlc291cmNlUmVmIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFJlc291cmNlIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBSZXNvdXJjZVJlZiBnZXRGaXh0dXJlKCkgewotCQlyZXR1cm4gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVSZXNvdXJjZVJlZigpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9SZXNvdXJjZVJlZlRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9SdW5Bc1NwZWNpZmllZElkZW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1J1bkFzU3BlY2lmaWVkSWRlbnRpdHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMzM5MDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1J1bkFzU3BlY2lmaWVkSWRlbnRpdHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlUZXN0LmphdmEsdiAxLjEgMjAwNS8wOC8yMyAwMzozMTowMCBjYnJpZGdoYSBFeHAgJAotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0czsKLQotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLkNvbW1vbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJ1bkFzU3BlY2lmaWVkSWRlbnRpdHk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UnVuIEFzIFNwZWNpZmllZCBJZGVudGl0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHlUZXN0IGV4dGVuZHMgU2VjdXJpdHlJZGVudGl0eVRlc3QgewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oUnVuQXNTcGVjaWZpZWRJZGVudGl0eVRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgUnVuIEFzIFNwZWNpZmllZCBJZGVudGl0eSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUnVuQXNTcGVjaWZpZWRJZGVudGl0eVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBSdW4gQXMgU3BlY2lmaWVkIElkZW50aXR5IHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFJ1bkFzU3BlY2lmaWVkSWRlbnRpdHkgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIChSdW5Bc1NwZWNpZmllZElkZW50aXR5KWZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUnVuQXNTcGVjaWZpZWRJZGVudGl0eSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9SdW5Bc1NwZWNpZmllZElkZW50aXR5VGVzdApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1NlY3VyaXR5SWRlbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvU2VjdXJpdHlJZGVudGl0eVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU5NjQ1Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvU2VjdXJpdHlJZGVudGl0eVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKgotICogPGNvcHlyaWdodD4KLSAqIDwvY29weXJpZ2h0PgotICoKLSAqICRJZDogU2VjdXJpdHlJZGVudGl0eVRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlJZGVudGl0eTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSB0ZXN0IGNhc2UgZm9yIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZWN1cml0eSBJZGVudGl0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFNlY3VyaXR5SWRlbnRpdHlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFNlY3VyaXR5IElkZW50aXR5IHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU2VjdXJpdHlJZGVudGl0eSBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oU2VjdXJpdHlJZGVudGl0eVRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgU2VjdXJpdHkgSWRlbnRpdHkgdGVzdCBjYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFNlY3VyaXR5SWRlbnRpdHlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZpeHR1cmUgZm9yIHRoaXMgU2VjdXJpdHkgSWRlbnRpdHkgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoU2VjdXJpdHlJZGVudGl0eSBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTZWN1cml0eSBJZGVudGl0eSB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTZWN1cml0eUlkZW50aXR5IGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3VyaXR5SWRlbnRpdHkoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSN0ZWFyRG93bigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUobnVsbCk7Ci0JfQotCi19IC8vU2VjdXJpdHlJZGVudGl0eVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9TZWN1cml0eVJvbGVSZWZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvU2VjdXJpdHlSb2xlUmVmVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTRiNjMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9TZWN1cml0eVJvbGVSZWZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFNlY3VyaXR5Um9sZVJlZlRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3VyaXR5IFJvbGUgUmVmPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgU2VjdXJpdHlSb2xlUmVmVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKioKLQkgKiBUaGUgZml4dHVyZSBmb3IgdGhpcyBTZWN1cml0eSBSb2xlIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNlY3VyaXR5Um9sZVJlZiBmaXh0dXJlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJVGVzdFJ1bm5lci5ydW4oU2VjdXJpdHlSb2xlUmVmVGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBTZWN1cml0eSBSb2xlIFJlZiB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlSb2xlUmVmVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNlY3VyaXR5IFJvbGUgUmVmIHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGaXh0dXJlKFNlY3VyaXR5Um9sZVJlZiBmaXh0dXJlKSB7Ci0JCXRoaXMuZml4dHVyZSA9IGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBTZWN1cml0eSBSb2xlIFJlZiB0ZXN0IGNhc2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBTZWN1cml0eVJvbGVSZWYgZ2V0Rml4dHVyZSgpIHsKLQkJcmV0dXJuIGZpeHR1cmU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXRVcCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEZpeHR1cmUoQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2VjdXJpdHlSb2xlUmVmKCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKG51bGwpOwotCX0KLQotfSAvL1NlY3VyaXR5Um9sZVJlZlRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9TZWN1cml0eVJvbGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvU2VjdXJpdHlSb2xlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTE0YTNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvbW1vbi90ZXN0cy9TZWN1cml0eVJvbGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKiAkSWQ6IFNlY3VyaXR5Um9sZVRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHRlc3QgY2FzZSBmb3IgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlNlY3VyaXR5IFJvbGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWN1cml0eVJvbGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCS8qKgotCSAqIFRoZSBmaXh0dXJlIGZvciB0aGlzIFNlY3VyaXR5IFJvbGUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTZWN1cml0eVJvbGUgZml4dHVyZSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKFNlY3VyaXR5Um9sZVRlc3QuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgU2VjdXJpdHkgUm9sZSB0ZXN0IGNhc2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU2VjdXJpdHlSb2xlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNlY3VyaXR5IFJvbGUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpeHR1cmUoU2VjdXJpdHlSb2xlIGZpeHR1cmUpIHsKLQkJdGhpcy5maXh0dXJlID0gZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXh0dXJlIGZvciB0aGlzIFNlY3VyaXR5IFJvbGUgdGVzdCBjYXNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgU2VjdXJpdHlSb2xlIGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiBmaXh0dXJlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRGaXh0dXJlKENvbW1vbkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlY3VyaXR5Um9sZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9TZWN1cml0eVJvbGVUZXN0CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvVXNlQ2FsbGVySWRlbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb21tb24vdGVzdHMvVXNlQ2FsbGVySWRlbnRpdHlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2IzYTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29tbW9uL3Rlc3RzL1VzZUNhbGxlcklkZW50aXR5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqCi0gKiA8Y29weXJpZ2h0PgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICogJElkOiBVc2VDYWxsZXJJZGVudGl0eVRlc3QuamF2YSx2IDEuMSAyMDA1LzA4LzIzIDAzOjMxOjAwIGNicmlkZ2hhIEV4cCAkCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLnRlc3RzOwotCi1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uVXNlQ2FsbGVySWRlbnRpdHk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgdGVzdCBjYXNlIGZvciB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VXNlIENhbGxlciBJZGVudGl0eTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFVzZUNhbGxlcklkZW50aXR5VGVzdCBleHRlbmRzIFNlY3VyaXR5SWRlbnRpdHlUZXN0IHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVRlc3RSdW5uZXIucnVuKFVzZUNhbGxlcklkZW50aXR5VGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBVc2UgQ2FsbGVyIElkZW50aXR5IHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBVc2VDYWxsZXJJZGVudGl0eVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZml4dHVyZSBmb3IgdGhpcyBVc2UgQ2FsbGVyIElkZW50aXR5IHRlc3QgY2FzZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIFVzZUNhbGxlcklkZW50aXR5IGdldEZpeHR1cmUoKSB7Ci0JCXJldHVybiAoVXNlQ2FsbGVySWRlbnRpdHkpZml4dHVyZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVVc2VDYWxsZXJJZGVudGl0eSgpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3RlYXJEb3duKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0Rml4dHVyZShudWxsKTsKLQl9Ci0KLX0gLy9Vc2VDYWxsZXJJZGVudGl0eVRlc3QKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvYXBpL3Rlc3QvQWxsQ29yZUFQSVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9jb3JlL2FwaS90ZXN0L0FsbENvcmVBUElUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGQwMTMwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvYXBpL3Rlc3QvQWxsQ29yZUFQSVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5hcGkudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzLmFwaS5BbGxBUElUZXN0OwotCi0vKioKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxDb3JlQVBJVGVzdHMgewotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0IGZvciBKMkVFIENvcmUgQXBpIFRlc3QiKTsKLSAgICAgICAgLy8kSlVuaXQtQkVHSU4kCi0JCXN1aXRlLmFkZFRlc3QoQWxsQVBJVGVzdC5zdWl0ZSgpKTsKLQotCQkvLyRKVW5pdC1FTkQkCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oamF2YS5sYW5nLlN0cmluZ1tdIGFyZ3MpIHsKLQkJanVuaXQudGV4dHVpLlRlc3RSdW5uZXIubWFpbihuZXcgU3RyaW5nW10geyBBbGxDb3JlQVBJVGVzdHMuY2xhc3MuZ2V0TmFtZSgpIH0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9hcGkvdGVzdC9BdXRvbWF0ZWRBUElCVlQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvYXBpL3Rlc3QvQXV0b21hdGVkQVBJQlZULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MjRhZmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS9hcGkvdGVzdC9BdXRvbWF0ZWRBUElCVlQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmFwaS50ZXN0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvbWF0ZWRBUElCVlQgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZURpcmVjdG9yeSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSArIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyICsgImNvbW1vbkFyY2hpdmVSZXNvdXJjZXMiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMiKTsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKTsgCi0gICAgICAgIAlBdXRvbWF0ZWRBUElCVlQuYmFzZURpcmVjdG9yeSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKS5nZXRGaWxlKCkgKyAiY29tbW9uQXJjaGl2ZVJlc291cmNlcyIrIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNpbmcgd29ya2luZyBkaXJlY3Rvcnkgc2luY2UgYSB3b3Jrc3BhY2UgVVJMIGNvdWxkIG5vdCBiZSBsb2NhdGVkLiIpOwotCQl9IAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IHVuaW1wbGVtZW50ZWRNZXRob2RzOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICB1bmltcGxlbWVudGVkTWV0aG9kcyA9IDA7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgICAgICBpZiAodW5pbXBsZW1lbnRlZE1ldGhvZHMgPiAwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ2FsbHMgdG8gd2FyblVuaW1wbDogIiArIHVuaW1wbGVtZW50ZWRNZXRob2RzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBdXRvbWF0ZWRBUElCVlQoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IChUZXN0U3VpdGUpIEF1dG9tYXRlZEFQSUJWVC5zdWl0ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN1aXRlLnRlc3RDb3VudCgpOyBpKyspIHsKLSAgICAgICAgICAgIGFkZFRlc3Qoc3VpdGUudGVzdEF0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgiVGVzdCBmb3Igb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5hcGkuYnZ0Iik7Ci0gICAgICAgIC8vJEpVbml0LUJFR0lOJAotICAgICAgICBzdWl0ZS5hZGRUZXN0KEFsbENvcmVBUElUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgLy8kSlVuaXQtRU5EJAotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9hcGkvQWxsQVBJVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvY29yZS90ZXN0cy9hcGkvQWxsQVBJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWExOGMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2NvcmUvdGVzdHMvYXBpL0FsbEFQSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAxOCwgMjAwNQotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5hcGk7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24udGVzdC5BcHBsaWNhdGlvbkZhY3RvcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLnRlc3QuQXBwbGljYXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC50ZXN0LkFwcGxpY2F0aW9uQ2xpZW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQudGVzdC5DbGllbnRGYWN0b3J5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdC5Db21tb25GYWN0b3J5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdC5FamJSZWZUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi50ZXN0Lkxpc3RlbmVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24udGVzdC5RTmFtZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuQXNzZW1ibHlEZXNjcmlwdG9yVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5DTVBBdHRyaWJ1dGVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0LkNNUkZpZWxkVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5Db250YWluZXJNYW5hZ2VkRW50aXR5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5FSkJSZWxhdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuRUpCUmVsYXRpb25zaGlwUm9sZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuRWpiRmFjdG9yeVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuRW50aXR5VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5NZXRob2RFbGVtZW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5NZXRob2RQZXJtaXNzaW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdC5RdWVyeU1ldGhvZFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3QuUXVlcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0LlNlc3Npb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS50ZXN0LkNvbm5lY3RvclRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnRlc3QuSmNhRmFjdG9yeVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLnRlc3QuSnNwRmFjdG9yeVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24udGVzdC5XZWJhcHBsaWNhdGlvbkZhY3RvcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24udGVzdC5Xc2NvbW1vbkZhY3RvcnlUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC50ZXN0LldzZGRGYWN0b3J5VGVzdDsKLQotCi0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEFsbEFQSVRlc3QgIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotCSBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLSAgICAgICAgcmV0dXJuIG5ldyBBbGxBUElUZXN0KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBBbGxBUElUZXN0KCl7Ci0gICAgICAgIHN1cGVyKCJKMkVFIENvcmUgQVBJIFRlc3RzIik7Ci0gICAgICAgIGFkZFRlc3QoQXBwbGljYXRpb25GYWN0b3J5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChBcHBsaWNhdGlvblRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoQXBwbGljYXRpb25DbGllbnRUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KENsaWVudEZhY3RvcnlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KENvbW1vbkZhY3RvcnlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEVqYlJlZlRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoTGlzdGVuZXJUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KFFOYW1lVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChBc3NlbWJseURlc2NyaXB0b3JUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KENNUEF0dHJpYnV0ZVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoQ01SRmllbGRUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KENvbnRhaW5lck1hbmFnZWRFbnRpdHlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEVqYkZhY3RvcnlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEVKQlJlbGF0aW9uc2hpcFJvbGVUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEVKQlJlbGF0aW9uVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChFbnRpdHlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KE1ldGhvZEVsZW1lbnRUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KE1ldGhvZFBlcm1pc3Npb25UZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KFF1ZXJ5TWV0aG9kVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChRdWVyeVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoU2Vzc2lvblRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoQ29ubmVjdG9yVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChKY2FGYWN0b3J5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChKc3BGYWN0b3J5VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChXZWJhcHBsaWNhdGlvbkZhY3RvcnlUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KFdzY29tbW9uRmFjdG9yeVRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoV3NkZEZhY3RvcnlUZXN0LnN1aXRlKCkpOwotICAgICAgICAKLSAgICB9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9Bc3NlbWJseURlc2NyaXB0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9Bc3NlbWJseURlc2NyaXB0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzZlNDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvQXNzZW1ibHlEZXNjcmlwdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5TZWN1cml0eVJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RUcmFuc2FjdGlvbjsKLQotcHVibGljIGNsYXNzIEFzc2VtYmx5RGVzY3JpcHRvclRlc3QgZXh0ZW5kcyBFamJFTUZUZXN0QmFzZSB7Ci0KLSAgICAvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBBc3NlbWJseURlc2NyaXB0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkJCi0JcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RQZXJtaXNzaW9uTWV0aG9kRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5pdCgpOwotCQlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBERC5nZXRFSkJKYXIoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJYXNzZXJ0Tm90TnVsbChhc3NlbWJseURlc2NyaXB0b3IpOwotCQlMaXN0IGVudGVycHJpc2VCZWFucyA9IERELmdldEVKQkphcigpLmdldEVudGVycHJpc2VCZWFucygpOwotCQlFbnRlcnByaXNlQmVhbiBlYjEgPSAoRW50ZXJwcmlzZUJlYW4pZW50ZXJwcmlzZUJlYW5zLmdldCgwKTsKLQkJTGlzdCBtZXRob2RQZXJtaXNzaW9uTGlzdCA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RQZXJtaXNzaW9uTWV0aG9kRWxlbWVudHMoZWIxKTsKLQkJCi0JCQotCQlMaXN0IGFsbE1ldGhvZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHBlcm1pc3Npb25zID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFBlcm1pc3Npb25zKCk7Ci0JCU1ldGhvZFBlcm1pc3Npb24gcGVybWlzc2lvbjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJtaXNzaW9ucy5zaXplKCk7IGkrKyl7Ci0JCQlwZXJtaXNzaW9uID0gKE1ldGhvZFBlcm1pc3Npb24pIHBlcm1pc3Npb25zLmdldChpKTsKLQkJCWFsbE1ldGhvZEVsZW1lbnRzLmFkZEFsbChwZXJtaXNzaW9uLmdldE1ldGhvZEVsZW1lbnRzKGViMSkpOyAKLQkJfQotCQlhc3NlcnRFcXVhbHMobWV0aG9kUGVybWlzc2lvbkxpc3QsYWxsTWV0aG9kRWxlbWVudHMpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGV4cGVjdGVkCi0JICogQHBhcmFtIGFjdHVhbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHMoTGlzdCBleHBlY3RlZCwgTGlzdCBhY3R1YWwpIHsKLQkJYXNzZXJ0RXF1YWxzKGFjdHVhbC5zaXplKCksIGV4cGVjdGVkLnNpemUoKSk7Ci0JCWZvciAoaW50IHg9MDsgeDwgZXhwZWN0ZWQuc2l6ZSgpOyArK3gpIHsKLQkJCU9iamVjdCBvID0gZXhwZWN0ZWQuZ2V0KHgpOwotCQkJYXNzZXJ0RXF1YWxzKGFjdHVhbC5jb250YWlucyhvKSwgdHJ1ZSk7Ci0JCX0KLQotCX0KLQkKLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFzc2VtYmx5RGVzY3JpcHRvclRlc3QoInRlc3RfZ2V0TWV0aG9kUGVybWlzc2lvbk1ldGhvZEVsZW1lbnRzIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBc3NlbWJseURlc2NyaXB0b3JUZXN0KCJ0ZXN0X2dldE1ldGhvZFRyYW5zYWN0aW9uTWV0aG9kRWxlbWVudHMiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFzc2VtYmx5RGVzY3JpcHRvclRlc3QoInRlc3RfZ2V0U2VjdXJpdHlSb2xlTmFtZWQiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEFzc2VtYmx5RGVzY3JpcHRvclRlc3QoInRlc3RfcmVuYW1lU2VjdXJpdHlSb2xlIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBBc3NlbWJseURlc2NyaXB0b3JUZXN0KCJ0ZXN0X3JlbW92ZURhdGEiKSk7Ci0JCQotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RQZXJtaXNzaW9uKCkgewotCi0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBvYmpBc3NlbWJseURlc2NyaXB0b3IgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMaXN0IHNlY3VyaXR5Um9sZXNMaXN0ID0gbnVsbDsKLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXNzZW1ibHlEZXNjcmlwdG9yCi0gICAgICAgICAgICAgICAgLmdldE1ldGhvZFBlcm1pc3Npb24oc2VjdXJpdHlSb2xlc0xpc3QpOwotICAgIH0gKi8KLQotIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RUcmFuc2FjdGlvbk1ldGhvZEVsZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgCWluaXQoKTsKLSAgICAJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gREQuZ2V0RUpCSmFyKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoYXNzZW1ibHlEZXNjcmlwdG9yKTsKLQkJTGlzdCBlbnRlcnByaXNlQmVhbnMgPSBERC5nZXRFSkJKYXIoKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJRW50ZXJwcmlzZUJlYW4gZWIxID0gKEVudGVycHJpc2VCZWFuKWVudGVycHJpc2VCZWFucy5nZXQoMCk7Ci0JCUxpc3QgbWV0aG9kVHJhbnNhY3Rpb25MaXN0ID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFRyYW5zYWN0aW9uTWV0aG9kRWxlbWVudHMoZWIxKTsKLQkJCi0JCQotCQlMaXN0IGFsbE1ldGhvZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRyYW5zYWN0aW9ucyA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RUcmFuc2FjdGlvbnMoKTsKLQkJTWV0aG9kVHJhbnNhY3Rpb24gdHJhbnNhY3Rpb247Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHJhbnNhY3Rpb25zLnNpemUoKTsgaSsrKXsKLQkJCXRyYW5zYWN0aW9uID0gKE1ldGhvZFRyYW5zYWN0aW9uKSB0cmFuc2FjdGlvbnMuZ2V0KGkpOwotCQkJYWxsTWV0aG9kRWxlbWVudHMuYWRkQWxsKHRyYW5zYWN0aW9uLmdldE1ldGhvZEVsZW1lbnRzKGViMSkpOyAKLQkJfQotCQlhc3NlcnRFcXVhbHMobWV0aG9kVHJhbnNhY3Rpb25MaXN0LGFsbE1ldGhvZEVsZW1lbnRzKTsKLSAgICB9Ci0KLQotCi0JcHVibGljIHZvaWQgdGVzdF9nZXRTZWN1cml0eVJvbGVOYW1lZCgpdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWluaXQoKTsKLQkJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gREQuZ2V0RUpCSmFyKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoYXNzZW1ibHlEZXNjcmlwdG9yKTsKLQkJU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZT0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotCQlTdHJpbmcgc2VjdXJpdHlSb2xlTmFtZSA9ICJ0ZXN0Um9sZSI7Ci0JCXNlY3VyaXR5Um9sZS5zZXRSb2xlTmFtZShzZWN1cml0eVJvbGVOYW1lKTsKLQkJYXNzZW1ibHlEZXNjcmlwdG9yLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoc2VjdXJpdHlSb2xlKTsKLQkJU2VjdXJpdHlSb2xlIHJldFZhbHVlID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldFNlY3VyaXR5Um9sZU5hbWVkKHNlY3VyaXR5Um9sZU5hbWUpIDsKLQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHNlY3VyaXR5Um9sZSk7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9yZW5hbWVTZWN1cml0eVJvbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJaW5pdCgpOwotICAgIAlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBERC5nZXRFSkJKYXIoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJYXNzZXJ0Tm90TnVsbChhc3NlbWJseURlc2NyaXB0b3IpOwotCQlTdHJpbmcgc2VjdXJpdHlSb2xlTmFtZSA9ICJ0ZXN0Um9sZSI7Ci0JCQotCQlTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlPSBDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb21tb25GYWN0b3J5KCkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JCQotCQlzZWN1cml0eVJvbGUuc2V0Um9sZU5hbWUoc2VjdXJpdHlSb2xlTmFtZSk7Ci0JCWFzc2VtYmx5RGVzY3JpcHRvci5nZXRTZWN1cml0eVJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZSk7Ci0JCVN0cmluZyBuZXdTZWN1cml0eVJvbGVOYW1lID0gIm5ld1Rlc3RSb2xlIiA7Ci0JCVNlY3VyaXR5Um9sZSByZXRWYWx1ZSA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRTZWN1cml0eVJvbGVOYW1lZChuZXdTZWN1cml0eVJvbGVOYW1lKSA7Ci0JCWFzc2VydE51bGwocmV0VmFsdWUpOwotCQlhc3NlbWJseURlc2NyaXB0b3IucmVuYW1lU2VjdXJpdHlSb2xlKHNlY3VyaXR5Um9sZU5hbWUsCi0JCQkJCW5ld1NlY3VyaXR5Um9sZU5hbWUpOwotCQlyZXRWYWx1ZSA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRTZWN1cml0eVJvbGVOYW1lZChuZXdTZWN1cml0eVJvbGVOYW1lKSA7Ci0JCWFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotCQkKLSAgICB9Ci0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kUGVybWlzc2lvbnMoKSB7Ci0KLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG9iakFzc2VtYmx5RGVzY3JpcHRvciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kUGVybWlzc2lvbnMoKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RUcmFuc2FjdGlvbnMoKSB7Ci0KLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG9iakFzc2VtYmx5RGVzY3JpcHRvciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kVHJhbnNhY3Rpb25zKCk7Ci0gICAgfSAqLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVqYkphcigpIHsKLQotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3Igb2JqQXNzZW1ibHlEZXNjcmlwdG9yID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCSmFyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBc3NlbWJseURlc2NyaXB0b3IuZ2V0RWpiSmFyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRFamJKYXIoKSB7Ci0KLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG9iakFzc2VtYmx5RGVzY3JpcHRvciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQkphciBuZXdFamJKYXIgPSBudWxsOwotICAgICAgICBvYmpBc3NlbWJseURlc2NyaXB0b3Iuc2V0RWpiSmFyKG5ld0VqYkphcik7Ci0gICAgfSAqLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlY3VyaXR5Um9sZXMoKSB7Ci0KLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIG9iakFzc2VtYmx5RGVzY3JpcHRvciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpBc3NlbWJseURlc2NyaXB0b3IuZ2V0U2VjdXJpdHlSb2xlcygpOwotICAgIH0qLwotCi0gLyogICBwdWJsaWMgdm9pZCB0ZXN0X2dldEV4Y2x1ZGVMaXN0KCkgewotCi0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBvYmpBc3NlbWJseURlc2NyaXB0b3IgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFeGNsdWRlTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXNzZW1ibHlEZXNjcmlwdG9yLmdldEV4Y2x1ZGVMaXN0KCk7Ci0gICAgfSAqLwotCi0gICAKLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9zZXRFeGNsdWRlTGlzdCgpIHsKLQotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3Igb2JqQXNzZW1ibHlEZXNjcmlwdG9yID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRXhjbHVkZUxpc3QgbmV3RXhjbHVkZUxpc3QgPSBudWxsOwotICAgICAgICBvYmpBc3NlbWJseURlc2NyaXB0b3Iuc2V0RXhjbHVkZUxpc3QobmV3RXhjbHVkZUxpc3QpOwotICAgIH0gKi8KLQotIC8qICAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlRGVzdGluYXRpb25zKCkgewotCi0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBvYmpBc3NlbWJseURlc2NyaXB0b3IgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQXNzZW1ibHlEZXNjcmlwdG9yLmdldE1lc3NhZ2VEZXN0aW5hdGlvbnMoKTsKLSAgICB9ICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJaW5pdCgpOwotICAgIAlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBERC5nZXRFSkJKYXIoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJYXNzZXJ0Tm90TnVsbChhc3NlbWJseURlc2NyaXB0b3IpOwotCQlMaXN0IGVudGVycHJpc2VCZWFucyA9IERELmdldEVKQkphcigpLmdldEVudGVycHJpc2VCZWFucygpOwotCQlFbnRlcnByaXNlQmVhbiBlYjEgPSAoRW50ZXJwcmlzZUJlYW4pZW50ZXJwcmlzZUJlYW5zLmdldCgwKTsKLQkJTGlzdCBtZXRob2RUcmFuc2FjdGlvbkxpc3QgPSBhc3NlbWJseURlc2NyaXB0b3IuZ2V0TWV0aG9kVHJhbnNhY3Rpb25NZXRob2RFbGVtZW50cyhlYjEpOwotCQlMaXN0IG1ldGhvZFBlcm1pc3Npb25MaXN0ID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFBlcm1pc3Npb25NZXRob2RFbGVtZW50cyhlYjEpOwotCQlhc3NlcnRFcXVhbHMobWV0aG9kVHJhbnNhY3Rpb25MaXN0LnNpemUoKSA+IDAsIHRydWUpOwotCQlhc3NlcnRFcXVhbHMobWV0aG9kUGVybWlzc2lvbkxpc3Quc2l6ZSgpID4gMCwgdHJ1ZSk7IAotCQkKLQkJYXNzZW1ibHlEZXNjcmlwdG9yLnJlbW92ZURhdGEoZWIxKTsKLQkJCi0JCW1ldGhvZFRyYW5zYWN0aW9uTGlzdCA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RUcmFuc2FjdGlvbk1ldGhvZEVsZW1lbnRzKGViMSk7Ci0JCW1ldGhvZFBlcm1pc3Npb25MaXN0ID0gYXNzZW1ibHlEZXNjcmlwdG9yLmdldE1ldGhvZFBlcm1pc3Npb25NZXRob2RFbGVtZW50cyhlYjEpOwotCQlhc3NlcnRFcXVhbHMobWV0aG9kVHJhbnNhY3Rpb25MaXN0LnNpemUoKSA9PSAwLCB0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZFBlcm1pc3Npb25MaXN0LnNpemUoKSA9PSAwLCB0cnVlKTsgCi0gICAgICAgIAotICAgIAkKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0NNUEF0dHJpYnV0ZVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0NNUEF0dHJpYnV0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhZmMwZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9DTVBBdHRyaWJ1dGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhSGVscGVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhUmVmRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDTVBBdHRyaWJ1dGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBFamJGYWN0b3J5IEVKQkZBQ1RPUlkgPSBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0JCi0JcHVibGljIENNUEF0dHJpYnV0ZVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgQ01QQXR0cmlidXRlIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotCQotCX0gIAotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRGaWVsZCgpIHsKLQotICAgICAgICBDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRmllbGQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5nZXRGaWVsZCgpOwotICAgIH0gKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0R2V0dGVyTmFtZSgpIHsKLSAgICAgICAgQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0gImF0dHJOYW1lIiA7Ci0gICAgICAgIFN0cmluZyBnZXR0ZXJOYW1lID0gImdldCIgKyBuYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgKG5hbWUubGVuZ3RoKCkgPiAxID8gbmFtZS5zdWJzdHJpbmcoMSkgOiAiIik7Ci0gICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXROYW1lKG5hbWUpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSBvYmpDTVBBdHRyaWJ1dGUuZ2V0R2V0dGVyTmFtZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0dGVyTmFtZSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRPcmlnaW5hdGluZ1R5cGUoKSB7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSBvYmpDTVBBdHRyaWJ1dGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKYXZhSGVscGVycyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmdldE9yaWdpbmF0aW5nVHlwZSgpOwotICAgICAgICBhc3NlcnROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgSmF2YUhlbHBlcnMgbmV3VmFsdWUgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldE9yaWdpbmF0aW5nVHlwZShuZXdWYWx1ZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmdldE9yaWdpbmF0aW5nVHlwZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsbmV3VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2V0dGVyTmFtZSgpIHsKLSAgICAJICBDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9ICJhdHRyTmFtZSIgOwotICAgICAgICAgIFN0cmluZyBzZXR0ZXJOYW1lID0gInNldCIgKyBuYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgKG5hbWUubGVuZ3RoKCkgPiAxID8gbmFtZS5zdWJzdHJpbmcoMSkgOiAiIik7Ci0gICAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldE5hbWUobmFtZSk7Ci0gICAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmdldFNldHRlck5hbWUoKTsKLSAgICAgICAgICBhc3NlcnRFcXVhbHMoc2V0dGVyTmFtZSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNNUEF0dHJpYnV0ZSBvYmpDTVBBdHRyaWJ1dGUgPSBnZXRJbnN0YW5jZSgpOwotCQlTdHJpbmcgbmFtZSA9ICJhdHRyTmFtZSIgOwotICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0TmFtZShuYW1lKTsKLSAgICAgICBKYXZhSGVscGVycyBuZXdWYWx1ZSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS5sYW5nLlN0cmluZyIpOwotICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0RVR5cGUobmV3VmFsdWUpOwotICAgICAgICBKYXZhSGVscGVycyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmdldFR5cGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLHJldFZhbHVlKTsKLSAgICAgICAgCi0JCQotICAgIH0KLQotICAKLQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0NNUkZpZWxkKCkgewotICAgIAlDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAJYm9vbGVhbiByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5pc0NNUkZpZWxkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIG9iakNNUEF0dHJpYnV0ZSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ01SRmllbGQoKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDTVBBdHRyaWJ1dGUuaXNDTVJGaWVsZCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNLZXkoKSB7Ci0gICAgCUVKQkphciBqYXIgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQkphcigpOwotICAgIAlDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgIAllbnRpdHkuc2V0TmFtZSgiRm9vIik7Ci0gICAgCWphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoZW50aXR5KTsKLSAgICAgICAgQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXROYW1lKCJmb29BdHRyIik7Ci0gICAgICAgIGVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpLmFkZChvYmpDTVBBdHRyaWJ1dGUpOwotICAgICAgICBKYXZhSGVscGVycyBuZXdWYWx1ZSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS5sYW5nLlN0cmluZyIpOwotICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0RVR5cGUobmV3VmFsdWUpOwotICAgICAgICAoKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpamFyLmdldEVudGVycHJpc2VCZWFuTmFtZWQoZW50aXR5LmdldE5hbWUoKSkpLmdldENNUEF0dHJpYnV0ZSgpLmFkZChvYmpDTVBBdHRyaWJ1dGUpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgcmV0QXR0cmlidXRlID0gKENNUEF0dHJpYnV0ZSllbnRpdHkuZ2V0Q01QQXR0cmlidXRlKCkuZ2V0KDApOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gcmV0QXR0cmlidXRlLmlzS2V5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIExpc3QgbGlzdCA9IGVudGl0eS5nZXRLZXlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGxpc3QuYWRkKG9iakNNUEF0dHJpYnV0ZSk7Ci0gICAgICAgIHJldFZhbHVlID0gcmV0QXR0cmlidXRlLmlzS2V5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzUHJpbUtleUZpZWxkKCkgewotICAgIAlDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gZW50aXR5LmdldENNUEF0dHJpYnV0ZSgpOwotICAgICAgICBlbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKS5hZGQob2JqQ01QQXR0cmlidXRlKTsKLSAgICAgICAgbGlzdC5hZGQob2JqQ01QQXR0cmlidXRlKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5pc1ByaW1LZXlGaWVsZCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICBlbnRpdHkuc2V0UHJpbUtleUZpZWxkKG9iakNNUEF0dHJpYnV0ZSk7Ci0gICAgICAgIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01QQXR0cmlidXRlLmlzUHJpbUtleUZpZWxkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE9yaWdpbmF0aW5nVHlwZSgpIHsKLQotICAgIAlDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSmF2YUhlbHBlcnMgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5nZXRPcmlnaW5hdGluZ1R5cGUoKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgIEphdmFIZWxwZXJzIG5ld1ZhbHVlID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXRPcmlnaW5hdGluZ1R5cGUobmV3VmFsdWUpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5nZXRPcmlnaW5hdGluZ1R5cGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLG5ld1ZhbHVlKTsKLSAgICB9Ci0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNNUEF0dHJpYnV0ZS5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0RGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24pOwotICAgIH0qLwotCi0gIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNEZXJpdmVkKCkgewotCi0gICAgCSBDTVBBdHRyaWJ1dGUgb2JqQ01QQXR0cmlidXRlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgIGJvb2xlYW4gYUJvb2xlYW4gPSBmYWxzZTsKLSAgICAgICAgIG9iakNNUEF0dHJpYnV0ZS5zZXREZXJpdmVkKGFCb29sZWFuKTsKLSAgICAgICAgIGJvb2xlYW4gcmV0VmFsID0gb2JqQ01QQXR0cmlidXRlLmlzRGVyaXZlZCgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbCxhQm9vbGVhbik7Ci0gICAgICAgICBhQm9vbGVhbiA9IHRydWU7Ci0gICAgICAgICBvYmpDTVBBdHRyaWJ1dGUuc2V0RGVyaXZlZChhQm9vbGVhbik7Ci0gICAgICAgICByZXRWYWwgPSBvYmpDTVBBdHRyaWJ1dGUuaXNEZXJpdmVkKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsLGFCb29sZWFuKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERlcml2ZWQoKSB7Ci0KLSAgICAgICAgQ01QQXR0cmlidXRlIG9iakNNUEF0dHJpYnV0ZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gYUJvb2xlYW4gPSBmYWxzZTsKLSAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldERlcml2ZWQoYUJvb2xlYW4pOwotICAgICAgICBib29sZWFuIHJldFZhbCA9IG9iakNNUEF0dHJpYnV0ZS5pc0Rlcml2ZWQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbCxhQm9vbGVhbik7Ci0gICAgICAgIGFCb29sZWFuID0gdHJ1ZTsKLSAgICAgICAgb2JqQ01QQXR0cmlidXRlLnNldERlcml2ZWQoYUJvb2xlYW4pOwotICAgICAgICByZXRWYWwgPSBvYmpDTVBBdHRyaWJ1dGUuaXNEZXJpdmVkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWwsYUJvb2xlYW4pOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ01QQXR0cmlidXRlVGVzdC5jbGFzcyk7Ci0JfQotCi0gICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0NNUkZpZWxkVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvQ01SRmllbGRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzc0YjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvQ01SRmllbGRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5KYXZhQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNNUkZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotCi1wdWJsaWMgY2xhc3MgQ01SRmllbGRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXByb3RlY3RlZCBFamJGYWN0b3J5IEVKQkZBQ1RPUlkgPSBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0KLQlwcml2YXRlIENNUkZpZWxkIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gRUpCRkFDVE9SWS5jcmVhdGVDTVJGaWVsZCgpOwotCX0KLQkKLSAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCkgewotCSAgIAlDTVJGaWVsZCBvYmpDTVJGaWVsZCA9IGdldEluc3RhbmNlKCk7Ci0JICAgIFN0cmluZyB0eXBlTmFtZSA9ICJ0ZXN0TmFtZSI7Ci0JICAgIG9iakNNUkZpZWxkLnNldENvbGxlY3Rpb25UeXBlTmFtZSh0eXBlTmFtZSk7Ci0JICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotCSAgICByZXRWYWx1ZSA9IG9iakNNUkZpZWxkLmdldENvbGxlY3Rpb25UeXBlTmFtZSgpOwotCSAgICBhc3NlcnRFcXVhbHModHlwZU5hbWUscmV0VmFsdWUpOwotICAgIH0KLQotIAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Q29sbGVjdGlvblR5cGVOYW1lKCkgewotCi0gICAgICAgIENNUkZpZWxkIG9iakNNUkZpZWxkID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gInRlc3ROYW1lIjsKLSAgICAgICAgb2JqQ01SRmllbGQuc2V0Q29sbGVjdGlvblR5cGVOYW1lKHR5cGVOYW1lKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ01SRmllbGQuZ2V0Q29sbGVjdGlvblR5cGVOYW1lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0eXBlTmFtZSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRSb2xlKCkgewotICAgIAkgQ01SRmllbGQgb2JqQ01SRmllbGQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBuZXdSb2xlID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgICAgICBuZXdSb2xlLnNldE5hbWUoIlJvbGUxIik7Ci0gICAgICAgICBvYmpDTVJGaWVsZC5zZXRSb2xlKG5ld1JvbGUpOwotICAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSByZXRWYWx1ZSA9IG9iakNNUkZpZWxkLmdldFJvbGUoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhuZXdSb2xlLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFJvbGUoKSB7Ci0gICAgICAgIENNUkZpZWxkIG9iakNNUkZpZWxkID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBuZXdSb2xlID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgICAgIG5ld1JvbGUuc2V0TmFtZSgiUm9sZTEiKTsKLSAgICAgICAgb2JqQ01SRmllbGQuc2V0Um9sZShuZXdSb2xlKTsKLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSByZXRWYWx1ZSA9IG9iakNNUkZpZWxkLmdldFJvbGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld1JvbGUscmV0VmFsdWUpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENvbGxlY3Rpb25UeXBlKCkgewotCi0gICAgCSBDTVJGaWVsZCBvYmpDTVJGaWVsZCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICBKYXZhQ2xhc3MgbmV3Q29sbGVjdGlvblR5cGUgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YUNsYXNzKCk7Ci0gICAgICAgICBvYmpDTVJGaWVsZC5zZXRDb2xsZWN0aW9uVHlwZShuZXdDb2xsZWN0aW9uVHlwZSk7Ci0gICAgICAgICBKYXZhQ2xhc3MgcmV0VmFsID0gb2JqQ01SRmllbGQuZ2V0Q29sbGVjdGlvblR5cGUoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhuZXdDb2xsZWN0aW9uVHlwZSxyZXRWYWwpOwotICAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRDb2xsZWN0aW9uVHlwZSgpIHsKLQotICAgICAgICBDTVJGaWVsZCBvYmpDTVJGaWVsZCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEphdmFDbGFzcyBuZXdDb2xsZWN0aW9uVHlwZSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhQ2xhc3MoKTsKLSAgICAgICAgb2JqQ01SRmllbGQuc2V0Q29sbGVjdGlvblR5cGUobmV3Q29sbGVjdGlvblR5cGUpOwotICAgICAgICBKYXZhQ2xhc3MgcmV0VmFsID0gb2JqQ01SRmllbGQuZ2V0Q29sbGVjdGlvblR5cGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld0NvbGxlY3Rpb25UeXBlLHJldFZhbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ01SRmllbGRUZXN0LmNsYXNzKTsKLQl9Ci0KLQotICAgCi0gICAgCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0NvbnRhaW5lck1hbmFnZWRFbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9Db250YWluZXJNYW5hZ2VkRW50aXR5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjdlZmY5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0NvbnRhaW5lck1hbmFnZWRFbnRpdHlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5GaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uamF2YS5pbnRlcm5hbC5pbXBsLkphdmFSZWZGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVWZXJzaW9uQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgQ29udGFpbmVyTWFuYWdlZEVudGl0eVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRWpiRmFjdG9yeSBFSkJGQUNUT1JZID0gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpOwotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShDb250YWluZXJNYW5hZ2VkRW50aXR5VGVzdC5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEVKQkZBQ1RPUlkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotCX0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2FkZEtleUF0dHJpYnV0ZU5hbWUoKSB7Ci0gICAgCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUgPSBFSkJGQUNUT1JZLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgICBMaXN0IHBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotICAgICAgICBwZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoY21wQXR0cmlidXRlKTsKLSAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gImF0dHIxIiA7Ci0gICAgICAgIGNtcEF0dHJpYnV0ZS5zZXROYW1lKGF0dHJOYW1lKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5hZGRLZXlBdHRyaWJ1dGVOYW1lKGF0dHJOYW1lKTsKLSAgICAgICAgTGlzdCBrZXlzID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRLZXlBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBrZXlzLmNvbnRhaW5zKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9hZGRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBGaWVsZCBhRmllbGQgPSBKYXZhUmVmRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLmNyZWF0ZUZpZWxkKCk7Ci0gICAgICAgIFN0cmluZyBuYW1lID0iYXR0cjEiIDsKLSAgICAgICAgYUZpZWxkLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5hZGRQZXJzaXN0ZW50QXR0cmlidXRlKGFGaWVsZCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShuYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9hZGRQZXJzaXN0ZW50QXR0cmlidXRlTmFtZSgpIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9ImF0dHIxIiA7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5hZGRQZXJzaXN0ZW50QXR0cmlidXRlTmFtZShuYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKG5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0S2V5QXR0cmlidXRlKCkgewotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlID0gRUpCRkFDVE9SWS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLSAgICAgICAgTGlzdCBwZXJzaXN0ZW50QXR0cmlidXRlcyA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgcGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZSA9ICJhdHRyMSIgOwotICAgICAgICBjbXBBdHRyaWJ1dGUuc2V0TmFtZShhdHRyTmFtZSk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuYWRkS2V5QXR0cmlidXRlTmFtZShhdHRyTmFtZSk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0S2V5QXR0cmlidXRlKGF0dHJOYW1lKTsKLSAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIAotICAgIH0KLQotICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFByaW1hcnlLZXlBdHRyaWJ1dGUoKSB7Ci0KLQkgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICBDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlID0gRUpCRkFDVE9SWS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLSAgICAgIExpc3QgcGVyc2lzdGVudEF0dHJpYnV0ZXMgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0gICAgICBwZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoY21wQXR0cmlidXRlKTsKLSAgICAgIFN0cmluZyBhdHRyTmFtZSA9ICJhdHRyMSIgOwotICAgICAgY21wQXR0cmlidXRlLnNldE5hbWUoYXR0ck5hbWUpOwotICAgICAgQ01QQXR0cmlidXRlIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQcmltYXJ5S2V5QXR0cmlidXRlKCk7Ci0gICAgICBhc3NlcnROb3RTYW1lKHJldFZhbHVlLGNtcEF0dHJpYnV0ZSk7Ci0gICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFByaW1LZXlGaWVsZChjbXBBdHRyaWJ1dGUpOwotICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFByaW1hcnlLZXlBdHRyaWJ1dGUoKTsKLSAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxjbXBBdHRyaWJ1dGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0tleUF0dHJpYnV0ZSgpIHsKLQotICAgIAlDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgY21wQXR0cmlidXRlID0gRUpCRkFDVE9SWS5jcmVhdGVDTVBBdHRyaWJ1dGUoKTsKLSAgICAgICAgTGlzdCBwZXJzaXN0ZW50QXR0cmlidXRlcyA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgcGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIFN0cmluZyBhdHRyTmFtZSA9ICJhdHRyMSIgOwotICAgICAgICBjbXBBdHRyaWJ1dGUuc2V0TmFtZShhdHRyTmFtZSk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzS2V5QXR0cmlidXRlKGNtcEF0dHJpYnV0ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuYWRkS2V5QXR0cmlidXRlTmFtZShhdHRyTmFtZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5pc0tleUF0dHJpYnV0ZShjbXBBdHRyaWJ1dGUpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3JlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGVfMigpIHsKLSAgICAJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIGNtcEF0dHJpYnV0ZSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ01QQXR0cmlidXRlKCk7Ci0gICAgICAgIExpc3QgcGVyc2lzdGVudEF0dHJpYnV0ZXMgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGVzKCk7Ci0gICAgICAgIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLmFkZChjbXBBdHRyaWJ1dGUpOwotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSAiYXR0cjEiIDsKLSAgICAgICAgY21wQXR0cmlidXRlLnNldE5hbWUoYXR0ck5hbWUpOwotICAgICAgICBDTVBBdHRyaWJ1dGUgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoYXR0ck5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnJlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGUoYXR0ck5hbWUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoYXR0ck5hbWUpOwotICAgICAgICBhc3NlcnROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCi0gICAgCSBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgRmllbGQgYUZpZWxkID0gSmF2YVJlZkZhY3RvcnlJbXBsLmdldEFjdGl2ZUZhY3RvcnkoKS5jcmVhdGVGaWVsZCgpOwotICAgICAgICAgU3RyaW5nIG5hbWUgPSJhdHRyMSIgOwotICAgICAgICAgYUZpZWxkLnNldE5hbWUobmFtZSk7Ci0gICAgICAgICBDTVBBdHRyaWJ1dGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmFkZFBlcnNpc3RlbnRBdHRyaWJ1dGUoYUZpZWxkKTsKLSAgICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgICAgICAgCi0gICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShuYW1lKTsKLSAgICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgICAgICAgCi0gICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkucmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZShhRmllbGQpOwotICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgICAKLSAgICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKG5hbWUpOwotICAgICAgICAgYXNzZXJ0TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJpbUtleUZpZWxkKCkgewotCi0gIAkgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENNUEF0dHJpYnV0ZSBjbXBBdHRyaWJ1dGUgPSBFSkJGQUNUT1JZLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgICBMaXN0IHBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlcygpOwotICAgICAgICBwZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoY21wQXR0cmlidXRlKTsKLSAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gImF0dHIxIiA7Ci0gICAgICAgIGNtcEF0dHJpYnV0ZS5zZXROYW1lKGF0dHJOYW1lKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQcmltS2V5RmllbGQoKTsKLSAgICAgICAgYXNzZXJ0Tm90U2FtZShyZXRWYWx1ZSxjbXBBdHRyaWJ1dGUpOwotICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFByaW1LZXlGaWVsZChjbXBBdHRyaWJ1dGUpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UHJpbUtleUZpZWxkKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxjbXBBdHRyaWJ1dGUpOwotICB9Ci0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNWZXJzaW9uMV9YKCkgewotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFZlcnNpb24oQ29udGFpbmVyTWFuYWdlZEVudGl0eS5WRVJTSU9OXzFfWCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzVmVyc2lvbjFfWCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0VmVyc2lvbihDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMl9YKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzVmVyc2lvbjFfWCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNWZXJzaW9uMl9YKCkgewotCi0gICAgCSBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8yX1gpOwotICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzVmVyc2lvbjJfWCgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8xX1gpOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmlzVmVyc2lvbjJfWCgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9saXN0UGVyc2lzdGVudEZpZWxkTmFtZXMoKSB7Ci0KLSAgICAJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIGNtcEF0dHJpYnV0ZTEgPSBFSkJGQUNUT1JZLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgICBTdHJpbmcgYXR0ck5hbWUxID0gImF0dHIxIiA7Ci0gICAgICAgIGNtcEF0dHJpYnV0ZTEuc2V0TmFtZShhdHRyTmFtZTEpOwotICAgICAgICAKLSAgICAgICAgQ01QQXR0cmlidXRlIGNtcEF0dHJpYnV0ZTIgPSBFSkJGQUNUT1JZLmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgICBTdHJpbmcgYXR0ck5hbWUyID0gImF0dHIyIiA7Ci0gICAgICAgIGNtcEF0dHJpYnV0ZTIuc2V0TmFtZShhdHRyTmFtZTIpOwotICAgICAgICAKLSAgICAgICAgTGlzdCBwZXJzaXN0ZW50QXR0cmlidXRlcyA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgcGVyc2lzdGVudEF0dHJpYnV0ZXMuYWRkKGNtcEF0dHJpYnV0ZTEpOwotICAgICAgICBwZXJzaXN0ZW50QXR0cmlidXRlcy5hZGQoY21wQXR0cmlidXRlMik7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmdbXSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5saXN0UGVyc2lzdGVudEZpZWxkTmFtZXMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5sZW5ndGggPT0gMiwgdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygocmV0VmFsdWVbMF09PWF0dHJOYW1lMSB8fCByZXRWYWx1ZVsxXT09YXR0ck5hbWUxKSAsIHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoKHJldFZhbHVlWzBdPT1hdHRyTmFtZTIgfHwgcmV0VmFsdWVbMV09PWF0dHJOYW1lMikgLCB0cnVlKTsKLSAgICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNVbmtub3duUHJpbWFyeUtleSgpIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFByaW1hcnlLZXlOYW1lKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5pc1Vua25vd25QcmltYXJ5S2V5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFByaW1hcnlLZXlOYW1lKCJqYXZhLmxhbmcuT2JqZWN0Iik7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5pc1Vua25vd25QcmltYXJ5S2V5KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgIH0KLSAgCi0gICAgLy8gVE9ETwotICAgLyogcHVibGljIHZvaWQgdGVzdF9tYWtlUHJpbUtleUZpZWxkUHJveHkoKSB7Ci0KLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5tYWtlUHJpbUtleUZpZWxkUHJveHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEFsbEF2YWlsYWJsZVF1ZXJ5TWV0aG9kcygpIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldEFsbEF2YWlsYWJsZVF1ZXJ5TWV0aG9kcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QXZhaWxhYmxlU2VsZWN0UXVlcnlNZXRob2RzKCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkKLSAgICAgICAgICAgICAgICAuZ2V0QXZhaWxhYmxlU2VsZWN0UXVlcnlNZXRob2RzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRBdmFpbGFibGVGaW5kUXVlcnlNZXRob2RzKCkgewotCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0QXZhaWxhYmxlRmluZFF1ZXJ5TWV0aG9kcygpOwotICAgIH0gKi8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q01QVmVyc2lvbklEKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8xX1gpOwotICAgICAgICBpbnQgcmV0VmFsdWUgPSAwOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0Q01QVmVyc2lvbklEKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMV8xX0lELCByZXRWYWx1ZSk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuc2V0VmVyc2lvbihDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMl9YKTsKLSAgICAgICAgCi0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRDTVBWZXJzaW9uSUQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzBfSUQsIHJldFZhbHVlKTsKLSAgICAgICAgCi0gICAgfQotICAKLSAgIAotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldENNUkZpZWxkcygpIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldENNUkZpZWxkcygpOwotICAgIH0KLQotICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRSb2xlcygpIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFJvbGVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRSb2xlKCkgewotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAgICAgU3RyaW5nIHJvbGVOYW1lID0gInJvbGUxIjsKLSAgICAgICAgcm9sZS5zZXROYW1lKHJvbGVOYW1lKTsKLSAgICAgICAgQ29tbW9uUmVsYXRpb25zaGlwUm9sZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRSb2xlKHJvbGVOYW1lKTsKLSAgICAgICAgYXNzZXJ0TnVsbChyZXRWYWx1ZSk7Ci0gICAgICAgIG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0Um9sZXMoKS5hZGQocm9sZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRSb2xlKHJvbGVOYW1lKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RmlsdGVyZWRGZWF0dXJlcygpIHsKLQotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFSkJFeHRlbnNpb25GaWx0ZXIgYUZpbHRlciA9IG51bGw7Ci0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0RmlsdGVyZWRGZWF0dXJlcyhhRmlsdGVyKTsKLSAgICB9ICovCi0KLSAgICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZyBhTmFtZSA9ICIiOwotICAgIENNUEF0dHJpYnV0ZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoYU5hbWUpOwotfSovCi0KLSAgICAKLSAgICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnNpb24oKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRWZXJzaW9uKCk7Ci19Ci0KLXB1YmxpYyB2b2lkIHRlc3Rfc2V0VmVyc2lvbigpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgU3RyaW5nIG5ld1ZlcnNpb24gPSAiIjsKLSAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LnNldFZlcnNpb24obmV3VmVyc2lvbik7Ci19Ki8KLQotLyogcHVibGljIHZvaWQgdGVzdF9nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRBYnN0cmFjdFNjaGVtYU5hbWUoKTsKLX0KLQotcHVibGljIHZvaWQgdGVzdF9zZXRBYnN0cmFjdFNjaGVtYU5hbWUoKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIFN0cmluZyBuZXdBYnN0cmFjdFNjaGVtYU5hbWUgPSAiIjsKLSAgICBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5Ci0gICAgICAgICAgICAuc2V0QWJzdHJhY3RTY2hlbWFOYW1lKG5ld0Fic3RyYWN0U2NoZW1hTmFtZSk7Ci19Ki8KLQotLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZXMoKTsKLX0qLwotCi0vKnB1YmxpYyB2b2lkIHRlc3RfZ2V0S2V5QXR0cmlidXRlcygpIHsKLQotICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRLZXlBdHRyaWJ1dGVzKCk7Ci19Ki8KLQotLyogcHVibGljIHZvaWQgdGVzdF9nZXRRdWVyaWVzKCkgewotCi0gICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgcmV0VmFsdWUgPSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5LmdldFF1ZXJpZXMoKTsKLX0qLwotCi0vKiAgcHVibGljIHZvaWQgdGVzdF9nZXRDTVBBdHRyaWJ1dGUoKSB7Ci0KLSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICByZXRWYWx1ZSA9IG9iakNvbnRhaW5lck1hbmFnZWRFbnRpdHkuZ2V0Q01QQXR0cmlidXRlKCk7Ci19Ki8KLQotLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJpbUtleUZpZWxkKCkgewotCi0gICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBvYmpDb250YWluZXJNYW5hZ2VkRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICBDTVBBdHRyaWJ1dGUgcmV0VmFsdWUgPSBudWxsOwotICAgIHJldFZhbHVlID0gb2JqQ29udGFpbmVyTWFuYWdlZEVudGl0eS5nZXRQcmltS2V5RmllbGQoKTsKLX0qLwotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FSkJKYXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FSkJKYXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGYyOTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRUpCSmFyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFSZWZGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5Db21tb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5FamJSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWVzc2FnZURyaXZlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEVKQkphclRlc3QgZXh0ZW5kcyAgRWpiRU1GVGVzdEJhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tbW9uRmFjdG9yeSBDT01NT05GQUNUT1JZID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotCXB1YmxpYyBFSkJKYXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQlwcml2YXRlIEVKQkphciBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGdldEVqYkZhY3RvcnkoKS5jcmVhdGVFSkJKYXIoKTsKLQl9Ci0gICAgcHVibGljIHZvaWQgdGVzdF9FSkJKYXIoKSB7Ci0gICAgICAgIEVKQkphciB0bXBFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcEVKQkphcik7Ci0gICAgfQotICAgIAotICAgCi0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zQ29udGFpbmVyTWFuYWdlZEJlYW5zKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24pOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5jb250YWluc0NvbnRhaW5lck1hbmFnZWRCZWFucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKGVudGl0eSk7Ci0gICAgICAgIAotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5jb250YWluc0NvbnRhaW5lck1hbmFnZWRCZWFucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jb250YWluc1NlY3VyaXR5Um9sZSgpIHsKLQotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRBc3NlbWJseURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgc2VjdXJpdHlSb2xlTmFtZSA9ICJ0ZXN0Um9sZSI7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuY29udGFpbnNTZWN1cml0eVJvbGUoc2VjdXJpdHlSb2xlTmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGU9IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFLmdldENvbW1vbkZhY3RvcnkoKS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLQkJc2VjdXJpdHlSb2xlLnNldFJvbGVOYW1lKHNlY3VyaXR5Um9sZU5hbWUpOwotCQlkZXNjcmlwdG9yLmdldFNlY3VyaXR5Um9sZXMoKS5hZGQoc2VjdXJpdHlSb2xlKTsKLQkJcmV0VmFsdWUgPSBvYmpFSkJKYXIuY29udGFpbnNTZWN1cml0eVJvbGUoc2VjdXJpdHlSb2xlTmFtZSkgOwotCQlhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRCZWFuTWFuYWdlZEJlYW5zKCkgewotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRCZWFuTWFuYWdlZEJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTAsdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBFbnRpdHkgZW50aXR5ID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVudGl0eSgpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKGVudGl0eSk7Ci0gICAgICAgIAotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRCZWFuTWFuYWdlZEJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTEsdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5nZXQoMCksZW50aXR5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENvbnRhaW5lck1hbmFnZWRCZWFucygpIHsKLSAgICAJCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24pOwotICAgICAgICAKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldENvbnRhaW5lck1hbmFnZWRCZWFucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0wLHRydWUpOwotICAgICAgICAKLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKGVudGl0eSk7Ci0gICAgICAgIAotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRDb250YWluZXJNYW5hZ2VkQmVhbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MSx0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmdldCgwKSxlbnRpdHkpOwotICAgIH0KLSAgICAKLSAgIAotICAgIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFSkIxMUNvbnRhaW5lck1hbmFnZWRCZWFucygpIHsKLQotICAgIAkgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgICAgb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uKTsKLSAgICAgICAgICAKLSAgICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFSkIxMUNvbnRhaW5lck1hbmFnZWRCZWFucygpOwotICAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTAsdHJ1ZSk7Ci0gICAgICAgICAgCi0gICAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkxID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLSAgICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKGVudGl0eTEpOwotICAgICAgICAgIGVudGl0eTEuc2V0VmVyc2lvbihDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMV9YKTsKLSAgICAgICAgICAKLSAgICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eTIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoZW50aXR5Mik7Ci0gICAgICAgICAgZW50aXR5Mi5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8yX1gpOwotICAgICAgICAgIAotICAgICAgICAgIAotICAgICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVKQjExQ29udGFpbmVyTWFuYWdlZEJlYW5zKCk7Ci0gICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MSx0cnVlKTsKLSAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuZ2V0KDApLGVudGl0eTEpOwotICAgIH0KLSAgICAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVKQjIwQ29udGFpbmVyTWFuYWdlZEJlYW5zKCkgewotCi0gIAkgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgU2Vzc2lvbiBzZXNzaW9uID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbik7Ci0gICAgICAKLSAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RUpCMjBDb250YWluZXJNYW5hZ2VkQmVhbnMoKTsKLSAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTAsdHJ1ZSk7Ci0gICAgICAKLSAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5MSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKGVudGl0eTEpOwotICAgICAgZW50aXR5MS5zZXRWZXJzaW9uKENvbnRhaW5lck1hbmFnZWRFbnRpdHkuVkVSU0lPTl8xX1gpOwotICAgICAgCi0gICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eTIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChlbnRpdHkyKTsKLSAgICAgIGVudGl0eTIuc2V0VmVyc2lvbihDb250YWluZXJNYW5hZ2VkRW50aXR5LlZFUlNJT05fMl9YKTsKLSAgICAgIAotICAgICAgCi0gICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFSkIyMENvbnRhaW5lck1hbmFnZWRCZWFucygpOwotICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MSx0cnVlKTsKLSAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5nZXQoMCksZW50aXR5Mik7Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXNzYWdlRHJpdmVuQmVhbnMoKSB7Ci0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXNzaW9uIHNlc3Npb24gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24pOwotICAgICAgICAKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldE1lc3NhZ2VEcml2ZW5CZWFucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0wLHRydWUpOwotICAgICAgICAKLSAgICAgICAgTWVzc2FnZURyaXZlbiBtZXNzYWdlRHJpdmVuID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZU1lc3NhZ2VEcml2ZW4oKTsKLSAgICAgICAgb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChtZXNzYWdlRHJpdmVuKTsKLSAgICAgICAgCi0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldE1lc3NhZ2VEcml2ZW5CZWFucygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpPT0xLHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuZ2V0KDApLG1lc3NhZ2VEcml2ZW4pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RWpiUmVsYXRpb25zKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSZWxhdGlvbnNoaXBzIHJlbGF0aW9uc2hpcHMgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlUmVsYXRpb25zaGlwcygpOwotICAgICAgICBvYmpFSkJKYXIuc2V0UmVsYXRpb25zaGlwTGlzdChyZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgcmVsYXRpb25zaGlwcy5zZXRFamJKYXIob2JqRUpCSmFyKTsKLSAgICAgICAgRUxpc3QgZWpiUmVsYXRpb25zID0gcmVsYXRpb25zaGlwcy5nZXRFamJSZWxhdGlvbnMoKTsKLSAgICAgICAgTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVqYlJlbGF0aW9ucygpOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGVqYlJlbGF0aW9ucyxyZXRWYWx1ZSk7Ci0gICAgfQotICAgIAotCi0gICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYoKSB7Ci0gICAgCQotICAgIAlFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRBc3NlbWJseURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgICAKLSAgICAJRWpiUmVmIGVqYlJlZiA9IENPTU1PTkZBQ1RPUlkuY3JlYXRlRWpiUmVmKCk7Ci0gICAgCVNlc3Npb24gc2Vzc2lvbjEgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTEgPSAiTmFtZTEiOwotICAgIAlzZXNzaW9uMS5zZXROYW1lKG5hbWUxKTsKLSAgICAJCi0gICAgCVNlc3Npb24gc2Vzc2lvbjIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTIgPSAiTmFtZTIiOwotICAgIAlzZXNzaW9uMi5zZXROYW1lKG5hbWUyKTsKLSAgICAJCi0gICAgCWVqYlJlZi5zZXRMaW5rKG5hbWUyKTsKLSAgICAJZWpiUmVmLnNldE5hbWUoIkVqYlJlZl8iICsgbmFtZTIpOwotICAgIAkKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMSk7Ci0gICAgCW9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbjIpOwotICAgIAkKLSAgICAgICAgRW50ZXJwcmlzZUJlYW4gcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RW50ZXJwaXNlQmVhbkZyb21SZWYoZWpiUmVmKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHNlc3Npb24yLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVudGVycHJpc2VCZWFuTmFtZWQoKSB7Ci0KLSAgICAJRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvcigpOwotICAgICAgICBvYmpFSkJKYXIuc2V0QXNzZW1ibHlEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICAgCi0gICAgCVNlc3Npb24gc2Vzc2lvbjEgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTEgPSAiTmFtZTEiOwotICAgIAlzZXNzaW9uMS5zZXROYW1lKG5hbWUxKTsKLSAgICAJCi0gICAgCVNlc3Npb24gc2Vzc2lvbjIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTIgPSAiTmFtZTIiOwotICAgIAlzZXNzaW9uMi5zZXROYW1lKG5hbWUyKTsKLSAgICAJCi0gICAgICAgIAkKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMSk7Ci0gICAgCW9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbjIpOwotICAgIAkKLSAgICAgICAgRW50ZXJwcmlzZUJlYW4gcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5OYW1lZChuYW1lMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZXNzaW9uMixyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFbnRlcnByaXNlQmVhbnNXaXRoUmVmZXJlbmNlKCkgewotCi0gICAgCUVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVBc3NlbWJseURlc2NyaXB0b3IoKTsKLSAgICAgICAgb2JqRUpCSmFyLnNldEFzc2VtYmx5RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgIAotICAgIAlTZXNzaW9uIHNlc3Npb24xID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAJU3RyaW5nIG5hbWUxID0gIk5hbWUxIjsKLSAgICAJc2Vzc2lvbjEuc2V0TmFtZShuYW1lMSk7Ci0gICAgCQotICAgIAlTZXNzaW9uIHNlc3Npb24yID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAJU3RyaW5nIG5hbWUyID0gIk5hbWUyIjsKLSAgICAJc2Vzc2lvbjIuc2V0TmFtZShuYW1lMik7Ci0gICAgCQotICAgICAgICAJCi0gICAgCW9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbjEpOwotICAgIAlvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKHNlc3Npb24yKTsKLSAgICAJCi0gICAgCUphdmFDbGFzcyBqYXZhQ2xhc3MxID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLmxhbmcuU3RyaW5nIikgOwotICAgIAlKYXZhQ2xhc3MgamF2YUNsYXNzMiA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS51dGlsLkxpc3QiKSA7Ci0gICAgCQotICAgIAlzZXNzaW9uMS5zZXRFamJDbGFzcyhqYXZhQ2xhc3MxKTsKLSAgICAJc2Vzc2lvbjIuc2V0RWpiQ2xhc3MoamF2YUNsYXNzMik7Ci0gICAgCQotICAgICAgICAgamF2YS51dGlsLkxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zV2l0aFJlZmVyZW5jZShqYXZhQ2xhc3MxKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTEsIHRydWUpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmNvbnRhaW5zKHNlc3Npb24xKSwgdHJ1ZSk7Ci0gICAgICAgICAKLSAgICAgICAgIHNlc3Npb24yLnNldEhvbWVJbnRlcmZhY2UoamF2YUNsYXNzMSk7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnNXaXRoUmVmZXJlbmNlKGphdmFDbGFzczEpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MiwgdHJ1ZSk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuY29udGFpbnMoc2Vzc2lvbjEpLCB0cnVlKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5jb250YWlucyhzZXNzaW9uMiksIHRydWUpOwotICAgICAgICAgCi0gICAgfQotICAgIAotICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RW50ZXJwcmlzZUJlYW5XaXRoUmVmZXJlbmNlKCkgewotICAgIAkKLSAgICAJRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvcigpOwotICAgICAgICBvYmpFSkJKYXIuc2V0QXNzZW1ibHlEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICAgCi0gICAgCVNlc3Npb24gc2Vzc2lvbjEgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTEgPSAiTmFtZTEiOwotICAgIAlzZXNzaW9uMS5zZXROYW1lKG5hbWUxKTsKLSAgICAJCi0gICAgCVNlc3Npb24gc2Vzc2lvbjIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgIAlTdHJpbmcgbmFtZTIgPSAiTmFtZTIiOwotICAgIAlzZXNzaW9uMi5zZXROYW1lKG5hbWUyKTsKLSAgICAJCi0gICAgICAgIAkKLSAgICAJb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpLmFkZChzZXNzaW9uMSk7Ci0gICAgCW9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbjIpOwotICAgIAkKLSAgICAJSmF2YUNsYXNzIGphdmFDbGFzczEgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEubGFuZy5TdHJpbmciKSA7Ci0gICAgCQotICAgIAlzZXNzaW9uMS5zZXRFamJDbGFzcyhqYXZhQ2xhc3MxKTsKLSAgICAJc2Vzc2lvbjIuc2V0RWpiQ2xhc3MoamF2YUNsYXNzMSk7Ci0gICAgCQotICAgIAlFbnRlcnByaXNlQmVhbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFuV2l0aFJlZmVyZW5jZShqYXZhQ2xhc3MxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCBzZXNzaW9uMSk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2Vzc2lvbkJlYW5zKCkgeyAgICAgCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXNzYWdlRHJpdmVuIG1lc3NhZ2VEcml2ZW4gPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlTWVzc2FnZURyaXZlbigpOwotICAgICAgICBvYmpFSkJKYXIuZ2V0RW50ZXJwcmlzZUJlYW5zKCkuYWRkKG1lc3NhZ2VEcml2ZW4pOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRTZXNzaW9uQmVhbnMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKT09MCx0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIFNlc3Npb24gc2Vzc2lvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIG9iakVKQkphci5nZXRFbnRlcnByaXNlQmVhbnMoKS5hZGQoc2Vzc2lvbik7Ci0gICAgICAgIAotICAgICAgICAKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0U2Vzc2lvbkJlYW5zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5zaXplKCk9PTEsdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZS5jb250YWlucyhzZXNzaW9uKSwgdHJ1ZSk7Ci0gICAgICAgIAotICAgIH0KLQotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X3JlbmFtZVNlY3VyaXR5Um9sZSgpIHsKLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGphdmEubGFuZy5TdHJpbmcgZXhpc3RpbmdSb2xlTmFtZSA9ICIiOwotICAgICAgICBqYXZhLmxhbmcuU3RyaW5nIG5ld1JvbGVOYW1lID0gIiI7Ci0gICAgICAgIG9iakVKQkphci5yZW5hbWVTZWN1cml0eVJvbGUoZXhpc3RpbmdSb2xlTmFtZSwgbmV3Um9sZU5hbWUpOwotICAgIH0gKi8KLQotICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldEVqYkNsaWVudEphcigpIHsKLQotICAgICAgICBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVqYkNsaWVudEphcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RWpiQ2xpZW50SmFyKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3RWpiQ2xpZW50SmFyID0gIiI7Ci0gICAgICAgIG9iakVKQkphci5zZXRFamJDbGllbnRKYXIobmV3RWpiQ2xpZW50SmFyKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRWZXJzaW9uKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0VmVyc2lvbigpOwotICAgIH0qLwotICAgIAotICAgCi0gICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFZlcnNpb25JRCgpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgCWluaXQoKTsKLSAgICAJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgICAgICBERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJc2V0TW9kdWxlVHlwZShFSkIpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLSAgICAgICAgaW50IHJldFZhbHVlID0gMDsKLSAgICAgICAgcmV0VmFsdWUgPSBERC5nZXRFSkJKYXIoKS5nZXRWZXJzaW9uSUQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLEoyRUVWZXJzaW9uQ29uc3RhbnRzLkVKQl8yXzFfSUQpOwotICAgICAgICAKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXJldFZhbHVlID0gREQuZ2V0RUpCSmFyKCkuZ2V0VmVyc2lvbklEKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxKMkVFVmVyc2lvbkNvbnN0YW50cy5FSkJfMl8wX0lEKTsKLQkgICAgCi0JICAgIERELnNldFZlcnNpb25JRChKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfMl9JRCk7Ci0JCXNldFZlcnNpb24oVkVSU0lPTl8xXzIpOwotCQlyZXRWYWx1ZSA9IERELmdldEVKQkphcigpLmdldFZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuRUpCXzFfMV9JRCk7CSAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEoyRUVWZXJzaW9uSUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgIAlpbml0KCk7Ci0gICAgCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV80X0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfNCk7Ci0JCXNldE1vZHVsZVR5cGUoRUpCKTsKLQkJcG9wdWxhdGVSb290KERELmdldFJvb3RPYmplY3QoKSk7Ci0gICAgICAgIGludCByZXRWYWx1ZSA9IDA7Ci0gICAgICAgIHJldFZhbHVlID0gREQuZ2V0RUpCSmFyKCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotICAgICAgICAKLSAgICAgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMyk7Ci0JCXJldFZhbHVlID0gREQuZ2V0RUpCSmFyKCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotCSAgICAKLQkgICAgREQuc2V0VmVyc2lvbklEKEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKTsKLQkJc2V0VmVyc2lvbihWRVJTSU9OXzFfMik7Ci0JCXJldFZhbHVlID0gREQuZ2V0RUpCSmFyKCkuZ2V0SjJFRVZlcnNpb25JRCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzJfSUQpOwotICAgIH0KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9zZXRWZXJzaW9uKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3VmVyc2lvbiA9ICIiOwotICAgICAgICBvYmpFSkJKYXIuc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRBc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotICAgIH0KLQotIAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRBc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBuZXdBc3NlbWJseURlc2NyaXB0b3IgPSBudWxsOwotICAgICAgICBvYmpFSkJKYXIuc2V0QXNzZW1ibHlEZXNjcmlwdG9yKG5ld0Fzc2VtYmx5RGVzY3JpcHRvcik7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RW50ZXJwcmlzZUJlYW5zKCkgewotCi0gICAgICAgIEVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVudGVycHJpc2VCZWFucygpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFJlbGF0aW9uc2hpcExpc3QoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlbGF0aW9uc2hpcHMgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRSZWxhdGlvbnNoaXBMaXN0KCk7Ci0gICAgfQotCi0gCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFJlbGF0aW9uc2hpcExpc3QoKSB7Ci0KLSAgICAgICAgRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlbGF0aW9uc2hpcHMgbmV3UmVsYXRpb25zaGlwTGlzdCA9IG51bGw7Ci0gICAgICAgIG9iakVKQkphci5zZXRSZWxhdGlvbnNoaXBMaXN0KG5ld1JlbGF0aW9uc2hpcExpc3QpOwotICAgIH0KLSovCi0gICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RUpCUmVsYXRpb24oKSB7Ci0gICAgCSBFSkJKYXIgb2JqRUpCSmFyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgIFJlbGF0aW9uc2hpcHMgcmVsYXRpb25zaGlwcyA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVSZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgICBvYmpFSkJKYXIuc2V0UmVsYXRpb25zaGlwTGlzdChyZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgIHJlbGF0aW9uc2hpcHMuc2V0RWpiSmFyKG9iakVKQkphcik7Ci0gICAgICAgCi0gICAgICAgICBFSkJSZWxhdGlvbiByZWxhdGlvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVFSkJSZWxhdGlvbigpOwotICAgICAgICAgU3RyaW5nIGFSZWxhdGlvbk5hbWUgPSAiUmVsYXRpb24xIjsKLSAgICAgICAgIHJlbGF0aW9uLnNldE5hbWUoYVJlbGF0aW9uTmFtZSk7Ci0gICAgICAgICAKLSAgICAgICAgIHJlbGF0aW9uc2hpcHMuZ2V0RWpiUmVsYXRpb25zKCkuYWRkKHJlbGF0aW9uKTsKLSAgICAgICAgIEVKQlJlbGF0aW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqRUpCSmFyLmdldEVKQlJlbGF0aW9uKGFSZWxhdGlvbk5hbWUpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCByZWxhdGlvbik7Ci0gICAgfQotICAgIAotICAgCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldEVKQlJlbGF0aW9uc0ZvclNvdXJjZSgpIHsKLSAgICAJCi0gICAgCUVKQkphciBvYmpFSkJKYXIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSZWxhdGlvbnNoaXBzIHJlbGF0aW9uc2hpcHMgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlUmVsYXRpb25zaGlwcygpOwotICAgICAgICBvYmpFSkJKYXIuc2V0UmVsYXRpb25zaGlwTGlzdChyZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgcmVsYXRpb25zaGlwcy5zZXRFamJKYXIob2JqRUpCSmFyKTsKLSAgICAgIAotICAgICAgICBFSkJSZWxhdGlvbiByZWxhdGlvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVFSkJSZWxhdGlvbigpOwotICAgICAgICBTdHJpbmcgYVJlbGF0aW9uTmFtZSA9ICJSZWxhdGlvbjEiOwotICAgICAgICByZWxhdGlvbi5zZXROYW1lKGFSZWxhdGlvbk5hbWUpOwotICAgICAgICAKLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgICAgIAotICAgIAlMaXN0IHJvbGVMaXN0ID0gcmVsYXRpb24uZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUxKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUyKTsKLSAgICAgICAgCi0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5ID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSB0YXJnZXRFbnRpdHkgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICAKLQkgICAgUm9sZVNvdXJjZSByb2xlU291cmNlID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVJvbGVTb3VyY2UoKTsKLQkgICAgcm9sZVNvdXJjZS5zZXRFbnRpdHlCZWFuKGVudGl0eSk7Ci0JICAgIHJvbGVTb3VyY2Uuc2V0Um9sZShyb2xlMSk7Ci0JICAgIHJvbGUxLnNldFNvdXJjZShyb2xlU291cmNlKTsKLQkgICAgCi0JICAgIFJvbGVTb3VyY2UgdGFyZ2V0Um9sZVNvdXJjZSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVSb2xlU291cmNlKCk7Ci0JICAgIHRhcmdldFJvbGVTb3VyY2Uuc2V0RW50aXR5QmVhbih0YXJnZXRFbnRpdHkpOwotCSAgICB0YXJnZXRSb2xlU291cmNlLnNldFJvbGUocm9sZTIpOwotCSAgICByb2xlMi5zZXRTb3VyY2UodGFyZ2V0Um9sZVNvdXJjZSk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJKYXIuZ2V0RUpCUmVsYXRpb25zRm9yU291cmNlKGVudGl0eSk7Ci0gICAgICAgIAotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLnNpemUoKSwxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmNvbnRhaW5zKHJlbGF0aW9uKSx0cnVlKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRFSkJSZWxhdGlvbnNoaXBSb2xlc0ZvclR5cGUoKSB7Ci0KLSAgICAJRUpCSmFyIG9iakVKQkphciA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlbGF0aW9uc2hpcHMgcmVsYXRpb25zaGlwcyA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVSZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgIG9iakVKQkphci5zZXRSZWxhdGlvbnNoaXBMaXN0KHJlbGF0aW9uc2hpcHMpOwotICAgICAgICByZWxhdGlvbnNoaXBzLnNldEVqYkphcihvYmpFSkJKYXIpOwotICAgICAgCi0gICAgICAgIEVKQlJlbGF0aW9uIHJlbGF0aW9uID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVKQlJlbGF0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBhUmVsYXRpb25OYW1lID0gIlJlbGF0aW9uMSI7Ci0gICAgICAgIHJlbGF0aW9uLnNldE5hbWUoYVJlbGF0aW9uTmFtZSk7Ci0gICAgICAgIAotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUxID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgICAgCi0gICAgCUxpc3Qgcm9sZUxpc3QgPSByZWxhdGlvbi5nZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTEpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTIpOwotICAgICAgICAKLSAgICAgICAgQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHkgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IHRhcmdldEVudGl0eSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVDb250YWluZXJNYW5hZ2VkRW50aXR5KCk7Ci0gICAgICAgIAotCSAgICBSb2xlU291cmNlIHJvbGVTb3VyY2UgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlUm9sZVNvdXJjZSgpOwotCSAgICByb2xlU291cmNlLnNldEVudGl0eUJlYW4oZW50aXR5KTsKLQkgICAgcm9sZVNvdXJjZS5zZXRSb2xlKHJvbGUxKTsKLQkgICAgcm9sZTEuc2V0U291cmNlKHJvbGVTb3VyY2UpOwotCSAgICAKLQkgICAgUm9sZVNvdXJjZSB0YXJnZXRSb2xlU291cmNlID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZVJvbGVTb3VyY2UoKTsKLQkgICAgdGFyZ2V0Um9sZVNvdXJjZS5zZXRFbnRpdHlCZWFuKHRhcmdldEVudGl0eSk7Ci0JICAgIHRhcmdldFJvbGVTb3VyY2Uuc2V0Um9sZShyb2xlMik7Ci0JICAgIHJvbGUyLnNldFNvdXJjZSh0YXJnZXRSb2xlU291cmNlKTsKLSAgICAgICAgCi0gICAgICAgIExpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQkphci5nZXRFSkJSZWxhdGlvbnNoaXBSb2xlc0ZvclR5cGUodGFyZ2V0RW50aXR5KTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuc2l6ZSgpLDEpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUuY29udGFpbnMocmVsYXRpb24pLHRydWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfRUpCSmFyIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2NvbnRhaW5zQ29udGFpbmVyTWFuYWdlZEJlYW5zIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2NvbnRhaW5zU2VjdXJpdHlSb2xlIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEJlYW5NYW5hZ2VkQmVhbnMiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0Q29udGFpbmVyTWFuYWdlZEJlYW5zIikpOwotCQkKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRFSkIxMUNvbnRhaW5lck1hbmFnZWRCZWFucyIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRFSkIyMENvbnRhaW5lck1hbmFnZWRCZWFucyIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRNZXNzYWdlRHJpdmVuQmVhbnMiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0RWpiUmVsYXRpb25zIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEVudGVycGlzZUJlYW5Gcm9tUmVmIikpOwotCQkKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRFbnRlcnByaXNlQmVhbk5hbWVkIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEVudGVycHJpc2VCZWFuc1dpdGhSZWZlcmVuY2UiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0RW50ZXJwcmlzZUJlYW5XaXRoUmVmZXJlbmNlIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldFNlc3Npb25CZWFucyIpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRUpCSmFyVGVzdCgidGVzdF9nZXRWZXJzaW9uSUQiKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEoyRUVWZXJzaW9uSUQiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0RUpCUmVsYXRpb24iKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEVKQkphclRlc3QoInRlc3RfZ2V0RUpCUmVsYXRpb25zRm9yU291cmNlIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFSkJKYXJUZXN0KCJ0ZXN0X2dldEVKQlJlbGF0aW9uc2hpcFJvbGVzRm9yVHlwZSIpKTsKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VKQlJlbGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRUpCUmVsYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Y2NlYzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRUpCUmVsYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBFSkJSZWxhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIEVqYkZhY3RvcnkgRUpCRkFDVE9SWSA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLQlwcml2YXRlIEVKQlJlbGF0aW9uIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlRUpCUmVsYXRpb24oKTsKLQl9Ci0JIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRUpCUmVsYXRpb25UZXN0LmNsYXNzKTsKLQl9Ci0JIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfRUpCUmVsYXRpb24oKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb24gdG1wRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcEVKQlJlbGF0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NvbnRhaW5zUmVsYXRpb25zaGlwUm9sZSgpIHsKLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMSA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUyID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uIG9iakVKQlJlbGF0aW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmNvbnRhaW5zUmVsYXRpb25zaGlwUm9sZShyb2xlMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSxyZXRWYWx1ZSk7Ci0gICAgICAgIExpc3Qgcm9sZUxpc3QgPSBvYmpFSkJSZWxhdGlvbi5nZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTEpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTIpOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmNvbnRhaW5zUmVsYXRpb25zaGlwUm9sZShyb2xlMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyh0cnVlLHJldFZhbHVlKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Rmlyc3RSb2xlKCkgewotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUxID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTIgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMaXN0IHJvbGVMaXN0ID0gb2JqRUpCUmVsYXRpb24uZ2V0UmVsYXRpb25zaGlwUm9sZXMoKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUxKTsKLSAgICAgICAgcm9sZUxpc3QuYWRkKHJvbGUyKTsKLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb24uZ2V0Rmlyc3RSb2xlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyb2xlMSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRPcHBvc2l0ZVJvbGUoKSB7Ci0gICAgCQotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUxID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTIgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9wcFJvbGUgPSBvYmpFSkJSZWxhdGlvbi5nZXRPcHBvc2l0ZVJvbGUocm9sZTEpOwotICAgICAgICBhc3NlcnROdWxsKG9wcFJvbGUpOwotICAgICAgICAKLSAgICAgICAgTGlzdCByb2xlTGlzdCA9IG9iakVKQlJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMSk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMik7Ci0gICAgICAgIAotICAgICAgICBvcHBSb2xlID0gb2JqRUpCUmVsYXRpb24uZ2V0T3Bwb3NpdGVSb2xlKHJvbGUxKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJvbGUyLG9wcFJvbGUpOwotICAgICAgICAKLSAgICAgICAgb3BwUm9sZSA9IG9iakVKQlJlbGF0aW9uLmdldE9wcG9zaXRlUm9sZShyb2xlMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyb2xlMSxvcHBSb2xlKTsKLSAgICB9Ci0KLSAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRTZWNvbmRSb2xlKCkgewotCi0gICAgCUVKQlJlbGF0aW9uc2hpcFJvbGUgcm9sZTEgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMiA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIExpc3Qgcm9sZUxpc3QgPSBvYmpFSkJSZWxhdGlvbi5nZXRSZWxhdGlvbnNoaXBSb2xlcygpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTEpOwotICAgICAgICByb2xlTGlzdC5hZGQocm9sZTIpOwotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbi5nZXRTZWNvbmRSb2xlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyb2xlMixyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRGb3dhcmQoKSB7Ci0KLSAgICAJRUpCUmVsYXRpb25zaGlwUm9sZSByb2xlMSA9IEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotICAgIAlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUyID0gRUpCRkFDVE9SWS5jcmVhdGVFSkJSZWxhdGlvbnNoaXBSb2xlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uIG9iakVKQlJlbGF0aW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTGlzdCByb2xlTGlzdCA9IG9iakVKQlJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMSk7Ci0gICAgICAgIHJvbGVMaXN0LmFkZChyb2xlMik7Ci0gICAgICAgIAotICAgICAgICBvYmpFSkJSZWxhdGlvbi5zZXRGb3dhcmQocm9sZTIpOwotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbi5nZXRGaXJzdFJvbGUoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJvbGUyLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbi5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3RGVzY3JpcHRpb24gPSAiIjsKLSAgICAgICAgb2JqRUpCUmVsYXRpb24uc2V0RGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24pOwotICAgIH0qLwotCi0gIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TmFtZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldE5hbWUoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3TmFtZSA9ICIiOwotICAgICAgICBvYmpFSkJSZWxhdGlvbi5zZXROYW1lKG5ld05hbWUpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFJlbGF0aW9uc2hpcExpc3QoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb24gb2JqRUpCUmVsYXRpb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSZWxhdGlvbnNoaXBzIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbi5nZXRSZWxhdGlvbnNoaXBMaXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRSZWxhdGlvbnNoaXBMaXN0KCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uIG9iakVKQlJlbGF0aW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUmVsYXRpb25zaGlwcyBuZXdSZWxhdGlvbnNoaXBMaXN0ID0gbnVsbDsKLSAgICAgICAgb2JqRUpCUmVsYXRpb24uc2V0UmVsYXRpb25zaGlwTGlzdChuZXdSZWxhdGlvbnNoaXBMaXN0KTsKLSAgICB9Ci0KLSAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9ucygpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbiBvYmpFSkJSZWxhdGlvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbi5nZXREZXNjcmlwdGlvbnMoKTsKLSAgICB9Ki8KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VKQlJlbGF0aW9uc2hpcFJvbGVUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FSkJSZWxhdGlvbnNoaXBSb2xlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzJjMDU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VKQlJlbGF0aW9uc2hpcFJvbGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01SRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZWxhdGlvbnNoaXBSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NdWx0aXBsaWNpdHlLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Sb2xlU291cmNlOwotCi1wdWJsaWMgY2xhc3MgRUpCUmVsYXRpb25zaGlwUm9sZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIEVqYkZhY3RvcnkgRUpCRkFDVE9SWSA9IEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKTsKLQlFSkJSZWxhdGlvbnNoaXBSb2xlIHJvbGUxID0gbnVsbCwgcm9sZTIgPSBudWxsOwotCUNvbnRhaW5lck1hbmFnZWRFbnRpdHkgZW50aXR5ID0gbnVsbDsKLQlFSkJSZWxhdGlvbiBlamJSZWxhdGlvbiA9IG51bGwgOwotCQotCSBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEVKQlJlbGF0aW9uc2hpcFJvbGVUZXN0LmNsYXNzKTsKLQl9Ci0JIAotCXByaXZhdGUgRUpCUmVsYXRpb25zaGlwUm9sZSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEVKQkZBQ1RPUlkuY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X0VKQlJlbGF0aW9uc2hpcFJvbGUoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSB0bXBFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCh0bXBFSkJSZWxhdGlvbnNoaXBSb2xlKTsKLSAgICB9Ci0KLSAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TG9naWNhbE5hbWUoKSB7Ci0KLSAgICAgICAvKiBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmdldExvZ2ljYWxOYW1lKCk7Ki8KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldE5hbWUoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSAicm9sZTEiOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0TmFtZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobmFtZSxyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRPcHBvc2l0ZSgpIHsKLSAgICAJaW5pdCgpOwotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSByb2xlMS5nZXRPcHBvc2l0ZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUscm9sZTIpOwotICAgICAgICByZXRWYWx1ZSA9IHJvbGUyLmdldE9wcG9zaXRlKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxyb2xlMSk7Ci0gICAgfQotCi0gICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNvdXJjZUVudGl0eSgpIHsKLQkgICAgaW5pdCgpOwotCSAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IHJldFZhbHVlID0gcm9sZTEuZ2V0U291cmNlRW50aXR5KCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxlbnRpdHkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNGb3J3YXJkKCkgewotICAgICAgIAlpbml0KCk7Ci0JICAgIGJvb2xlYW4gcmV0VmFsdWUgPSByb2xlMi5pc0ZvcndhcmQoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLQkgICAgcm9sZTIuc2V0Rm93YXJkKCk7Ci0JICAgIHJldFZhbHVlID0gcm9sZTIuaXNGb3J3YXJkKCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLQkgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0tleSgpIHsKLSAgICAJaW5pdCgpOwotCSAgICBib29sZWFuIHJldFZhbHVlID0gcm9sZTIuaXNLZXkoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLQkgICAgcm9sZTIuc2V0S2V5KHRydWUpOwotCSAgICByZXRWYWx1ZSA9IHJvbGUyLmlzS2V5KCk7Ci0JICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEtleSgpIHsKLQotICAgIAlpbml0KCk7Ci0JICAgIGJvb2xlYW4gcmV0VmFsdWUgPSByb2xlMi5pc0tleSgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotCSAgICByb2xlMi5zZXRLZXkodHJ1ZSk7Ci0JICAgIHJldFZhbHVlID0gcm9sZTIuaXNLZXkoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKLSAgICAJcm9sZTEgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLQkJcm9sZTIgPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLQkgICAgZWpiUmVsYXRpb24gPSBFSkJGQUNUT1JZLmNyZWF0ZUVKQlJlbGF0aW9uKCk7Ci0JICAgIGVudGl0eSA9IEVKQkZBQ1RPUlkuY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotCSAgICBSb2xlU291cmNlIHJvbGVTb3VyY2UgPSBFSkJGQUNUT1JZLmNyZWF0ZVJvbGVTb3VyY2UoKTsKLQkgICAgcm9sZVNvdXJjZS5zZXRFbnRpdHlCZWFuKGVudGl0eSk7Ci0JICAgIHJvbGVTb3VyY2Uuc2V0Um9sZShyb2xlMSk7Ci0JICAgIHJvbGUxLnNldFNvdXJjZShyb2xlU291cmNlKTsKLQkgICAgTGlzdCByb2xlTGlzdCA9IGVqYlJlbGF0aW9uLmdldFJlbGF0aW9uc2hpcFJvbGVzKCk7Ci0JICAgIHJvbGVMaXN0LmFkZChyb2xlMSk7Ci0JICAgIHJvbGVMaXN0LmFkZChyb2xlMik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc01hbnkoKSB7Ci0gICAgCWluaXQoKTsKLQkgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotCSAgICByZXRWYWx1ZSA9IHJvbGUxLmlzTWFueSgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpIDsKLQkgICAgcm9sZTIuc2V0TXVsdGlwbGljaXR5KE11bHRpcGxpY2l0eUtpbmQuTUFOWV9MSVRFUkFMKTsKLQkgICAgcmV0VmFsdWUgPSByb2xlMS5pc01hbnkoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpIDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTmF2aWdhYmxlKCkgewotICAgIAlpbml0KCk7Ci0gICAgCWJvb2xlYW4gcmV0VmFsdWUgPSByb2xlMS5pc05hdmlnYWJsZSgpOwotICAgIAlhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgIAlDTVJGaWVsZCBjbXJGaWVsZCA9IEVKQkZBQ1RPUlkuY3JlYXRlQ01SRmllbGQoKTsKLSAgICAJcm9sZTEuc2V0Q21yRmllbGQoY21yRmllbGQpOwotICAgIAlyZXRWYWx1ZSA9IHJvbGUxLmlzTmF2aWdhYmxlKCk7Ci0gICAgCWFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRGb3dhcmQoKSB7Ci0gICAgCWluaXQoKTsKLQkgICAgYm9vbGVhbiByZXRWYWx1ZSA9IHJvbGUyLmlzRm9yd2FyZCgpOwotCSAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotCSAgICByb2xlMi5zZXRGb3dhcmQoKTsKLQkgICAgcmV0VmFsdWUgPSByb2xlMi5pc0ZvcndhcmQoKTsKLQkgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TmFtZSgpIHsKLQotICAgIAkgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgIFN0cmluZyBuYW1lID0gInJvbGUxIjsKLSAgICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuc2V0TmFtZShuYW1lKTsKLSAgICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmdldE5hbWUoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgLyogcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTdHJpbmcgbmV3RGVzY3JpcHRpb24gPSAiIjsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbik7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Um9sZU5hbWUoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5nZXRSb2xlTmFtZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Um9sZU5hbWUoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld1JvbGVOYW1lID0gIiI7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuc2V0Um9sZU5hbWUobmV3Um9sZU5hbWUpOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldE11bHRpcGxpY2l0eSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNdWx0aXBsaWNpdHlLaW5kIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmdldE11bHRpcGxpY2l0eSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0TXVsdGlwbGljaXR5KCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE11bHRpcGxpY2l0eUtpbmQgbmV3TXVsdGlwbGljaXR5ID0gbnVsbDsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXRNdWx0aXBsaWNpdHkobmV3TXVsdGlwbGljaXR5KTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF91bnNldE11bHRpcGxpY2l0eSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnVuc2V0TXVsdGlwbGljaXR5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1NldE11bHRpcGxpY2l0eSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5pc1NldE11bHRpcGxpY2l0eSgpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2lzQ2FzY2FkZURlbGV0ZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5pc0Nhc2NhZGVEZWxldGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldENhc2NhZGVEZWxldGUoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiBuZXdDYXNjYWRlRGVsZXRlID0gZmFsc2U7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuc2V0Q2FzY2FkZURlbGV0ZShuZXdDYXNjYWRlRGVsZXRlKTsKLSAgICB9Ki8KLQotIC8qICAgcHVibGljIHZvaWQgdGVzdF91bnNldENhc2NhZGVEZWxldGUoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS51bnNldENhc2NhZGVEZWxldGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzU2V0Q2FzY2FkZURlbGV0ZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5pc1NldENhc2NhZGVEZWxldGUoKTsKLSAgICB9Ki8KLQotICAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UmVsYXRpb25zaGlwKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLmdldFJlbGF0aW9uc2hpcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVsYXRpb25zaGlwKCkgewotCi0gICAgICAgIEVKQlJlbGF0aW9uc2hpcFJvbGUgb2JqRUpCUmVsYXRpb25zaGlwUm9sZSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uIG5ld0NvbnRhaW5lciA9IG51bGw7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuc2V0UmVsYXRpb25zaGlwKG5ld0NvbnRhaW5lcik7Ci0gICAgfSovCi0KLSAgIC8qcHVibGljIHZvaWQgdGVzdF9nZXRTb3VyY2UoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgUm9sZVNvdXJjZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5nZXRTb3VyY2UoKTsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNvdXJjZSgpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSb2xlU291cmNlIG5ld1NvdXJjZSA9IG51bGw7Ci0gICAgICAgIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuc2V0U291cmNlKG5ld1NvdXJjZSk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0Q21yRmllbGQoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ01SRmllbGQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0Q21yRmllbGQoKTsKLSAgICB9Ci0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0Q21yRmllbGQoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ01SRmllbGQgbmV3Q21yRmllbGQgPSBudWxsOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnNldENtckZpZWxkKG5ld0NtckZpZWxkKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbnMoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuZ2V0RGVzY3JpcHRpb25zKCk7Ci0gICAgfSovCi0KLSAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UmVxdWlyZWQoKSB7Ci0KLSAgICAgICAgRUpCUmVsYXRpb25zaGlwUm9sZSBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQm9vbGVhbiBpc1JlcXVpcmVkID0gQm9vbGVhbi5GQUxTRTsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXRSZXF1aXJlZChpc1JlcXVpcmVkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLG9iakVKQlJlbGF0aW9uc2hpcFJvbGUuaXNSZXF1aXJlZCgpKTsKLSAgICAgICAgaXNSZXF1aXJlZCA9IEJvb2xlYW4uVFJVRTsKLSAgICAgICAgb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5zZXRSZXF1aXJlZChpc1JlcXVpcmVkKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsb2JqRUpCUmVsYXRpb25zaGlwUm9sZS5pc1JlcXVpcmVkKCkpOwotICAgIH0KLSAgICAKLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfcmVjb25jaWxlQXR0cmlidXRlcygpIHsKLQotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIG9iakVKQlJlbGF0aW9uc2hpcFJvbGUgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpFSkJSZWxhdGlvbnNoaXBSb2xlLnJlY29uY2lsZUF0dHJpYnV0ZXMoKTsKLSAgICB9ICovCi0KLQotICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FamJFTUZUZXN0QmFzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRWpiRU1GVGVzdEJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0NjA5Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FamJFTUZUZXN0QmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWFyIDE0LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFyY2hpdmUuZW1mdGVzdHMuRWpiRU1GVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLnRlc3R1dGlsaXRpZXMuRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbgotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIEVqYkVNRlRlc3RCYXNlIGV4dGVuZHMgRWpiRU1GVGVzdCB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBFamJFTUZUZXN0QmFzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb257Ci0JCUVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3IucmVzZXQoKTsKLQkJY3JlYXRlRUFSKCk7Ci0JCWNyZWF0ZUVKQigpOwotCi0JCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJLy9UT0RPOiBpbmRpdmlkdWFsIHRlc3QgZm9yIGVhY2ggdmVyc2lvbgotCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJc2V0TW9kdWxlVHlwZShFSkIpOwotCQlwb3B1bGF0ZVJvb3QoREQuZ2V0Um9vdE9iamVjdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVKQkphclBvcHVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZG9udCB0ZXN0IHRoZSBiYXNlIGZ1bmN0aW9ucwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0MTRFSkJKYXJQb3B1bGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vCQkgZG9udCB0ZXN0IHRoZSBiYXNlIGZ1bmN0aW9ucwotCX0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FamJGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRWpiRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1MGM4YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9FamJGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5BY3RpdmF0aW9uQ29uZmlnUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ01QQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5DTVJGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJNZXRob2RDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQlJlbGF0aW9uc2hpcFJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRXhjbHVkZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kUGVybWlzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuTWV0aG9kVHJhbnNhY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5RdWVyeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUmVsYXRpb25zaGlwczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUm9sZVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLQotcHVibGljIGNsYXNzIEVqYkZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBFamJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gRWpiUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RWpiRmFjdG9yeSgpOwotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoRWpiRmFjdG9yeVRlc3QuY2xhc3MpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X0VqYkZhY3RvcnkoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSB0bXBFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1ldGhvZEVsZW1lbnQoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIGFTaWduYXR1cmUgPSAiIjsKLSAgICAgICAgTWV0aG9kRWxlbWVudCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVNZXRob2RFbGVtZW50KGFTaWduYXR1cmUpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1ldGhvZEVsZW1lbnRGcm9tKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZCBhTWV0aG9kID0gIEphdmFSZWZGYWN0b3J5SW1wbC5nZXRBY3RpdmVGYWN0b3J5KCkuY3JlYXRlTWV0aG9kKCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZSA9ICJzZXRUd29QYXJhbU1ldGhvZCI7Ci0gICAgICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlcjEgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YVBhcmFtZXRlcigpOwotICAgICAgICBKYXZhSGVscGVycyB0eXBlMSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS5sYW5nLlN0cmluZyIpOwotICAgICAgICBqYXZhUGFyYW1ldGVyMS5zZXRFVHlwZSh0eXBlMSk7Ci0gICAgICAgIAotICAgICAgICBKYXZhUGFyYW1ldGVyIGphdmFQYXJhbWV0ZXIyID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUphdmFQYXJhbWV0ZXIoKTsKLSAgICAgICAgSmF2YUhlbHBlcnMgdHlwZTIgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2xhc3NSZWYoImphdmEudXRpbC5MaXN0Iik7Ci0gICAgICAgIGphdmFQYXJhbWV0ZXIyLnNldEVUeXBlKHR5cGUyKTsKLSAgICAgICAgCi0gICAgICAgIGFNZXRob2Quc2V0TmFtZShuYW1lKTsKLSAgICAgICAgYU1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuYWRkKGphdmFQYXJhbWV0ZXIxKTsKLSAgICAgICAgYU1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkuYWRkKGphdmFQYXJhbWV0ZXIyKTsKLSAgICAgICAgCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlTWV0aG9kRWxlbWVudEZyb20oYU1ldGhvZCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWV0aG9kRWxlbWVudEZyb21fMigpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gbnVsbDsKLSAgICAgICAgTWV0aG9kRWxlbWVudCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVNZXRob2RFbGVtZW50RnJvbShtZXRob2QpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNZXRob2RQZXJtaXNzaW9uKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlTWV0aG9kUGVybWlzc2lvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUFzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBc3NlbWJseURlc2NyaXB0b3IgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlQXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFbnRpdHkoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRW50aXR5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZUVudGl0eSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZUNvbnRhaW5lck1hbmFnZWRFbnRpdHkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVDTVBBdHRyaWJ1dGUoKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ01QQXR0cmlidXRlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZUNNUEF0dHJpYnV0ZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUNNUkZpZWxkKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENNUkZpZWxkIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZUNNUkZpZWxkKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlRUpCUmVsYXRpb25zaGlwUm9sZSgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFSkJSZWxhdGlvbnNoaXBSb2xlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZUVKQlJlbGF0aW9uc2hpcFJvbGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVKQlJlbGF0aW9uKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQlJlbGF0aW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZUVKQlJlbGF0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVSZWxhdGlvbnNoaXBzKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFJlbGF0aW9uc2hpcHMgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlUmVsYXRpb25zaGlwcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVKQkphcigpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFSkJKYXIgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlRUpCSmFyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUm9sZVNvdXJjZSgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSb2xlU291cmNlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZVJvbGVTb3VyY2UoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVRdWVyeSgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBRdWVyeSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVF1ZXJ5TWV0aG9kKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFF1ZXJ5TWV0aG9kIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZVF1ZXJ5TWV0aG9kKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQWN0aXZhdGlvbkNvbmZpZ1Byb3BlcnR5KCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFjdGl2YXRpb25Db25maWdQcm9wZXJ0eSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVBY3RpdmF0aW9uQ29uZmlnUHJvcGVydHkoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVBY3RpdmF0aW9uQ29uZmlnKCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFjdGl2YXRpb25Db25maWcgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakVqYkZhY3RvcnkuY3JlYXRlQWN0aXZhdGlvbkNvbmZpZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1ldGhvZEVsZW1lbnRfMigpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2RFbGVtZW50IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZU1ldGhvZEVsZW1lbnQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFeGNsdWRlTGlzdCgpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFeGNsdWRlTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVFeGNsdWRlTGlzdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlc3Npb24oKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2Vzc2lvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRWpiRmFjdG9yeS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWVzc2FnZURyaXZlbigpIHsKLQotICAgICAgICBFamJGYWN0b3J5IG9iakVqYkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXNzYWdlRHJpdmVuIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZU1lc3NhZ2VEcml2ZW4oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVNZXNzYWdlRHJpdmVuRGVzdGluYXRpb24oKSB7Ci0KLSAgICAgICAgRWpiRmFjdG9yeSBvYmpFamJGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWVzc2FnZURyaXZlbkRlc3RpbmF0aW9uIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZU1lc3NhZ2VEcml2ZW5EZXN0aW5hdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVKQk1ldGhvZENhdGVnb3J5KCkgewotCi0gICAgICAgIEVqYkZhY3Rvcnkgb2JqRWpiRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVKQk1ldGhvZENhdGVnb3J5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFamJGYWN0b3J5LmNyZWF0ZUVKQk1ldGhvZENhdGVnb3J5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvRW50aXR5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2E1NDhjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L0VudGl0eVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkFzc2VtYmx5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVqYkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVudGVycHJpc2VCZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FbnRpdHk7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlUZXN0IGV4dGVuZHMgRWpiRU1GVGVzdEJhc2V7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBFbnRpdHlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIEVudGl0eSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVudGl0eSgpOwotCX0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X0VudGl0eSgpIHsKLSAgICAgICAgRW50aXR5IHRtcEVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG1wRW50aXR5KTsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXN1cGVyLnNldFVwKCk7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRQcmltYXJ5S2V5TmFtZSgpIHRocm93cyBFeGNlcHRpb257Ci0gICAgCWluaXQoKTsKLSAgICAJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotICAgIAkKLSAgICAJQXNzZW1ibHlEZXNjcmlwdG9yIGFzc2VtYmx5RGVzY3JpcHRvciA9IERELmdldEVKQkphcigpLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotCQlMaXN0IGVudGVycHJpc2VCZWFucyA9IERELmdldEVKQkphcigpLmdldEVudGVycHJpc2VCZWFucygpOwotCQlDb250YWluZXJNYW5hZ2VkRW50aXR5IGVudGl0eUJlYW4gPSBudWxsOwotCQlFbnRlcnByaXNlQmVhbiBiZWFuID0gbnVsbDsKLQkJZm9yIChpbnQgeD0wOyB4PCBlbnRlcnByaXNlQmVhbnMuc2l6ZSgpOyArK3gpIHsKLQkJCWJlYW4gPSAoRW50ZXJwcmlzZUJlYW4pIGVudGVycHJpc2VCZWFucy5nZXQoeCk7Ci0JCQlpZiAoYmVhbi5pc0VudGl0eSgpICYmIGJlYW4uaXNDb250YWluZXJNYW5hZ2VkRW50aXR5KCkpIHsKLQkJCQllbnRpdHlCZWFuID0gKENvbnRhaW5lck1hbmFnZWRFbnRpdHkpIGJlYW47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVudGl0eUJlYW4gIT0gbnVsbCkgewotCQkJU3RyaW5nIG5hbWUgPSBlbnRpdHlCZWFuLmdldFByaW1hcnlLZXlOYW1lKCk7Ci0JCQlTdHJpbmcgcHJpbUtleU5hbWUgPSBlbnRpdHlCZWFuLmdldFByaW1hcnlLZXkoKS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQlhc3NlcnRFcXVhbHMobmFtZSxwcmltS2V5TmFtZSk7Ci0JCQkKLQkJfQotICAgIH0KLQotICAgIAotICAgLyogcHVibGljIHZvaWQgdGVzdF9pc0NvbnRhaW5lck1hbmFnZWRFbnRpdHkoKSB7Ci0gICAgICAgIEVudGl0eSBvYmpFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqRW50aXR5LmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpOwotICAgIH0qLwotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRQcmltYXJ5S2V5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIAlpbml0KCk7Ci0gICAgCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLSAgICAJCi0gICAgCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBERC5nZXRFSkJKYXIoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJTGlzdCBlbnRlcnByaXNlQmVhbnMgPSBERC5nZXRFSkJKYXIoKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHlCZWFuID0gbnVsbDsKLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IG51bGw7Ci0JCWZvciAoaW50IHg9MDsgeDwgZW50ZXJwcmlzZUJlYW5zLnNpemUoKTsgKyt4KSB7Ci0JCQliZWFuID0gKEVudGVycHJpc2VCZWFuKSBlbnRlcnByaXNlQmVhbnMuZ2V0KHgpOwotCQkJaWYgKGJlYW4uaXNFbnRpdHkoKSAmJiBiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJZW50aXR5QmVhbiA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChlbnRpdHlCZWFuICE9IG51bGwpIHsKLQkJCVN0cmluZyBuYW1lID0gZW50aXR5QmVhbi5nZXRQcmltYXJ5S2V5TmFtZSgpOwotCQkJU3RyaW5nIG5ld05hbWUgPSAiTmV3TmFtZSIgOwotCQkJZW50aXR5QmVhbi5zZXRQcmltYXJ5S2V5TmFtZShuZXdOYW1lKTsKLQkJCWFzc2VydEVxdWFscyhuZXdOYW1lLGVudGl0eUJlYW4uZ2V0UHJpbWFyeUtleU5hbWUoKSk7Ci0JCX0gICAgCi0gICAgfQotCi0gIC8qIHB1YmxpYyB2b2lkIHRlc3RfaXNSZWVudHJhbnQoKSB7Ci0KLSAgICAgICAgRW50aXR5IG9iakVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFbnRpdHkuaXNSZWVudHJhbnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFJlZW50cmFudCgpIHsKLQotICAgICAgICBFbnRpdHkgb2JqRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiBuZXdSZWVudHJhbnQgPSBmYWxzZTsKLSAgICAgICAgb2JqRW50aXR5LnNldFJlZW50cmFudChuZXdSZWVudHJhbnQpOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X3Vuc2V0UmVlbnRyYW50KCkgewotCi0gICAgICAgIEVudGl0eSBvYmpFbnRpdHkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpFbnRpdHkudW5zZXRSZWVudHJhbnQoKTsKLSAgICB9ICovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfaXNTZXRSZWVudHJhbnQoKSB7Ci0KLSAgICAgICAgRW50aXR5IG9iakVudGl0eSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFbnRpdHkuaXNTZXRSZWVudHJhbnQoKTsKLSAgICB9ICovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0UHJpbWFyeUtleSgpIHsKLQotICAgICAgICBFbnRpdHkgb2JqRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSmF2YUNsYXNzIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpFbnRpdHkuZ2V0UHJpbWFyeUtleSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UHJpbWFyeUtleSgpIHsKLQotICAgICAgICBFbnRpdHkgb2JqRW50aXR5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSmF2YUNsYXNzIG5ld1ByaW1hcnlLZXkgPSBudWxsOwotICAgICAgICBvYmpFbnRpdHkuc2V0UHJpbWFyeUtleShuZXdQcmltYXJ5S2V5KTsKLSAgICB9ICovCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFbnRpdHlUZXN0KCJ0ZXN0X3NldFByaW1hcnlLZXlOYW1lIikpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBFbnRpdHlUZXN0KCJ0ZXN0X2dldFByaW1hcnlLZXlOYW1lIikpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvTWV0aG9kRWxlbWVudFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L01ldGhvZEVsZW1lbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTMzZmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvTWV0aG9kRWxlbWVudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLmludGVybmFsLmltcGwuSmF2YVJlZkZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5TZXNzaW9uOwotCi1wdWJsaWMgY2xhc3MgTWV0aG9kRWxlbWVudFRlc3QgZXh0ZW5kcyBFamJFTUZUZXN0QmFzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgU0VTU0lPTiA9MDsKLQlwcml2YXRlIGZpbmFsIGludCBFTlRJVFkgPSAxOwotCXByaXZhdGUgZmluYWwgaW50IENPTlRBSU5FUl9NQU5BR0VEX0VOVElUWSA9MjsKLQkKLQkKLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIE1ldGhvZEVsZW1lbnRUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQkKLQl9Ci0KLQlwcml2YXRlIE1ldGhvZEVsZW1lbnQgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCkuY3JlYXRlTWV0aG9kRWxlbWVudCgpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X01ldGhvZEVsZW1lbnQoKSB7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgdG1wTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG1wTWV0aG9kRWxlbWVudCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9hZGRNZXRob2RQYXJhbXMoKSB7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBwYXJhbTEgPSAicGFyYW0xIjsKLSAgICAgICAgU3RyaW5nIHBhcmFtMj0gInBhcmFtMiI7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0xKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0yKTsKLSAgICAgICAgTGlzdCBsaXN0ID0gb2JqTWV0aG9kRWxlbWVudC5nZXRNZXRob2RQYXJhbXMoKTsKLSAgICAgICAgcmV0VmFsdWUgPSBsaXN0LmNvbnRhaW5zKHBhcmFtMSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2FwcGx5WmVyb1BhcmFtcygpIHsKLSAgICAJTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHBhcmFtMSA9ICJwYXJhbTEiOwotICAgICAgICBTdHJpbmcgcGFyYW0yPSAicGFyYW0yIjsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTIpOwotICAgICAgICBMaXN0IGxpc3QgPSBvYmpNZXRob2RFbGVtZW50LmdldE1ldGhvZFBhcmFtcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdC5zaXplKCk9PTIsIHRydWUpIDsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hcHBseVplcm9QYXJhbXMoKTsKLSAgICAgICAgbGlzdCA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0TWV0aG9kUGFyYW1zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0LnNpemUoKT09MCwgdHJ1ZSkgOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2VxdWFsU2lnbmF0dXJlKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudDEgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQyID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50MyA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50MS5zZXROYW1lKCJuYW1lIik7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLnNldE5hbWUoIm5hbWUiKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDMuc2V0TmFtZSgibmFtZSIpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHBhcmFtMSA9ICJwYXJhbTEiOwotICAgICAgICBTdHJpbmcgcGFyYW0yPSAicGFyYW0yIjsKLSAgICAgICAgU3RyaW5nIHBhcmFtMyA9ICJwYXJhbTMiOwotICAgICAgICBTdHJpbmcgcGFyYW00PSAicGFyYW00IjsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQxLmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50MS5hZGRNZXRob2RQYXJhbXMocGFyYW0yKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50Mi5hZGRNZXRob2RQYXJhbXMocGFyYW0yKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQzLmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50My5hZGRNZXRob2RQYXJhbXMocGFyYW0yKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQxLnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQzLnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCk7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudDEuZXF1YWxTaWduYXR1cmUob2JqTWV0aG9kRWxlbWVudDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudDIuZXF1YWxTaWduYXR1cmUob2JqTWV0aG9kRWxlbWVudDMpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50My5zZXROYW1lKCJuYW1lRGlmZiIpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQyLmVxdWFsU2lnbmF0dXJlKG9iak1ldGhvZEVsZW1lbnQzKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLmFkZE1ldGhvZFBhcmFtcyhwYXJhbTMpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQxLmVxdWFsU2lnbmF0dXJlKG9iak1ldGhvZEVsZW1lbnQyKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQzLnNldE5hbWUoIm5hbWUiKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50MS5lcXVhbFNpZ25hdHVyZShvYmpNZXRob2RFbGVtZW50Myk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQzLnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuSE9NRV9MSVRFUkFMKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50MS5lcXVhbFNpZ25hdHVyZShvYmpNZXRob2RFbGVtZW50Myk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RQYXJhbXMoKSB7Ci0KLSAgICAJTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHBhcmFtMSA9ICJwYXJhbTEiOwotICAgICAgICBTdHJpbmcgcGFyYW0yPSAicGFyYW0yIjsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTIpOwotICAgICAgICBMaXN0IGxpc3QgPSBvYmpNZXRob2RFbGVtZW50LmdldE1ldGhvZFBhcmFtcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdC5zaXplKCk9PTIsIHRydWUpIDsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3QuY29udGFpbnMocGFyYW0xKSx0cnVlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3QuY29udGFpbnMocGFyYW0yKSx0cnVlKTsKLSAgICB9Ci0KLSAgICAKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2lnbmF0dXJlKCkgewotCi0gICAgCU1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgCVN0cmluZyBuYW1lID0gInRlc3QiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldE5hbWUobmFtZSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcGFyYW0xID0gInBhcmFtMSI7Ci0gICAgICAgIFN0cmluZyBwYXJhbTI9ICJwYXJhbTIiOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0xKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5hZGRNZXRob2RQYXJhbXMocGFyYW0yKTsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBzaWduYXR1cmUgPSBuYW1lICsgIigiICsgcGFyYW0xICsgIiwiICsgcGFyYW0yICsgIikiOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldFNpZ25hdHVyZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2lnbmF0dXJlLHJldFZhbHVlKTsKLSAgICAgICAgCi0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFR5cGVKYXZhQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJaW5pdCgpOwotICAgIAlFSkJSZXNvdXJjZSBERCA9IChFSkJSZXNvdXJjZSkgZWpiRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0gICAgCUxpc3QgZW50ZXJwcmlzZUJlYW5zID0gREQuZ2V0RUpCSmFyKCkuZ2V0RW50ZXJwcmlzZUJlYW5zKCk7Ci0gICAgCUVudGVycHJpc2VCZWFuIGViID0gKEVudGVycHJpc2VCZWFuKWVudGVycHJpc2VCZWFucy5nZXQoMCk7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0RW50ZXJwcmlzZUJlYW4oZWIpOwotICAgICAgICBKYXZhQ2xhc3MgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICBpZiAoZWIuaGFzUmVtb3RlQ2xpZW50KCkpIHsKLSAgICAgICAgCW9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5IT01FX0xJVEVSQUwpOwotICAgICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldFR5cGVKYXZhQ2xhc3MoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxlYi5nZXRIb21lSW50ZXJmYWNlKCkpOwotICAgICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLlJFTU9URV9MSVRFUkFMKTsKLSAgICAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXRUeXBlSmF2YUNsYXNzKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZWIuZ2V0UmVtb3RlSW50ZXJmYWNlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gCi0gICAgICAgIGlmIChlYi5oYXNMb2NhbENsaWVudCgpKXsKLSAgICAgICAgCW9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FX0xJVEVSQUwpOwotICAgICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldFR5cGVKYXZhQ2xhc3MoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxlYi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSk7Ci0gICAgICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfTElURVJBTCk7Ci0gICAgICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0VHlwZUphdmFDbGFzcygpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGViLmdldExvY2FsSW50ZXJmYWNlKCkpOwotICAgICAgICAgICAgCi0gICAgICAgIH0gCi0gICAgICAgIGlmIChlYi5pc01lc3NhZ2VEcml2ZW4oKSkgewotICAgICAgICAJb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOwotICAgICAgICAJcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldFR5cGVKYXZhQ2xhc3MoKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxlYi5nZXRFamJDbGFzcygpKTsKLSAgICAgICAgfQotICAKLSAgICB9Ci0gICAgCi0gICAKLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RzKCkgewotICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9zdFNwZWNpZmljKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgYU1ldGhvZEVsZW1lbnQgPSBudWxsOwotICAgICAgICBKYXZhQ2xhc3MgYUNsYXNzID0gbnVsbDsKLSAgICAgICAgTWV0aG9kRWxlbWVudCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXRNb3N0U3BlY2lmaWMoYU1ldGhvZEVsZW1lbnQsIGFDbGFzcyk7Ci0gICAgfSovCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9oYXNNZXRob2RQYXJhbXMoKSB7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50Lmhhc01ldGhvZFBhcmFtcygpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICBTdHJpbmcgcGFyYW0xID0gInBhcmFtMSI7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMSk7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5oYXNNZXRob2RQYXJhbXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICBTdHJpbmcgcGFyYW0yID0gInBhcmFtMiI7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMik7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5oYXNNZXRob2RQYXJhbXMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaW5pdGlhbGl6ZUZyb21TaWduYXR1cmUoKSB7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBzaWduYXR1cmUgPSAic2V0VHdvUGFyYW1NZXRob2QoamF2YS5sYW5nLlN0cmluZyxqYXZhLnV0aWwuTGlzdCkiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmluaXRpYWxpemVGcm9tU2lnbmF0dXJlKHNpZ25hdHVyZSk7Ci0gICAgICAgIExpc3QgbGlzdCA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0TWV0aG9kUGFyYW1zKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0LnNpemUoKT09MiwgdHJ1ZSkgOwotICAgICAgICBTdHJpbmcgbmFtZSA9ICJzZXRUd29QYXJhbU1ldGhvZCI7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0LmNvbnRhaW5zKCJqYXZhLmxhbmcuU3RyaW5nIiksdHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0LmNvbnRhaW5zKCJqYXZhLnV0aWwuTGlzdCIpLHRydWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2JqTWV0aG9kRWxlbWVudC5nZXROYW1lKCksICJzZXRUd29QYXJhbU1ldGhvZCIpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRGVmYXVsdCgpIHsKLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXROYW1lKCJ0ZXN0Iik7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzRGVmYXVsdCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldE5hbWUoSmF2YUNsYXNzLkRFRkFVTFRfTUVUSE9EX05BTUUpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNEZWZhdWx0KCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0VxdWl2YWxlbnQoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50MSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudDIgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAKLSAgICAgICAgU2Vzc2lvbiBzZXNzaW9uMSA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIFNlc3Npb24gc2Vzc2lvbjIgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50MS5zZXRFbnRlcnByaXNlQmVhbihzZXNzaW9uMSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLnNldEVudGVycHJpc2VCZWFuKHNlc3Npb24xKTsKLSAgICAgICAgU3RyaW5nIHNpZ25hdHVyZTEgPSAic2V0VHdvUGFyYW1NZXRob2QoamF2YS5sYW5nLlN0cmluZyxqYXZhLnV0aWwuTGlzdCkiOwotICAgICAgICBTdHJpbmcgc2lnbmF0dXJlMiA9ICJzZXRUd29QYXJhbU1ldGhvZDIoamF2YS5sYW5nLlN0cmluZyxqYXZhLnV0aWwuTGlzdCkiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50MS5pbml0aWFsaXplRnJvbVNpZ25hdHVyZShzaWduYXR1cmUxKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDIuaW5pdGlhbGl6ZUZyb21TaWduYXR1cmUoc2lnbmF0dXJlMSk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50MS5pc0VxdWl2YWxlbnQob2JqTWV0aG9kRWxlbWVudDIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQyLmluaXRpYWxpemVGcm9tU2lnbmF0dXJlKHNpZ25hdHVyZTIpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQxLmlzRXF1aXZhbGVudChvYmpNZXRob2RFbGVtZW50Mik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50Mi5pbml0aWFsaXplRnJvbVNpZ25hdHVyZShzaWduYXR1cmUxKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudDIuc2V0RW50ZXJwcmlzZUJlYW4oc2Vzc2lvbjIpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQxLmlzRXF1aXZhbGVudChvYmpNZXRob2RFbGVtZW50Mik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0hvbWUoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkhPTUVfTElURVJBTCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzSG9tZSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5MT0NBTF9IT01FX0xJVEVSQUwpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNIb21lKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNSZW1vdGUoKSB7Ci0gICAgCSBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLlJFTU9URV9MSVRFUkFMKTsKLSAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc1JlbW90ZSgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0hPTUVfTElURVJBTCk7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNSZW1vdGUoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1Vuc3BlY2lmaWVkKCkgewotICAgIAkgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5VTlNQRUNJRklFRF9MSVRFUkFMKTsKLSAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc1Vuc3BlY2lmaWVkKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuTE9DQUxfSE9NRV9MSVRFUkFMKTsKLSAgICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc1Vuc3BlY2lmaWVkKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzTG9jYWxIb21lKCkgewotCi0gICAgCSBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLkxPQ0FMX0hPTUVfTElURVJBTCApOwotICAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzTG9jYWxIb21lKCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFR5cGUoTWV0aG9kRWxlbWVudEtpbmQuVU5TUEVDSUZJRURfTElURVJBTCk7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNMb2NhbEhvbWUoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc0xvY2FsKCkgewotICAgIAkgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShNZXRob2RFbGVtZW50S2luZC5MT0NBTF9MSVRFUkFMICk7Ci0gICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuaXNMb2NhbCgpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRUeXBlKE1ldGhvZEVsZW1lbnRLaW5kLlVOU1BFQ0lGSUVEX0xJVEVSQUwpOwotICAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzTG9jYWwoKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1ZhbGlkKCkgewotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5pc1ZhbGlkKCk7Ci0gICAgfQotCi0gIAotICAgIHB1YmxpYyB2b2lkIHRlc3RfbmFtZUFuZFBhcmFtc0VxdWFscygpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXRob2QgYU1ldGhvZCA9ICBKYXZhUmVmRmFjdG9yeUltcGwuZ2V0QWN0aXZlRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZCgpOwotICAgICAgICBTdHJpbmcgbmFtZSA9ICJzZXRUd29QYXJhbU1ldGhvZCI7Ci0gICAgICAgIFN0cmluZyBwYXJhbTEgPSAiamF2YS5sYW5nLlN0cmluZyI7Ci0gICAgICAgIFN0cmluZyBwYXJhbTIgPSAiamF2YS51dGlsLkxpc3QiOwotICAgICAgICAKLSAgICAgICAgSmF2YVBhcmFtZXRlciBqYXZhUGFyYW1ldGVyMSA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhUGFyYW1ldGVyKCk7Ci0gICAgICAgIEphdmFIZWxwZXJzIHR5cGUxID0gSmF2YVJlZkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNsYXNzUmVmKCJqYXZhLmxhbmcuU3RyaW5nIik7Ci0gICAgICAgIGphdmFQYXJhbWV0ZXIxLnNldEVUeXBlKHR5cGUxKTsKLSAgICAgICAgCi0gICAgICAgIEphdmFQYXJhbWV0ZXIgamF2YVBhcmFtZXRlcjIgPSBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSmF2YVBhcmFtZXRlcigpOwotICAgICAgICBKYXZhSGVscGVycyB0eXBlMiA9IEphdmFSZWZGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDbGFzc1JlZigiamF2YS51dGlsLkxpc3QiKTsKLSAgICAgICAgamF2YVBhcmFtZXRlcjIuc2V0RVR5cGUodHlwZTIpOwotICAgICAgICAKLSAgICAgICAgYU1ldGhvZC5zZXROYW1lKG5hbWUpOwotICAgICAgICBhTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQoamF2YVBhcmFtZXRlcjEpOwotICAgICAgICBhTWV0aG9kLmdldFBhcmFtZXRlcnMoKS5hZGQoamF2YVBhcmFtZXRlcjIpOwotICAgICAgICAKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXROYW1lKG5hbWUpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTEpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTIpOwotICAgICAgIAotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5uYW1lQW5kUGFyYW1zRXF1YWxzKGFNZXRob2QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsdHJ1ZSk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgbmFtZTIgPSAic2V0VHdvUGFyYW1NZXRob2QyIjsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXROYW1lKG5hbWUyKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50Lm5hbWVBbmRQYXJhbXNFcXVhbHMoYU1ldGhvZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSxmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldE5hbWUobmFtZSk7Ci0gICAgICAgIFN0cmluZyBwYXJhbTMgPSAiamF2YS51dGlsLkxpc3QiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTMpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQubmFtZUFuZFBhcmFtc0VxdWFscyhhTWV0aG9kKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLGZhbHNlKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9yZW1vdmVNZXRob2RQYXJhbXMoKSB7Ci0KLSAgICAJIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgICBTdHJpbmcgcGFyYW0xID0gInBhcmFtMSI7Ci0gICAgICAgICBTdHJpbmcgcGFyYW0yPSAicGFyYW0yIjsKLSAgICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgIG9iak1ldGhvZEVsZW1lbnQuYWRkTWV0aG9kUGFyYW1zKHBhcmFtMSk7Ci0gICAgICAgICBvYmpNZXRob2RFbGVtZW50LmFkZE1ldGhvZFBhcmFtcyhwYXJhbTIpOwotICAgICAgICAgTGlzdCBsaXN0ID0gb2JqTWV0aG9kRWxlbWVudC5nZXRNZXRob2RQYXJhbXMoKTsKLSAgICAgICAgIHJldFZhbHVlID0gbGlzdC5jb250YWlucyhwYXJhbTEpOwotICAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLHRydWUpOwotICAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5yZW1vdmVNZXRob2RQYXJhbXMocGFyYW0xKTsKLSAgICAgICAgIGxpc3QgPSBvYmpNZXRob2RFbGVtZW50LmdldE1ldGhvZFBhcmFtcygpOwotICAgICAgICAgcmV0VmFsdWUgPSBsaXN0LmNvbnRhaW5zKHBhcmFtMSk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgIH0KLQotIC8qICAgcHVibGljIHZvaWQgdGVzdF9yZXByZXNlbnRzKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZCBhTWV0aG9kID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQucmVwcmVzZW50cyhhTWV0aG9kKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldElkVG9SZWFkYWJsZVN0cmluZygpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldElkVG9SZWFkYWJsZVN0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5pcXVlbHlJZGVudGlmaWVzKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZCBhTWV0aG9kID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQudW5pcXVlbHlJZGVudGlmaWVzKGFNZXRob2QpOwotICAgIH0gKi8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXROYW1lKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0TmFtZSgpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X3NldE5hbWUoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld05hbWUgPSAiIjsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXROYW1lKG5ld05hbWUpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFBhcm1zKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0UGFybXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFBhcm1zKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdQYXJtcyA9ICIiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldFBhcm1zKG5ld1Bhcm1zKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRUeXBlKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1ldGhvZEVsZW1lbnRLaW5kIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldFR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFR5cGUoKSB7Ci0KLSAgICAgICAgTWV0aG9kRWxlbWVudCBvYmpNZXRob2RFbGVtZW50ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTWV0aG9kRWxlbWVudEtpbmQgbmV3VHlwZSA9IG51bGw7Ci0gICAgICAgIG9iak1ldGhvZEVsZW1lbnQuc2V0VHlwZShuZXdUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3Vuc2V0VHlwZSgpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnVuc2V0VHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNTZXRUeXBlKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmlzU2V0VHlwZSgpOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZEVsZW1lbnQuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldERlc2NyaXB0aW9uKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpNZXRob2RFbGVtZW50LnNldERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9uKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRFbnRlcnByaXNlQmVhbigpIHsKLQotICAgICAgICBNZXRob2RFbGVtZW50IG9iak1ldGhvZEVsZW1lbnQgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFbnRlcnByaXNlQmVhbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kRWxlbWVudC5nZXRFbnRlcnByaXNlQmVhbigpOwotICAgIH0KLQotICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEVudGVycHJpc2VCZWFuKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVudGVycHJpc2VCZWFuIG5ld0VudGVycHJpc2VCZWFuID0gbnVsbDsKLSAgICAgICAgb2JqTWV0aG9kRWxlbWVudC5zZXRFbnRlcnByaXNlQmVhbihuZXdFbnRlcnByaXNlQmVhbik7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25zKCkgewotCi0gICAgICAgIE1ldGhvZEVsZW1lbnQgb2JqTWV0aG9kRWxlbWVudCA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RFbGVtZW50LmdldERlc2NyaXB0aW9ucygpOwotICAgIH0qLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoTWV0aG9kRWxlbWVudFRlc3QuY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvTWV0aG9kUGVybWlzc2lvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L01ldGhvZFBlcm1pc3Npb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMzQ1NzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvTWV0aG9kUGVybWlzc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FamJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5NZXRob2RQZXJtaXNzaW9uOwotCi1wdWJsaWMgY2xhc3MgTWV0aG9kUGVybWlzc2lvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFamJGYWN0b3J5IEVKQkZBQ1RPUlkgPSBFamJQYWNrYWdlLmVJTlNUQU5DRS5nZXRFamJGYWN0b3J5KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tbW9uRmFjdG9yeSBDT01NT05GQUNUT1JZID0gQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29tbW9uRmFjdG9yeSgpOwotCXByaXZhdGUgTWV0aG9kUGVybWlzc2lvbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEVKQkZBQ1RPUlkuY3JlYXRlTWV0aG9kUGVybWlzc2lvbigpOwotCX0KLQkKLQkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X01ldGhvZFBlcm1pc3Npb24oKSB7Ci0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gdG1wTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwodG1wTWV0aG9kUGVybWlzc2lvbik7Ci0gICAgfQotCi0gICAvKnB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kRWxlbWVudHMoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRW50ZXJwcmlzZUJlYW4gYW5FSkIgPSBudWxsOwotICAgICAgICBMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmdldE1ldGhvZEVsZW1lbnRzKGFuRUpCKTsKLSAgICB9Ki8KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0U2VjdXJpdHlSb2xlKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGU9IENPTU1PTkZBQ1RPUlkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JCVN0cmluZyBzZWN1cml0eVJvbGVOYW1lID0gInRlc3RSb2xlIjsKLQkJc2VjdXJpdHlSb2xlLnNldFJvbGVOYW1lKHNlY3VyaXR5Um9sZU5hbWUpOwotCQlvYmpNZXRob2RQZXJtaXNzaW9uLmdldFJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZSk7Ci0JCQotICAgICAgICBTZWN1cml0eVJvbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uZ2V0U2VjdXJpdHlSb2xlKHNlY3VyaXR5Um9sZU5hbWUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc2VjdXJpdHlSb2xlLHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc1NlY3VyaXR5Um9sZSgpIHsKLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZT0gQ09NTU9ORkFDVE9SWS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLQkJU3RyaW5nIHNlY3VyaXR5Um9sZU5hbWUgPSAidGVzdFJvbGUiOwotCQlzZWN1cml0eVJvbGUuc2V0Um9sZU5hbWUoc2VjdXJpdHlSb2xlTmFtZSk7Ci0JCW9iak1ldGhvZFBlcm1pc3Npb24uZ2V0Um9sZXMoKS5hZGQoc2VjdXJpdHlSb2xlKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uaGFzU2VjdXJpdHlSb2xlKHNlY3VyaXR5Um9sZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGUyPSBDT01NT05GQUNUT1JZLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uaGFzU2VjdXJpdHlSb2xlKHNlY3VyaXR5Um9sZTIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc1NlY3VyaXR5Um9sZV8yKCkgewotCi0gICAgCU1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGU9IENPTU1PTkZBQ1RPUlkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0JCVN0cmluZyBzZWN1cml0eVJvbGVOYW1lID0gInRlc3RSb2xlIjsKLQkJc2VjdXJpdHlSb2xlLnNldFJvbGVOYW1lKHNlY3VyaXR5Um9sZU5hbWUpOwotCQlvYmpNZXRob2RQZXJtaXNzaW9uLmdldFJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZSk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmhhc1NlY3VyaXR5Um9sZShzZWN1cml0eVJvbGVOYW1lKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCB0cnVlKTsKLSAgICAgICAgU3RyaW5nIHNlY3VyaXR5Um9sZU5hbWVEb2VzTm90RXhpc3QgPSAidGVzdFJvbGVEb2VzTm90RXhpc3QiOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uaGFzU2VjdXJpdHlSb2xlKHNlY3VyaXR5Um9sZU5hbWVEb2VzTm90RXhpc3QpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRXF1aXZhbGVudCgpIHsKLQotICAgIAlNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24xID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAJTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uMiA9IGdldEluc3RhbmNlKCk7Ci0gICAgCQotICAgICAgICBTZWN1cml0eVJvbGUgc2VjdXJpdHlSb2xlMT0gQ09NTU9ORkFDVE9SWS5jcmVhdGVTZWN1cml0eVJvbGUoKTsKLSAgICAgICAgc2VjdXJpdHlSb2xlMS5zZXRSb2xlTmFtZSgidGVzdFJvbGUxIik7Ci0gICAgICAgIFNlY3VyaXR5Um9sZSBzZWN1cml0eVJvbGUyPSBDT01NT05GQUNUT1JZLmNyZWF0ZVNlY3VyaXR5Um9sZSgpOwotICAgICAgICBzZWN1cml0eVJvbGUyLnNldFJvbGVOYW1lKCJ0ZXN0Um9sZTIiKTsKLSAgICAgICAgU2VjdXJpdHlSb2xlIHNlY3VyaXR5Um9sZTM9IENPTU1PTkZBQ1RPUlkuY3JlYXRlU2VjdXJpdHlSb2xlKCk7Ci0gICAgICAgIHNlY3VyaXR5Um9sZTMuc2V0Um9sZU5hbWUoInRlc3RSb2xlMyIpOwotICAgICAgICAKLQkJCi0gICAgICAgIG9iak1ldGhvZFBlcm1pc3Npb24xLmdldFJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZTEpOwotICAgICAgICBvYmpNZXRob2RQZXJtaXNzaW9uMS5nZXRSb2xlcygpLmFkZChzZWN1cml0eVJvbGUyKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZFBlcm1pc3Npb24yLmdldFJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZTEpOwotICAgICAgICBvYmpNZXRob2RQZXJtaXNzaW9uMi5nZXRSb2xlcygpLmFkZChzZWN1cml0eVJvbGUyKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbjEuaXNFcXVpdmFsZW50KG9iak1ldGhvZFBlcm1pc3Npb24yKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHJldFZhbHVlLCB0cnVlKTsKLSAgICAgICAgCi0gICAgICAgIG9iak1ldGhvZFBlcm1pc3Npb24xLmdldFJvbGVzKCkuYWRkKHNlY3VyaXR5Um9sZTMpOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24xLmlzRXF1aXZhbGVudChvYmpNZXRob2RQZXJtaXNzaW9uMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSwgZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgfQotCi0gLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIHJldFZhbHVlID0gIiI7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbi5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU3RyaW5nIG5ld0Rlc2NyaXB0aW9uID0gIiI7Ci0gICAgICAgIG9iak1ldGhvZFBlcm1pc3Npb24uc2V0RGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24pOwotICAgIH0qLwotCi0gIC8qIHB1YmxpYyB2b2lkIHRlc3RfaXNVbmNoZWNrZWQoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uaXNVbmNoZWNrZWQoKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9zZXRVbmNoZWNrZWQoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiBuZXdVbmNoZWNrZWQgPSBmYWxzZTsKLSAgICAgICAgb2JqTWV0aG9kUGVybWlzc2lvbi5zZXRVbmNoZWNrZWQobmV3VW5jaGVja2VkKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF91bnNldFVuY2hlY2tlZCgpIHsKLQotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBvYmpNZXRob2RQZXJtaXNzaW9uLnVuc2V0VW5jaGVja2VkKCk7Ci0gICAgfSovCi0KLSAgICAvKnB1YmxpYyB2b2lkIHRlc3RfaXNTZXRVbmNoZWNrZWQoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFBlcm1pc3Npb24uaXNTZXRVbmNoZWNrZWQoKTsKLSAgICB9Ki8KLQotICAgLyogcHVibGljIHZvaWQgdGVzdF9nZXRBc3NlbWJseURlc2NyaXB0b3IoKSB7Ci0KLSAgICAgICAgTWV0aG9kUGVybWlzc2lvbiBvYmpNZXRob2RQZXJtaXNzaW9uID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmdldEFzc2VtYmx5RGVzY3JpcHRvcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBuZXdBc3NlbWJseURlc2NyaXB0b3IgPSBudWxsOwotICAgICAgICBvYmpNZXRob2RQZXJtaXNzaW9uLnNldEFzc2VtYmx5RGVzY3JpcHRvcihuZXdBc3NlbWJseURlc2NyaXB0b3IpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFJvbGVzKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmdldFJvbGVzKCk7Ci0gICAgfSovCi0KLSAgIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kRWxlbWVudHNfMigpIHsKLQotICAgICAgICBNZXRob2RQZXJtaXNzaW9uIG9iak1ldGhvZFBlcm1pc3Npb24gPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFTGlzdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kUGVybWlzc2lvbi5nZXRNZXRob2RFbGVtZW50cygpOwotICAgIH0qLwotCi0gIC8qIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25zKCkgewotCi0gICAgICAgIE1ldGhvZFBlcm1pc3Npb24gb2JqTWV0aG9kUGVybWlzc2lvbiA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RQZXJtaXNzaW9uLmdldERlc2NyaXB0aW9ucygpOwotICAgIH0qLyAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoTWV0aG9kUGVybWlzc2lvblRlc3QuY2xhc3MpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9NZXRob2RUcmFuc2FjdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L01ldGhvZFRyYW5zYWN0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2RkOThkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L01ldGhvZFRyYW5zYWN0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLk1ldGhvZFRyYW5zYWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5UcmFuc2FjdGlvbkF0dHJpYnV0ZVR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBNZXRob2RUcmFuc2FjdGlvblRlc3QgZXh0ZW5kcyBFamJFTUZUZXN0QmFzZSB7Ci0KLSAgICAvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBNZXRob2RUcmFuc2FjdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdF9NZXRob2RUcmFuc2FjdGlvbigpIHsKLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gdG1wTWV0aG9kVHJhbnNhY3Rpb24gPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcE1ldGhvZFRyYW5zYWN0aW9uKTsKLSAgICB9ICAgCi0gICAgCi0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNZXRob2RFbGVtZW50cygpIHRocm93cyBFeGNlcHRpb257Ci0gICAgCWluaXQoKTsKLSAgICAJRUpCUmVzb3VyY2UgREQgPSAoRUpCUmVzb3VyY2UpIGVqYkZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlBc3NlbWJseURlc2NyaXB0b3IgYXNzZW1ibHlEZXNjcmlwdG9yID0gREQuZ2V0RUpCSmFyKCkuZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoYXNzZW1ibHlEZXNjcmlwdG9yKTsKLQkJTGlzdCBlbnRlcnByaXNlQmVhbnMgPSBERC5nZXRFSkJKYXIoKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJRW50ZXJwcmlzZUJlYW4gZWIxID0gKEVudGVycHJpc2VCZWFuKWVudGVycHJpc2VCZWFucy5nZXQoMCk7Ci0JCS8vIGNyZWF0ZSBhIG1ldGhvZCB0cmFuc2FjdGlvbgotCQlNZXRob2RUcmFuc2FjdGlvbiBtZXRob2RUcmFuc2FjdGlvbiA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVNZXRob2RUcmFuc2FjdGlvbigpOwotCQlMaXN0IG1ldGhvZFRyYW5zYWN0aW9ucyA9IGFzc2VtYmx5RGVzY3JpcHRvci5nZXRNZXRob2RUcmFuc2FjdGlvbnMoKTsKLQkJbWV0aG9kVHJhbnNhY3Rpb25zLmFkZChtZXRob2RUcmFuc2FjdGlvbik7Ci0JCS8vIGNyZWF0ZSBhIG1ldGhvZCBlbGVtZW50Ci0JCU1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IGdldEVqYkZhY3RvcnkoKS5jcmVhdGVNZXRob2RFbGVtZW50KCk7Ci0JCW1ldGhvZEVsZW1lbnQuc2V0RW50ZXJwcmlzZUJlYW4oZWIxKTsKLQkJbWV0aG9kVHJhbnNhY3Rpb24uZ2V0TWV0aG9kRWxlbWVudHMoKS5hZGQobWV0aG9kRWxlbWVudCk7Ci0JCS8vIGdldCB0aGUgbWV0aG9kIGVsZW1lbnQgZm9yIHRoZSBlbnRlcnByaXNlIGJlYW4KLQkJTGlzdCBtZXRob2RFbGVtZW50cyA9IG1ldGhvZFRyYW5zYWN0aW9uLmdldE1ldGhvZEVsZW1lbnRzKGViMSk7Ci0JCWFzc2VydEVxdWFscyhtZXRob2RFbGVtZW50cy5jb250YWlucyhtZXRob2RFbGVtZW50KSwgdHJ1ZSk7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqICAKLSAgICAgKiBbaXNzdWUgOiBTQSAtIGdldE1vc3RTcGVjaWZpY01ldGhvZEVsZW1lbnQoKSAtIGRvZXMgaXQgbmVlZCB0byBiZSBhbiBBUEkgYXMgaXQgY2FsbHMKLSAgICAgKiAgdG8gdGhlIHN0YXRpYyBtZW1iZXIgb2YgTWV0aG9kRWxlbWVudEltcGwgXQotICAgICAqCi0gICAgICovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TW9zdFNwZWNpZmljTWV0aG9kRWxlbWVudCgpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIE1ldGhvZCBhTWV0aG9kID0gbnVsbDsKLSAgICAgICAgTWV0aG9kRWxlbWVudCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kVHJhbnNhY3Rpb24KLSAgICAgICAgICAgICAgICAuZ2V0TW9zdFNwZWNpZmljTWV0aG9kRWxlbWVudChhTWV0aG9kKTsKLSAgICB9ICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzRXF1aXZhbGVudCgpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbjEgPSBnZXRFamJGYWN0b3J5KCkuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgTWV0aG9kVHJhbnNhY3Rpb24gb2JqTWV0aG9kVHJhbnNhY3Rpb24yID0gZ2V0RWpiRmFjdG9yeSgpLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0KLSAgICAgICAgb2JqTWV0aG9kVHJhbnNhY3Rpb24xLnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5TVVBQT1JUU19MSVRFUkFMKTsKLSAgICAgICAgb2JqTWV0aG9kVHJhbnNhY3Rpb24yLnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5TVVBQT1JUU19MSVRFUkFMKTsKLSAgICAgCi0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBvYmpNZXRob2RUcmFuc2FjdGlvbjEuaXNFcXVpdmFsZW50KG9iak1ldGhvZFRyYW5zYWN0aW9uMik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhyZXRWYWx1ZSx0cnVlKTsKLSAgICAgICAgb2JqTWV0aG9kVHJhbnNhY3Rpb24yLnNldFRyYW5zYWN0aW9uQXR0cmlidXRlKFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZS5SRVFVSVJFRF9MSVRFUkFMKTsKLSAgICAgICAgCi0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kVHJhbnNhY3Rpb24xLmlzRXF1aXZhbGVudChvYmpNZXRob2RUcmFuc2FjdGlvbjIpOwotICAgICAgICBhc3NlcnRFcXVhbHMocmV0VmFsdWUsZmFsc2UpOwotICAgIH0KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIFRyYW5zYWN0aW9uQXR0cmlidXRlVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqTWV0aG9kVHJhbnNhY3Rpb24uZ2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgVHJhbnNhY3Rpb25BdHRyaWJ1dGVUeXBlIG5ld1RyYW5zYWN0aW9uQXR0cmlidXRlID0gbnVsbDsKLSAgICAgICAgb2JqTWV0aG9kVHJhbnNhY3Rpb24KLSAgICAgICAgICAgICAgICAuc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUobmV3VHJhbnNhY3Rpb25BdHRyaWJ1dGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5zZXRUcmFuc2FjdGlvbkF0dHJpYnV0ZSgpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIG9iak1ldGhvZFRyYW5zYWN0aW9uLnVuc2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKTsKLSAgICB9IAotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1NldFRyYW5zYWN0aW9uQXR0cmlidXRlKCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFRyYW5zYWN0aW9uLmlzU2V0VHJhbnNhY3Rpb25BdHRyaWJ1dGUoKTsKLSAgICB9Ci0qLwotIC8qICAgcHVibGljIHZvaWQgdGVzdF9nZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIFN0cmluZyByZXRWYWx1ZSA9ICIiOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFRyYW5zYWN0aW9uLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXREZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIFN0cmluZyBuZXdEZXNjcmlwdGlvbiA9ICIiOwotICAgICAgICBvYmpNZXRob2RUcmFuc2FjdGlvbi5zZXREZXNjcmlwdGlvbihuZXdEZXNjcmlwdGlvbik7Ci0gICAgfSovCi0KLSAvKiAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0QXNzZW1ibHlEZXNjcmlwdG9yKCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgQXNzZW1ibHlEZXNjcmlwdG9yIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RUcmFuc2FjdGlvbi5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEFzc2VtYmx5RGVzY3JpcHRvcigpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIEFzc2VtYmx5RGVzY3JpcHRvciBuZXdBc3NlbWJseURlc2NyaXB0b3IgPSBudWxsOwotICAgICAgICBvYmpNZXRob2RUcmFuc2FjdGlvbi5zZXRBc3NlbWJseURlc2NyaXB0b3IobmV3QXNzZW1ibHlEZXNjcmlwdG9yKTsKLSAgICB9ICovCi0KLSAgLyogIHB1YmxpYyB2b2lkIHRlc3RfZ2V0TWV0aG9kRWxlbWVudHNfMigpIHsKLQotICAgICAgICBNZXRob2RUcmFuc2FjdGlvbiBvYmpNZXRob2RUcmFuc2FjdGlvbiA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1ldGhvZFRyYW5zYWN0aW9uKCk7Ci0gICAgICAgIEVMaXN0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpNZXRob2RUcmFuc2FjdGlvbi5nZXRNZXRob2RFbGVtZW50cygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25zKCkgewotCi0gICAgICAgIE1ldGhvZFRyYW5zYWN0aW9uIG9iak1ldGhvZFRyYW5zYWN0aW9uID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWV0aG9kVHJhbnNhY3Rpb24oKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iak1ldGhvZFRyYW5zYWN0aW9uLmdldERlc2NyaXB0aW9ucygpOwotICAgIH0gKi8KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IE1ldGhvZFRyYW5zYWN0aW9uVGVzdCgidGVzdF9pc0VxdWl2YWxlbnQiKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IE1ldGhvZFRyYW5zYWN0aW9uVGVzdCgidGVzdF9nZXRNZXRob2RFbGVtZW50cyIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLSAgIAotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9RdWVyeU1ldGhvZFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L1F1ZXJ5TWV0aG9kVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2E2ZmZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L1F1ZXJ5TWV0aG9kVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQXNzZW1ibHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5Db250YWluZXJNYW5hZ2VkRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlF1ZXJ5TWV0aG9kOwotCi1wdWJsaWMgY2xhc3MgUXVlcnlNZXRob2RUZXN0IGV4dGVuZHMgRWpiRU1GVGVzdEJhc2UgewotCi0JLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgUXVlcnlNZXRob2RUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLSAgIAotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRRdWVyeSgpIHsKLQotICAgICAgICBRdWVyeU1ldGhvZCBvYmpRdWVyeU1ldGhvZCA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5TWV0aG9kKCk7Ci0gICAgICAgIFF1ZXJ5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRdWVyeU1ldGhvZC5nZXRRdWVyeSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UXVlcnkoKSB7Ci0KLSAgICAgICAgUXVlcnlNZXRob2Qgb2JqUXVlcnlNZXRob2QgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeU1ldGhvZCgpOwotICAgICAgICBRdWVyeSBuZXdRdWVyeSA9IG51bGw7Ci0gICAgICAgIG9ialF1ZXJ5TWV0aG9kLnNldFF1ZXJ5KG5ld1F1ZXJ5KTsKLSAgICB9ICovCi0gICAgCi0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldENsaWVudFR5cGVKYXZhQ2xhc3NlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlpbml0KCk7Ci0JCUVKQlJlc291cmNlIEREID0gKEVKQlJlc291cmNlKSBlamJGaWxlLmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKTsKLQkJCi0JCUFzc2VtYmx5RGVzY3JpcHRvciBhc3NlbWJseURlc2NyaXB0b3IgPSBERC5nZXRFSkJKYXIoKS5nZXRBc3NlbWJseURlc2NyaXB0b3IoKTsKLQkJTGlzdCBlbnRlcnByaXNlQmVhbnMgPSBERC5nZXRFSkJKYXIoKS5nZXRFbnRlcnByaXNlQmVhbnMoKTsKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBlbnRpdHlCZWFuID0gbnVsbDsKLQkJRW50ZXJwcmlzZUJlYW4gYmVhbiA9IG51bGw7Ci0JCWZvciAoaW50IHg9MDsgeDwgZW50ZXJwcmlzZUJlYW5zLnNpemUoKTsgKyt4KSB7Ci0JCQliZWFuID0gKEVudGVycHJpc2VCZWFuKSBlbnRlcnByaXNlQmVhbnMuZ2V0KHgpOwotCQkJaWYgKGJlYW4uaXNFbnRpdHkoKSAmJiBiZWFuLmlzQ29udGFpbmVyTWFuYWdlZEVudGl0eSgpKSB7Ci0JCQkJZW50aXR5QmVhbiA9IChDb250YWluZXJNYW5hZ2VkRW50aXR5KSBiZWFuOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFzc2VydE5vdE51bGwoZW50aXR5QmVhbik7Ci0JCVF1ZXJ5TWV0aG9kIG9ialF1ZXJ5TWV0aG9kID1nZXRFamJGYWN0b3J5KCkuY3JlYXRlUXVlcnlNZXRob2QoKTsKLQkJb2JqUXVlcnlNZXRob2Quc2V0TmFtZShRdWVyeU1ldGhvZC5TRUxFQ1RfUFJFRklYKyJUZXN0Iik7Ci0JCW9ialF1ZXJ5TWV0aG9kLnNldEVudGVycHJpc2VCZWFuKGVudGl0eUJlYW4pOwotCQlKYXZhQ2xhc3NbXSByZXRWYWx1ZSA9IG9ialF1ZXJ5TWV0aG9kLmdldENsaWVudFR5cGVKYXZhQ2xhc3NlcygpOwotCQlhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmxlbmd0aD09MSx0cnVlICk7Ci0JCWFzc2VydEVxdWFscyhyZXRWYWx1ZVswXSxlbnRpdHlCZWFuLmdldEVqYkNsYXNzKCkpOwotCQkKLQkJb2JqUXVlcnlNZXRob2Quc2V0TmFtZShRdWVyeU1ldGhvZC5GSU5EX1BSRUZJWCsiVGVzdCIpOwotCQkKLQkJaWYgKGVudGl0eUJlYW4uaGFzTG9jYWxDbGllbnQoKSAmJiAhZW50aXR5QmVhbi5oYXNSZW1vdGVDbGllbnQoKSkgewotCQkJcmV0VmFsdWUgPSBvYmpRdWVyeU1ldGhvZC5nZXRDbGllbnRUeXBlSmF2YUNsYXNzZXMoKTsKLQkJCWFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotCQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlLmxlbmd0aD09MSx0cnVlICk7Ci0JCQlhc3NlcnRFcXVhbHMocmV0VmFsdWVbMF0sZW50aXR5QmVhbi5nZXRMb2NhbEhvbWVJbnRlcmZhY2UoKSk7Ci0JCX0JCi0JCWlmIChlbnRpdHlCZWFuLmhhc1JlbW90ZUNsaWVudCgpICYmICFlbnRpdHlCZWFuLmhhc0xvY2FsQ2xpZW50KCkpIHsKLQkJCXJldFZhbHVlID0gb2JqUXVlcnlNZXRob2QuZ2V0Q2xpZW50VHlwZUphdmFDbGFzc2VzKCk7Ci0JCQlhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLQkJCWFzc2VydEVxdWFscyhyZXRWYWx1ZS5sZW5ndGg9PTEsdHJ1ZSApOwotCQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlWzBdLGVudGl0eUJlYW4uZ2V0SG9tZUludGVyZmFjZSgpKTsKLQkJfQotCQlpZiAoZW50aXR5QmVhbi5oYXNSZW1vdGVDbGllbnQoKSAmJiBlbnRpdHlCZWFuLmhhc0xvY2FsQ2xpZW50KCkpIHsKLQkJCXJldFZhbHVlID0gb2JqUXVlcnlNZXRob2QuZ2V0Q2xpZW50VHlwZUphdmFDbGFzc2VzKCk7Ci0JCQlhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLQkJCWFzc2VydEVxdWFscyhyZXRWYWx1ZS5sZW5ndGg9PTIsdHJ1ZSApOwotCQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlWzBdLGVudGl0eUJlYW4uZ2V0TG9jYWxIb21lSW50ZXJmYWNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHJldFZhbHVlWzFdLGVudGl0eUJlYW4uZ2V0SG9tZUludGVyZmFjZSgpKTsKLQkJfSAgCi0JfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgUXVlcnlNZXRob2RUZXN0KCJ0ZXN0X2dldENsaWVudFR5cGVKYXZhQ2xhc3NlcyIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0JCQotCQkKLQkKLQkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvUXVlcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9RdWVyeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYyZDY0Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9lamIvdGVzdC9RdWVyeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLlJldHVyblR5cGVNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgUXVlcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgcHVibGljIHZvaWQgdGVzdF9RdWVyeSgpIHsKLSAgICAgICAgUXVlcnkgdG1wUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHRtcFF1ZXJ5KTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShRdWVyeVRlc3QuY2xhc3MpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNMb2NhbFJlc3VsdE1hcHBpbmcoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBvYmpRdWVyeS5zZXRSZXR1cm5UeXBlTWFwcGluZyhSZXR1cm5UeXBlTWFwcGluZy5MT0NBTF9MSVRFUkFMKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9ialF1ZXJ5LmlzTG9jYWxSZXN1bHRNYXBwaW5nKCksdHJ1ZSk7Ci0gICAgICAgIG9ialF1ZXJ5LnNldFJldHVyblR5cGVNYXBwaW5nKFJldHVyblR5cGVNYXBwaW5nLlJFTU9URV9MSVRFUkFMKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKG9ialF1ZXJ5LmlzTG9jYWxSZXN1bHRNYXBwaW5nKCksZmFsc2UpOwotICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfaXNSZW1vdGVSZXN1bHRNYXBwaW5nKCkgewotCi0gICAgCSBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgICBvYmpRdWVyeS5zZXRSZXR1cm5UeXBlTWFwcGluZyhSZXR1cm5UeXBlTWFwcGluZy5SRU1PVEVfTElURVJBTCk7Ci0gICAgICAgICBhc3NlcnRFcXVhbHMob2JqUXVlcnkuaXNMb2NhbFJlc3VsdE1hcHBpbmcoKSxmYWxzZSk7Ci0gICAgICAgICBvYmpRdWVyeS5zZXRSZXR1cm5UeXBlTWFwcGluZyhSZXR1cm5UeXBlTWFwcGluZy5MT0NBTF9MSVRFUkFMKTsKLSAgICAgICAgIGFzc2VydEVxdWFscyhvYmpRdWVyeS5pc0xvY2FsUmVzdWx0TWFwcGluZygpLHRydWUpOwotICAgICAKLSAgICB9Ci0KLSAvKiAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRdWVyeS5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RGVzY3JpcHRpb24oKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBTdHJpbmcgbmV3RGVzY3JpcHRpb24gPSAiIjsKLSAgICAgICAgb2JqUXVlcnkuc2V0RGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0RWpiUUwoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBTdHJpbmcgcmV0VmFsdWUgPSAiIjsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRdWVyeS5nZXRFamJRTCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0RWpiUUwoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBTdHJpbmcgbmV3RWpiUUwgPSAiIjsKLSAgICAgICAgb2JqUXVlcnkuc2V0RWpiUUwobmV3RWpiUUwpOwotICAgIH0gKi8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRSZXR1cm5UeXBlTWFwcGluZygpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIFJldHVyblR5cGVNYXBwaW5nIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRdWVyeS5nZXRSZXR1cm5UeXBlTWFwcGluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UmV0dXJuVHlwZU1hcHBpbmcoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBSZXR1cm5UeXBlTWFwcGluZyBuZXdSZXR1cm5UeXBlTWFwcGluZyA9IG51bGw7Ci0gICAgICAgIG9ialF1ZXJ5LnNldFJldHVyblR5cGVNYXBwaW5nKG5ld1JldHVyblR5cGVNYXBwaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3Vuc2V0UmV0dXJuVHlwZU1hcHBpbmcoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBvYmpRdWVyeS51bnNldFJldHVyblR5cGVNYXBwaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1NldFJldHVyblR5cGVNYXBwaW5nKCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9ialF1ZXJ5LmlzU2V0UmV0dXJuVHlwZU1hcHBpbmcoKTsKLSAgICB9Ki8KLQotIC8qICAgcHVibGljIHZvaWQgdGVzdF9nZXRRdWVyeU1ldGhvZCgpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIFF1ZXJ5TWV0aG9kIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRdWVyeS5nZXRRdWVyeU1ldGhvZCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3Rfc2V0UXVlcnlNZXRob2QoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBRdWVyeU1ldGhvZCBuZXdRdWVyeU1ldGhvZCA9IG51bGw7Ci0gICAgICAgIG9ialF1ZXJ5LnNldFF1ZXJ5TWV0aG9kKG5ld1F1ZXJ5TWV0aG9kKTsKLSAgICB9Ki8KLQotICAvKiAgcHVibGljIHZvaWQgdGVzdF9nZXRFbnRpdHkoKSB7Ci0KLSAgICAgICAgUXVlcnkgb2JqUXVlcnkgPSBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVRdWVyeSgpOwotICAgICAgICBDb250YWluZXJNYW5hZ2VkRW50aXR5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpRdWVyeS5nZXRFbnRpdHkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldEVudGl0eSgpIHsKLQotICAgICAgICBRdWVyeSBvYmpRdWVyeSA9IEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVF1ZXJ5KCk7Ci0gICAgICAgIENvbnRhaW5lck1hbmFnZWRFbnRpdHkgbmV3RW50aXR5ID0gbnVsbDsKLSAgICAgICAgb2JqUXVlcnkuc2V0RW50aXR5KG5ld0VudGl0eSk7Ci0gICAgfSovCi0KLSAgICAvKnB1YmxpYyB2b2lkIHRlc3RfZ2V0RGVzY3JpcHRpb25zKCkgewotCi0gICAgICAgIFF1ZXJ5IG9ialF1ZXJ5ID0gRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlUXVlcnkoKTsKLSAgICAgICAgRUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialF1ZXJ5LmdldERlc2NyaXB0aW9ucygpOwotICAgIH0qLwotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvU2Vzc2lvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2VqYi90ZXN0L1Nlc3Npb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNzdmZDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZWpiL3Rlc3QvU2Vzc2lvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRWpiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLQotcHVibGljIGNsYXNzIFNlc3Npb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFNlc3Npb25UZXN0LmNsYXNzKTsKLQl9Ci0gCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBUcmFuc2FjdGlvblR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialNlc3Npb24uZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0KLSAgICAgICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgVHJhbnNhY3Rpb25UeXBlIG5ld1RyYW5zYWN0aW9uVHlwZSA9IG51bGw7Ci0gICAgICAgIG9ialNlc3Npb24uc2V0VHJhbnNhY3Rpb25UeXBlKG5ld1RyYW5zYWN0aW9uVHlwZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF91bnNldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBvYmpTZXNzaW9uLnVuc2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9pc1NldFRyYW5zYWN0aW9uVHlwZSgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBib29sZWFuIHJldFZhbHVlID0gZmFsc2U7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqU2Vzc2lvbi5pc1NldFRyYW5zYWN0aW9uVHlwZSgpOwotICAgIH0qLwotCi0gICAvKiBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlc3Npb25UeXBlKCkgewotCi0gICAgICAgIFNlc3Npb24gb2JqU2Vzc2lvbiA9ICBFamJGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIFNlc3Npb25UeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpTZXNzaW9uLmdldFNlc3Npb25UeXBlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9zZXRTZXNzaW9uVHlwZSgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBTZXNzaW9uVHlwZSBuZXdTZXNzaW9uVHlwZSA9IG51bGw7Ci0gICAgICAgIG9ialNlc3Npb24uc2V0U2Vzc2lvblR5cGUobmV3U2Vzc2lvblR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfdW5zZXRTZXNzaW9uVHlwZSgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBvYmpTZXNzaW9uLnVuc2V0U2Vzc2lvblR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2lzU2V0U2Vzc2lvblR5cGUoKSB7Ci0KLSAgICAgICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYkZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVNlc3Npb24oKTsKLSAgICAgICAgYm9vbGVhbiByZXRWYWx1ZSA9IGZhbHNlOwotICAgICAgICByZXRWYWx1ZSA9IG9ialNlc3Npb24uaXNTZXRTZXNzaW9uVHlwZSgpOwotICAgIH0qLwotCi0gIC8qICBwdWJsaWMgdm9pZCB0ZXN0X2dldFNlcnZpY2VFbmRwb2ludCgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBKYXZhQ2xhc3MgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialNlc3Npb24uZ2V0U2VydmljZUVuZHBvaW50KCk7Ci0gICAgfQotCi0gICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNlcnZpY2VFbmRwb2ludCgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBKYXZhQ2xhc3MgbmV3U2VydmljZUVuZHBvaW50ID0gbnVsbDsKLSAgICAgICAgb2JqU2Vzc2lvbi5zZXRTZXJ2aWNlRW5kcG9pbnQobmV3U2VydmljZUVuZHBvaW50KTsKLSAgICB9Ki8KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0X3NldFNlcnZpY2VFbmRwb2ludE5hbWUoKSB7Ci0KLSAgICAgICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgIFN0cmluZyBzZXJ2aWNlRW5kcG9pbnROYW1lID0gIlNlc3Npb25FbmRQb2ludDEiOwotICAgICAgICBvYmpTZXNzaW9uLnNldFNlcnZpY2VFbmRwb2ludE5hbWUoc2VydmljZUVuZHBvaW50TmFtZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzZXJ2aWNlRW5kcG9pbnROYW1lLG9ialNlc3Npb24uZ2V0U2VydmljZUVuZHBvaW50TmFtZSgpKTsKLSAgICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2hhc1NlcnZpY2VFbmRwb2ludCgpIHsKLQotICAgICAgICBTZXNzaW9uIG9ialNlc3Npb24gPSAgRWpiRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlU2Vzc2lvbigpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2JqU2Vzc2lvbi5oYXNTZXJ2aWNlRW5kcG9pbnQoKSxmYWxzZSk7Ci0gICAgICAgIGJvb2xlYW4gcmV0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VFbmRwb2ludE5hbWUgPSAiU2Vzc2lvbkVuZFBvaW50MSI7Ci0gICAgICAgIG9ialNlc3Npb24uc2V0U2VydmljZUVuZHBvaW50TmFtZShzZXJ2aWNlRW5kcG9pbnROYW1lKTsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpTZXNzaW9uLmhhc1NlcnZpY2VFbmRwb2ludCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2JqU2Vzc2lvbi5oYXNTZXJ2aWNlRW5kcG9pbnQoKSx0cnVlKTsKLSAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRTZXJ2aWNlRW5kcG9pbnROYW1lKCkgewotCi0JICAgU2Vzc2lvbiBvYmpTZXNzaW9uID0gIEVqYlBhY2thZ2UuZUlOU1RBTkNFLmdldEVqYkZhY3RvcnkoKS5jcmVhdGVTZXNzaW9uKCk7Ci0gICAgICAgU3RyaW5nIHNlcnZpY2VFbmRwb2ludE5hbWUgPSAiU2Vzc2lvbkVuZFBvaW50MSI7Ci0gICAgICAgb2JqU2Vzc2lvbi5zZXRTZXJ2aWNlRW5kcG9pbnROYW1lKHNlcnZpY2VFbmRwb2ludE5hbWUpOwotICAgICAgIGFzc2VydEVxdWFscyhzZXJ2aWNlRW5kcG9pbnROYW1lLG9ialNlc3Npb24uZ2V0U2VydmljZUVuZHBvaW50TmFtZSgpKTsKLSAgICAgCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdGVzdC9Db25uZWN0b3JUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdGVzdC9Db25uZWN0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxN2M4ZDUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Rlc3QvQ29ubmVjdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcmNoaXZlLmVtZnRlc3RzLlJhckVNRlRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS50ZXN0dXRpbGl0aWVzLkVNRkF0dHJpYnV0ZUZlYXR1cmVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuSjJFRVZlcnNpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkpjYVBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JUZXN0IGV4dGVuZHMgUmFyRU1GVGVzdCB7Ci0KLSAgICAvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBDb25uZWN0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgCXJldHVybiBKY2FQYWNrYWdlLmVJTlNUQU5DRS5nZXRKY2FGYWN0b3J5KCkuY3JlYXRlQ29ubmVjdG9yKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRWZXJzaW9uSUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJRU1GQXR0cmlidXRlRmVhdHVyZUdlbmVyYXRvci5yZXNldCgpOwotCQljcmVhdGVFQVIoKTsKLQkJY3JlYXRlUkFSKCk7Ci0KLQkJQ29ubmVjdG9yUmVzb3VyY2UgREQgPSAoQ29ubmVjdG9yUmVzb3VyY2UpIHJhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQlERC5zZXRWZXJzaW9uSUQoSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzRfSUQpOwotCQlzZXRWZXJzaW9uKFZFUlNJT05fMV80KTsKLQkJaW50IHZlcnNpb25JRCA9IERELmdldENvbm5lY3RvcigpLmdldFZlcnNpb25JRCgpOwotCQlhc3NlcnRFcXVhbHModmVyc2lvbklELEoyRUVWZXJzaW9uQ29uc3RhbnRzLkpDQV8xXzVfSUQpOwotCQkKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBDb25uZWN0b3JUZXN0KCJ0ZXN0X2dldFZlcnNpb25JRCIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdGVzdC9KY2FGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvamNhL3Rlc3QvSmNhRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5MDU5My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9qY2EvdGVzdC9KY2FGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnRlc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5BY3RpdmF0aW9uU3BlYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQWRtaW5PYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkF1dGhlbnRpY2F0aW9uTWVjaGFuaXNtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5Db25maWdQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLkNvbm5lY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSW5ib3VuZFJlc291cmNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuSmNhUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTGljZW5zZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuTWVzc2FnZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLk1lc3NhZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuT3V0Ym91bmRSZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlJlcXVpcmVkQ29uZmlnUHJvcGVydHlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5SZXNvdXJjZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLlNlY3VyaXR5UGVybWlzc2lvbjsKLQotcHVibGljIGNsYXNzIEpjYUZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBKY2FGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gSmNhUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SmNhRmFjdG9yeSgpOwotCX0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X0pjYUZhY3RvcnkoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSB0bXBKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShKY2FGYWN0b3J5VGVzdC5jbGFzcyk7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVDb25uZWN0b3IoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ29ubmVjdG9yIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZUNvbm5lY3RvcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUxpY2Vuc2UoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTGljZW5zZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVMaWNlbnNlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlSW5ib3VuZFJlc291cmNlQWRhcHRlcigpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBJbmJvdW5kUmVzb3VyY2VBZGFwdGVyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZUluYm91bmRSZXNvdXJjZUFkYXB0ZXIoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcigpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBPdXRib3VuZFJlc291cmNlQWRhcHRlciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVPdXRib3VuZFJlc291cmNlQWRhcHRlcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1lc3NhZ2VBZGFwdGVyKCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1lc3NhZ2VBZGFwdGVyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZU1lc3NhZ2VBZGFwdGVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb24oKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQ29ubmVjdGlvbkRlZmluaXRpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlQ29ubmVjdGlvbkRlZmluaXRpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVBZG1pbk9iamVjdCgpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBZG1pbk9iamVjdCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVBZG1pbk9iamVjdCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZU1lc3NhZ2VMaXN0ZW5lcigpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBNZXNzYWdlTGlzdGVuZXIgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlTWVzc2FnZUxpc3RlbmVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQWN0aXZhdGlvblNwZWMoKSB7Ci0KLSAgICAgICAgSmNhRmFjdG9yeSBvYmpKY2FGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgQWN0aXZhdGlvblNwZWMgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlQWN0aXZhdGlvblNwZWMoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENvbmZpZ1Byb3BlcnR5VHlwZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVJlc291cmNlQWRhcHRlcigpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSZXNvdXJjZUFkYXB0ZXIgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpjYUZhY3RvcnkuY3JlYXRlUmVzb3VyY2VBZGFwdGVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2VjdXJpdHlQZXJtaXNzaW9uKCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlY3VyaXR5UGVybWlzc2lvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVTZWN1cml0eVBlcm1pc3Npb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSmNhRmFjdG9yeS5jcmVhdGVBdXRoZW50aWNhdGlvbk1lY2hhbmlzbSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUNvbmZpZ1Byb3BlcnR5KCkgewotCi0gICAgICAgIEpjYUZhY3Rvcnkgb2JqSmNhRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENvbmZpZ1Byb3BlcnR5IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmNyZWF0ZUNvbmZpZ1Byb3BlcnR5KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0SmNhUGFja2FnZSgpIHsKLQotICAgICAgICBKY2FGYWN0b3J5IG9iakpjYUZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBKY2FQYWNrYWdlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKY2FGYWN0b3J5LmdldEpjYVBhY2thZ2UoKTsKLSAgICAgICAKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvdGVzdC9Kc3BGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvanNwL3Rlc3QvSnNwRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IxZjk4Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9qc3AvdGVzdC9Kc3BGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnRlc3QuSmNhRmFjdG9yeVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuanNwLkpTUENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSlNQUHJvcGVydHlHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuSnNwUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qc3AuVGFnTGliUmVmVHlwZTsKLQotcHVibGljIGNsYXNzIEpzcEZhY3RvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShKY2FGYWN0b3J5VGVzdC5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgSnNwRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIEpzcFBhY2thZ2UuZUlOU1RBTkNFLmdldEpzcEZhY3RvcnkoKTsKLQl9Ci0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVKU1BDb25maWcoKSB7Ci0KLSAgICAgICAgSnNwRmFjdG9yeSBvYmpKc3BGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSlNQQ29uZmlnIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKc3BGYWN0b3J5LmNyZWF0ZUpTUENvbmZpZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUpTUFByb3BlcnR5R3JvdXAoKSB7Ci0KLSAgICAgICAgSnNwRmFjdG9yeSBvYmpKc3BGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgSlNQUHJvcGVydHlHcm91cCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqSnNwRmFjdG9yeS5jcmVhdGVKU1BQcm9wZXJ0eUdyb3VwKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlVGFnTGliUmVmVHlwZSgpIHsKLQotICAgICAgICBKc3BGYWN0b3J5IG9iakpzcEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBUYWdMaWJSZWZUeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpKc3BGYWN0b3J5LmNyZWF0ZVRhZ0xpYlJlZlR5cGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRKc3BQYWNrYWdlKCkgewotCi0gICAgICAgIEpzcEZhY3Rvcnkgb2JqSnNwRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEpzcFBhY2thZ2UgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9iakpzcEZhY3RvcnkuZ2V0SnNwUGFja2FnZSgpOwotICAgICAgICAvLyBUT0RPIGdldFdzZGRQYWNrYWdlIG1ldGhvZCBhbHdheXMgcmV0dXJuIG51bGwKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJhcHBsaWNhdGlvbi90ZXN0L1dlYmFwcGxpY2F0aW9uRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL3Rlc3QvV2ViYXBwbGljYXRpb25GYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2QwYTFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYmFwcGxpY2F0aW9uL3Rlc3QvV2ViYXBwbGljYXRpb25GYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24udGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQXV0aENvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uQ29udGV4dFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkVycm9yQ29kZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5FcnJvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRXhjZXB0aW9uVHlwZUVycm9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uRmlsdGVyTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Gb3JtTG9naW5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSFRUUE1ldGhvZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uSW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkpTUFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkxvZ2luQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLk1pbWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlJvbGVOYW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZWN1cml0eUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXNzaW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlRhZ0xpYlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5VUkxQYXR0ZXJuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5Vc2VyRGF0YUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYlJlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJhcHBsaWNhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlbGNvbWVGaWxlTGlzdDsKLQotcHVibGljIGNsYXNzIFdlYmFwcGxpY2F0aW9uRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFdlYmFwcGxpY2F0aW9uRmFjdG9yeVRlc3QuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIFdlYmFwcGxpY2F0aW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V2ViYXBwbGljYXRpb25GYWN0b3J5KCk7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlV2ViQXBwKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBXZWJBcHAgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVXZWJBcHAoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVDb250ZXh0UGFyYW0oKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIENvbnRleHRQYXJhbSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUNvbnRleHRQYXJhbSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVycm9yUGFnZSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRXJyb3JQYWdlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlRXJyb3JQYWdlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlVGFnTGliUmVmKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBUYWdMaWJSZWYgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVUYWdMaWJSZWYoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFeGNlcHRpb25UeXBlRXJyb3JQYWdlKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBFeGNlcHRpb25UeXBlRXJyb3JQYWdlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlRXhjZXB0aW9uVHlwZUVycm9yUGFnZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUVycm9yQ29kZUVycm9yUGFnZSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRXJyb3JDb2RlRXJyb3JQYWdlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlRXJyb3JDb2RlRXJyb3JQYWdlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlV2VsY29tZUZpbGVMaXN0KCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBXZWxjb21lRmlsZUxpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVXZWxjb21lRmlsZUxpc3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVXZWxjb21lRmlsZSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgV2VsY29tZUZpbGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVXZWxjb21lRmlsZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlY3VyaXR5Q29uc3RyYWludCgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VjdXJpdHlDb25zdHJhaW50IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlU2VjdXJpdHlDb25zdHJhaW50KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlV2ViUmVzb3VyY2VDb2xsZWN0aW9uKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBXZWJSZXNvdXJjZUNvbGxlY3Rpb24gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVXZWJSZXNvdXJjZUNvbGxlY3Rpb24oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVVUkxQYXR0ZXJuVHlwZSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgVVJMUGF0dGVyblR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVVUkxQYXR0ZXJuVHlwZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUF1dGhDb25zdHJhaW50KCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBBdXRoQ29uc3RyYWludCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUF1dGhDb25zdHJhaW50KCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlVXNlckRhdGFDb25zdHJhaW50KCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBVc2VyRGF0YUNvbnN0cmFpbnQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVVc2VyRGF0YUNvbnN0cmFpbnQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVMb2dpbkNvbmZpZygpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTG9naW5Db25maWcgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVMb2dpbkNvbmZpZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUZvcm1Mb2dpbkNvbmZpZygpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRm9ybUxvZ2luQ29uZmlnIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlRm9ybUxvZ2luQ29uZmlnKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTWltZU1hcHBpbmcoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIE1pbWVNYXBwaW5nIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlTWltZU1hcHBpbmcoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTZXNzaW9uQ29uZmlnKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXNzaW9uQ29uZmlnIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkuY3JlYXRlU2Vzc2lvbkNvbmZpZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlcnZsZXRNYXBwaW5nKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXJ2bGV0TWFwcGluZyByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVNlcnZsZXRNYXBwaW5nKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2VydmxldCgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VydmxldCByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZVNlcnZsZXQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTZXJ2bGV0VHlwZSgpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgU2VydmxldFR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVTZXJ2bGV0VHlwZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUpTUFR5cGUoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEpTUFR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVKU1BUeXBlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlSW5pdFBhcmFtKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBJbml0UGFyYW0gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVJbml0UGFyYW0oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVGaWx0ZXIoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEZpbHRlciByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUZpbHRlcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUZpbHRlck1hcHBpbmcoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIEZpbHRlck1hcHBpbmcgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVGaWx0ZXJNYXBwaW5nKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlTG9jYWxFbmNvZGluZ01hcHBpbmdMaXN0KCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeQotICAgICAgICAgICAgICAgIC5jcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZ0xpc3QoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZygpIHsKLQotICAgICAgICBXZWJhcHBsaWNhdGlvbkZhY3Rvcnkgb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgTG9jYWxFbmNvZGluZ01hcHBpbmcgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVMb2NhbEVuY29kaW5nTWFwcGluZygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUhUVFBNZXRob2RUeXBlKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBIVFRQTWV0aG9kVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmNyZWF0ZUhUVFBNZXRob2RUeXBlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUm9sZU5hbWVUeXBlKCkgewotCi0gICAgICAgIFdlYmFwcGxpY2F0aW9uRmFjdG9yeSBvYmpXZWJhcHBsaWNhdGlvbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBSb2xlTmFtZVR5cGUgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeS5jcmVhdGVSb2xlTmFtZVR5cGUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRXZWJhcHBsaWNhdGlvblBhY2thZ2UoKSB7Ci0KLSAgICAgICAgV2ViYXBwbGljYXRpb25GYWN0b3J5IG9ialdlYmFwcGxpY2F0aW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFdlYmFwcGxpY2F0aW9uUGFja2FnZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV2ViYXBwbGljYXRpb25GYWN0b3J5LmdldFdlYmFwcGxpY2F0aW9uUGFja2FnZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vdGVzdC9Xc2NvbW1vbkZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzY29tbW9uL3Rlc3QvV3Njb21tb25GYWN0b3J5VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTc2NGZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvbW9majJlZVRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3dlYnNlcnZpY2Uvd3Njb21tb24vdGVzdC9Xc2NvbW1vbkZhY3RvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3Njb21tb24udGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EZXNjcmlwdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5EaXNwbGF5TmFtZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Jbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5Qb3J0TmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLlNPQVBIZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2NvbW1vbi5TT0FQUm9sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzY29tbW9uLldzY29tbW9uUGFja2FnZTsKLQotcHVibGljIGNsYXNzIFdzY29tbW9uRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFdzY29tbW9uRmFjdG9yeVRlc3QuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIFdzY29tbW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIFdzY29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V3Njb21tb25GYWN0b3J5KCk7Ci0JfQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlSW5pdFBhcmFtKCkgewotCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBvYmpXc2NvbW1vbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBJbml0UGFyYW0gcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzY29tbW9uRmFjdG9yeS5jcmVhdGVJbml0UGFyYW0oKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVTT0FQSGVhZGVyKCkgewotCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBvYmpXc2NvbW1vbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTT0FQSGVhZGVyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2NvbW1vbkZhY3RvcnkuY3JlYXRlU09BUEhlYWRlcigpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNPQVBSb2xlKCkgewotCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBvYmpXc2NvbW1vbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTT0FQUm9sZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3Njb21tb25GYWN0b3J5LmNyZWF0ZVNPQVBSb2xlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUG9ydE5hbWUoKSB7Ci0KLSAgICAgICAgV3Njb21tb25GYWN0b3J5IG9ialdzY29tbW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFBvcnROYW1lIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2NvbW1vbkZhY3RvcnkuY3JlYXRlUG9ydE5hbWUoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVEZXNjcmlwdGlvblR5cGUoKSB7Ci0KLSAgICAgICAgV3Njb21tb25GYWN0b3J5IG9ialdzY29tbW9uRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIERlc2NyaXB0aW9uVHlwZSByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3Njb21tb25GYWN0b3J5LmNyZWF0ZURlc2NyaXB0aW9uVHlwZSgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZURpc3BsYXlOYW1lVHlwZSgpIHsKLQotICAgICAgICBXc2NvbW1vbkZhY3Rvcnkgb2JqV3Njb21tb25GYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRGlzcGxheU5hbWVUeXBlIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2NvbW1vbkZhY3RvcnkuY3JlYXRlRGlzcGxheU5hbWVUeXBlKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfZ2V0V3Njb21tb25QYWNrYWdlKCkgewotCi0gICAgICAgIFdzY29tbW9uRmFjdG9yeSBvYmpXc2NvbW1vbkZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBXc2NvbW1vblBhY2thZ2UgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzY29tbW9uRmFjdG9yeS5nZXRXc2NvbW1vblBhY2thZ2UoKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy9tb2ZqMmVlVGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvd2Vic2VydmljZS93c2RkL3Rlc3QvV3NkZEZhY3RvcnlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvdGVzdC9Xc2RkRmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxMGFiOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL21vZmoyZWVUZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS93ZWJzZXJ2aWNlL3dzZGQvdGVzdC9Xc2RkRmFjdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuQmVhbkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkVKQkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLkhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlBvcnRDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLlNlcnZpY2VJbXBsQmVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuU2VydmxldExpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldTRExQb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2Vic2VydmljZS53c2RkLldlYlNlcnZpY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5Xc2RkRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlLndzZGQuV3NkZFBhY2thZ2U7Ci0KLXB1YmxpYyBjbGFzcyBXc2RkRmFjdG9yeVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFdzZGRGYWN0b3J5VGVzdC5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgV3NkZEZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBXc2RkUGFja2FnZS5lSU5TVEFOQ0UuZ2V0V3NkZEZhY3RvcnkoKTsKLQl9Ci0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVXZWJTZXJ2aWNlcygpIHsKLQotICAgICAgICBXc2RkRmFjdG9yeSBvYmpXc2RkRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFdlYlNlcnZpY2VzIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2RkRmFjdG9yeS5jcmVhdGVXZWJTZXJ2aWNlcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVdlYlNlcnZpY2VEZXNjcmlwdGlvbigpIHsKLQotICAgICAgICBXc2RkRmFjdG9yeSBvYmpXc2RkRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFdlYlNlcnZpY2VEZXNjcmlwdGlvbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3NkZEZhY3RvcnkuY3JlYXRlV2ViU2VydmljZURlc2NyaXB0aW9uKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlUG9ydENvbXBvbmVudCgpIHsKLQotICAgICAgICBXc2RkRmFjdG9yeSBvYmpXc2RkRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFBvcnRDb21wb25lbnQgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICByZXRWYWx1ZSA9IG9ialdzZGRGYWN0b3J5LmNyZWF0ZVBvcnRDb21wb25lbnQoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVXU0RMUG9ydCgpIHsKLQotICAgICAgICBXc2RkRmFjdG9yeSBvYmpXc2RkRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFdTRExQb3J0IHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2RkRmFjdG9yeS5jcmVhdGVXU0RMUG9ydCgpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZVNlcnZpY2VJbXBsQmVhbigpIHsKLQotICAgICAgICBXc2RkRmFjdG9yeSBvYmpXc2RkRmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0gICAgICAgIFNlcnZpY2VJbXBsQmVhbiByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3NkZEZhY3RvcnkuY3JlYXRlU2VydmljZUltcGxCZWFuKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlU2VydmxldExpbmsoKSB7Ci0KLSAgICAgICAgV3NkZEZhY3Rvcnkgb2JqV3NkZEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBTZXJ2bGV0TGluayByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3NkZEZhY3RvcnkuY3JlYXRlU2VydmxldExpbmsoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9jcmVhdGVFSkJMaW5rKCkgewotCi0gICAgICAgIFdzZGRGYWN0b3J5IG9ialdzZGRGYWN0b3J5ID0gZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgRUpCTGluayByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3NkZEZhY3RvcnkuY3JlYXRlRUpCTGluaygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKHJldFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2NyZWF0ZUhhbmRsZXIoKSB7Ci0KLSAgICAgICAgV3NkZEZhY3Rvcnkgb2JqV3NkZEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBIYW5kbGVyIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgcmV0VmFsdWUgPSBvYmpXc2RkRmFjdG9yeS5jcmVhdGVIYW5kbGVyKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocmV0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RfY3JlYXRlQmVhbkxpbmsoKSB7Ci0KLSAgICAgICAgV3NkZEZhY3Rvcnkgb2JqV3NkZEZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotICAgICAgICBCZWFuTGluayByZXRWYWx1ZSA9IG51bGw7Ci0gICAgICAgIHJldFZhbHVlID0gb2JqV3NkZEZhY3RvcnkuY3JlYXRlQmVhbkxpbmsoKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXRWYWx1ZSk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvb3V0LnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvb3V0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkMzBjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL291dC54bWkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iQVNDSUkiPz4NCi08b3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6SmF2YUNsYXNzIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeG1sbnM6b3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE9ImphdmEueG1pIiBuYW1lPSJBIiBraW5kPSJDTEFTUyIgcHVibGljPSJ0cnVlIj4NCi0gIDxlU3VwZXJUeXBlcyBocmVmPSJqYXZhOi9qYXZhLmxhbmcjT2JqZWN0Ii8+DQotICA8aW1wbGVtZW50c0ludGVyZmFjZXMgaHJlZj0iamF2YTovY29tLmlibS5ldG9vbHMuamF2YS5zdHJlc3NTYW1wbGUjSUEiLz4NCi0gIDxmaWVsZHMgbmFtZT0iYW5BIiBlVHlwZT0iLyIvPg0KLSAgPGZpZWxkcyBuYW1lPSJhQiI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6SmF2YUNsYXNzIiBocmVmPSJqYXZhOi9jb20uaWJtLmV0b29scy5qYXZhLnN0cmVzc1NhbXBsZSNCIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0iYmVlcyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi9jb20uaWJtLmV0b29scy5qYXZhLnN0cmVzc1NhbXBsZSNCW10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJiZWVzX2FuZF9iZWVzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6L2NvbS5pYm0uZXRvb2xzLmphdmEuc3RyZXNzU2FtcGxlI0JbXVtdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0iaW50cyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jaW50W10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJpbnRzMiI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jaW50W11bXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9ImludHMzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNpbnRbXVtdW10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJjaGFycyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jY2hhcltdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0iZmxvYXRzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNmbG9hdFtdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0iY29vbHMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2Jvb2xlYW5bXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9ImRvdWJsZXMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2RvdWJsZVtdIi8+DQotICA8L2ZpZWxkcz4NCi0gIDxmaWVsZHMgbmFtZT0ibG9uZ3MiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2xvbmdbXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9InNob3J0cyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jc2hvcnRbXSIvPg0KLSAgPC9maWVsZHM+DQotICA8ZmllbGRzIG5hbWU9ImJ5dGVzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNieXRlW10iLz4NCi0gIDwvZmllbGRzPg0KLSAgPGZpZWxkcyBuYW1lPSJ0ZXN0U3RyaW5nIiBmaW5hbD0idHJ1ZSIgc3RhdGljPSJ0cnVlIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpKYXZhQ2xhc3MiIGhyZWY9ImphdmE6L2phdmEubGFuZyNTdHJpbmciLz4NCi0gICAgPGluaXRpYWxpemVyIHNvdXJjZT0iJnF1b3Q7dGVzdGluZyZxdW90OyIgbmFtZT0idGVzdFN0cmluZ19ibG9jayIvPg0KLSAgPC9maWVsZHM+DQotICA8bWV0aG9kcyBuYW1lPSJkb0FsbFByaW1pdGl2ZXMiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkphdmFEYXRhVHlwZSIgaHJlZj0iamF2YTovI3ZvaWQiLz4NCi0gICAgPHBhcmFtZXRlcnMgbmFtZT0iYXJnMCI+DQotICAgICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNpbnRbXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzEiPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jaW50W11bXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzIiPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jaW50W11bXVtdIi8+DQotICAgIDwvcGFyYW1ldGVycz4NCi0gICAgPHBhcmFtZXRlcnMgbmFtZT0iYXJnMyI+DQotICAgICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNjaGFyW10iLz4NCi0gICAgPC9wYXJhbWV0ZXJzPg0KLSAgICA8cGFyYW1ldGVycyBuYW1lPSJhcmc0Ij4NCi0gICAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2Zsb2F0W10iLz4NCi0gICAgPC9wYXJhbWV0ZXJzPg0KLSAgICA8cGFyYW1ldGVycyBuYW1lPSJhcmc1Ij4NCi0gICAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2Jvb2xlYW5bXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzYiPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jZG91YmxlW10iLz4NCi0gICAgPC9wYXJhbWV0ZXJzPg0KLSAgICA8cGFyYW1ldGVycyBuYW1lPSJhcmc3Ij4NCi0gICAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2xvbmdbXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzgiPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jc2hvcnRbXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICAgIDxwYXJhbWV0ZXJzIG5hbWU9ImFyZzkiPg0KLSAgICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi8jYnl0ZVtdIi8+DQotICAgIDwvcGFyYW1ldGVycz4NCi0gIDwvbWV0aG9kcz4NCi0gIDxtZXRob2RzIG5hbWU9ImRvU29tZXRoaW5nIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpKYXZhQ2xhc3MiIGhyZWY9ImphdmE6L2NvbS5pYm0uZXRvb2xzLmphdmEuc3RyZXNzU2FtcGxlI0MiLz4NCi0gIDwvbWV0aG9kcz4NCi0gIDxtZXRob2RzIG5hbWU9ImdldEJ5dGVzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNieXRlW10iLz4NCi0gIDwvbWV0aG9kcz4NCi0gIDxtZXRob2RzIG5hbWU9ImdldENoYXIiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2NoYXJbXSIvPg0KLSAgPC9tZXRob2RzPg0KLSAgPG1ldGhvZHMgbmFtZT0iZ2V0RmxvYXRzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNmbG9hdFtdIi8+DQotICA8L21ldGhvZHM+DQotICA8bWV0aG9kcyBuYW1lPSJnZXRJbnRzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNpbnRbXSIvPg0KLSAgPC9tZXRob2RzPg0KLSAgPG1ldGhvZHMgbmFtZT0iZ2V0TG9uZ3MiPg0KLSAgICA8ZVR5cGUgeHNpOnR5cGU9Im9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC5qYXZhOkFycmF5VHlwZSIgaHJlZj0iamF2YTovI2xvbmdbXSIvPg0KLSAgPC9tZXRob2RzPg0KLSAgPG1ldGhvZHMgbmFtZT0iZ2V0U2hvcnRzIj4NCi0gICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6LyNzaG9ydFtdIi8+DQotICA8L21ldGhvZHM+DQotICA8bWV0aG9kcyBuYW1lPSJyZXR1cm5BcyI+DQotICAgIDxlVHlwZSB4c2k6dHlwZT0ib3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6QXJyYXlUeXBlIiBocmVmPSJqYXZhOi9jb20uaWJtLmV0b29scy5qYXZhLnN0cmVzc1NhbXBsZSNBW10iLz4NCi0gICAgPHBhcmFtZXRlcnMgbmFtZT0iYXJnMCI+DQotICAgICAgPGVUeXBlIHhzaTp0eXBlPSJvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwuamF2YTpBcnJheVR5cGUiIGhyZWY9ImphdmE6L2NvbS5pYm0uZXRvb2xzLmphdmEuc3RyZXNzU2FtcGxlI0NbXSIvPg0KLSAgICA8L3BhcmFtZXRlcnM+DQotICA8L21ldGhvZHM+DQotICA8bWV0aG9kcyBuYW1lPSJBIiBjb25zdHJ1Y3Rvcj0idHJ1ZSIvPg0KLTwvb3JnLmVjbGlwc2UuamVtLmludGVybmFsLmphdmE6SmF2YUNsYXNzPg0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZiZGRlOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMiCi0gICBuYW1lPSJKMkVFIENvcmUgVGVzdHMgQ29tcG9uZW50IgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyIgPgotCi0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0idGVzdHMuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5qdW5pdCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMiLz4KLQotICAgPC9yZXF1aXJlcz4KLQotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWRiNjk4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotICA8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotIDwhLS0gPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4gLS0+Ci0JPGVjaG8gbWVzc2FnZT0iYmFzZWRpciAke2Jhc2VkaXJ9IiAvPgotCTxlY2hvIG1lc3NhZ2U9ImVjbGlwc2UgcGxhY2UgJHtlY2xpcHNlLWhvbWV9IiAvPgotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgcGx1Z2luLW5hbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLURYbXg3MDBNIi8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ianN0LWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9qc3RfZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7anN0LWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2pzdC1mb2xkZXJ9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMuYnZ0LkF1dG9tYXRlZEJWVCIgLz4KLSAgIAkgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAJICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPgotICAgIDwvYW50PgotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtqc3QtZm9sZGVyfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmFwaS50ZXN0LkF1dG9tYXRlZEFQSUJWVCIgLz4KLSAgIAkgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAJICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNDE2NTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS41LjQgCi1DcmVhdGVkLUJ5OiAxLjMuMCAoSUJNIENvcnBvcmF0aW9uKQotTWFpbi1DbGFzczogbnVsbAotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9UYWJsZS5kZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9UYWJsZS5kZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ODA4NjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvVGFibGUuZGRsCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotDQotDQotLS0gR2VuZXJhdGVkIGJ5IFJlbGF0aW9uYWwgU2NoZW1hIENlbnRlciBvbiBGcmkgTWFyIDEyIDE0OjMyOjE0IENTVCAyMDA0DQotDQotDQotQ1JFQVRFIFRBQkxFIEFDQ09VTlQNCi0gIChBQ0NPVU5USUQgVkFSQ0hBUigyNTApIE5PVCBOVUxMLA0KLSAgIFRZUEUxIElOVEVHRVIgTk9UIE5VTEwsDQotICAgQkFMQU5DRSBET1VCTEUgUFJFQ0lTSU9OIE5PVCBOVUxMLA0KLSAgIEFQUiBET1VCTEUgUFJFQ0lTSU9OIE5PVCBOVUxMKTsNCi0NCi1BTFRFUiBUQUJMRSBBQ0NPVU5UDQotICBBREQgQ09OU1RSQUlOVCBQS19BQ0NPVU5UIFBSSU1BUlkgS0VZIChBQ0NPVU5USUQpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvTWFwLm1hcHhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvTWFwLm1hcHhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE5YTk4ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL01hcC5tYXB4bWkKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxlamJyZGJtYXBwaW5nOkVqYlJkYkRvY3VtZW50Um9vdCB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOlJEQlNjaGVtYT0iUkRCU2NoZW1hLnhtaSIgeG1sbnM6ZWpiPSJlamIueG1pIiB4bWxuczplamJyZGJtYXBwaW5nPSJlamJyZGJtYXBwaW5nLnhtaSIgeG1sbnM6TWFwcGluZz0iTWFwcGluZy54bWkiIHhtaTppZD0iRWpiUmRiRG9jdW1lbnRSb290XzEwNzkxMjM1MTY5MDciIHRvcFRvQm90dG9tPSJ0cnVlIiBjb21tYW5kU3RhY2s9IiZsdDtjb2xsZWN0aW9uPiZsdDtjb21tYW5kLWNyZWF0aW9uLXJlY29yZD4mbHQ7Y2xhc3MgbmFtZT0mcXVvdDtjb20uaWJtLmV0b29scy5lamJyZGJtYXBwaW5nLmNvbW1hbmQuVG9wRG93bkVqYkphckNvbW1hbmQmcXVvdDsvPiZsdDtjb21tYW5kLXBhcmFtZXRlcj4mbHQ7cmVmLW9iamVjdCBocmVmPSZxdW90O3BsYXRmb3JtOi9yZXNvdXJjZS9iNjM3NDhiYS9lamJNb2R1bGUvTUVUQS1JTkYvZWpiLWphci54bWwjZWpiLWphcl9JRCZxdW90Oy8+Jmx0O251bGwvPiZsdDtjb2xsZWN0aW9uPiZsdDtzdHJpbmcgdmFsdWU9JnF1b3Q7VG9wRG93bkRCJnF1b3Q7Lz4mbHQ7bnVsbC8+Jmx0O2ludCB2YWx1ZT0mcXVvdDsxOCZxdW90Oy8+Jmx0O2hhc2h0YWJsZT4mbHQ7L2hhc2h0YWJsZT4mbHQ7aGFzaHRhYmxlPiZsdDsvaGFzaHRhYmxlPiZsdDtib29sZWFuIHZhbHVlPSZxdW90O2ZhbHNlJnF1b3Q7Lz4mbHQ7Ym9vbGVhbiB2YWx1ZT0mcXVvdDtmYWxzZSZxdW90Oy8+Jmx0Oy9jb2xsZWN0aW9uPiZsdDtudWxsLz4mbHQ7aW50IHZhbHVlPSZxdW90Oy0xJnF1b3Q7Lz4mbHQ7L2NvbW1hbmQtcGFyYW1ldGVyPiZsdDsvY29tbWFuZC1jcmVhdGlvbi1yZWNvcmQ+Jmx0Oy9jb2xsZWN0aW9uPiI+DQotICA8aGVscGVyIHhtaTp0eXBlPSJlamJyZGJtYXBwaW5nOlJkYlNjaGVtYVByb3BlcmllcyIgeG1pOmlkPSJSZGJTY2hlbWFQcm9wZXJpZXNfMTA3OTEyMzUxNjkwNyIgcHJpbWl0aXZlc0RvY3VtZW50PSJDTE9VRFNDQVBFX1Y1MCIvPg0KLSAgPG5lc3RlZCB4bWk6dHlwZT0iZWpicmRibWFwcGluZzpSREJFamJNYXBwZXIiIHhtaTppZD0iUkRCRWpiTWFwcGVyXzEwNzkxMjM1MTY5MDciPg0KLSAgICA8aGVscGVyIHhtaTp0eXBlPSJlamJyZGJtYXBwaW5nOlByaW1hcnlUYWJsZVN0cmF0ZWd5IiB4bWk6aWQ9IlByaW1hcnlUYWJsZVN0cmF0ZWd5XzEwNzkxMjM1MTY5MDciPg0KLSAgICAgIDx0YWJsZSBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSURfQUNDT1VOVC50Ymx4bWkjQUNDT1VOVCIvPg0KLSAgICA8L2hlbHBlcj4NCi0gICAgPG5lc3RlZCB4bWk6dHlwZT0iZWpicmRibWFwcGluZzpSREJFamJGaWVsZE1hcHBlciIgeG1pOmlkPSJSREJFamJGaWVsZE1hcHBlcl8xMDc5MTIzNTE2OTA3Ij4NCi0gICAgICA8aW5wdXRzIHhtaTp0eXBlPSJlamI6Q01QQXR0cmlidXRlIiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNBY2NvdW50X2FjY291bnRpZCIvPg0KLSAgICAgIDxvdXRwdXRzIHhtaTp0eXBlPSJSREJTY2hlbWE6UkRCQ29sdW1uIiBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSURfQUNDT1VOVC50Ymx4bWkjQUNDT1VOVElEIi8+DQotICAgICAgPHR5cGVNYXBwaW5nIGhyZWY9IkphdmF0b0NMT1VEU0NBUEVfVjUwVHlwZU1hcHMueG1pI1N0cmluZy1WQVJDSEFSIi8+DQotICAgIDwvbmVzdGVkPg0KLSAgICA8bmVzdGVkIHhtaTp0eXBlPSJlamJyZGJtYXBwaW5nOlJEQkVqYkZpZWxkTWFwcGVyIiB4bWk6aWQ9IlJEQkVqYkZpZWxkTWFwcGVyXzEwNzkxMjM1MTY5MDgiIG9wdGltaXN0aWM9InRydWUiPg0KLSAgICAgIDxpbnB1dHMgeG1pOnR5cGU9ImVqYjpDTVBBdHRyaWJ1dGUiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI0FjY291bnRfdHlwZSIvPg0KLSAgICAgIDxvdXRwdXRzIHhtaTp0eXBlPSJSREJTY2hlbWE6UkRCQ29sdW1uIiBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSURfQUNDT1VOVC50Ymx4bWkjVFlQRTEiLz4NCi0gICAgICA8dHlwZU1hcHBpbmcgaHJlZj0iSmF2YXRvQ0xPVURTQ0FQRV9WNTBUeXBlTWFwcy54bWkjaW50LUlOVEVHRVIiLz4NCi0gICAgPC9uZXN0ZWQ+DQotICAgIDxuZXN0ZWQgeG1pOnR5cGU9ImVqYnJkYm1hcHBpbmc6UkRCRWpiRmllbGRNYXBwZXIiIHhtaTppZD0iUkRCRWpiRmllbGRNYXBwZXJfMTA3OTEyMzUxNjkwOSIgb3B0aW1pc3RpYz0idHJ1ZSI+DQotICAgICAgPGlucHV0cyB4bWk6dHlwZT0iZWpiOkNNUEF0dHJpYnV0ZSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjQWNjb3VudF9iYWxhbmNlIi8+DQotICAgICAgPG91dHB1dHMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJDb2x1bW4iIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRF9BQ0NPVU5ULnRibHhtaSNCQUxBTkNFIi8+DQotICAgICAgPHR5cGVNYXBwaW5nIGhyZWY9IkphdmF0b0NMT1VEU0NBUEVfVjUwVHlwZU1hcHMueG1pI2RvdWJsZS1ET1VCTEUiLz4NCi0gICAgPC9uZXN0ZWQ+DQotICAgIDxuZXN0ZWQgeG1pOnR5cGU9ImVqYnJkYm1hcHBpbmc6UkRCRWpiRmllbGRNYXBwZXIiIHhtaTppZD0iUkRCRWpiRmllbGRNYXBwZXJfMTA3OTEyMzUxNjkxMCIgb3B0aW1pc3RpYz0idHJ1ZSI+DQotICAgICAgPGlucHV0cyB4bWk6dHlwZT0iZWpiOkNNUEF0dHJpYnV0ZSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjQWNjb3VudF9hcHIiLz4NCi0gICAgICA8b3V0cHV0cyB4bWk6dHlwZT0iUkRCU2NoZW1hOlJEQkNvbHVtbiIgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElEX0FDQ09VTlQudGJseG1pI0FQUiIvPg0KLSAgICAgIDx0eXBlTWFwcGluZyBocmVmPSJKYXZhdG9DTE9VRFNDQVBFX1Y1MFR5cGVNYXBzLnhtaSNkb3VibGUtRE9VQkxFIi8+DQotICAgIDwvbmVzdGVkPg0KLSAgICA8aW5wdXRzIHhtaTp0eXBlPSJlamI6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjQ29udGFpbmVyTWFuYWdlZEVudGl0eV8xIi8+DQotICAgIDxvdXRwdXRzIHhtaTp0eXBlPSJSREJTY2hlbWE6UkRCVGFibGUiIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRF9BQ0NPVU5ULnRibHhtaSNBQ0NPVU5UIi8+DQotICA8L25lc3RlZD4NCi0gIDxpbnB1dHMgeG1pOnR5cGU9ImVqYjpFSkJKYXIiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI2VqYi1qYXJfSUQiLz4NCi0gIDxvdXRwdXRzIHhtaTp0eXBlPSJSREJTY2hlbWE6UkRCRGF0YWJhc2UiIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCLmRieG1pI1RvcERvd25EQiIvPg0KLSAgPHR5cGVNYXBwaW5nIHhtaTp0eXBlPSJNYXBwaW5nOk1hcHBpbmdSb290IiBocmVmPSJKYXZhdG9DTE9VRFNDQVBFX1Y1MFR5cGVNYXBzLnhtaSNKYXZhX3RvX0NMT1VEU0NBUEVfVjUwX1R5cGVNYXBzIi8+DQotPC9lamJyZGJtYXBwaW5nOkVqYlJkYkRvY3VtZW50Um9vdD4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RhYmxlLmRkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVGFibGUuZGRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzgwODYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVGFibGUuZGRsCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotDQotDQotLS0gR2VuZXJhdGVkIGJ5IFJlbGF0aW9uYWwgU2NoZW1hIENlbnRlciBvbiBGcmkgTWFyIDEyIDE0OjMyOjE0IENTVCAyMDA0DQotDQotDQotQ1JFQVRFIFRBQkxFIEFDQ09VTlQNCi0gIChBQ0NPVU5USUQgVkFSQ0hBUigyNTApIE5PVCBOVUxMLA0KLSAgIFRZUEUxIElOVEVHRVIgTk9UIE5VTEwsDQotICAgQkFMQU5DRSBET1VCTEUgUFJFQ0lTSU9OIE5PVCBOVUxMLA0KLSAgIEFQUiBET1VCTEUgUFJFQ0lTSU9OIE5PVCBOVUxMKTsNCi0NCi1BTFRFUiBUQUJMRSBBQ0NPVU5UDQotICBBREQgQ09OU1RSQUlOVCBQS19BQ0NPVU5UIFBSSU1BUlkgS0VZIChBQ0NPVU5USUQpOwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCLmRieG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREIuZGJ4bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNGJkZWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREIuZGJ4bWkKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPFJEQlNjaGVtYTpSREJEYXRhYmFzZSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOlJEQlNjaGVtYT0iUkRCU2NoZW1hLnhtaSIgeG1pOmlkPSJUb3BEb3duREIiIG5hbWU9IlRvcERvd25EQiI+DQotICA8c2NoZW1hdGEgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElELnNjaHhtaSNOVUxMSUQiLz4NCi0gIDx0YWJsZUdyb3VwIHhtaTp0eXBlPSJSREJTY2hlbWE6UkRCVGFibGUiIGhyZWY9Ik1FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRF9BQ0NPVU5ULnRibHhtaSNBQ0NPVU5UIi8+DQotICA8ZG9tYWluIGhyZWY9IkNMT1VEU0NBUEVfVjUwX0RvbWFpbi54bWkjU1FMVmVuZG9yXzEiLz4NCi08L1JEQlNjaGVtYTpSREJEYXRhYmFzZT4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSUQuc2NoeG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElELnNjaHhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EyMGE0MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQl9OVUxMSUQuc2NoeG1pCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxSREJTY2hlbWE6UkRCU2NoZW1hIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6UkRCU2NoZW1hPSJSREJTY2hlbWEueG1pIiB4bWk6aWQ9Ik5VTExJRCIgbmFtZT0iTlVMTElEIj4NCi0gIDxkYXRhYmFzZSBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQi5kYnhtaSNUb3BEb3duREIiLz4NCi0gIDx0YWJsZXMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJUYWJsZSIgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElEX0FDQ09VTlQudGJseG1pI0FDQ09VTlQiLz4NCi08L1JEQlNjaGVtYTpSREJTY2hlbWE+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElEX0FDQ09VTlQudGJseG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElEX0FDQ09VTlQudGJseG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGYxZDc1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvVG9wRG93bkRCX05VTExJRF9BQ0NPVU5ULnRibHhtaQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPFJEQlNjaGVtYTpSREJUYWJsZSB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOlJEQlNjaGVtYT0iUkRCU2NoZW1hLnhtaSIgeG1pOmlkPSJBQ0NPVU5UIiBuYW1lPSJBQ0NPVU5UIiBwcmltYXJ5S2V5PSJQS19BQ0NPVU5UIj4NCi0gIDxkYXRhYmFzZSBocmVmPSJNRVRBLUlORi9iYWNrZW5kcy9DTE9VRFNDQVBFX1Y1MF8xL1RvcERvd25EQi5kYnhtaSNUb3BEb3duREIiLz4NCi0gIDxzY2hlbWEgaHJlZj0iTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9Ub3BEb3duREJfTlVMTElELnNjaHhtaSNOVUxMSUQiLz4NCi0gIDxjb2x1bW5zIHhtaTp0eXBlPSJSREJTY2hlbWE6UkRCQ29sdW1uIiB4bWk6aWQ9IkFDQ09VTlRJRCIgbmFtZT0iQUNDT1VOVElEIj4NCi0gICAgPHR5cGUgeG1pOnR5cGU9IlJEQlNjaGVtYTpTUUxDaGFyYWN0ZXJTdHJpbmdUeXBlIiB4bWk6aWQ9IlNRTENoYXJhY3RlclN0cmluZ1R5cGVfMTA3OTEyMzUxNjk3NyIgbGVuZ3RoPSIyNTAiPg0KLSAgICAgIDxvcmlnaW5hdGluZ1R5cGUgeG1pOnR5cGU9IlJEQlNjaGVtYTpTUUxDaGFyYWN0ZXJTdHJpbmdUeXBlIiBocmVmPSJKYXZhdG9DTE9VRFNDQVBFX1Y1MFR5cGVNYXBzLnhtaSNTUUxDaGFyYWN0ZXJTdHJpbmdUeXBlXzI1MCIvPg0KLSAgICA8L3R5cGU+DQotICA8L2NvbHVtbnM+DQotICA8Y29sdW1ucyB4bWk6dHlwZT0iUkRCU2NoZW1hOlJEQkNvbHVtbiIgeG1pOmlkPSJUWVBFMSIgbmFtZT0iVFlQRTEiPg0KLSAgICA8dHlwZSB4bWk6dHlwZT0iUkRCU2NoZW1hOlNRTEV4YWN0TnVtZXJpYyIgeG1pOmlkPSJTUUxFeGFjdE51bWVyaWNfMTA3OTEyMzUxNjk3NyI+DQotICAgICAgPG9yaWdpbmF0aW5nVHlwZSB4bWk6dHlwZT0iUkRCU2NoZW1hOlNRTEV4YWN0TnVtZXJpYyIgaHJlZj0iQ0xPVURTQ0FQRV9WNTBfUHJpbWl0aXZlcy54bWkjU1FMRXhhY3ROdW1lcmljXzEiLz4NCi0gICAgPC90eXBlPg0KLSAgPC9jb2x1bW5zPg0KLSAgPGNvbHVtbnMgeG1pOnR5cGU9IlJEQlNjaGVtYTpSREJDb2x1bW4iIHhtaTppZD0iQkFMQU5DRSIgbmFtZT0iQkFMQU5DRSI+DQotICAgIDx0eXBlIHhtaTp0eXBlPSJSREJTY2hlbWE6U1FMQXBwcm94aW1hdGVOdW1lcmljIiB4bWk6aWQ9IlNRTEFwcHJveGltYXRlTnVtZXJpY18xMDc5MTIzNTE2OTc3Ij4NCi0gICAgICA8b3JpZ2luYXRpbmdUeXBlIHhtaTp0eXBlPSJSREJTY2hlbWE6U1FMQXBwcm94aW1hdGVOdW1lcmljIiBocmVmPSJDTE9VRFNDQVBFX1Y1MF9QcmltaXRpdmVzLnhtaSNTUUxBcHByb3hpbWF0ZU51bWVyaWNfMSIvPg0KLSAgICA8L3R5cGU+DQotICA8L2NvbHVtbnM+DQotICA8Y29sdW1ucyB4bWk6dHlwZT0iUkRCU2NoZW1hOlJEQkNvbHVtbiIgeG1pOmlkPSJBUFIiIG5hbWU9IkFQUiI+DQotICAgIDx0eXBlIHhtaTp0eXBlPSJSREJTY2hlbWE6U1FMQXBwcm94aW1hdGVOdW1lcmljIiB4bWk6aWQ9IlNRTEFwcHJveGltYXRlTnVtZXJpY18xMDc5MTIzNTE2OTc4Ij4NCi0gICAgICA8b3JpZ2luYXRpbmdUeXBlIHhtaTp0eXBlPSJSREJTY2hlbWE6U1FMQXBwcm94aW1hdGVOdW1lcmljIiBocmVmPSJDTE9VRFNDQVBFX1Y1MF9QcmltaXRpdmVzLnhtaSNTUUxBcHByb3hpbWF0ZU51bWVyaWNfMSIvPg0KLSAgICA8L3R5cGU+DQotICA8L2NvbHVtbnM+DQotICA8bmFtZWRHcm91cCB4bWk6dHlwZT0iUkRCU2NoZW1hOlNRTFJlZmVyZW5jZSIgeG1pOmlkPSJQS19BQ0NPVU5UIiBuYW1lPSJQS19BQ0NPVU5UIiBtZW1iZXJzPSJBQ0NPVU5USUQiIGNvbnN0cmFpbnQ9IlNRTENvbnN0cmFpbnRfMTA3OTEyMzUxNjk3NyIvPg0KLSAgPGNvbnN0cmFpbnRzIHhtaTppZD0iU1FMQ29uc3RyYWludF8xMDc5MTIzNTE2OTc3IiBuYW1lPSJQS19BQ0NPVU5UIiB0eXBlPSJQUklNQVJZS0VZIiBwcmltYXJ5S2V5PSJQS19BQ0NPVU5UIi8+DQotPC9SREJTY2hlbWE6UkRCVGFibGU+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9pYm1fcG1iYWIucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2JhY2tlbmRzL0NMT1VEU0NBUEVfVjUwXzEvaWJtX3BtYmFiLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZjYyZDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvYmFja2VuZHMvQ0xPVURTQ0FQRV9WNTBfMS9pYm1fcG1iYWIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotI0ZyaSBNYXIgMTIgMTQ6MzI6MDEgQ1NUIDIwMDQKLUFjY291bnQ9Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy5hcHBwcm9maWxlLmFjY291bnRtYW5hZ2VtZW50ZWpiLndlYnNwaGVyZV9kZXBsb3kuQ0xPVURTQ0FQRV9WNTBfMS5BY2NvdW50QmVhbkFkYXB0b3JCaW5kaW5nXzBjMTgyMTM1CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9lamItamFyLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2VqYi1qYXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDk4NjBmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2VqYi1qYXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBlamItamFyIFBVQkxJQyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEVudGVycHJpc2UgSmF2YUJlYW5zIDIuMC8vRU4iICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9lamItamFyXzJfMC5kdGQiPgotCi0gICA8ZWpiLWphciBpZD0iZWpiLWphcl9JRCI+Ci0gICAgICA8ZGlzcGxheS1uYW1lPkFwcFByb2ZpbGVTYW1wbGVFSkJNb2R1bGU8L2Rpc3BsYXktbmFtZT4KLSAgICAgIDxlbnRlcnByaXNlLWJlYW5zPgotICAgICAgICAgPGVudGl0eSBpZD0iQ29udGFpbmVyTWFuYWdlZEVudGl0eV8xIj4KLSAgICAgICAgICAgIDxlamItbmFtZT5BY2NvdW50PC9lamItbmFtZT4KLSAgICAgICAgICAgIDxob21lPmNvbS5pYm0ud2Vic3BoZXJlLnNhbXBsZXMuYXBwcHJvZmlsZS5hY2NvdW50bWFuYWdlbWVudGVqYi5BY2NvdW50SG9tZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy5hcHBwcm9maWxlLmFjY291bnRtYW5hZ2VtZW50ZWpiLkFjY291bnQ8L3JlbW90ZT4KLSAgICAgICAgICAgIDxsb2NhbC1ob21lPmNvbS5pYm0ud2Vic3BoZXJlLnNhbXBsZXMuYXBwcHJvZmlsZS5hY2NvdW50bWFuYWdlbWVudGVqYi5Mb2NhbEFjY291bnRIb21lPC9sb2NhbC1ob21lPgotICAgICAgICAgICAgPGxvY2FsPmNvbS5pYm0ud2Vic3BoZXJlLnNhbXBsZXMuYXBwcHJvZmlsZS5hY2NvdW50bWFuYWdlbWVudGVqYi5Mb2NhbEFjY291bnQ8L2xvY2FsPgotICAgICAgICAgICAgPGVqYi1jbGFzcz5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLmFwcHByb2ZpbGUuYWNjb3VudG1hbmFnZW1lbnRlamIuQWNjb3VudEJlYW48L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxwZXJzaXN0ZW5jZS10eXBlPkNvbnRhaW5lcjwvcGVyc2lzdGVuY2UtdHlwZT4KLSAgICAgICAgICAgIDxwcmltLWtleS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9wcmltLWtleS1jbGFzcz4KLSAgICAgICAgICAgIDxyZWVudHJhbnQ+RmFsc2U8L3JlZW50cmFudD4KLSAgICAgICAgICAgIDxjbXAtdmVyc2lvbj4yLng8L2NtcC12ZXJzaW9uPgotICAgICAgICAgICAgPGFic3RyYWN0LXNjaGVtYS1uYW1lPkFjY291bnQ8L2Fic3RyYWN0LXNjaGVtYS1uYW1lPgotICAgICAgICAgICAgPGNtcC1maWVsZCBpZD0iQWNjb3VudF9hY2NvdW50aWQiPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+YWNjb3VudGlkPC9maWVsZC1uYW1lPgotICAgICAgICAgICAgPC9jbXAtZmllbGQ+Ci0gICAgICAgICAgICA8Y21wLWZpZWxkIGlkPSJBY2NvdW50X3R5cGUiPgotICAgICAgICAgICAgICAgPGZpZWxkLW5hbWU+dHlwZTwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPGNtcC1maWVsZCBpZD0iQWNjb3VudF9iYWxhbmNlIj4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPmJhbGFuY2U8L2ZpZWxkLW5hbWU+Ci0gICAgICAgICAgICA8L2NtcC1maWVsZD4KLSAgICAgICAgICAgIDxjbXAtZmllbGQgaWQ9IkFjY291bnRfYXByIj4KLSAgICAgICAgICAgICAgIDxmaWVsZC1uYW1lPmFwcjwvZmllbGQtbmFtZT4KLSAgICAgICAgICAgIDwvY21wLWZpZWxkPgotICAgICAgICAgICAgPHByaW1rZXktZmllbGQ+YWNjb3VudGlkPC9wcmlta2V5LWZpZWxkPgotICAgICAgICAgICAgPHF1ZXJ5IGlkPSJRdWVyeV8xIj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2QgaWQ9IlF1ZXJ5TWV0aG9kXzEiPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPmZpbmRMYXJnZUFjY291bnRzPC9tZXRob2QtbmFtZT4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW1zPgotICAgICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbT5kb3VibGU8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPGVqYi1xbD5TRUxFQ1QgT0JKRUNUKGEpIEZST00gQWNjb3VudCBhIFdIRVJFIGEuYmFsYW5jZSA+PSA/MTwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgICAgIDxxdWVyeSBpZD0iUXVlcnlfMiI+Ci0gICAgICAgICAgICAgICA8cXVlcnktbWV0aG9kIGlkPSJRdWVyeU1ldGhvZF8yIj4KLSAgICAgICAgICAgICAgICAgIDxtZXRob2QtbmFtZT5maW5kQnlBY2NvdW50SWQ8L21ldGhvZC1uYW1lPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtPmphdmEubGFuZy5TdHJpbmc8L21ldGhvZC1wYXJhbT4KLSAgICAgICAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgIDwvcXVlcnktbWV0aG9kPgotICAgICAgICAgICAgICAgPGVqYi1xbD5TRUxFQ1QgT0JKRUNUKGEpIEZST00gQWNjb3VudCBhIFdIRVJFIGEuYWNjb3VudGlkICA9ID8xPC9lamItcWw+Ci0gICAgICAgICAgICA8L3F1ZXJ5PgotICAgICAgICAgICAgPHF1ZXJ5IGlkPSJRdWVyeV8zIj4KLSAgICAgICAgICAgICAgIDxxdWVyeS1tZXRob2QgaWQ9IlF1ZXJ5TWV0aG9kXzMiPgotICAgICAgICAgICAgICAgICAgPG1ldGhvZC1uYW1lPmZpbmRBbGxBY2NvdW50czwvbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICAgICAgICA8bWV0aG9kLXBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgIDxtZXRob2QtcGFyYW0+PC9tZXRob2QtcGFyYW0+Ci0gICAgICAgICAgICAgICAgICA8L21ldGhvZC1wYXJhbXM+Ci0gICAgICAgICAgICAgICA8L3F1ZXJ5LW1ldGhvZD4KLSAgICAgICAgICAgICAgIDxlamItcWw+U0VMRUNUIE9CSkVDVChhKSBGUk9NIEFjY291bnQgYTwvZWpiLXFsPgotICAgICAgICAgICAgPC9xdWVyeT4KLSAgICAgICAgIDwvZW50aXR5PgotICAgICAgICAgPHNlc3Npb24gaWQ9IlNlc3Npb25fMSI+Ci0gICAgICAgICAgICA8ZGlzcGxheS1uYW1lPkFjY291bnRNYW5hZ2VyPC9kaXNwbGF5LW5hbWU+Ci0gICAgICAgICAgICA8ZWpiLW5hbWU+QWNjb3VudE1hbmFnZXI8L2VqYi1uYW1lPgotICAgICAgICAgICAgPGhvbWU+Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy5hcHBwcm9maWxlLmFjY291bnRtYW5hZ2VtZW50ZWpiLkFjY291bnRNYW5hZ2VySG9tZTwvaG9tZT4KLSAgICAgICAgICAgIDxyZW1vdGU+Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy5hcHBwcm9maWxlLmFjY291bnRtYW5hZ2VtZW50ZWpiLkFjY291bnRNYW5hZ2VyPC9yZW1vdGU+Ci0gICAgICAgICAgICA8ZWpiLWNsYXNzPmNvbS5pYm0ud2Vic3BoZXJlLnNhbXBsZXMuYXBwcHJvZmlsZS5hY2NvdW50bWFuYWdlbWVudGVqYi5BY2NvdW50TWFuYWdlckJlYW48L2VqYi1jbGFzcz4KLSAgICAgICAgICAgIDxzZXNzaW9uLXR5cGU+U3RhdGVsZXNzPC9zZXNzaW9uLXR5cGU+Ci0gICAgICAgICAgICA8dHJhbnNhY3Rpb24tdHlwZT5Db250YWluZXI8L3RyYW5zYWN0aW9uLXR5cGU+Ci0gICAgICAgICAgICA8ZWpiLWxvY2FsLXJlZiBpZD0iRUpCTG9jYWxSZWZfMSI+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi1uYW1lPmVqYi9BcHBQcm9maWxlU2FtcGxlLUFjY291bnRIb21lPC9lamItcmVmLW5hbWU+Ci0gICAgICAgICAgICAgICA8ZWpiLXJlZi10eXBlPkVudGl0eTwvZWpiLXJlZi10eXBlPgotICAgICAgICAgICAgICAgPGxvY2FsLWhvbWU+Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy5hcHBwcm9maWxlLmFjY291bnRtYW5hZ2VtZW50ZWpiLkxvY2FsQWNjb3VudEhvbWU8L2xvY2FsLWhvbWU+Ci0gICAgICAgICAgICAgICA8bG9jYWw+Y29tLmlibS53ZWJzcGhlcmUuc2FtcGxlcy5hcHBwcm9maWxlLmFjY291bnRtYW5hZ2VtZW50ZWpiLkxvY2FsQWNjb3VudDwvbG9jYWw+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+QWNjb3VudDwvZWpiLWxpbms+Ci0gICAgICAgICAgICA8L2VqYi1sb2NhbC1yZWY+Ci0gICAgICAgICA8L3Nlc3Npb24+Ci0gICAgICA8L2VudGVycHJpc2UtYmVhbnM+Ci0gICA8L2VqYi1qYXI+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9pYm0tZWpiLWphci1ibmQueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvaWJtLWVqYi1qYXItYm5kLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5MGQ0My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9pYm0tZWpiLWphci1ibmQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZWpiYm5kOkVKQkphckJpbmRpbmcgeG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczplamJibmQ9ImVqYmJuZC54bWkiIHhtbG5zOmVqYj0iZWpiLnhtaSIgeG1sbnM6Y29tbW9uPSJjb21tb24ueG1pIiB4bWk6aWQ9ImVqYi1qYXJfSURfQm5kIiBjdXJyZW50QmFja2VuZElkPSJDTE9VRFNDQVBFX1Y1MF8xIj4NCi0gIDxlamJKYXIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjZWpiLWphcl9JRCIvPg0KLSAgPGVqYkJpbmRpbmdzIHhtaTppZD0iQ29udGFpbmVyTWFuYWdlZEVudGl0eV8xX0JuZCIgam5kaU5hbWU9IkFwcFByb2ZpbGVTYW1wbGUtQWNjb3VudEhvbWUiPg0KLSAgICA8ZW50ZXJwcmlzZUJlYW4geG1pOnR5cGU9ImVqYjpDb250YWluZXJNYW5hZ2VkRW50aXR5IiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNDb250YWluZXJNYW5hZ2VkRW50aXR5XzEiLz4NCi0gIDwvZWpiQmluZGluZ3M+DQotICA8ZWpiQmluZGluZ3MgeG1pOmlkPSJFbnRlcnByaXNlQmVhbkJpbmRpbmdfMSIgam5kaU5hbWU9IkFwcFByb2ZpbGVTYW1wbGUtQWNjb3VudE1hbmFnZXJIb21lIj4NCi0gICAgPGVudGVycHJpc2VCZWFuIHhtaTp0eXBlPSJlamI6U2Vzc2lvbiIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjU2Vzc2lvbl8xIi8+DQotICAgIDxlamJSZWZCaW5kaW5ncyB4bWk6aWQ9IkVqYlJlZkJpbmRpbmdfMSIgam5kaU5hbWU9IkFwcFByb2ZpbGVTYW1wbGUtQWNjb3VudEhvbWUiPg0KLSAgICAgIDxiaW5kaW5nRWpiUmVmIHhtaTp0eXBlPSJjb21tb246RUpCTG9jYWxSZWYiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI0VKQkxvY2FsUmVmXzEiLz4NCi0gICAgPC9lamJSZWZCaW5kaW5ncz4NCi0gIDwvZWpiQmluZGluZ3M+DQotICA8ZGVmYXVsdENNUENvbm5lY3Rpb25GYWN0b3J5IHhtaTppZD0iQ01QQ29ubmVjdGlvbkZhY3RvcnlCaW5kaW5nXzIiIGpuZGlOYW1lPSJlaXMvamRiYy9BcHBQcm9maWxlU2FtcGxlREJfQ01QIiByZXNBdXRoPSJQZXJfQ29ubmVjdGlvbl9GYWN0b3J5Ii8+DQotPC9lamJibmQ6RUpCSmFyQmluZGluZz4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9pYm0tZWpiLWphci1leHQtcG1lLnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2libS1lamItamFyLWV4dC1wbWUueG1pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWVlY2IxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvZWpiL01FVEEtSU5GL2libS1lamItamFyLWV4dC1wbWUueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cG1lZXh0OlBNRUVKQkphckV4dGVuc2lvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmFwcHByb2ZpbGVlamJleHQ9Imh0dHA6Ly93d3cuaWJtLmNvbS93ZWJzcGhlcmUvYXBwc2VydmVyL3NjaGVtYXMvNS4wL2FwcHByb2ZpbGVlamJleHQueG1pIiB4bWxuczplamJleHQ9ImVqYmV4dC54bWkiIHhtbG5zOmVqYj0iZWpiLnhtaSIgeG1sbnM6cG1lZXh0PSJodHRwOi8vd3d3LmlibS5jb20vd2Vic3BoZXJlL2FwcHNlcnZlci9zY2hlbWFzLzUuMC9wbWVleHQueG1pIiB4bWk6aWQ9IlBNRUVKQkphckV4dGVuc2lvbl8xIj4NCi0gIDxhcHBQcm9maWxlRUpCSmFyRXh0ZW5zaW9uIHhtaTppZD0iQXBwUHJvZmlsZUVKQkphckV4dGVuc2lvbl8xIj4NCi0gICAgPGFwcGxpY2F0aW9uUHJvZmlsZXMgeG1pOmlkPSJFSkJNb2R1bGVQcm9maWxlXzEiIG5hbWU9IlJlYWQtb25seSIgZGVzY3JpcHRpb249IlRoaXMgcHJvZmlsZSB3aWxsIGFwcGx5IGEgcmVhZC1vbmx5IGFjY2Vzcy1pbnRlbnQgcG9saWN5IHRvIHRoZSBtdWx0aWZpbmRlciBmb3IgdGhlIEFjY291bnQgZW50aXR5IGJlYW4uIj4NCi0gICAgICA8YXBwbGllZEFjY2Vzc0ludGVudHMgeG1pOmlkPSJBcHBsaWVkQWNjZXNzSW50ZW50XzEwNzI4Mjg3NTM0MjQiIG5hbWU9ImNvbS5pYm0ud2Vic3BoZXJlLmVqYnF1ZXJ5LkRlZmF1bHQiIGRlc2NyaXB0aW9uPSJBbGwgbWV0aG9kcyBvZiB0aGUgQWNjb3VudCBiZWFuIGFyZSBzZXQgZm9yIHJlYWQgb25seS4iIGFjY2Vzc0ludGVudE5hbWU9IndzUGVzc2ltaXN0aWNSZWFkIj4NCi0gICAgICAgIDxtZXRob2RFbGVtZW50cyB4bWk6aWQ9Ik1ldGhvZEVsZW1lbnRfMTA3MjgyODc1MzQyNCIgdHlwZT0iVW5zcGVjaWZpZWQiPg0KLSAgICAgICAgICA8ZW50ZXJwcmlzZUJlYW4geG1pOnR5cGU9ImVqYjpDb250YWluZXJNYW5hZ2VkRW50aXR5IiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNDb250YWluZXJNYW5hZ2VkRW50aXR5XzEiLz4NCi0gICAgICAgIDwvbWV0aG9kRWxlbWVudHM+DQotICAgICAgPC9hcHBsaWVkQWNjZXNzSW50ZW50cz4NCi0gICAgICA8dGFza3MgeG1pOmlkPSJUYXNrXzEwNzEwOTM0MTU3ODQiIG5hbWU9ImdldExhcmdlQWNjb3VudHMiIGRlc2NyaXB0aW9uPSJUaGlzIHRhc2sgd2lsbCBiZSB1c2VkIGJ5IEFjY291bnRNYW5hZ2VyIHNlc3Npb24gYmVhbiBmb3IgcmVhZC1vbmx5IGludGVudC4iLz4NCi0gICAgPC9hcHBsaWNhdGlvblByb2ZpbGVzPg0KLSAgICA8ZWpiSmFyRXh0ZW5zaW9uIGhyZWY9Ik1FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkjZWpiLWphcl9JRF9FeHQiLz4NCi0gICAgPGRlZmluZWRBY2Nlc3NJbnRlbnRQb2xpY2llcyB4bWk6aWQ9IkRlZmluZWRBY2Nlc3NJbnRlbnRQb2xpY3lfMSIgbmFtZT0iUGVzc2ltaXN0aWNVcGRhdGUgLSBJbmNyZW1lbnQgMTAiIGRlc2NyaXB0aW9uPSJUaGlzIGlzIGEgY3VzdG9tIHBvbGljeSB0aGF0IGtlZXBzIGFsbCB0aGUgYXR0cmlidXRlcyBvZiB3c1Blc3NpbWlzaXRpY1VwZGF0ZSBleGNlcHQgZm9yIGNvbGxlY3Rpb24gaW5jcmVtZW50LCB3aGljaCBpcyBzZXQgdG8gMTAuIj4NCi0gICAgICA8YWNjZXNzSW50ZW50RW50cmllcyB4bWk6dHlwZT0iZWpiZXh0OlBlc3NpbWlzdGljVXBkYXRlIiB4bWk6aWQ9IlBlc3NpbWlzdGljVXBkYXRlXzEwNzI4MjQyOTA4MTciLz4NCi0gICAgICA8YWNjZXNzSW50ZW50RW50cmllcyB4bWk6dHlwZT0iZWpiZXh0OkNvbGxlY3Rpb25JbmNyZW1lbnQiIHhtaTppZD0iQ29sbGVjdGlvbkluY3JlbWVudF8xMDcyODI0MjkwODE3IiBjb2xsZWN0aW9uSW5jcmVtZW50PSIxMCIvPg0KLSAgICAgIDxhY2Nlc3NJbnRlbnRFbnRyaWVzIHhtaTp0eXBlPSJlamJleHQ6UmVzb3VyY2VNYW5hZ2VyUHJlRmV0Y2hJbmNyZW1lbnQiIHhtaTppZD0iUmVzb3VyY2VNYW5hZ2VyUHJlRmV0Y2hJbmNyZW1lbnRfMTA3MjgyNDI5MDgxNyIgcHJlRmV0Y2hJbmNyZW1lbnQ9IjAiLz4NCi0gICAgICA8YWNjZXNzSW50ZW50RW50cmllcyB4bWk6dHlwZT0iZWpiZXh0OlRyYW5zYWN0aW9uU2NvcGUiIHhtaTppZD0iVHJhbnNhY3Rpb25TY29wZV8xMDcyODI0MjkwODE3Ii8+DQotICAgIDwvZGVmaW5lZEFjY2Vzc0ludGVudFBvbGljaWVzPg0KLSAgICA8cnVuQXNUYXNrcyB4bWk6aWQ9IlJ1bkFzVGFza18yIiBuYW1lPSJnZXRMYXJnZUFjb3VudHMiPg0KLSAgICAgIDx0YXNrUnVuQXNLaW5kIHhtaTp0eXBlPSJhcHBwcm9maWxlZWpiZXh0OlJ1bkFzU3BlY2lmaWVkVGFzayIgeG1pOmlkPSJSdW5Bc1NwZWNpZmllZFRhc2tfMiI+DQotICAgICAgICA8dGFzayB4bWk6aWQ9IlRhc2tfNSIgbmFtZT0iZ2V0TGFyZ2VBY2NvdW50cyIgZGVzY3JpcHRpb249ImZvciB2aWV3aW5nIGFjY291bnQgZGF0YSBvbmx5Ii8+DQotICAgICAgPC90YXNrUnVuQXNLaW5kPg0KLSAgICAgIDxtZXRob2RFbGVtZW50cyB4bWk6aWQ9Ik1ldGhvZEVsZW1lbnRfMyIgbmFtZT0iZ2V0TGFyZ2VBY2NvdW50cyIgcGFybXM9ImRvdWJsZSAiIHR5cGU9IlJlbW90ZSI+DQotICAgICAgICA8ZW50ZXJwcmlzZUJlYW4geG1pOnR5cGU9ImVqYjpTZXNzaW9uIiBocmVmPSJNRVRBLUlORi9lamItamFyLnhtbCNTZXNzaW9uXzEiLz4NCi0gICAgICA8L21ldGhvZEVsZW1lbnRzPg0KLSAgICA8L3J1bkFzVGFza3M+DQotICAgIDxhcHBQcm9maWxlQ29tcG9uZW50RXh0ZW5zaW9ucyB4bWk6aWQ9IkFwcFByb2ZpbGVDb21wb25lbnRFeHRlbnNpb25fMSI+DQotICAgICAgPGNvbXBvbmVudEV4dGVuc2lvbiB4bWk6dHlwZT0iZWpiZXh0OlNlc3Npb25FeHRlbnNpb24iIGhyZWY9Ik1FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkjU2Vzc2lvbkV4dGVuc2lvbl8xIi8+DQotICAgIDwvYXBwUHJvZmlsZUNvbXBvbmVudEV4dGVuc2lvbnM+DQotICAgIDxhcHBQcm9maWxlQ29tcG9uZW50RXh0ZW5zaW9ucyB4bWk6aWQ9IkFwcFByb2ZpbGVDb21wb25lbnRFeHRlbnNpb25fMiI+DQotICAgICAgPGNvbXBvbmVudEV4dGVuc2lvbiB4bWk6dHlwZT0iZWpiZXh0OkNvbnRhaW5lck1hbmFnZWRFbnRpdHlFeHRlbnNpb24iIGhyZWY9Ik1FVEEtSU5GL2libS1lamItamFyLWV4dC54bWkjQ29udGFpbmVyTWFuYWdlZEVudGl0eV8xX0V4dCIvPg0KLSAgICA8L2FwcFByb2ZpbGVDb21wb25lbnRFeHRlbnNpb25zPg0KLSAgPC9hcHBQcm9maWxlRUpCSmFyRXh0ZW5zaW9uPg0KLTwvcG1lZXh0OlBNRUVKQkphckV4dGVuc2lvbj4NCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9pYm0tZWpiLWphci1leHQueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9lamIvTUVUQS1JTkYvaWJtLWVqYi1qYXItZXh0LnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczMjY0Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL2VqYi9NRVRBLUlORi9pYm0tZWpiLWphci1leHQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZWpiZXh0OkVKQkphckV4dGVuc2lvbiB4bWk6dmVyc2lvbj0iMi4wIiB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVqYmV4dD0iZWpiZXh0LnhtaSIgeG1sbnM6ZWpiPSJlamIueG1pIiB4bWk6aWQ9ImVqYi1qYXJfSURfRXh0Ij4NCi0gIDxlamJFeHRlbnNpb25zIHhtaTp0eXBlPSJlamJleHQ6Q29udGFpbmVyTWFuYWdlZEVudGl0eUV4dGVuc2lvbiIgeG1pOmlkPSJDb250YWluZXJNYW5hZ2VkRW50aXR5XzFfRXh0IiBjb25jdXJyZW5jeUNvbnRyb2w9InBlc3NpbWlzdGljIj4NCi0gICAgPGVudGVycHJpc2VCZWFuIHhtaTp0eXBlPSJlamI6Q29udGFpbmVyTWFuYWdlZEVudGl0eSIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjQ29udGFpbmVyTWFuYWdlZEVudGl0eV8xIi8+DQotICAgIDxzdHJ1Y3R1cmUgeG1pOmlkPSJCZWFuU3RydWN0dXJlXzEiIGluaGVyaXRlbmNlUm9vdD0iZmFsc2UiLz4NCi0gICAgPGJlYW5DYWNoZSB4bWk6aWQ9IkJlYW5DYWNoZV8xIiBhY3RpdmF0ZUF0PSJUUkFOU0FDVElPTiIgbG9hZEF0PSJUUkFOU0FDVElPTiIvPg0KLSAgICA8bG9jYWxUcmFuIHhtaTppZD0iTG9jYWxUcmFuXzEiIGJvdW5kYXJ5PSJCRUFOX01FVEhPRCIgdW5yZXNvbHZlZEFjdGlvbj0iUk9MTEJBQ0siLz4NCi0gICAgPGRhdGFDYWNoZSB4bWk6aWQ9IkRhdGFDYWNoZV8xIiBsaWZldGltZUluQ2FjaGU9IjAiIGxpZmV0aW1lSW5DYWNoZVVzYWdlPSJPRkYiLz4NCi0gIDwvZWpiRXh0ZW5zaW9ucz4NCi0gIDxlamJFeHRlbnNpb25zIHhtaTp0eXBlPSJlamJleHQ6U2Vzc2lvbkV4dGVuc2lvbiIgeG1pOmlkPSJTZXNzaW9uRXh0ZW5zaW9uXzEiIHRpbWVvdXQ9IjYwMCI+DQotICAgIDxlbnRlcnByaXNlQmVhbiB4bWk6dHlwZT0iZWpiOlNlc3Npb24iIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI1Nlc3Npb25fMSIvPg0KLSAgICA8c3RydWN0dXJlIHhtaTppZD0iQmVhblN0cnVjdHVyZV8yIiBpbmhlcml0ZW5jZVJvb3Q9ImZhbHNlIi8+DQotICAgIDxiZWFuQ2FjaGUgeG1pOmlkPSJCZWFuQ2FjaGVfMiIgYWN0aXZhdGVBdD0iT05DRSIvPg0KLSAgICA8bG9jYWxUcmFuIHhtaTppZD0iTG9jYWxUcmFuXzIiIGJvdW5kYXJ5PSJCRUFOX01FVEhPRCIgdW5yZXNvbHZlZEFjdGlvbj0iUk9MTEJBQ0siLz4NCi0gIDwvZWpiRXh0ZW5zaW9ucz4NCi0gIDxlamJKYXIgaHJlZj0iTUVUQS1JTkYvZWpiLWphci54bWwjZWpiLWphcl9JRCIvPg0KLSAgPGFwcGxpZWRBY2Nlc3NJbnRlbnRzIHhtaTppZD0iQXBwbGllZEFjY2Vzc0ludGVudF8xMDcxMDkzNDE1NzQ0IiBuYW1lPSJjb20uaWJtLndlYnNwaGVyZS5lamJxdWVyeS5EZWZhdWx0IiBkZXNjcmlwdGlvbj0iIiBhY2Nlc3NJbnRlbnROYW1lPSJQZXNzaW1pc3RpY1VwZGF0ZSAtIEluY3JlbWVudCAxMCI+DQotICAgIDxtZXRob2RFbGVtZW50cyB4bWk6aWQ9Ik1ldGhvZEVsZW1lbnRfMTA3MTA5MzQxNTc0NCIgdHlwZT0iVW5zcGVjaWZpZWQiPg0KLSAgICAgIDxlbnRlcnByaXNlQmVhbiB4bWk6dHlwZT0iZWpiOkNvbnRhaW5lck1hbmFnZWRFbnRpdHkiIGhyZWY9Ik1FVEEtSU5GL2VqYi1qYXIueG1sI0NvbnRhaW5lck1hbmFnZWRFbnRpdHlfMSIvPg0KLSAgICA8L21ldGhvZEVsZW1lbnRzPg0KLSAgPC9hcHBsaWVkQWNjZXNzSW50ZW50cz4NCi08L2VqYmV4dDpFSkJKYXJFeHRlbnNpb24+DQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvTUVUQS1JTkYvZWpiLWphci54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL01FVEEtSU5GL2VqYi1qYXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjkzYzg2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvTUVUQS1JTkYvZWpiLWphci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGVqYi1qYXIgaWQ9ImVqYi1qYXJfSUQiIHZlcnNpb249IjIuMSIgCi0JeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUiID4KLQk8ZGlzcGxheS1uYW1lPgotCVRlc3RFSkI8L2Rpc3BsYXktbmFtZT4KLQk8ZW50ZXJwcmlzZS1iZWFucz4KLQkJPHNlc3Npb24gaWQ9IlQxIj4KLQkJCTxlamItbmFtZT5UMTwvZWpiLW5hbWU+Ci0JCQk8aG9tZT5lamJzLlQxSG9tZTwvaG9tZT4KLQkJCTxyZW1vdGU+ZWpicy5UMTwvcmVtb3RlPgotCQkJPGVqYi1jbGFzcz5lamJzLlQxQmVhbjwvZWpiLWNsYXNzPgotCQkJPHNlc3Npb24tdHlwZT5TdGF0ZWxlc3M8L3Nlc3Npb24tdHlwZT4KLQkJCTx0cmFuc2FjdGlvbi10eXBlPkNvbnRhaW5lcjwvdHJhbnNhY3Rpb24tdHlwZT4KLQkJPC9zZXNzaW9uPgotCTwvZW50ZXJwcmlzZS1iZWFucz4KLTwvZWpiLWphcj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvZWpicy9UMS5jbGFzcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvZWpicy9UMS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhNGUwOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL2VqYnMvVDEuY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL2VqYnMvVDFCZWFuLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9lamJzL1QxQmVhbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjYjRmNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL25vLXNsL2VqYnMvVDFCZWFuLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9lamJzL1QxSG9tZS5jbGFzcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvbm8tc2wvZWpicy9UMUhvbWUuY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Nzk4MzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9uby1zbC9lamJzL1QxSG9tZS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTQ5OWJjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL01FVEEtSU5GL2VqYi1qYXIueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9NRVRBLUlORi9lamItamFyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzN2EwMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL01FVEEtSU5GL2VqYi1qYXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlamItamFyIGlkPSJlamItamFyX0lEIiB2ZXJzaW9uPSIyLjEiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS9lamItamFyXzJfMS54c2QiPgotCTxkaXNwbGF5LW5hbWU+Ci0JVGVzdEVKQjwvZGlzcGxheS1uYW1lPgotCTxlbnRlcnByaXNlLWJlYW5zPgotCQk8c2Vzc2lvbiBpZD0iVDEiPgotCQkJPGVqYi1uYW1lPlQxPC9lamItbmFtZT4KLQkJCTxob21lPmVqYnMuVDFIb21lPC9ob21lPgotCQkJPHJlbW90ZT5lamJzLlQxPC9yZW1vdGU+Ci0JCQk8ZWpiLWNsYXNzPmVqYnMuVDFCZWFuPC9lamItY2xhc3M+Ci0JCQk8c2Vzc2lvbi10eXBlPlN0YXRlbGVzczwvc2Vzc2lvbi10eXBlPgotCQkJPHRyYW5zYWN0aW9uLXR5cGU+Q29udGFpbmVyPC90cmFuc2FjdGlvbi10eXBlPgotCQk8L3Nlc3Npb24+Ci0JPC9lbnRlcnByaXNlLWJlYW5zPgotPC9lamItamFyPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9lamJzL1QxLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9lamJzL1QxLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGE0ZTA4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvZWpicy9UMS5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvZWpicy9UMUJlYW4uY2xhc3MgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL2VqYnMvVDFCZWFuLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWNiNGY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvc2wvZWpicy9UMUJlYW4uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL2VqYnMvVDFIb21lLmNsYXNzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS9zbC9lamJzL1QxSG9tZS5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU3OTgzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3NsL2VqYnMvVDFIb21lLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS93ZWJzZXJ2aWNlcy9NRVRBLUlORi9Bbm51aXR5U2VydmljZXNfbWFwcGluZy54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL0FubnVpdHlTZXJ2aWNlc19tYXBwaW5nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmZGNiZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL0FubnVpdHlTZXJ2aWNlc19tYXBwaW5nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGphdmEtd3NkbC1tYXBwaW5nIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB2ZXJzaW9uPSIxLjEiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMveHNkL2oyZWVfamF4cnBjX21hcHBpbmdfMV8xLnhzZCI+Ci0gICAgPHBhY2thZ2UtbWFwcGluZz4KLSAgICAgICAgPHBhY2thZ2UtdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhPC9wYWNrYWdlLXR5cGU+Ci0gICAgICAgIDxuYW1lc3BhY2VVUkk+aHR0cDovL2RhdGEucGxpLnRjLndzc3Z0LmlibS5jb208L25hbWVzcGFjZVVSST4KLSAgICA8L3BhY2thZ2UtbWFwcGluZz4KLSAgICA8cGFja2FnZS1tYXBwaW5nPgotICAgICAgICA8cGFja2FnZS10eXBlPmNvbS5pYm0ud3NzdnQuYWNtZS5hbm51aXR5LndzPC9wYWNrYWdlLXR5cGU+Ci0gICAgICAgIDxuYW1lc3BhY2VVUkk+aHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tPC9uYW1lc3BhY2VVUkk+Ci0gICAgPC9wYWNrYWdlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5kb3VibGU8L2phdmEtdHlwZT4KLSAgICAgICAgPHJvb3QtdHlwZS1xbmFtZSB4bWxuczpydHE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj5ydHE6ZG91YmxlPC9yb290LXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5zaW1wbGVUeXBlPC9xbmFtZS1zY29wZT4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmphdmEudXRpbC5WZWN0b3I8L2phdmEtdHlwZT4KLSAgICAgICAgPHJvb3QtdHlwZS1xbmFtZSB4bWxuczpydHE9Imh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcCI+cnRxOlZlY3Rvcjwvcm9vdC10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+c2ltcGxlVHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5qYXZhLmxhbmcuU3RyaW5nPC9qYXZhLXR5cGU+Ci0gICAgICAgIDxyb290LXR5cGUtcW5hbWUgeG1sbnM6cnRxPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+cnRxOnN0cmluZzwvcm9vdC10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+c2ltcGxlVHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLldTQW5udWl0eUNvbXBvc2l0ZURhdGE8L2phdmEtdHlwZT4KLSAgICAgICAgPHJvb3QtdHlwZS1xbmFtZSB4bWxuczpydHE9Imh0dHA6Ly9kYXRhLnBsaS50Yy53c3N2dC5pYm0uY29tIj5ydHE6V1NBbm51aXR5Q29tcG9zaXRlRGF0YTwvcm9vdC10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+Y29tcGxleFR5cGU8L3FuYW1lLXNjb3BlPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+V1NBbm51aXR5ICAgIERhdGE8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPldTQW5udWl0eSAgICBEYXRhPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5zdWJBY2NvdW50czwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+c3ViQWNjb3VudHM8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICA8L2phdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICA8amF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgICAgICA8amF2YS10eXBlPmNvbS5pYm0ud3NzdnQudGMucGxpLmRhdGEuV1NBbm51aXR5RGF0YTwvamF2YS10eXBlPgotICAgICAgICA8cm9vdC10eXBlLXFuYW1lIHhtbG5zOnJ0cT0iaHR0cDovL2RhdGEucGxpLnRjLndzc3Z0LmlibS5jb20iPnJ0cTpXU0FubnVpdHlEYXRhPC9yb290LXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5jb21wbGV4VHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT50YXhTdGF0dXM8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPnRheFN0YXR1czwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+dHlwZTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+dHlwZTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+YW1vdW50PC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5hbW91bnQ8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmVuZERhdGU8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmVuZERhdGU8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmN1c3ROdW1iZXI8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmN1c3ROdW1iZXI8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmN1c3ROYW1lPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5jdXN0TmFtZTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+Y3VzdFNTTnVtPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5jdXN0U1NOdW08L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPkVNYWlsPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5FTWFpbDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+YW5udWl0eU5vPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5hbm51aXR5Tm88L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPnByZW1pdW08L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPnByZW1pdW08L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmJlZ2luRGF0ZTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+YmVnaW5EYXRlPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5zdGF0dXM8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPnN0YXR1czwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+Zml4ZWRQZXJpb2Q8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmZpeGVkUGVyaW9kPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5maXhlZEFtb3VudDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+Zml4ZWRBbW91bnQ8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmxpZmU8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmxpZmU8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmxpZmVXaXRoUGVyaW9kPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5saWZlV2l0aFBlcmlvZDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+Zml4ZWRQZXJjZW50PC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5maXhlZFBlcmNlbnQ8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmFjdHVhbFBlcmNlbnQ8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmFjdHVhbFBlcmNlbnQ8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmJlbmVmaXRPcHRpb25zPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5iZW5lZml0T3B0aW9uczwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+cHJlbWl1bVNjaGVkPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5wcmVtaXVtU2NoZWQ8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmludmVzdENhdGVnb3J5PC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5pbnZlc3RDYXRlZ29yeTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+cGF5b3V0T3B0aW9uczwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+cGF5b3V0T3B0aW9uczwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+Z3VhclBheW91dDwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+Z3VhclBheW91dDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+bnVtU3ViQWNjdHM8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPm51bVN1YkFjY3RzPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5leHRyYUNyZWRpdHM8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmV4dHJhQ3JlZGl0czwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+Y2VsbE5vZGVTZXJ2ZXJOYW1lPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5jZWxsTm9kZVNlcnZlck5hbWU8L3htbC1lbGVtZW50LW5hbWU+Ci0gICAgICAgIDwvdmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPmNsaWVudElkPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5jbGllbnRJZDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgIDwvamF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgIDxqYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxqYXZhLXR5cGU+aW50PC9qYXZhLXR5cGU+Ci0gICAgICAgIDxyb290LXR5cGUtcW5hbWUgeG1sbnM6cnRxPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+cnRxOmludDwvcm9vdC10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+c2ltcGxlVHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5qYXZhLnV0aWwuQ2FsZW5kYXI8L2phdmEtdHlwZT4KLSAgICAgICAgPHJvb3QtdHlwZS1xbmFtZSB4bWxuczpydHE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj5ydHE6ZGF0ZVRpbWU8L3Jvb3QtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPnNpbXBsZVR5cGU8L3FuYW1lLXNjb3BlPgotICAgIDwvamF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgIDxqYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxqYXZhLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5TdWJBY2N0RGF0YVtdPC9qYXZhLXR5cGU+Ci0gICAgICAgIDxhbm9ueW1vdXMtdHlwZS1xbmFtZT5odHRwOi8vZGF0YS5wbGkudGMud3NzdnQuaWJtLmNvbTpTdWJBY2N0RGF0YVswLHVuYm91bmRlZF08L2Fub255bW91cy10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+Y29tcGxleFR5cGU8L3FuYW1lLXNjb3BlPgotICAgIDwvamF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgIDxqYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxqYXZhLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5TdWJBY2N0RGF0YTwvamF2YS10eXBlPgotICAgICAgICA8cm9vdC10eXBlLXFuYW1lIHhtbG5zOnJ0cT0iaHR0cDovL2RhdGEucGxpLnRjLndzc3Z0LmlibS5jb20iPnJ0cTpTdWJBY2N0RGF0YTwvcm9vdC10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+Y29tcGxleFR5cGU8L3FuYW1lLXNjb3BlPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+dHlwZTwvamF2YS12YXJpYWJsZS1uYW1lPgotICAgICAgICAgICAgPHhtbC1lbGVtZW50LW5hbWU+dHlwZTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+dmFsdWU8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPnZhbHVlPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5hbm51aXR5SWQ8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmFubnVpdHlJZDwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+aWQ8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmlkPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5uYW1lPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5uYW1lPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgIDx2YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICAgICAgPGphdmEtdmFyaWFibGUtbmFtZT5jZWxsTm9kZVNlcnZlck5hbWU8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmNlbGxOb2RlU2VydmVyTmFtZTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgICAgICA8dmFyaWFibGUtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLXZhcmlhYmxlLW5hbWU+Y2xpZW50SWQ8L2phdmEtdmFyaWFibGUtbmFtZT4KLSAgICAgICAgICAgIDx4bWwtZWxlbWVudC1uYW1lPmNsaWVudElkPC94bWwtZWxlbWVudC1uYW1lPgotICAgICAgICA8L3ZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5ib29sZWFuPC9qYXZhLXR5cGU+Ci0gICAgICAgIDxyb290LXR5cGUtcW5hbWUgeG1sbnM6cnRxPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+cnRxOmJvb2xlYW48L3Jvb3QtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPnNpbXBsZVR5cGU8L3FuYW1lLXNjb3BlPgotICAgIDwvamF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgIDxqYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxqYXZhLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5TdWJBY2N0RGF0YVtdPC9qYXZhLXR5cGU+Ci0gICAgICAgIDxyb290LXR5cGUtcW5hbWUgeG1sbnM6cnRxPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPnJ0cTpBcnJheU9mX3RuczJfbmlsbGFibGVfU3ViQWNjdERhdGE8L3Jvb3QtdHlwZS1xbmFtZT4KLSAgICAgICAgPHFuYW1lLXNjb3BlPmNvbXBsZXhUeXBlPC9xbmFtZS1zY29wZT4KLSAgICAgICAgPHZhcmlhYmxlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS12YXJpYWJsZS1uYW1lPnN1YkFjY3REYXRhPC9qYXZhLXZhcmlhYmxlLW5hbWU+Ci0gICAgICAgICAgICA8eG1sLWVsZW1lbnQtbmFtZT5TdWJBY2N0RGF0YTwveG1sLWVsZW1lbnQtbmFtZT4KLSAgICAgICAgPC92YXJpYWJsZS1tYXBwaW5nPgotICAgIDwvamF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgIDxqYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgICAgIDxqYXZhLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5TdWJBY2N0RGF0YVtdPC9qYXZhLXR5cGU+Ci0gICAgICAgIDxhbm9ueW1vdXMtdHlwZS1xbmFtZT5odHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb206QXJyYXlPZl90bnMyX25pbGxhYmxlX1N1YkFjY3REYXRhJmd0O1N1YkFjY3REYXRhWzAsdW5ib3VuZGVkXTwvYW5vbnltb3VzLXR5cGUtcW5hbWU+Ci0gICAgICAgIDxxbmFtZS1zY29wZT5jb21wbGV4VHlwZTwvcW5hbWUtc2NvcGU+Ci0gICAgPC9qYXZhLXhtbC10eXBlLW1hcHBpbmc+Ci0gICAgPGphdmEteG1sLXR5cGUtbWFwcGluZz4KLSAgICAgICAgPGphdmEtdHlwZT5qYXZhLmxhbmcuT2JqZWN0W108L2phdmEtdHlwZT4KLSAgICAgICAgPGFub255bW91cy10eXBlLXFuYW1lPmh0dHA6Ly94bWwuYXBhY2hlLm9yZy94bWwtc29hcDpWZWN0b3ImZ3Q7aXRlbVswLHVuYm91bmRlZF08L2Fub255bW91cy10eXBlLXFuYW1lPgotICAgICAgICA8cW5hbWUtc2NvcGU+Y29tcGxleFR5cGU8L3FuYW1lLXNjb3BlPgotICAgIDwvamF2YS14bWwtdHlwZS1tYXBwaW5nPgotICAgIDxzZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nPgotICAgICAgICA8c2VydmljZS1pbnRlcmZhY2U+Y29tLmlibS53c3N2dC5hY21lLmFubnVpdHkud3MuV1NUQW5udWl0eVNlcnZpY2U8L3NlcnZpY2UtaW50ZXJmYWNlPgotICAgICAgICA8d3NkbC1zZXJ2aWNlLW5hbWUgeG1sbnM6c2ltPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPnNpbTpXU1RBbm51aXR5U2VydmljZTwvd3NkbC1zZXJ2aWNlLW5hbWU+Ci0gICAgICAgIDxwb3J0LW1hcHBpbmc+Ci0gICAgICAgICAgICA8cG9ydC1uYW1lPldTVEFubnVpdHlTZXJ2aWNlPC9wb3J0LW5hbWU+Ci0gICAgICAgICAgICA8amF2YS1wb3J0LW5hbWU+V1NUQW5udWl0eVNlcnZpY2U8L2phdmEtcG9ydC1uYW1lPgotICAgICAgICA8L3BvcnQtbWFwcGluZz4KLSAgICA8L3NlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmc+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+d3J2bTp3c0NyZWF0ZUFubnVpdHlSZXNwb25zZTwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPndzQ3JlYXRlQW5udWl0eVJldHVybjwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgIDwvd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgPC9zZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgIDwvc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZz4KLSAgICA8c2VydmljZS1pbnRlcmZhY2UtbWFwcGluZz4KLSAgICAgICAgPHNlcnZpY2UtaW50ZXJmYWNlPmNvbS5pYm0ud3NzdnQuYWNtZS5hbm51aXR5LndzLkFubnVpdHlTZXJ2aWNlPC9zZXJ2aWNlLWludGVyZmFjZT4KLSAgICAgICAgPHdzZGwtc2VydmljZS1uYW1lIHhtbG5zOnNpbT0iaHR0cDovL3dzLmFubnVpdHkuYWNtZS53c3N2dC5pYm0uY29tIj5zaW06QW5udWl0eVNlcnZpY2U8L3dzZGwtc2VydmljZS1uYW1lPgotICAgICAgICA8cG9ydC1tYXBwaW5nPgotICAgICAgICAgICAgPHBvcnQtbmFtZT5Bbm51aXR5U2VydmljZTwvcG9ydC1uYW1lPgotICAgICAgICAgICAgPGphdmEtcG9ydC1uYW1lPkFubnVpdHlTZXJ2aWNlPC9qYXZhLXBvcnQtbmFtZT4KLSAgICAgICAgPC9wb3J0LW1hcHBpbmc+Ci0gICAgPC9zZXJ2aWNlLWludGVyZmFjZS1tYXBwaW5nPgotICAgIDxzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZS1tYXBwaW5nPgotICAgICAgICA8c2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2U+Y29tLmlibS53c3N2dC5hY21lLmFubnVpdHkud3MuQW5udWl0eVNlcnZpY2VQb3J0VHlwZTwvc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2U+Ci0gICAgICAgIDx3c2RsLXBvcnQtdHlwZSB4bWxuczpzZWltd3B0PSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPnNlaW13cHQ6QW5udWl0eVNlcnZpY2VQb3J0VHlwZTwvd3NkbC1wb3J0LXR5cGU+Ci0gICAgICAgIDx3c2RsLWJpbmRpbmcgeG1sbnM6c2VpbXdiPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPnNlaW13YjpBbm51aXR5U2VydmljZUJpbmRpbmc8L3dzZGwtYmluZGluZz4KLSAgICAgICAgPHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS1tZXRob2QtbmFtZT53c0xpc3RBbm51aXR5QnlIb2xkZXI8L2phdmEtbWV0aG9kLW5hbWU+Ci0gICAgICAgICAgICA8d3NkbC1vcGVyYXRpb24+d3NMaXN0QW5udWl0eUJ5SG9sZGVyPC93c2RsLW9wZXJhdGlvbj4KLSAgICAgICAgICAgIDx3cmFwcGVkLWVsZW1lbnQ+PC93cmFwcGVkLWVsZW1lbnQ+Ci0gICAgICAgICAgICA8bWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXBvc2l0aW9uPjA8L3BhcmFtLXBvc2l0aW9uPgotICAgICAgICAgICAgICAgIDxwYXJhbS10eXBlPmphdmEubGFuZy5TdHJpbmc8L3BhcmFtLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOm1wcG09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+bXBwbTp3c0xpc3RBbm51aXR5QnlIb2xkZXJSZXF1ZXN0PC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPmhvbGRlclNTTjwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHBhcmFtZXRlci1tb2RlPklOPC9wYXJhbWV0ZXItbW9kZT4KLSAgICAgICAgICAgICAgICA8L3dzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgPC9tZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgIDx3c2RsLXJldHVybi12YWx1ZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxtZXRob2QtcmV0dXJuLXZhbHVlPmphdmEudXRpbC5WZWN0b3I8L21ldGhvZC1yZXR1cm4tdmFsdWU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczp3cnZtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPndydm06d3NMaXN0QW5udWl0eUJ5SG9sZGVyUmVzcG9uc2U8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT53c0xpc3RBbm51aXR5QnlIb2xkZXJSZXR1cm48L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICA8L3dzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgIDwvc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICAgICAgPHNlcnZpY2UtZW5kcG9pbnQtbWV0aG9kLW1hcHBpbmc+Ci0gICAgICAgICAgICA8amF2YS1tZXRob2QtbmFtZT53c0FkZFN1YkFjY291bnRzPC9qYXZhLW1ldGhvZC1uYW1lPgotICAgICAgICAgICAgPHdzZGwtb3BlcmF0aW9uPndzQWRkU3ViQWNjb3VudHM8L3dzZGwtb3BlcmF0aW9uPgotICAgICAgICAgICAgPHdyYXBwZWQtZWxlbWVudD48L3dyYXBwZWQtZWxlbWVudD4KLSAgICAgICAgICAgIDxtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8cGFyYW0tcG9zaXRpb24+MDwvcGFyYW0tcG9zaXRpb24+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5XU0FubnVpdHlDb21wb3NpdGVEYXRhPC9wYXJhbS10eXBlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczptcHBtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPm1wcG06d3NBZGRTdWJBY2NvdW50c1JlcXVlc3Q8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+YUNEPC93c2RsLW1lc3NhZ2UtcGFydC1uYW1lPgotICAgICAgICAgICAgICAgICAgICA8cGFyYW1ldGVyLW1vZGU+SU48L3BhcmFtZXRlci1tb2RlPgotICAgICAgICAgICAgICAgIDwvd3NkbC1tZXNzYWdlLW1hcHBpbmc+Ci0gICAgICAgICAgICA8L21ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgPG1ldGhvZC1wYXJhbS1wYXJ0cy1tYXBwaW5nPgotICAgICAgICAgICAgICAgIDxwYXJhbS1wb3NpdGlvbj4xPC9wYXJhbS1wb3NpdGlvbj4KLSAgICAgICAgICAgICAgICA8cGFyYW0tdHlwZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLlN1YkFjY3REYXRhW108L3BhcmFtLXR5cGU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1tYXBwaW5nPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlIHhtbG5zOm1wcG09Imh0dHA6Ly93cy5hbm51aXR5LmFjbWUud3NzdnQuaWJtLmNvbSI+bXBwbTp3c0FkZFN1YkFjY291bnRzUmVxdWVzdDwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT5zQUQ8L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXItbW9kZT5JTjwvcGFyYW1ldGVyLW1vZGU+Ci0gICAgICAgICAgICAgICAgPC93c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICA8d3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXJldHVybi12YWx1ZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLldTQW5udWl0eUNvbXBvc2l0ZURhdGE8L21ldGhvZC1yZXR1cm4tdmFsdWU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczp3cnZtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPndydm06d3NBZGRTdWJBY2NvdW50c1Jlc3BvbnNlPC93c2RsLW1lc3NhZ2U+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+d3NBZGRTdWJBY2NvdW50c1JldHVybjwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgIDwvd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgPC9zZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgICAgICA8c2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICAgICAgICAgIDxqYXZhLW1ldGhvZC1uYW1lPndzQ3JlYXRlQW5udWl0eTwvamF2YS1tZXRob2QtbmFtZT4KLSAgICAgICAgICAgIDx3c2RsLW9wZXJhdGlvbj53c0NyZWF0ZUFubnVpdHk8L3dzZGwtb3BlcmF0aW9uPgotICAgICAgICAgICAgPHdyYXBwZWQtZWxlbWVudD48L3dyYXBwZWQtZWxlbWVudD4KLSAgICAgICAgICAgIDxtZXRob2QtcGFyYW0tcGFydHMtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8cGFyYW0tcG9zaXRpb24+MDwvcGFyYW0tcG9zaXRpb24+Ci0gICAgICAgICAgICAgICAgPHBhcmFtLXR5cGU+Y29tLmlibS53c3N2dC50Yy5wbGkuZGF0YS5XU0FubnVpdHlDb21wb3NpdGVEYXRhPC9wYXJhbS10eXBlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczptcHBtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPm1wcG06d3NDcmVhdGVBbm51aXR5UmVxdWVzdDwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT5hQ0Q8L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDxwYXJhbWV0ZXItbW9kZT5JTjwvcGFyYW1ldGVyLW1vZGU+Ci0gICAgICAgICAgICAgICAgPC93c2RsLW1lc3NhZ2UtbWFwcGluZz4KLSAgICAgICAgICAgIDwvbWV0aG9kLXBhcmFtLXBhcnRzLW1hcHBpbmc+Ci0gICAgICAgICAgICA8d3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgICAgICAgICA8bWV0aG9kLXJldHVybi12YWx1ZT5jb20uaWJtLndzc3Z0LnRjLnBsaS5kYXRhLldTQW5udWl0eUNvbXBvc2l0ZURhdGE8L21ldGhvZC1yZXR1cm4tdmFsdWU+Ci0gICAgICAgICAgICAgICAgPHdzZGwtbWVzc2FnZSB4bWxuczp3cnZtPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPndydm06d3NDcmVhdGVBbm51aXR5UmVzcG9uc2U8L3dzZGwtbWVzc2FnZT4KLSAgICAgICAgICAgICAgICA8d3NkbC1tZXNzYWdlLXBhcnQtbmFtZT53c0NyZWF0ZUFubnVpdHlSZXR1cm48L3dzZGwtbWVzc2FnZS1wYXJ0LW5hbWU+Ci0gICAgICAgICAgICA8L3dzZGwtcmV0dXJuLXZhbHVlLW1hcHBpbmc+Ci0gICAgICAgIDwvc2VydmljZS1lbmRwb2ludC1tZXRob2QtbWFwcGluZz4KLSAgICA8L3NlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlLW1hcHBpbmc+Ci0gICAgPHNlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmc+Ci0gICAgICAgIDxzZXJ2aWNlLWludGVyZmFjZT5jb20uaWJtLndzc3Z0LmFjbWUuYW5udWl0eS53cy5Bbm51aXR5U2VydmljZTI8L3NlcnZpY2UtaW50ZXJmYWNlPgotICAgICAgICA8d3NkbC1zZXJ2aWNlLW5hbWUgeG1sbnM6c2ltPSJodHRwOi8vd3MuYW5udWl0eS5hY21lLndzc3Z0LmlibS5jb20iPnNpbTpBbm51aXR5U2VydmljZTI8L3dzZGwtc2VydmljZS1uYW1lPgotICAgICAgICA8cG9ydC1tYXBwaW5nPgotICAgICAgICAgICAgPHBvcnQtbmFtZT5Bbm51aXR5U2VydmljZTI8L3BvcnQtbmFtZT4KLSAgICAgICAgICAgIDxqYXZhLXBvcnQtbmFtZT5Bbm51aXR5U2VydmljZTI8L2phdmEtcG9ydC1uYW1lPgotICAgICAgICA8L3BvcnQtbWFwcGluZz4KLSAgICA8L3NlcnZpY2UtaW50ZXJmYWNlLW1hcHBpbmc+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+d3J2bTp3c0NyZWF0ZUFubnVpdHlSZXNwb25zZTwvd3NkbC1tZXNzYWdlPgotICAgICAgICAgICAgICAgIDx3c2RsLW1lc3NhZ2UtcGFydC1uYW1lPndzQ3JlYXRlQW5udWl0eVJldHVybjwvd3NkbC1tZXNzYWdlLXBhcnQtbmFtZT4KLSAgICAgICAgICAgIDwvd3NkbC1yZXR1cm4tdmFsdWUtbWFwcGluZz4KLSAgICAgICAgPC9zZXJ2aWNlLWVuZHBvaW50LW1ldGhvZC1tYXBwaW5nPgotICAgIDwvc2VydmljZS1lbmRwb2ludC1pbnRlcmZhY2UtbWFwcGluZz4KLTwvamF2YS13c2RsLW1hcHBpbmc+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL2libS13ZWJzZXJ2aWNlcy1ibmQueG1pIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS93ZWJzZXJ2aWNlcy9NRVRBLUlORi9pYm0td2Vic2VydmljZXMtYm5kLnhtaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkY2Y2Yy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL2libS13ZWJzZXJ2aWNlcy1ibmQueG1pCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2Uud3NibmQ6V1NCaW5kaW5nIHhtaTp2ZXJzaW9uPSIyLjAiIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6Y29tLmlibS5ldG9vbHMud2Vic2VydmljZS53c2JuZD0iaHR0cDovL3d3dy5pYm0uY29tL3dlYnNwaGVyZS9hcHBzZXJ2ZXIvc2NoZW1hcy81LjAuMi93c2JuZC54bWkiIHhtaTppZD0iV1NCaW5kaW5nXzEwNTU3MzcyNDE3OTciPgotICA8d3NkZXNjQmluZGluZ3MgeG1pOmlkPSJXU0Rlc2NCaW5kaW5nXzEwNTU3MzcyNDE3OTciIHdzRGVzY05hbWVMaW5rPSJTdG9ja1F1b3RlRmV0Y2hlciI+Ci0gICAgPHBjQmluZGluZ3MgeG1pOmlkPSJQQ0JpbmRpbmdfMTA1NTczNzI0MTc5NyIgcGNOYW1lTGluaz0idXJuOnhtbHRvZGF5LWRlbGF5ZWQtcXVvdGVzIiBzY29wZT0iU2Vzc2lvbiIvPgotICA8L3dzZGVzY0JpbmRpbmdzPgotICA8cm91dGVyTW9kdWxlcyB4bWk6aWQ9IlJvdXRlck1vZHVsZV8xMDU1NzM3MjQxNzk3IiB0cmFuc3BvcnQ9Imh0dHAiIG5hbWU9IlN0b2NrUXVvdGUud2FyIi8+Ci08L2NvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2Uud3NibmQ6V1NCaW5kaW5nPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS93ZWJzZXJ2aWNlcy9NRVRBLUlORi9pYm0td2Vic2VydmljZXMtZXh0LnhtaSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvaWJtLXdlYnNlcnZpY2VzLWV4dC54bWkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MDUwMGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy90ZXN0RGF0YS93ZWJzZXJ2aWNlcy9NRVRBLUlORi9pYm0td2Vic2VydmljZXMtZXh0LnhtaQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPGNvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2Uud3NleHQ6V3NFeHRlbnNpb24geG1pOnZlcnNpb249IjIuMCIgeG1sbnM6eG1pPSJodHRwOi8vd3d3Lm9tZy5vcmcvWE1JIiB4bWxuczpjb20uaWJtLmV0b29scy53ZWJzZXJ2aWNlLndzZXh0PSJodHRwOi8vd3d3LmlibS5jb20vd2Vic3BoZXJlL2FwcHNlcnZlci9zY2hlbWFzLzUuMC4yL3dzZXh0LnhtaSIgeG1pOmlkPSJXc0V4dGVuc2lvbl8xMDUzNDg0NjE1MDU0Ij4KLSAgPHdzRGVzY0V4dCB4bWk6aWQ9IldzRGVzY0V4dF8xMDUzNDg0NjE1MDU0IiB3c0Rlc2NOYW1lTGluaz0iU3RvY2tRdW90ZUZldGNoZXIiPgotICAgIDxwY0JpbmRpbmcgeG1pOmlkPSJQY0JpbmRpbmdfMTA1MzQ4NDYxNTA1NCIgcGNOYW1lTGluaz0idXJuOnhtbHRvZGF5LWRlbGF5ZWQtcXVvdGVzIj4KLSAgICA8L3BjQmluZGluZz4KLSAgPC93c0Rlc2NFeHQ+Ci08L2NvbS5pYm0uZXRvb2xzLndlYnNlcnZpY2Uud3NleHQ6V3NFeHRlbnNpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLnRlc3RzL3Rlc3REYXRhL3dlYnNlcnZpY2VzL01FVEEtSU5GL3dlYnNlcnZpY2VzLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvd2Vic2VydmljZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjY5MDc3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMvdGVzdERhdGEvd2Vic2VydmljZXMvTUVUQS1JTkYvd2Vic2VydmljZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSB3ZWJzZXJ2aWNlcyBQVUJMSUMgIi0vL0lCTSBDb3Jwb3JhdGlvbiwgSW5jLi8vRFREIEoyRUUgV2ViIHNlcnZpY2VzIDEuMC8vRU4iICJodHRwOi8vd3d3LmlibS5jb20vd2Vic2VydmljZXMvZHRkL2oyZWVfd2ViX3NlcnZpY2VzXzFfMC5kdGQiPgotCi0gICA8d2Vic2VydmljZXMgaWQ9IldlYlNlcnZpY2VzXzEwNTU3MzcyNDE2NzIiPgotICAgICAgPHdlYnNlcnZpY2UtZGVzY3JpcHRpb24gaWQ9IldlYlNlcnZpY2VEZXNjcmlwdGlvbl8xMDU1NzM3MjQxNjg4Ij4KLSAgICAgICAgIDx3ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uLW5hbWU+U3RvY2tRdW90ZUZldGNoZXI8L3dlYnNlcnZpY2UtZGVzY3JpcHRpb24tbmFtZT4KLSAgICAgICAgIDx3c2RsLWZpbGU+TUVUQS1JTkYvd3NkbC9TdG9ja1F1b3RlRmV0Y2hlci53c2RsPC93c2RsLWZpbGU+Ci0gICAgICAgICA8amF4cnBjLW1hcHBpbmctZmlsZT5NRVRBLUlORi9TdG9ja1F1b3RlRmV0Y2hlcl9tYXBwaW5nLnhtbDwvamF4cnBjLW1hcHBpbmctZmlsZT4KLSAgICAgICAgIDxwb3J0LWNvbXBvbmVudCBpZD0iUG9ydENvbXBvbmVudF8xMDU1NzM3MjQxNzM0Ij4KLSAgICAgICAgICAgIDxwb3J0LWNvbXBvbmVudC1uYW1lPnVybjp4bWx0b2RheS1kZWxheWVkLXF1b3RlczwvcG9ydC1jb21wb25lbnQtbmFtZT4KLSAgICAgICAgICAgIDx3c2RsLXBvcnQgaWQ9IldTRExQb3J0XzEwNTU3MzcyNDE3MzQiPgotICAgICAgICAgICAgICAgPG5hbWVzcGFjZVVSST5odHRwOi8vc3RvY2sud2Vic2VydmljZXMuc2FtcGxlcy53ZWJzcGhlcmUuaWJtLmNvbTwvbmFtZXNwYWNlVVJJPgotICAgICAgICAgICAgICAgPGxvY2FscGFydD5TdG9ja1F1b3RlPC9sb2NhbHBhcnQ+Ci0gICAgICAgICAgICA8L3dzZGwtcG9ydD4KLSAgICAgICAgICAgIDxzZXJ2aWNlLWVuZHBvaW50LWludGVyZmFjZT5jb20uaWJtLndlYnNwaGVyZS5zYW1wbGVzLndlYnNlcnZpY2VzLnN0b2NrLlN0b2NrUXVvdGU8L3NlcnZpY2UtZW5kcG9pbnQtaW50ZXJmYWNlPgotICAgICAgICAgICAgPHNlcnZpY2UtaW1wbC1iZWFuIGlkPSJTZXJ2aWNlSW1wbEJlYW5fMTA1NTczNzI0MTczNCI+Ci0gICAgICAgICAgICAgICA8ZWpiLWxpbms+Y29tX2libV93ZWJzcGhlcmVfc2FtcGxlc193ZWJzZXJ2aWNlc19zdG9ja19TdG9ja1F1b3RlPC9lamItbGluaz4KLSAgICAgICAgICAgIDwvc2VydmljZS1pbXBsLWJlYW4+Ci0gICAgICAgICA8L3BvcnQtY29tcG9uZW50PgotICAgICAgPC93ZWJzZXJ2aWNlLWRlc2NyaXB0aW9uPgotICAgPC93ZWJzZXJ2aWNlcz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmY2NzBlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImNvbW1vbi8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvLmN2c2lnbm9yZSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYWM2MDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1wZXJmb3JtYW5jZS5qYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZWQzM2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZDQ1NDcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLnBlcmZvcm1hbmNlLmphciA9IGNvbW1vbi8KLW91dHB1dC5wZXJmb3JtYW5jZS5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlLmphcixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvQmFzZVBlcmZvcm1hbmNlVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9CYXNlUGVyZm9ybWFuY2VUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTc1NmFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9CYXNlUGVyZm9ybWFuY2VUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIERlYyA2LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuQmFzZVRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlUGVyZm9ybWFuY2VUZXN0Q2FzZSBleHRlbmRzIEJhc2VUZXN0Q2FzZSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBNYXAgcGVyZm9ybWFuY2VDbGFzcyA9IG51bGw7Ci0Jc3RhdGljIENsYXNzTG9hZGVyIGNsYXp6TG9hZGVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBmaWxlPSBudWxsOyAKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXBlcmZvcm1hbmNlQ2xhc3MgPSBudWxsOwotCQlyZXR1cm4gY3JlYXRlVGVzdFN1aXRlcygpIDsKLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVGVzdCBjcmVhdGVUZXN0U3VpdGVzKCkgewotCQljcmVhdGVQZXJmb3JtYW5jZUNsYXNzKCk7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcGVyZm9ybWFuY2VDbGFzcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUNsYXNzIGNsYXp6ID0gKENsYXNzKSBpdGVyLm5leHQoKTsKLQkJCUxpc3QgbWV0aG9kTGlzdCA9IChMaXN0KXBlcmZvcm1hbmNlQ2xhc3MuZ2V0KGNsYXp6KTsKLQkJCWZvciAoaW50IHg9MDsgeDwgbWV0aG9kTGlzdC5zaXplKCk7ICsreCkgewotCQkJCVBlcmZvcm1hbmNlVGVzdE9iamVjdCB0ZXN0T2JqZWN0ID0gKFBlcmZvcm1hbmNlVGVzdE9iamVjdCltZXRob2RMaXN0LmdldCh4KTsKLQkJCQlUZXN0IHRlc3QgPSBjcmVhdGVUZXN0KGNsYXp6LHRlc3RPYmplY3QuZ2V0TmFtZSgpKTsKLQkJCQlpZiAodGVzdCBpbnN0YW5jZW9mIEJhc2VUZXN0Q2FzZSkgewotCQkJCQlzdWl0ZS5hZGRUZXN0KG5ldyBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlcigoQmFzZVRlc3RDYXNlKXRlc3QsIHRlc3RPYmplY3QuZ2V0VGFnZ2luZygpICwgdGVzdE9iamVjdC5nZXRTaG9ydE5hbWUoKSkpOwotCQkJCX0KLQkJCX0KLQkJfQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyBUZXN0IGNyZWF0ZVRlc3QoQ2xhc3MgdGhlQ2xhc3MsIFN0cmluZyBuYW1lKSB7Ci0JCUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yOwotCQl0cnkgewotCQkJY29uc3RydWN0b3I9IGdldFRlc3RDb25zdHJ1Y3Rvcih0aGVDbGFzcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gd2FybmluZygiQ2xhc3MgIit0aGVDbGFzcy5nZXROYW1lKCkrIiBoYXMgbm8gcHVibGljIGNvbnN0cnVjdG9yIFRlc3RDYXNlKFN0cmluZyBuYW1lKSBvciBUZXN0Q2FzZSgpIik7Ci0JCX0KLQkJT2JqZWN0IHRlc3Q7Ci0JCXRyeSB7Ci0JCQlpZiAoY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMCkgewotCQkJCXRlc3Q9IGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbMF0pOwotCQkJCWlmICh0ZXN0IGluc3RhbmNlb2YgVGVzdENhc2UpCi0JCQkJCSgoVGVzdENhc2UpIHRlc3QpLnNldE5hbWUobmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCXRlc3Q9IGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKG5ldyBPYmplY3RbXXtuYW1lfSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuKHdhcm5pbmcoIkNhbm5vdCBpbnN0YW50aWF0ZSB0ZXN0IGNhc2U6ICIrbmFtZSsiICgiK2V4Y2VwdGlvblRvU3RyaW5nKGUpKyIpIikpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybih3YXJuaW5nKCJFeGNlcHRpb24gaW4gY29uc3RydWN0b3I6ICIrbmFtZSsiICgiK2V4Y2VwdGlvblRvU3RyaW5nKGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpKyIpIikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybih3YXJuaW5nKCJDYW5ub3QgYWNjZXNzIHRlc3QgY2FzZTogIituYW1lKyIgKCIrZXhjZXB0aW9uVG9TdHJpbmcoZSkrIikiKSk7Ci0JCX0KLQkJcmV0dXJuIChUZXN0KSB0ZXN0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgdGVzdCB3aGljaCB3aWxsIGZhaWwgYW5kIGxvZyBhIHdhcm5pbmcgbWVzc2FnZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBUZXN0IHdhcm5pbmcoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBUZXN0Q2FzZSgid2FybmluZyIpIHsKLQkJCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB7Ci0JCQkJZmFpbChtZXNzYWdlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDb25zdHJ1Y3RvciBnZXRUZXN0Q29uc3RydWN0b3IoQ2xhc3MgdGhlQ2xhc3MpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlDbGFzc1tdIGFyZ3M9IHsgU3RyaW5nLmNsYXNzIH07Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhlQ2xhc3MuZ2V0Q29uc3RydWN0b3IoYXJncyk7CQotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJLy8gZmFsbCB0aHJvdWdoCi0JCX0KLQkJcmV0dXJuIHRoZUNsYXNzLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1swXSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBleGNlcHRpb25Ub1N0cmluZyhUaHJvd2FibGUgdCkgewotCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHdyaXRlcj0gbmV3IFByaW50V3JpdGVyKHN0cmluZ1dyaXRlcik7Ci0JCXQucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7Ci0JCXJldHVybiBzdHJpbmdXcml0ZXIudG9TdHJpbmcoKTsKLQotCX0KLQkvKioKLQkgKiBAcGFyYW0gcGVyZm9ybWFuY2VDbGFzczIKLQkgKi8KLQkKLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRQZXJmb3JtYW5jZUNsYXNzKCkgewotCQlpZiAocGVyZm9ybWFuY2VDbGFzcyA9PSBudWxsKSB7Ci0JCQljcmVhdGVQZXJmb3JtYW5jZUNsYXNzKCk7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1hbmNlQ2xhc3M7Ci0JfQotCQotCQkKLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY3JlYXRlUGVyZm9ybWFuY2VDbGFzcygpIHsKLQkJaWYgKHBlcmZvcm1hbmNlQ2xhc3MgPT0gbnVsbCkgewotCQkJcGVyZm9ybWFuY2VDbGFzcyA9IG5ldyBUZXN0Q2FzZVNBWFBhcnNlcigpLmRvTG9hZChuZXcgRmlsZShmaWxlKSk7Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGNsYXp6TG9hZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0JCXJldHVybiBjbGF6ekxvYWRlcjsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGNsYXp6TG9hZGVyIFRoZSBjbGF6ekxvYWRlciB0byBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIGNsYXp6TG9hZGVyKSB7Ci0JCUJhc2VQZXJmb3JtYW5jZVRlc3RDYXNlLmNsYXp6TG9hZGVyID0gY2xhenpMb2FkZXI7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlKCkgewotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaWxlKFN0cmluZyBmaWxlKSB7Ci0JCUJhc2VQZXJmb3JtYW5jZVRlc3RDYXNlLmZpbGUgPSBmaWxlOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gc3VpdGUKLQkgKiBAcGFyYW0gdGVzdAotCSAqIEBwYXJhbSBnbG9iYWwKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFkZFBlcmZvcm1hbmNlVGVzdChUZXN0U3VpdGUgc3VpdGUsIEJhc2VUZXN0Q2FzZSB0ZXN0LCBpbnQgdGFnZ2luZywgU3RyaW5nIHNob3J0TmFtZSkgewotCQlQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlciB0ZXN0Q2FzZSA9IG5ldyBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlcih0ZXN0LCB0YWdnaW5nICwgc2hvcnROYW1lKTsKLQkJc3VpdGUuYWRkVGVzdCh0ZXN0Q2FzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzllMjhhYy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFBlcmZvcm1hbmNlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFBlcmZvcm1hbmNlUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUGVyZm9ybWFuY2VQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQkJcGx1Z2luID0gbnVsbDsKLQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcmZvcm1hbmNlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBQZXJmb3JtYW5jZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VQbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1BlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0NzAxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjQsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLkRpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRlc3QucGVyZm9ybWFuY2UuUGVyZm9ybWFuY2VUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkJhc2VUZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgIGNsYXNzIFBlcmZvcm1hbmNlVGVzdENhc2VXcmFwcGVyIGV4dGVuZHMgUGVyZm9ybWFuY2VUZXN0Q2FzZSB7Ci0JcHJvdGVjdGVkIEJhc2VUZXN0Q2FzZSBmVGVzdDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT05FID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0NBTCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR0xPQkFMID0gMjsJCi0JCi0JcHJpdmF0ZSBib29sZWFuIHRhZ0FzR2xvYmFsU3VtbWFyeTsKLQlwcml2YXRlIGJvb2xlYW4gdGFnQXNTdW1tYXJ5OwotCXByaXZhdGUgU3RyaW5nIHNob3J0TmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJVEVSQVRJT05TID0gMTA7Ci0KLQlwdWJsaWMgUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIoQmFzZVRlc3RDYXNlIHRlc3QsIAotCQkJCQkJCQkJaW50IHRhZ2dpbmcsCi0JCQkJCQkJCQlTdHJpbmcgc2hvcnROYW1lKSB7Ci0JCWZUZXN0PXRlc3Q7Ci0JCXRhZ0FzR2xvYmFsU3VtbWFyeSA9ICgodGFnZ2luZyAmIEdMT0JBTCkgIT0gMCk7Ci0JICAgIHRhZ0FzU3VtbWFyeSA9ICgodGFnZ2luZyAmIExPQ0FMKSAhPSAwKTsKLQkgICAgdGhpcy5zaG9ydE5hbWUgPSAgc2hvcnROYW1lOwotCX0KLQkKLQlwdWJsaWMgaW50IGNvdW50VGVzdENhc2VzKCkgewotCQlyZXR1cm4gZlRlc3QuY291bnRUZXN0Q2FzZXMoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGZUZXN0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFRlc3QgZ2V0VGVzdCgpIHsKLQkJcmV0dXJuIGZUZXN0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZUZXN0LnNldFVwVGVzdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBiYXNpY1NldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcmZvcm1hbmNlIHBlcmZvcm1hbmNlPSBQZXJmb3JtYW5jZS5nZXREZWZhdWx0KCk7Ci0JCWZQZXJmb3JtYW5jZU1ldGVyPSBwZXJmb3JtYW5jZS5jcmVhdGVQZXJmb3JtYW5jZU1ldGVyKHBlcmZvcm1hbmNlLmdldERlZmF1bHRTY2VuYXJpb0lkKGZUZXN0KSk7Ci0JfQotCi0JCi0JLyoqCi0JICogUnVucyB0aGUgYmFyZSB0ZXN0IHNlcXVlbmNlLgotCSAqIEBleGNlcHRpb24gVGhyb3dhYmxlIGlmIGFueSBleGNlcHRpb24gaXMgdGhyb3duCi0JICovCi0JcHVibGljIHZvaWQgcnVuQmFyZSgpIHRocm93cyBUaHJvd2FibGUgewotCQliYXNpY1NldFVwKCk7Ci0JCXRhZ0lmTmVjZXNzYXJ5KHNob3J0TmFtZSwgRGltZW5zaW9uLkNQVV9USU1FKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBJVEVSQVRJT05TOyBpKyspIHsKLQkJCQlzZXRVcCgpOwotCQkJCXN0YXJ0TWVhc3VyaW5nKCk7Ci0JCQkJcnVuVGVzdCgpOwotCQkJCXN0b3BNZWFzdXJpbmcoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWNvbW1pdE1lYXN1cmVtZW50cygpOwotCQkJYXNzZXJ0UGVyZm9ybWFuY2UoKTsKLQkJCXRlYXJEb3duKCk7Ci0JCX0KLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3J1blRlc3QoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlmVGVzdC5ydW5Db3JlVGVzdCgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLlBlcmZvcm1hbmNlVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJZlRlc3QudGVhckRvd25UZXN0KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNzZXROYW1lKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCWZUZXN0LnNldE5hbWUobmFtZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIGZUZXN0LmdldE5hbWUoKTsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogQW5zd2VycyB3aGV0aGVyIHRoaXMgdGVzdCBzaG91bGQgYmUgdGFnZ2VkIGdsb2JhbGx5LgotICAgICAqIAotICAgICAqIEByZXR1cm4gd2hldGhlciB0aGlzIHRlc3Qgc2hvdWxkIGJlIHRhZ2dlZCBnbG9iYWxseQotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRHbG9iYWxseVRhZygpIHsKLSAgICAJcmV0dXJuIHRhZ0FzR2xvYmFsU3VtbWFyeTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQW5zd2VycyB3aGV0aGVyIHRoaXMgdGVzdCBzaG91bGQgYmUgdGFnZ2VkIGxvY2FsbHkuCi0gICAgICogCi0gICAgICogQHJldHVybiB3aGV0aGVyIHRoaXMgdGVzdCBzaG91bGQgYmUgdGFnZ2VkIGxvY2FsbHkKLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gc2hvdWxkTG9jYWxseVRhZygpIHsKLSAgICAJcmV0dXJuIHRhZ0FzU3VtbWFyeTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGFnSWZOZWNlc3NhcnkoU3RyaW5nIHNob3J0TmFtZSwgRGltZW5zaW9uIGRpbWVuc2lvbikgewotCQlpZiAoc2hvdWxkR2xvYmFsbHlUYWcoKSkgewotCQkJdGFnQXNHbG9iYWxTdW1tYXJ5KHNob3J0TmFtZSwgZGltZW5zaW9uKTsKLQkJfQotCQlpZiAoc2hvdWxkTG9jYWxseVRhZygpKSB7Ci0JCQl0YWdBc1N1bW1hcnkoc2hvcnROYW1lLCBkaW1lbnNpb24pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRhZ0lmTmVjZXNzYXJ5KFN0cmluZyBzaG9ydE5hbWUsIERpbWVuc2lvbiBbXSBkaW1lbnNpb25zKSB7Ci0JCWlmIChzaG91bGRHbG9iYWxseVRhZygpKSB7Ci0JCQl0YWdBc0dsb2JhbFN1bW1hcnkoc2hvcnROYW1lLCBkaW1lbnNpb25zKTsKLQkJfQotCQlpZiAoc2hvdWxkTG9jYWxseVRhZygpKSB7Ci0JCQl0YWdBc1N1bW1hcnkoc2hvcnROYW1lLCBkaW1lbnNpb25zKTsKLQkJfQotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RPYmplY3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9QZXJmb3JtYW5jZVRlc3RPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzOTM0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9jb21tb24vb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvcGVyZm9ybWFuY2UvUGVyZm9ybWFuY2VUZXN0T2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBOb3YgMjYsIDIwMDQKLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJmb3JtYW5jZVRlc3RPYmplY3QgewotCWludCB0YWdnaW5nOwotCVN0cmluZyBzaG9ydE5hbWU7Ci0JU3RyaW5nIG5hbWU7Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFBlcmZvcm1hbmNlVGVzdE9iamVjdChTdHJpbmcgbmFtZSxpbnQgdGFnZ2luZywgU3RyaW5nIHNob3J0bmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnRhZ2dpbmcgPSB0YWdnaW5nOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnNob3J0TmFtZSA9IHNob3J0bmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzaG9ydE5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKSB7Ci0JCXJldHVybiBzaG9ydE5hbWU7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdGFnZ2luZy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFRhZ2dpbmcoKSB7Ci0JCXJldHVybiB0YWdnaW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLnBlcmZvcm1hbmNlL2NvbW1vbi9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9wZXJmb3JtYW5jZS9UZXN0Q2FzZVNBWFBhcnNlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1Rlc3RDYXNlU0FYUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxODllYTAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvY29tbW9uL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL3BlcmZvcm1hbmNlL1Rlc3RDYXNlU0FYUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTm92IDI5LCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0Q2FzZVNBWFBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQlwcml2YXRlIHN0YXRpYyBNYXAgcGVyZm9ybWFuY2VDYXNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0FTRSA9ICJ0ZXN0Q2FzZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTID0gImNsYXNzIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EID0gIm1ldGhvZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1JUX05BTUUgPSAic2hvcnROYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHR0lORyA9ICJ0YWdnaW5nIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX05BTUUgPSAibmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdMT0JBTCA9ICJHTE9CQUwiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NBTCA9ICJMT0NBTCI7Ci0JcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgY3VycmVudENsYXp6ID0gbnVsbDsKLQkKLQotCQotCXB1YmxpYyBNYXAgZG9Mb2FkKEZpbGUgZmlsZSkgewotCQkgcGVyZm9ybWFuY2VDYXNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCSBEZWZhdWx0SGFuZGxlciBoYW5kbGVyID0gbmV3IFRlc3RDYXNlU0FYUGFyc2VyKCk7Ci0JCSBTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCSB0cnkgewotCQkgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCQkgIHNheFBhcnNlci5wYXJzZShmaWxlICwgaGFuZGxlciApOwotCQkgfQotCQkgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJICBTeXN0ZW0uZXJyLnByaW50bG4gKCJGYWlsZWQgdG8gY3JlYXRlIFNBWCBwYXJzZXI6IiArIGV4KTsKLQkJIH0KLQkJIGNhdGNoIChTQVhFeGNlcHRpb24gZXgpIHsKLQkJICBTeXN0ZW0uZXJyLnByaW50bG4gKCJTQVggcGFyc2VyIGV4Y2VlcHRpb246IiArIGV4KTsKLQkJIH0KLQkJIGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkgIFN5c3RlbS5lcnIucHJpbnRsbiAoIklPIGV4ZWNlcHRpb246IiArIGV4KTsKLQkJIH0KLQkJIGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJICBTeXN0ZW0uZXJyLnByaW50bG4gKCJJbnZhbGlkIGZpbGUgYXJndW1lbnQiICsgZXgpOwotCQkgfQotCQkgcmV0dXJuIHBlcmZvcm1hbmNlQ2FzZXM7Ci0JIH0KLQkKLQkgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIAotCSAgU3RyaW5nIHF1YWxpZmllZE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JIAlpZiAocXVhbGlmaWVkTmFtZS5lcXVhbHMoVEVTVF9DQVNFKSkgewotCQkgIGZvciAoaW50IGkgPSAwOyBpPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJICAgIGlmIChhdHRyaWJ1dGVzLmdldFFOYW1lKGkpLmVxdWFsc0lnbm9yZUNhc2UoQ0xBU1MpKSB7Ci0JCSAgICAJdHJ5IHsKLQkJICAgIAkJY3VycmVudENsYXp6ID0gbG9hZENsYXNzKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSkpOwotCQkJCQlpZiAocGVyZm9ybWFuY2VDYXNlcy5nZXQoY3VycmVudENsYXp6KSA9PSBudWxsKSB7Ci0JCQkgICAgCQlBcnJheUxpc3QgbWV0aG9kTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCSAgICAJCXBlcmZvcm1hbmNlQ2FzZXMucHV0KGN1cnJlbnRDbGF6eixtZXRob2RMaXN0KTsKLQkJICAgIAkJfQotCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQljdXJyZW50Q2xhenogPSBudWxsOwotCQkJCQkgU3lzdGVtLmVyci5wcmludGxuICgiRmFpbGVkIHRvIGxvYWQgY2xhc3M6IiArIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSkpOwotCQkJCQkvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkgICAgfSAvLyBlbmQgb2YgaWYKLQkJICB9IC8vIGVuZCBvZiBmb3IKLQkgCX0gLy8gZW5kIG9mIGlmIFRFU1RfQ0FTRQotCSAJZWxzZSBpZiAocXVhbGlmaWVkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1FVEhPRCkpIHsKLQkgCQkgU3RyaW5nIG1ldGhvZE5hbWUgPSBudWxsOwotCSAJCSBpbnQgdGFnZ2luZyA9IDA7Ci0JIAkJIFN0cmluZyBzaG9ydE5hbWUgPSBudWxsOwotCSAJCSAKLQkgCQkgaWYgKGN1cnJlbnRDbGF6eiA9PSBudWxsKSByZXR1cm47Ci0JIAkJIAotCSAJCSBmb3IgKGludCBpID0gMDsgaTwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JIAkJICAgIGlmIChhdHRyaWJ1dGVzLmdldFFOYW1lKGkpLmVxdWFsc0lnbm9yZUNhc2UoTUVUSE9EX05BTUUpKSB7Ci0JIAkJICAgIAltZXRob2ROYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLQkgCQkgICAgfSAKLQkgCQkgICAgZWxzZSBpZiAoYXR0cmlidXRlcy5nZXRRTmFtZShpKS5lcXVhbHNJZ25vcmVDYXNlKFRBR0dJTkcpKXsKLQkgCQkgICAgCWlmIChhdHRyaWJ1dGVzLmdldFZhbHVlKGkpLmVxdWFsc0lnbm9yZUNhc2UoR0xPQkFMKSkgewotCSAJCSAgICAJCXRhZ2dpbmcgPSBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5HTE9CQUw7Ci0JIAkJICAgIAl9IGVsc2UgaWYgKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSkuZXF1YWxzSWdub3JlQ2FzZShMT0NBTCkpIHsKLQkgCQkgICAgCQl0YWdnaW5nID0gUGVyZm9ybWFuY2VUZXN0Q2FzZVdyYXBwZXIuTE9DQUw7Ci0JIAkJICAgIAl9IGVsc2UgewotCSAJCSAgICAJCXRhZ2dpbmcgPSBQZXJmb3JtYW5jZVRlc3RDYXNlV3JhcHBlci5OT05FOwotCSAJCSAgICAJfQotCSAJCSAJfSBlbHNlIGlmKGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSkuZXF1YWxzSWdub3JlQ2FzZShTSE9SVF9OQU1FKSkgewotCSAJCSAJCXNob3J0TmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0JIAkJCX0KLQkgCQkgfSAvLyBlbmQgb2YgZm9yCi0JIAkJIExpc3QgbWV0aG9kTGlzdCA9IChMaXN0KSBwZXJmb3JtYW5jZUNhc2VzLmdldChjdXJyZW50Q2xhenopOwotCSAJCSBtZXRob2RMaXN0LmFkZChuZXcgUGVyZm9ybWFuY2VUZXN0T2JqZWN0KG1ldGhvZE5hbWUsdGFnZ2luZyxzaG9ydE5hbWUpKTsKLQkgCSB9Ci0JIH0KLQotCSBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxdWFsaWZpZWROYW1lKQotCSAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JICAgIGlmIChxdWFsaWZpZWROYW1lLmVxdWFscyhURVNUX0NBU0UpKSB7Ci0JICAJCWN1cnJlbnRDbGF6eiA9IG51bGw7Ci0JICAJfQotCSB9Ci0JIAotCSAvKioKLQkgKiBMb2FkcyB0aGUgdGVzdCBzdWl0ZSBjbGFzcy4KLQkgKi8KLQkgcHJpdmF0ZSBDbGFzcyBsb2FkQ2xhc3MoU3RyaW5nIGNsYXNzTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpIAotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCSB9Ci0JIAotCSAvKioKLQkgKiBUaGUgY2xhc3MgbG9hZGVyIHRvIGJlIHVzZWQgZm9yIGxvYWRpbmcgdGVzdHMuCi0JICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gdXNlIGFub3RoZXIgY2xhc3MgbG9hZGVyLgotCSAqLwotCSBwcm90ZWN0ZWQgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0JCXJldHVybiBCYXNlUGVyZm9ybWFuY2VUZXN0Q2FzZS5nZXRDbGFzc0xvYWRlcigpOwotCSB9Ci0JIAotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMucGVyZm9ybWFuY2UvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNiMWI2YS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZSIKLSAgIG5hbWU9IlBlcmZvcm1hbmNlIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5wZXJmb3JtYW5jZS5QZXJmb3JtYW5jZVBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0icGVyZm9ybWFuY2UuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmp1bml0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyIvPgotICAgPC9yZXF1aXJlcz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU4NmMyNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iajJlZS10ZXN0cy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ3ZWJtb2R1bGUtdGVzdHMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZWpibW9kdWxlLXRlc3RzLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImpjYW1vZHVsZS10ZXN0cy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzYXZlc3RyYXRlZ3ktdGVzdHMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZGVmZWN0LXRlc3RzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLy5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YThjNmUyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotajJlZS10ZXN0cy5qYXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZWM5YzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9EZWZlY3RUZXN0RGF0YS9CZWVuVGhlcmUuZWFyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvRGVmZWN0VGVzdERhdGEvQmVlblRoZXJlLmVhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQyNmZhZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9EZWZlY3RUZXN0RGF0YS9CZWVuVGhlcmUuZWFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvRGVmZWN0VGVzdERhdGEvQ29sbGlzaW9uLmVhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL0RlZmVjdFRlc3REYXRhL0NvbGxpc2lvbi5lYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMTNhMTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvRGVmZWN0VGVzdERhdGEvQ29sbGlzaW9uLmVhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL0RlZmVjdFRlc3REYXRhL0VBUjEyMTE1OC5lYXIvRUFSMTIxMTU4Q2xpZW50LmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL0RlZmVjdFRlc3REYXRhL0VBUjEyMTE1OC5lYXIvRUFSMTIxMTU4Q2xpZW50LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2NjEwMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9EZWZlY3RUZXN0RGF0YS9FQVIxMjExNTguZWFyL0VBUjEyMTE1OENsaWVudC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9EZWZlY3RUZXN0RGF0YS9FQVIxMjExNTguZWFyL0VBUjEyMTE1OENvbm5lY3Rvci5yYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9EZWZlY3RUZXN0RGF0YS9FQVIxMjExNTguZWFyL0VBUjEyMTE1OENvbm5lY3Rvci5yYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YmEyMzQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvRGVmZWN0VGVzdERhdGEvRUFSMTIxMTU4LmVhci9FQVIxMjExNThDb25uZWN0b3IucmFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvRGVmZWN0VGVzdERhdGEvRUFSMTIxMTU4LmVhci9FQVIxMjExNThFSkIuamFyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvRGVmZWN0VGVzdERhdGEvRUFSMTIxMTU4LmVhci9FQVIxMjExNThFSkIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2Q1NjUzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL0RlZmVjdFRlc3REYXRhL0VBUjEyMTE1OC5lYXIvRUFSMTIxMTU4RUpCLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL0RlZmVjdFRlc3REYXRhL0VBUjEyMTE1OC5lYXIvRUFSMTIxMTU4VXRpbC5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9EZWZlY3RUZXN0RGF0YS9FQVIxMjExNTguZWFyL0VBUjEyMTE1OFV0aWwuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVjMzFjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL0RlZmVjdFRlc3REYXRhL0VBUjEyMTE1OC5lYXIvRUFSMTIxMTU4VXRpbC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9EZWZlY3RUZXN0RGF0YS9FQVIxMjExNTguZWFyL0VBUjEyMTE1OFdlYi53YXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9EZWZlY3RUZXN0RGF0YS9FQVIxMjExNTguZWFyL0VBUjEyMTE1OFdlYi53YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhMjY5MzkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvRGVmZWN0VGVzdERhdGEvRUFSMTIxMTU4LmVhci9FQVIxMjExNThXZWIud2FyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvRGVmZWN0VGVzdERhdGEvRUFSMTIxMTU4LmVhci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL0RlZmVjdFRlc3REYXRhL0VBUjEyMTE1OC5lYXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDk5YmMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvRGVmZWN0VGVzdERhdGEvRUFSMTIxMTU4LmVhci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL0RlZmVjdFRlc3REYXRhL0VBUjEyMTE1OC5lYXIvTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvRGVmZWN0VGVzdERhdGEvRUFSMTIxMTU4LmVhci9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MDFkZDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvRGVmZWN0VGVzdERhdGEvRUFSMTIxMTU4LmVhci9NRVRBLUlORi9hcHBsaWNhdGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGFwcGxpY2F0aW9uIGlkPSJBcHBsaWNhdGlvbl9JRCIgdmVyc2lvbj0iMS40IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvYXBwbGljYXRpb25fMV80LnhzZCI+Ci0JPGRpc3BsYXktbmFtZT4KLQlFQVIxMjExNTg8L2Rpc3BsYXktbmFtZT4KLQk8bW9kdWxlIGlkPSJXZWJNb2R1bGVfMTE0NDc4NDkyNTE5NCI+Ci0JCTx3ZWI+Ci0JCQk8d2ViLXVyaT5FQVIxMjExNThXZWIud2FyPC93ZWItdXJpPgotCQkJPGNvbnRleHQtcm9vdD5FQVIxMjExNThXZWI8L2NvbnRleHQtcm9vdD4KLQkJPC93ZWI+Ci0JPC9tb2R1bGU+Ci0JPG1vZHVsZSBpZD0iRWpiTW9kdWxlXzExNDQ3ODQ5MjUyMjQiPgotCQk8ZWpiPkVBUjEyMTE1OEVKQi5qYXI8L2VqYj4KLQk8L21vZHVsZT4KLQk8bW9kdWxlIGlkPSJKYXZhQ2xpZW50TW9kdWxlXzExNDQ3ODQ5MjUyMzQiPgotCQk8amF2YT5FQVIxMjExNThDbGllbnQuamFyPC9qYXZhPgotCTwvbW9kdWxlPgotCTxtb2R1bGUgaWQ9IkNvbm5lY3Rvck1vZHVsZV8xMTQ0Nzg0OTI1MjQ0Ij4KLQkJPGNvbm5lY3Rvcj5FQVIxMjExNThDb25uZWN0b3IucmFyPC9jb25uZWN0b3I+Ci0JPC9tb2R1bGU+Ci08L2FwcGxpY2F0aW9uPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvRGVmZWN0VGVzdERhdGEvRUpCTG9jYWxBbmRSZW1vdGVSZWZFQVJXaXRoQ2xpZW50SmFycy5lYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9EZWZlY3RUZXN0RGF0YS9FSkJMb2NhbEFuZFJlbW90ZVJlZkVBUldpdGhDbGllbnRKYXJzLmVhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5ZjM4NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9EZWZlY3RUZXN0RGF0YS9FSkJMb2NhbEFuZFJlbW90ZVJlZkVBUldpdGhDbGllbnRKYXJzLmVhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL0RlZmVjdFRlc3REYXRhL3NpYi50ZXN0Lm1lZGlhdGlvbnMubTUuSnNNQlIuZWFyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvRGVmZWN0VGVzdERhdGEvc2liLnRlc3QubWVkaWF0aW9ucy5tNS5Kc01CUi5lYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOTc3NmIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvRGVmZWN0VGVzdERhdGEvc2liLnRlc3QubWVkaWF0aW9ucy5tNS5Kc01CUi5lYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwZTcxOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGVtcE91dHB1dApkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvQXBwQ2xpZW50VGVzdHMvMTJBcHBDbGllbnRUZXN0LmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0FwcENsaWVudFRlc3RzLzEyQXBwQ2xpZW50VGVzdC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjY2UxMTIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvQXBwQ2xpZW50VGVzdHMvMTJBcHBDbGllbnRUZXN0LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0FwcENsaWVudFRlc3RzLzEzQXBwQ2xpZW50LmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0FwcENsaWVudFRlc3RzLzEzQXBwQ2xpZW50LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk5NTdjNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9BcHBDbGllbnRUZXN0cy8xM0FwcENsaWVudC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9BcHBDbGllbnRUZXN0cy8xM0FwcENsaWVudFRlc3QuamFyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvQXBwQ2xpZW50VGVzdHMvMTNBcHBDbGllbnRUZXN0LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwY2Y4Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9BcHBDbGllbnRUZXN0cy8xM0FwcENsaWVudFRlc3QuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvQXBwQ2xpZW50VGVzdHMvQXBwQ2xpZW50RXhwVGVzdC5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9BcHBDbGllbnRUZXN0cy9BcHBDbGllbnRFeHBUZXN0LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNjN2VkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9BcHBDbGllbnRUZXN0cy9BcHBDbGllbnRFeHBUZXN0LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0FwcENsaWVudFRlc3RzL0FwcENsaWVudE5vU291cmNlLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0FwcENsaWVudFRlc3RzL0FwcENsaWVudE5vU291cmNlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlN2RmYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9BcHBDbGllbnRUZXN0cy9BcHBDbGllbnROb1NvdXJjZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9BcHBDbGllbnRUZXN0cy9BcHBDbGllbnRTb21lU291cmNlLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0FwcENsaWVudFRlc3RzL0FwcENsaWVudFNvbWVTb3VyY2UuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWY5OGY2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0FwcENsaWVudFRlc3RzL0FwcENsaWVudFNvbWVTb3VyY2UuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvQXBwQ2xpZW50VGVzdHMvQXBwQ2xpZW50U291cmNlLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0FwcENsaWVudFRlc3RzL0FwcENsaWVudFNvdXJjZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYWMzM2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvQXBwQ2xpZW50VGVzdHMvQXBwQ2xpZW50U291cmNlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0JpbmRpbmdzSGVscGVyVGVzdHMvQmluZGluZ3NUZXN0RUFSLmVhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0JpbmRpbmdzSGVscGVyVGVzdHMvQmluZGluZ3NUZXN0RUFSLmVhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JlZGFkYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9CaW5kaW5nc0hlbHBlclRlc3RzL0JpbmRpbmdzVGVzdEVBUi5lYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9EZWZlY3RUZXN0cy9FSkIxMDA0NDFOb0NsaWVudC5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9EZWZlY3RUZXN0cy9FSkIxMDA0NDFOb0NsaWVudC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOTIxYzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvRGVmZWN0VGVzdHMvRUpCMTAwNDQxTm9DbGllbnQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvRUFSSW1wb3J0VGVzdHMvU2ltcGxlRUFSLmVhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0VBUkltcG9ydFRlc3RzL1NpbXBsZUVBUi5lYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZjIzYzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvRUFSSW1wb3J0VGVzdHMvU2ltcGxlRUFSLmVhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0VBUkltcG9ydFRlc3RzL1Rlc3QxMkVKQkVBUi5lYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9FQVJJbXBvcnRUZXN0cy9UZXN0MTJFSkJFQVIuZWFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2M4ZGM5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0VBUkltcG9ydFRlc3RzL1Rlc3QxMkVKQkVBUi5lYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9FQVJJbXBvcnRUZXN0cy9UZXN0MTJXRUJFSkJFQVIuZWFyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvRUFSSW1wb3J0VGVzdHMvVGVzdDEyV0VCRUpCRUFSLmVhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE2ZGEyYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9FQVJJbXBvcnRUZXN0cy9UZXN0MTJXRUJFSkJFQVIuZWFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvRUFSSW1wb3J0VGVzdHMvVGVzdDEzRUpCRUFSLmVhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0VBUkltcG9ydFRlc3RzL1Rlc3QxM0VKQkVBUi5lYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYzdiZWIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvRUFSSW1wb3J0VGVzdHMvVGVzdDEzRUpCRUFSLmVhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0VBUkltcG9ydFRlc3RzL1Rlc3QxM1dFQkVKQkVBUi5lYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9FQVJJbXBvcnRUZXN0cy9UZXN0MTNXRUJFSkJFQVIuZWFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTMyNTA5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0VBUkltcG9ydFRlc3RzL1Rlc3QxM1dFQkVKQkVBUi5lYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9FQVJJbXBvcnRUZXN0cy9UZXN0MTRFSkJFQVIuZWFyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvRUFSSW1wb3J0VGVzdHMvVGVzdDE0RUpCRUFSLmVhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQyMjAyOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9FQVJJbXBvcnRUZXN0cy9UZXN0MTRFSkJFQVIuZWFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvRUFSSW1wb3J0VGVzdHMvVGVzdDE0V0VCRUpCRUFSLmVhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0VBUkltcG9ydFRlc3RzL1Rlc3QxNFdFQkVKQkVBUi5lYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Y2I0OTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvRUFSSW1wb3J0VGVzdHMvVGVzdDE0V0VCRUpCRUFSLmVhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0VBUkltcG9ydFRlc3RzL1Rlc3QxNFdFQkVKQkVBUldpdGhNZXRhRGF0YS5lYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9FQVJJbXBvcnRUZXN0cy9UZXN0MTRXRUJFSkJFQVJXaXRoTWV0YURhdGEuZWFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2I5ODFhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0VBUkltcG9ydFRlc3RzL1Rlc3QxNFdFQkVKQkVBUldpdGhNZXRhRGF0YS5lYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9FQVJJbXBvcnRUZXN0cy9VdGlsaXR5SmFyVGVzdEVBUi5lYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9FQVJJbXBvcnRUZXN0cy9VdGlsaXR5SmFyVGVzdEVBUi5lYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiODMxMDEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvRUFSSW1wb3J0VGVzdHMvVXRpbGl0eUphclRlc3RFQVIuZWFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvRUFSSW1wb3J0VGVzdHMvVXRpbGl0eUphcldlYkxpYldpdGhNZXRhRGF0YUZpbGVzRUFSLmVhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0VBUkltcG9ydFRlc3RzL1V0aWxpdHlKYXJXZWJMaWJXaXRoTWV0YURhdGFGaWxlc0VBUi5lYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZWJiM2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvRUFSSW1wb3J0VGVzdHMvVXRpbGl0eUphcldlYkxpYldpdGhNZXRhRGF0YUZpbGVzRUFSLmVhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0VKQkltcG9ydFRlc3RzL1Rlc3QxM0VKQi5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9FSkJJbXBvcnRUZXN0cy9UZXN0MTNFSkIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTAwMzMyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0VKQkltcG9ydFRlc3RzL1Rlc3QxM0VKQi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9FSkJJbXBvcnRUZXN0cy9UZXN0MTRFSkIuamFyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvRUpCSW1wb3J0VGVzdHMvVGVzdDE0RUpCLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2Zjc1NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9FSkJJbXBvcnRUZXN0cy9UZXN0MTRFSkIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvR2VucmFsQXJ0aWZhY3RUZXN0L0oyRUVBcnRpZmFjdEVkaXRUZXN0UHJvamVjdHMuemlwIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvR2VucmFsQXJ0aWZhY3RUZXN0L0oyRUVBcnRpZmFjdEVkaXRUZXN0UHJvamVjdHMuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGE0Y2YzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0dlbnJhbEFydGlmYWN0VGVzdC9KMkVFQXJ0aWZhY3RFZGl0VGVzdFByb2plY3RzLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0dlbnJhbEFydGlmYWN0VGVzdC9URVNUMF83LnppcCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL0dlbnJhbEFydGlmYWN0VGVzdC9URVNUMF83LnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkzNWI5OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9HZW5yYWxBcnRpZmFjdFRlc3QvVEVTVDBfNy56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9HZW5yYWxBcnRpZmFjdFRlc3QvcGVyZldBUi56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9HZW5yYWxBcnRpZmFjdFRlc3QvcGVyZldBUi56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YzRiMmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvR2VucmFsQXJ0aWZhY3RUZXN0L3BlcmZXQVIuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvUkFSSW1wb3J0VGVzdHMvSkRFQ29ubmVjdG9yLnJhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL1JBUkltcG9ydFRlc3RzL0pERUNvbm5lY3Rvci5yYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZmI4OWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvUkFSSW1wb3J0VGVzdHMvSkRFQ29ubmVjdG9yLnJhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL1NhdmVTdHJhdGVneVRlc3RzL0FwcENsaWVudC56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9TYXZlU3RyYXRlZ3lUZXN0cy9BcHBDbGllbnQuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODE3Mjg3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL1NhdmVTdHJhdGVneVRlc3RzL0FwcENsaWVudC56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9TYXZlU3RyYXRlZ3lUZXN0cy9XYXJJbXBvcnRGbGV4UHJvamVjdC56aXAgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9TYXZlU3RyYXRlZ3lUZXN0cy9XYXJJbXBvcnRGbGV4UHJvamVjdC56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNTE0ODAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvU2F2ZVN0cmF0ZWd5VGVzdHMvV2FySW1wb3J0RmxleFByb2plY3QuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvV0FSSW1wb3J0VGVzdHMvRXhhbXBsZTEud2FyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvV0FSSW1wb3J0VGVzdHMvRXhhbXBsZTEud2FyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzMwYTM4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL1dBUkltcG9ydFRlc3RzL0V4YW1wbGUxLndhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL1dBUkltcG9ydFRlc3RzL1Rlc3QxMldlYi53YXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9XQVJJbXBvcnRUZXN0cy9UZXN0MTJXZWIud2FyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTIyMGIxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL1dBUkltcG9ydFRlc3RzL1Rlc3QxMldlYi53YXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9XQVJJbXBvcnRUZXN0cy9UZXN0MTNXZWIud2FyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvV0FSSW1wb3J0VGVzdHMvVGVzdDEzV2ViLndhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhYTkyNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9XQVJJbXBvcnRUZXN0cy9UZXN0MTNXZWIud2FyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvV0FSSW1wb3J0VGVzdHMvVGVzdDE0V2ViLndhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL1dBUkltcG9ydFRlc3RzL1Rlc3QxNFdlYi53YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYjJhM2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvV0FSSW1wb3J0VGVzdHMvVGVzdDE0V2ViLndhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL1dBUkltcG9ydFRlc3RzL1dlYkNvbnRhaW5lckNsaWVudEFwcC53YXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9XQVJJbXBvcnRUZXN0cy9XZWJDb250YWluZXJDbGllbnRBcHAud2FyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjBhMjE5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL1dBUkltcG9ydFRlc3RzL1dlYkNvbnRhaW5lckNsaWVudEFwcC53YXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9XQVJJbXBvcnRUZXN0cy9XZWJOb1NvdXJjZS53YXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9XQVJJbXBvcnRUZXN0cy9XZWJOb1NvdXJjZS53YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YTc1OTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvV0FSSW1wb3J0VGVzdHMvV2ViTm9Tb3VyY2Uud2FyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvV0FSSW1wb3J0VGVzdHMvV2ViU29tZVNvdXJjZS53YXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9XQVJJbXBvcnRUZXN0cy9XZWJTb21lU291cmNlLndhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzYjAwMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9XQVJJbXBvcnRUZXN0cy9XZWJTb21lU291cmNlLndhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL1dBUkltcG9ydFRlc3RzL1dlYlNvdXJjZS53YXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS9XQVJJbXBvcnRUZXN0cy9XZWJTb3VyY2Uud2FyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjcxYTBlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL1dBUkltcG9ydFRlc3RzL1dlYlNvdXJjZS53YXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS90ZXN0T3V0cHV0LzEyQXBwQ2xpZW50VGVzdF93aXRob3V0U291cmNlLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL3Rlc3RPdXRwdXQvMTJBcHBDbGllbnRUZXN0X3dpdGhvdXRTb3VyY2UuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmQ3ZWVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL3Rlc3RPdXRwdXQvMTJBcHBDbGllbnRUZXN0X3dpdGhvdXRTb3VyY2UuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvdGVzdE91dHB1dC8xM0FwcENsaWVudFRlc3Rfd2l0aG91dFNvdXJjZS5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS90ZXN0T3V0cHV0LzEzQXBwQ2xpZW50VGVzdF93aXRob3V0U291cmNlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA3ZDM3MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS90ZXN0T3V0cHV0LzEzQXBwQ2xpZW50VGVzdF93aXRob3V0U291cmNlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL3Rlc3RPdXRwdXQvMTNBcHBDbGllbnRfd2l0aG91dFNvdXJjZS5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS90ZXN0T3V0cHV0LzEzQXBwQ2xpZW50X3dpdGhvdXRTb3VyY2UuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWY0ZWU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL3Rlc3RPdXRwdXQvMTNBcHBDbGllbnRfd2l0aG91dFNvdXJjZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS90ZXN0T3V0cHV0L0FwcENsaWVudEV4cFRlc3Rfd2l0aG91dFNvdXJjZS5qYXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS90ZXN0T3V0cHV0L0FwcENsaWVudEV4cFRlc3Rfd2l0aG91dFNvdXJjZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNTQwMjUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvdGVzdE91dHB1dC9BcHBDbGllbnRFeHBUZXN0X3dpdGhvdXRTb3VyY2UuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvdGVzdE91dHB1dC9BcHBDbGllbnROb1NvdXJjZV93aXRob3V0U291cmNlLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL3Rlc3RPdXRwdXQvQXBwQ2xpZW50Tm9Tb3VyY2Vfd2l0aG91dFNvdXJjZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMjE2OGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvVGVzdERhdGEvdGVzdE91dHB1dC9BcHBDbGllbnROb1NvdXJjZV93aXRob3V0U291cmNlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL3Rlc3RPdXRwdXQvQXBwQ2xpZW50U29tZVNvdXJjZV93aXRob3V0U291cmNlLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL3Rlc3RPdXRwdXQvQXBwQ2xpZW50U29tZVNvdXJjZV93aXRob3V0U291cmNlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0OGQ1OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS90ZXN0T3V0cHV0L0FwcENsaWVudFNvbWVTb3VyY2Vfd2l0aG91dFNvdXJjZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9UZXN0RGF0YS90ZXN0T3V0cHV0L0FwcENsaWVudFNvdXJjZV93aXRob3V0U291cmNlLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL3Rlc3RPdXRwdXQvQXBwQ2xpZW50U291cmNlX3dpdGhvdXRTb3VyY2UuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjFmMGRkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL1Rlc3REYXRhL3Rlc3RPdXRwdXQvQXBwQ2xpZW50U291cmNlX3dpdGhvdXRTb3VyY2UuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvYWJvdXQuaHRtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzEzNDBmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1zb3VyY2UuajJlZS10ZXN0cy5qYXIgPSBqMmVlLXRlc3RzLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICB3ZWJtb2R1bGUtdGVzdHMvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVqYm1vZHVsZS10ZXN0cy8sXAotICAgICAgICAgICAgICAgICAgICAgICAgamNhbW9kdWxlLXRlc3RzLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZlY3QtdGVzdHMvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVzdHJhdGVneS10ZXN0cy8KLW91dHB1dC5qMmVlLXRlc3RzLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgajJlZS10ZXN0cy5qYXIsXAotICAgICAgICAgICAgICAgVGVzdERhdGEvLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgRGVmZWN0VGVzdERhdGEvCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHRlc3QueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgVGVzdERhdGEvLFwKLSAgICAgICAgICAgICAgIERlZmVjdFRlc3REYXRhLwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvZGVmZWN0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RlZmVjdC90ZXN0cy9EZWZlY3RWZXJpZmljYXRpb25UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvZGVmZWN0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2RlZmVjdC90ZXN0cy9EZWZlY3RWZXJpZmljYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmNmNzk3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2RlZmVjdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kZWZlY3QvdGVzdHMvRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZGVmZWN0LnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkVBUkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuRUFSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Nb2R1bGVGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5SdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRUFSQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLnByb2plY3QuZmFjZXQuSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuQ29tcG9uZW50VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5PcGVyYXRpb25UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlByb2plY3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLnBsdWdpbi5IZWFkbGVzc1Rlc3RzUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHMgZXh0ZW5kcyBPcGVyYXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGdWxsVGVzdERhdGFQYXRoKFN0cmluZyBkYXRhUGF0aCkgewotCQl0cnkgewotCQkJU3RyaW5nIGRlZmVjdFRlc3REYXRhUGF0aCA9ICJEZWZlY3RUZXN0RGF0YSIgKyBmaWxlU2VwICsgZGF0YVBhdGg7Ci0JCQlIZWFkbGVzc1Rlc3RzUGx1Z2luIHBsdWdpbiA9IEhlYWRsZXNzVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQkJaWYgKHBsdWdpbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFByb2plY3RVdGlsaXR5LmdldEZ1bGxGaWxlTmFtZShwbHVnaW4sIGRlZmVjdFRlc3REYXRhUGF0aCk7Ci0JCQl9Ci0JCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyBkZWZlY3RUZXN0RGF0YVBhdGg7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQotCS8qKgotCSAqIFRlc3QgZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjAwMTgKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0MTIwMDE4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoSVdlYkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCAiVGVzdDEyMDAxOCIpOwotCQltb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRVdGlsaXRpZXMuZ2V0Q29tcG9uZW50KCJUZXN0MTIwMDE4Iik7Ci0KLQkJSVZpcnR1YWxGb2xkZXIgZm9sZGVyID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGb2xkZXIoImltcG9ydGVkX2NsYXNzZXMiKTsKLQkJZm9sZGVyLmNyZWF0ZShJUmVzb3VyY2UuTk9ORSwgbnVsbCk7Ci0JCUlQYXRoIGZvbGRlclBhdGggPSBmb2xkZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCi0JCWZpbmFsIElWaXJ0dWFsRm9sZGVyIGpzcmMgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcigiL1dFQi1JTkYvY2xhc3NlcyIpOwotCQlqc3JjLmNyZWF0ZUxpbmsoZm9sZGVyLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKSwgMCwgbnVsbCk7Ci0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCWJvb2xlYW4gZm91bmRJbXBvcnRlZENsYXNzZXMgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aCAmJiAhZm91bmRJbXBvcnRlZENsYXNzZXM7IGkrKykgewotCQkJaWYgKElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSID09IGVudHJpZXNbaV0uZ2V0RW50cnlLaW5kKCkpIHsKLQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihlbnRyaWVzW2ldLmdldFBhdGgoKSwgamF2YVByb2plY3QpOwotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNvbnRhaW5lckVudHJpZXMgPSBjb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29udGFpbmVyRW50cmllcy5sZW5ndGggJiYgIWZvdW5kSW1wb3J0ZWRDbGFzc2VzOyBqKyspIHsKLQkJCQkJSVBhdGggZW50cnlQYXRoID0gY29udGFpbmVyRW50cmllc1tqXS5nZXRQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCQkJZm91bmRJbXBvcnRlZENsYXNzZXMgPSBmb2xkZXJQYXRoLmVxdWFscyhlbnRyeVBhdGgpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCUFzc2VydC5hc3NlcnRUcnVlKGZvdW5kSW1wb3J0ZWRDbGFzc2VzKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA1OTAxCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDEwNTkwMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgZWFyRmlsZU5hbWUgPSBnZXRGdWxsVGVzdERhdGFQYXRoKCJDb2xsaXNpb24uZWFyIik7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgZWFyRmlsZU5hbWUpOwotCQlydW5BbmRWZXJpZnkobW9kZWwpOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlQpOwotCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBjb21wLmdldFJlZmVyZW5jZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlZnMubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA5NDMwCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDEwOTQzMCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgZWFyRmlsZU5hbWUgPSBnZXRGdWxsVGVzdERhdGFQYXRoKCJFSkJMb2NhbEFuZFJlbW90ZVJlZkVBUldpdGhDbGllbnRKYXJzLmVhciIpOwotCQlJRGF0YU1vZGVsIG1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQltb2RlbC5zZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsIGVhckZpbGVOYW1lKTsKLQkJTGlzdCBtb2R1bGVMaXN0ID0gKExpc3QpIG1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlNFTEVDVEVEX01PREVMU19MSVNUKTsKLQotCQlMaXN0IG1vZHVsZXNOZWVkZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJSURhdGFNb2RlbCBhTW9kZWwgPSAoSURhdGFNb2RlbCkgbW9kdWxlTGlzdC5nZXQoaSk7Ci0JCQlPYmplY3QgZmlsZSA9IGFNb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFKTsKLQotCQkJaWYgKGZpbGUgaW5zdGFuY2VvZiBNb2R1bGVGaWxlKSB7Ci0JCQkJTW9kdWxlRmlsZSBtb2R1bGVGaWxlID0gKE1vZHVsZUZpbGUpIGZpbGU7Ci0JCQkJaWYgKG1vZHVsZUZpbGUuaXNFSkJKYXJGaWxlKCkpCi0JCQkJCW1vZHVsZXNOZWVkZWQuYWRkKGFNb2RlbCk7Ci0JCQl9Ci0JCX0KLQkJcnVuQW5kVmVyaWZ5KG1vZGVsKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gKElWaXJ0dWFsQ29tcG9uZW50KSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlQpOwotCQlFQVJBcnRpZmFjdEVkaXQgYXJ0aWZhY3RFZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQkJRUFSRmlsZSBlYXJGaWxlID0gKEVBUkZpbGUpIGFydGlmYWN0RWRpdC5hc0FyY2hpdmUodHJ1ZSk7Ci0JCWVhckZpbGUuZ2V0RUpCUmVmZXJlbmNlcyh0cnVlLCBmYWxzZSk7Ci0JCWFydGlmYWN0RWRpdC5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExMjYzNgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3QxMTI2MzYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY2hlY2tEZXBsb3koIkJlZW5UaGVyZS5lYXIiKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGZvciBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEyODM1Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdDExMjgzNSgpIHRocm93cyBFeGNlcHRpb24gewotCQljaGVja0RlcGxveSgic2liLnRlc3QubWVkaWF0aW9ucy5tNS5Kc01CUi5lYXIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0MTIxMTU4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBlYXJGaWxlTmFtZSA9IGdldEZ1bGxUZXN0RGF0YVBhdGgoIkVBUjEyMTE1OC5lYXIiKTsgLy8kTk9OLU5MUy0xJAotCQlFQVJGaWxlIGVhckZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJQXJjaGl2ZU9wdGlvbnMgb3B0cyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQkJb3B0cy5zZXRJc1JlYWRPbmx5KHRydWUpOwotCQkJZWFyRmlsZSA9IENvbW1vbmFyY2hpdmVGYWN0b3J5LmVJTlNUQU5DRS5vcGVuRUFSRmlsZShvcHRzLCBlYXJGaWxlTmFtZSk7Ci0KLQkJCUxpc3QgbW9kdWxlTGlzdCA9IGVhckZpbGUuZ2V0TW9kdWxlRmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlTGlzdC5zaXplKCk7IGkrKykgewotCQkJCU1vZHVsZUZpbGUgbW9kdWxlID0gKE1vZHVsZUZpbGUpIG1vZHVsZUxpc3QuZ2V0KGkpOwotCQkJCVJ1bnRpbWVDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMgPSBtb2R1bGUuZ2V0RnVsbFJ1bnRpbWVDbGFzc1BhdGgoKTsKLQkJCQlhc3NlcnRFcXVhbHMoMiwgZW50cmllcy5sZW5ndGgpOwotCQkJCWFzc2VydFRydWUoZW50cmllc1swXS50b1N0cmluZygpLmVuZHNXaXRoKG1vZHVsZS5nZXRVUkkoKSkpOwotCQkJCWFzc2VydFRydWUoZW50cmllc1sxXS50b1N0cmluZygpLmVuZHNXaXRoKCJFQVIxMjExNThVdGlsLmphciIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWFyRmlsZSAhPSBudWxsICYmIGVhckZpbGUuaXNPcGVuKCkpIHsKLQkJCQllYXJGaWxlLmNsb3NlKCk7Ci0JCQkJZWFyRmlsZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0RlcGxveShTdHJpbmcgZWFyTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBlYXJGaWxlTmFtZSA9IGdldEZ1bGxUZXN0RGF0YVBhdGgoZWFyTmFtZSk7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgZWFyRmlsZU5hbWUpOwotCi0JCUxpc3QgbW9kdWxlTGlzdCA9IChMaXN0KSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5TRUxFQ1RFRF9NT0RFTFNfTElTVCk7Ci0JCWZvciAoaW50IGkgPSBtb2R1bGVMaXN0LnNpemUoKSAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0JCQlJRGF0YU1vZGVsIGFNb2RlbCA9IChJRGF0YU1vZGVsKSBtb2R1bGVMaXN0LmdldChpKTsKLQkJCU9iamVjdCBmaWxlID0gYU1vZGVsLmdldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEUpOwotCQkJaWYgKGZpbGUgaW5zdGFuY2VvZiBNb2R1bGVGaWxlKSB7Ci0JCQkJTW9kdWxlRmlsZSBtb2R1bGVGaWxlID0gKE1vZHVsZUZpbGUpIGZpbGU7Ci0JCQkJaWYgKG1vZHVsZUZpbGUuaXNXQVJGaWxlKCkpCi0JCQkJCW1vZHVsZUxpc3QucmVtb3ZlKGFNb2RlbCk7Ci0JCQl9Ci0JCX0KLQotCQlydW5BbmRWZXJpZnkobW9kZWwpOwotCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gKElWaXJ0dWFsQ29tcG9uZW50KSBtb2RlbC5nZXRQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlQpOwotCQlFQVJBcnRpZmFjdEVkaXQgZWFyRWRpdCA9IEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXApOwotCQlFQVJGaWxlIGVhckZpbGUgPSAoRUFSRmlsZSkgZWFyRWRpdC5hc0FyY2hpdmUoZmFsc2UpOwotCQllYXJGaWxlLmdldEVKQlJlZmVyZW5jZXModHJ1ZSwgdHJ1ZSk7Ci0JCWVhckZpbGUuZ2V0RUpCUmVmZXJlbmNlcyh0cnVlLCBmYWxzZSk7Ci0JCWVhckZpbGUuZ2V0RUpCUmVmZXJlbmNlcyhmYWxzZSwgdHJ1ZSk7Ci0JCWVhckZpbGUuZ2V0RUpCUmVmZXJlbmNlcyhmYWxzZSwgZmFsc2UpOwotCi0JCVRocmVhZC5zbGVlcCg1MDAwKTsKLQotCQlTdHJpbmcgZWFyT3V0cHV0TmFtZSA9ICJkOlxcdGVtcFxcT3V0cHV0IiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIi5lYXIiOwotCQlJRGF0YU1vZGVsIGV4cG9ydCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFQVJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJZXhwb3J0LnNldFByb3BlcnR5KElFQVJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgY29tcC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpKTsKLQkJZXhwb3J0LnNldFByb3BlcnR5KElFQVJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkFSQ0hJVkVfREVTVElOQVRJT04sIGVhck91dHB1dE5hbWUpOwotCQlydW5BbmRWZXJpZnkoZXhwb3J0KTsKLQotCX0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9kZWZlY3QtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZGVmZWN0L3Rlc3RzL0RlZmVjdFZlcmlmaWNhdGlvblRlc3RzU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2RlZmVjdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kZWZlY3QvdGVzdHMvRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHNTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDE5NTU0Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2RlZmVjdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9kZWZlY3QvdGVzdHMvRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHNTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRlZmVjdC50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuU2ltcGxlVGVzdFN1aXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIERlZmVjdFZlcmlmaWNhdGlvblRlc3RzU3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IERlZmVjdFZlcmlmaWNhdGlvblRlc3RzU3VpdGUoKTsKLQl9Ci0KLQlwdWJsaWMgRGVmZWN0VmVyaWZpY2F0aW9uVGVzdHNTdWl0ZSgpIHsKLQkJc3VwZXIoIkRlZmVjdCBWZXJpZmljYXRpb24gVGVzdHMiKTsKLQkJYWRkVGVzdChuZXcgU2ltcGxlVGVzdFN1aXRlKERlZmVjdFZlcmlmaWNhdGlvblRlc3RzLmNsYXNzKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9lamJtb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvZWpiL29wZXJhdGlvbnMvQWxsVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2VqYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9lamIvb3BlcmF0aW9ucy9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTkxMzIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2VqYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9lamIvb3BlcmF0aW9ucy9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmVqYi5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmhlYWRsZXNzLnRlc3RzLnNhdmVzdHJhdGVneS5FSkJJbXBvcnRPcGVyYXRpb25UZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpewotICAgICAgICByZXR1cm4gbmV3IEFsbFRlc3RzKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBBbGxUZXN0cygpewotICAgICAgICBzdXBlcigiRUpCIFRlc3RzIik7Ci0gICAgICAgIGFkZFRlc3QoRUpCRXhwb3J0T3BlcmF0aW9uVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChFSkJJbXBvcnRPcGVyYXRpb25UZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEVKQlByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3Quc3VpdGUoKSk7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvZWpibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2VqYi9vcGVyYXRpb25zL0VKQkV4cG9ydE9wZXJhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2VqYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9lamIvb3BlcmF0aW9ucy9FSkJFeHBvcnRPcGVyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMTU1MmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvZWpibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2VqYi9vcGVyYXRpb25zL0VKQkV4cG9ydE9wZXJhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA2LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5lamIub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuRUpCSmFyRmlsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmNvbXBvbmVudGNvcmUudXRpbC5FSkJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb2plY3Qub3BlcmF0aW9ucy5FSkJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuaGVhZGxlc3MudGVzdHMuc2F2ZXN0cmF0ZWd5LkVKQkltcG9ydE9wZXJhdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmhlYWRsZXNzLnRlc3RzLnNhdmVzdHJhdGVneS5Nb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRUpCRXhwb3J0T3BlcmF0aW9uVGVzdCBleHRlbmRzIE1vZHVsZUV4cG9ydE9wZXJhdGlvblRlc3RDYXNlIHsgIAotCQotCXB1YmxpYyBFSkJFeHBvcnRPcGVyYXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkgCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShFSkJFeHBvcnRPcGVyYXRpb25UZXN0LmNsYXNzKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZUV4cG9ydE9wZXJhdGlvblRlc3RDYXNlI2dldEV4cG9ydE1vZGVsKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBnZXRNb2RlbEluc3RhbmNlKCkgewotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVKQkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdENhc2UjZ2V0SW1wb3J0VGVzdENhc2UoKQotCSAqLwotCXByb3RlY3RlZCBNb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZSBnZXRJbXBvcnRUZXN0Q2FzZSgpIHsKLQkJcmV0dXJuIG5ldyBFSkJJbXBvcnRPcGVyYXRpb25UZXN0KCIiKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEV4cG9ydChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQsIFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlc3RFeHBvcnQoY29tcG9uZW50LGZpbGVuYW1lKTsKLQkJLy92ZXJpZnkgZWpiIGRkCi0JCXRlc3REREV4cG9ydGVkKGNvbXBvbmVudCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRlc3REREV4cG9ydGVkKElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVKQkFydGlmYWN0RWRpdCBlamJFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVqYkVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yUmVhZChjb21wb25lbnQpOwotCQkJRUpCSmFyRmlsZUltcGwgYXJjaGl2ZSA9IChFSkJKYXJGaWxlSW1wbCkgZWpiRWRpdC5hc0FyY2hpdmUodHJ1ZSk7Ci0JCQl0cnkgewotCQkJUmVzb3VyY2UgcmVzID0gYXJjaGl2ZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoIkVKQiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgbnVsbC4iKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlamJFZGl0ICE9bnVsbCkKLQkJCQllamJFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJUHJvamVjdFtdIGdldEV4cG9ydGFibGVQcm9qZWN0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlJUHJvamVjdFtdIHByb2pzID0gc3VwZXIuZ2V0RXhwb3J0YWJsZVByb2plY3RzKCk7Ci0JCUxpc3QgZmlsdGVyZWRQcm9qcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qcy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2pzW2ldOwotCQkJCi0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQlpZihKMkVFUHJvamVjdFV0aWxpdGllcy5pc0VKQlByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpKQotCQkJCWZpbHRlcmVkUHJvanMuYWRkKHByb2plY3QpOwotCQl9Ci0JCXJldHVybiAoSVByb2plY3RbXSkgZmlsdGVyZWRQcm9qcy50b0FycmF5KG5ldyBJUHJvamVjdFtmaWx0ZXJlZFByb2pzLnNpemUoKV0pOwotCQkKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2VqYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9lamIvb3BlcmF0aW9ucy9FSkJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9lamJtb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvZWpiL29wZXJhdGlvbnMvRUpCUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmIxNWQ3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2VqYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9lamIvb3BlcmF0aW9ucy9FSkJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuZWpiLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvamVjdC5vcGVyYXRpb25zLkVqYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GYWNldERhdGFNb2RlbE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBFSkJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0IGV4dGVuZHMgTW9kdWxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdCB7Ci0KLQkgLyoqCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgRUpCUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShFSkJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdCNnZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwoKQotICAgICAqLwotICAgIHB1YmxpYyBJRGF0YU1vZGVsIGdldENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsKCkgewotICAgIAlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVqYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RGaW5kRmlsZXNVdGlsaXR5KCkgewotICAgIAlJRmlsZSBmaWxlID0gbnVsbDsKLSAgICAJSVJlc291cmNlIGVjbGlwc2VGaWxlID0gbnVsbDsKLSAgICAJdHJ5IHsKLSAgICAJCXRlc3REZWZhdWx0cygpOwotICAgIAkJSVByb2plY3QgcHJvamVjdCA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldEFsbFByb2plY3RzSW5Xb3Jrc3BhY2VPZlR5cGUoSjJFRVByb2plY3RVdGlsaXRpZXMuRUpCKVswXTsKLSAgICAJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXAgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLSAgICAJCXRyeSB7Ci0gICAgCQkJaWYgKCFwcm9qZWN0LmlzU3luY2hyb25pemVkKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSkpCi0gICAgCQkJCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0gICAgCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAJCQlMb2dnZXIuZ2V0TG9nZ2VyKCkubG9nRXJyb3IoZSk7Ci0gICAgCQl9Ci0gICAgCQllY2xpcHNlRmlsZSA9IHByb2plY3QuZmluZE1lbWJlcihuZXcgUGF0aCgiZWpiTW9kdWxlL01FVEEtSU5GL2VqYi1qYXIueG1sIikpOwotICAgIAkJLy9maWxlID0gQ29tcG9uZW50VXRpbGl0aWVzLmZpbmRGaWxlKGNvbXAsIG5ldyBQYXRoKCJNRVRBLUlORi9lamItamFyLnhtbCIpKTsgLy8kTk9OLU5MUy0xJAotICAgIAkJZmlsZSA9IGNvbXAuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUobmV3IFBhdGgoIk1FVEEtSU5GL2VqYi1qYXIueG1sIikpLmdldFVuZGVybHlpbmdGaWxlKCk7IC8vJE5PTi1OTFMtMSQKLSAgICAJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgCX0KLSAgICAJQXNzZXJ0LmFzc2VydFRydWUoZWNsaXBzZUZpbGUgIT0gbnVsbCAmJiBmaWxlICE9IG51bGwgJiYgZmlsZS5leGlzdHMoKSk7Ci0gICAgfQotICAKLSAgICBwdWJsaWMgSURhdGFNb2RlbCBnZXRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFdpdGhFYXIoKSB7Ci0gICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSAgRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVqYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIEZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotICAgICAgICBJRGF0YU1vZGVsIGZhY2V0RE0gPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoSjJFRVByb2plY3RVdGlsaXRpZXMuRUpCKTsKLSAgICAgICAgZmFjZXRETS5zZXRCb29sZWFuUHJvcGVydHkoIElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLCB0cnVlICk7Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9ICAgICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9lamJtb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvZWpiL29wZXJhdGlvbnMvU3RydWN0dXJlRWRpdFN0cmVzc1Rlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2VqYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9lamIvb3BlcmF0aW9ucy9TdHJ1Y3R1cmVFZGl0U3RyZXNzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjI2ZDMxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2VqYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9lamIvb3BlcmF0aW9ucy9TdHJ1Y3R1cmVFZGl0U3RyZXNzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA2LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5lamIub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5lamIucHJvamVjdC5vcGVyYXRpb25zLkVKQkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLkNvbXBvbmVudFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5oZWFkbGVzcy50ZXN0cy5zYXZlc3RyYXRlZ3kuRUpCSW1wb3J0T3BlcmF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuaGVhZGxlc3MudGVzdHMuc2F2ZXN0cmF0ZWd5Lk1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVFeHBvcnRPcGVyYXRpb25UZXN0Q2FzZTsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVFZGl0U3RyZXNzVGVzdCBleHRlbmRzIE1vZHVsZUV4cG9ydE9wZXJhdGlvblRlc3RDYXNlIHsgIAotCQotCXB1YmxpYyBTdHJ1Y3R1cmVFZGl0U3RyZXNzVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JIAotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoU3RydWN0dXJlRWRpdFN0cmVzc1Rlc3QuY2xhc3MpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdENhc2UjZ2V0RXhwb3J0TW9kZWwoKQotCSAqLwotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldE1vZGVsSW5zdGFuY2UoKSB7Ci0JCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRUpCQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVFeHBvcnRPcGVyYXRpb25UZXN0Q2FzZSNnZXRJbXBvcnRUZXN0Q2FzZSgpCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlIGdldEltcG9ydFRlc3RDYXNlKCkgewotCQlyZXR1cm4gbmV3IEVKQkltcG9ydE9wZXJhdGlvblRlc3QoIiIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3RyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgZXhwb3J0RGlyZWN0b3J5ID0gbmV3IEZpbGUoVEVTVFNfT1VUUFVUX1BBVEgpOwotCQlpZiAoZXhwb3J0RGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBjb250ZW50cyA9IGV4cG9ydERpcmVjdG9yeS5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIWNvbnRlbnRzW2ldLmlzRGlyZWN0b3J5KCkpCi0JCQkJCWNvbnRlbnRzW2ldLmRlbGV0ZSgpOwotCQkJfQotCQl9Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBnZXRFeHBvcnRhYmxlUHJvamVjdHMoKTsKLQkJSm9iW10gdGVzdEpvYnMgPSBuZXcgSm9iWzUwMF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdEpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCUpvYiBqb2IgPSBuZXcgSm9iKCJTdHJlc3MgSm9iICIgKyBpKQotCQkgICAgICB7Ci0JCSAgICAgICAgCi0JCSAgICAgICAgcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJICAgICAgICB7Ci0JCSAgICAgICAgICB0cnkKLQkJICAgICAgICAgIHsKLQkJICAgICAgICAgICAgQ29tcG9uZW50VXRpbGl0aWVzLmdldEFsbFdvcmtiZW5jaENvbXBvbmVudHMoKTsKLQkJICAgICAgICAgIH0KLQkJICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLQkJICAgICAgICAgIHsKLQkJICAgICAgICAJICByZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCSAgICAgICAgICB9Ci0JCSAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJICAgICAgICB9Ci0JCSAgICAgIH07Ci0JCQl0ZXN0Sm9ic1tpXSA9IGpvYjsJCi0JCQl9Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgdGVzdEpvYnMubGVuZ3RoOyBqKyspIHsKLQkJCUpvYiBqb2IgPSB0ZXN0Sm9ic1tqXTsKLQkJCWpvYi5zY2hlZHVsZSgpOwotCQl9Ci0JCWZvciAoaW50IGcgPSAwOyBnIDwgMTAwMDAwMDsgZysrKXt9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEV4cG9ydFRlc3RDYXNlcygpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsV2l0aEV4cG9ydFNvdXJjZUZpbGVzV2l0aG91dE92ZXJ3cml0ZUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxXaXRoRXhwb3J0U291cmNlRmlsZXNXaXRoT3ZlcndyaXRlRXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbFdpdGhvdXRFeHBvcnRTb3VyY2VGaWxlc1dpdGhvdXRPdmVyd3JpdGVFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsV2l0aG91dEV4cG9ydFNvdXJjZUZpbGVzV2l0aE92ZXJ3cml0ZUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvZWpibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2VqYi92ZXJpZmllcnMvRUpCRXhwb3J0RGF0YU1vZGVsVmVyaWZpZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2VqYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9lamIvdmVyaWZpZXJzL0VKQkV4cG9ydERhdGFNb2RlbFZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTJmYmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvZWpibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2VqYi92ZXJpZmllcnMvRUpCRXhwb3J0RGF0YU1vZGVsVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5lamIudmVyaWZpZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS52ZXJpZmllcnMuTW9kdWxlRXhwb3J0RGF0YU1vZGVsVmVyaWZpZXI7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRUpCRXhwb3J0RGF0YU1vZGVsVmVyaWZpZXIgZXh0ZW5kcyBNb2R1bGVFeHBvcnREYXRhTW9kZWxWZXJpZmllciB7Ci0gCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9lamJtb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvZWpiL3ZlcmlmaWVycy9FSkJJbXBvcnREYXRhTW9kZWxWZXJpZmllci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvZWpibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2VqYi92ZXJpZmllcnMvRUpCSW1wb3J0RGF0YU1vZGVsVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMxNTcxOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9lamJtb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvZWpiL3ZlcmlmaWVycy9FSkJJbXBvcnREYXRhTW9kZWxWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmVqYi52ZXJpZmllcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLnZlcmlmaWVycy5Nb2R1bGVJbXBvcnREYXRhTW9kZWxWZXJpZmllcjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJJbXBvcnREYXRhTW9kZWxWZXJpZmllciBleHRlbmRzIE1vZHVsZUltcG9ydERhdGFNb2RlbFZlcmlmaWVyIHsKLQkKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvZWpibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2VqYi92ZXJpZmllcnMvRUpCUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2VqYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9lamIvdmVyaWZpZXJzL0VKQlByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYzU2MTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvZWpibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2VqYi92ZXJpZmllcnMvRUpCUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5lamIudmVyaWZpZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRUpCSmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5jb21wb25lbnRjb3JlLnV0aWwuRUpCQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLnZlcmlmaWVycy5Nb2R1bGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxWZXJpZmllcjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtCi0gKiBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRUpCUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIgZXh0ZW5kcyBNb2R1bGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxWZXJpZmllciB7Ci0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLnZlcmlmaWVycy5Nb2R1bGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxWZXJpZmllciN2ZXJpZnlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwoY29tLmlibS5ldG9vbHMuYXBwbGljYXRpb24ub3BlcmF0aW9ucy5KMkVFUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHZlcmlmeVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIE9iamVjdCBrZXkgPSBuZXcgT2JqZWN0KCk7Ci0gICAgICAgIEVKQkFydGlmYWN0RWRpdCBlamJFZGl0ID0gbnVsbDsKLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgT2JqZWN0IGRkID0gbnVsbDsKLSAgICAgICAgICAgIGVqYkVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yUmVhZChQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpKSk7Ci0gICAgICAgICAgICBpZiAoZWpiRWRpdCAhPSBudWxsKQotICAgICAgICAgICAgICAgIGRkID0gKEVKQkphcikgZWpiRWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLSAgICAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKCJEZXBsb3ltZW50IERlc2NyaXB0b3IgTnVsbCIsIGRkKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChlamJFZGl0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgZWpiRWRpdC5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gaWYKLSAgICAgICAgLy8gKGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1RPX0VBUikpCi0gICAgICAgIC8vIHsKLSAgICAgICAgLy8gSVByb2plY3QgZWFyUHJvamVjdCA9Ci0gICAgICAgIC8vIGRhdGFNb2RlbC5nZXRFYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpLmdldFRhcmdldFByb2plY3QoKTsKLSAgICAgICAgLy8gRUFSRWRpdE1vZGVsIGVhciA9IG51bGw7Ci0gICAgICAgIC8vIHRyeSB7Ci0gICAgICAgIC8vIEFzc2VydC5hc3NlcnRUcnVlKCJFQVIgZG9lc24ndCBleGlzdDoiLCBlYXJQcm9qZWN0LmV4aXN0cygpKTsKLSAgICAgICAgLy8gRUFSTmF0dXJlUnVudGltZSBydW50aW1lID0gRUFSTmF0dXJlUnVudGltZS5nZXRSdW50aW1lKGVhclByb2plY3QpOwotICAgICAgICAvLyAvL0VNRldvcmtiZW5jaENvbnRleHQgZW1mV29ya2JlbmNoQ29udGV4dCA9Ci0gICAgICAgIC8vIFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmNyZWF0ZUVNRkNvbnRleHQoZWFyUHJvamVjdCwgbnVsbCk7Ci0gICAgICAgIC8vIGVhciA9IChFQVJFZGl0TW9kZWwpCi0gICAgICAgIC8vIHJ1bnRpbWUuZ2V0RWRpdE1vZGVsRm9yUmVhZChJRUFSTmF0dXJlQ29uc3RhbnRzLkVESVRfTU9ERUxfSUQsIGtleSk7Ci0gICAgICAgIC8vIGVhci5nZXRNb2R1bGVNYXBwaW5nKGRhdGFNb2RlbC5nZXRUYXJnZXRQcm9qZWN0KCkpOwotICAgICAgICAvLyAvL1RPRE8KLSAgICAgICAgLy8gfSBmaW5hbGx5IHsKLSAgICAgICAgLy8gZWFyLnJlbGVhc2VBY2Nlc3Moa2V5KTsKLSAgICAgICAgLy8gfQotICAgICAgICAvLwotICAgICAgICAvLyB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2Fubm90YXRpb25zL3Rlc3RzL0Fubm90YXRpb25Qcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9hbm5vdGF0aW9ucy90ZXN0cy9Bbm5vdGF0aW9uUHJvdmlkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYmM4NTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2Fubm90YXRpb25zL3Rlc3RzL0Fubm90YXRpb25Qcm92aWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLkFubm90YXRpb25zUHJvdmlkZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29yZS5JQW5ub3RhdGlvbnNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEFubm90YXRpb25Qcm92aWRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvblByb3ZpZGVyVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvblByb3ZpZGVyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCSAgICByZXR1cm4gbmV3IFNpbXBsZVRlc3RTdWl0ZShBbm5vdGF0aW9uUHJvdmlkZXJUZXN0LmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25Qcm92aWRlckZyYW1ld29yaygpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0IHByb3ZpZGVycyA9IEFubm90YXRpb25zUHJvdmlkZXJNYW5hZ2VyLklOU1RBTkNFLmdldEFubm90YXRpb25zUHJvdmlkZXJzKCk7Ci0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQlmb3IgKGludCBpPTA7IGk8cHJvdmlkZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlJQW5ub3RhdGlvbnNQcm92aWRlciBwcm92aWRlciA9IChJQW5ub3RhdGlvbnNQcm92aWRlcikgcHJvdmlkZXJzLmdldChpKTsKLQkJCXByb3ZpZGVyLmlzQW5ub3RhdGVkKG51bGwpOwotCQkJcHJvdmlkZXIuZ2V0UHJpbWFyeUFubm90YXRlZENvbXBpbGF0aW9uVW5pdChudWxsKTsKLQkJCXByb3ZpZGVyLmdldFByaW1hcnlUYWdzZXQobnVsbCk7Ci0JCQlzdWNjZXNzID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKHN1Y2Nlc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2Fubm90YXRpb25zL3Rlc3RzL1Rlc3RBbm5vdGF0aW9uUHJvdmlkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2NvbW1vbi9hbm5vdGF0aW9ucy90ZXN0cy9UZXN0QW5ub3RhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTk2OWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvY29tbW9uL2Fubm90YXRpb25zL3Rlc3RzL1Rlc3RBbm5vdGF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb3JlLklBbm5vdGF0aW9uc1Byb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgVGVzdEFubm90YXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIElBbm5vdGF0aW9uc1Byb3ZpZGVyIHsKLQotCXB1YmxpYyBUZXN0QW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGVkKEVPYmplY3QgZU9iamVjdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0UHJpbWFyeUFubm90YXRlZENvbXBpbGF0aW9uVW5pdChFT2JqZWN0IGVPYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5VGFnc2V0KEVPYmplY3QgZU9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYmluZGluZ3NoZWxwZXIvdGVzdHMvQmFyQmluZGluZ3NIZWxwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYmluZGluZ3NoZWxwZXIvdGVzdHMvQmFyQmluZGluZ3NIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmOTAxNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2JpbmRpbmdzaGVscGVyL3Rlc3RzL0JhckJpbmRpbmdzSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYmluZGluZ3NoZWxwZXIudGVzdHM7Ci0KLXB1YmxpYyBjbGFzcyBCYXJCaW5kaW5nc0hlbHBlciBleHRlbmRzIFRlc3RCaW5kaW5nc0hlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZSgpewotCQlyZXR1cm4gImJhci50eHQiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ3NGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldEZpbGVOYW1lKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9iaW5kaW5nc2hlbHBlci90ZXN0cy9CaW5kaW5nc0hlbHBlclRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYmluZGluZ3NoZWxwZXIvdGVzdHMvQmluZGluZ3NIZWxwZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNjlhYTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9iaW5kaW5nc2hlbHBlci90ZXN0cy9CaW5kaW5nc0hlbHBlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYmluZGluZ3NoZWxwZXIudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZUVudlJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUmVzb3VyY2VSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlNlY3VyaXR5Um9sZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkVKQkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuV0FSRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLnV0aWwuRUFSQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUuaW50ZXJuYWwuYmluZGluZ3MuSUpORElCaW5kaW5nc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlLmludGVybmFsLmJpbmRpbmdzLkpORElCaW5kaW5nc0hlbHBlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkNvbnRhaW5lck1hbmFnZWRFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuUHJvamVjdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMucGx1Z2luLkhlYWRsZXNzVGVzdHNQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBCaW5kaW5nc0hlbHBlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGdWxsVGVzdERhdGFQYXRoKFN0cmluZyBkYXRhUGF0aCkgewotCQl0cnkgewotCQkJU3RyaW5nIGRlZmVjdFRlc3REYXRhUGF0aCA9ICJUZXN0RGF0YSIgKyBmaWxlU2VwICsgIkJpbmRpbmdzSGVscGVyVGVzdHMiICsgZmlsZVNlcCArIGRhdGFQYXRoOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUhlYWRsZXNzVGVzdHNQbHVnaW4gcGx1Z2luID0gSGVhZGxlc3NUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gUHJvamVjdFV0aWxpdHkuZ2V0RnVsbEZpbGVOYW1lKHBsdWdpbiwgZGVmZWN0VGVzdERhdGFQYXRoKTsKLQkJCX0KLQkJCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArIGRlZmVjdFRlc3REYXRhUGF0aDsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0IGVhclByb2plY3Q7Ci0JcHJpdmF0ZSBJVmlydHVhbENvbXBvbmVudCBlYXJDb21wb25lbnQ7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlJRGF0YU1vZGVsIG1vZGVsID0gaW1wb3J0RWFyKGdldEZ1bGxUZXN0RGF0YVBhdGgoIkJpbmRpbmdzVGVzdEVBUi5lYXIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZWFyUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpKTsKLQkJZWFyQ29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWFyUHJvamVjdCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVBUkZpbGUgZ2V0RWFyRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlFQVJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoZWFyUHJvamVjdCk7Ci0JCQlyZXR1cm4gKEVBUkZpbGUpIGVkaXQuYXNBcmNoaXZlKHRydWUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG51bGwgIT0gZWRpdCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRGF0YU1vZGVsIGltcG9ydEVhcihTdHJpbmcgZWFyUGF0aCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KElFQVJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgZWFyUGF0aCk7Ci0JCW1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFByb2plY3RVdGlsaXRpZXMuZ2V0QWxsUHJvamVjdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJcHJvamVjdHNbaV0uZGVsZXRlKHRydWUsIG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJ0ZXN0LnR4dCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGVscGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBGaXJzdCBjaGVjayB0aGUgZGVmYXVsdCBoZWxwZXI7IGkuZS4gbm8gaGVscGVycyBlbmFibGVkCi0JCUlKTkRJQmluZGluZ3NIZWxwZXJbXSBoZWxwZXJzID0gY2hlY2tIZWxwZXIobnVsbCk7Ci0JCWNoZWNrQmluZGluZ3MoZ2V0RWFyRmlsZSgpLCBoZWxwZXJzWzBdLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBOb3cgY2hlY2sgZm9vSGVscGVyIChiYXJIZWxwZXIgZGlzYWJsZWQpCi0JCUlGaWxlIHNyY0ZpbGUgPSBlYXJDb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUoZ2V0U291cmNlRmlsZU5hbWUoKSkuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJSUZpbGUgZm9vRmlsZSA9IGVhckNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShGb29CaW5kaW5nc0hlbHBlci5nZXRGaWxlTmFtZSgpKS5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCQlzcmNGaWxlLmNvcHkobmV3IFBhdGgoZm9vRmlsZS5nZXRGdWxsUGF0aCgpLmxhc3RTZWdtZW50KCkpLCB0cnVlLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShmb29GaWxlLmV4aXN0cygpKTsKLQotCQloZWxwZXJzID0gY2hlY2tIZWxwZXIoRm9vQmluZGluZ3NIZWxwZXIuY2xhc3MpOwotCQljaGVja0JpbmRpbmdzKGdldEVhckZpbGUoKSwgaGVscGVyc1swXSwgRm9vQmluZGluZ3NIZWxwZXIuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gTm93IGNoZWNrIGJhckhlbHBlciAoZm9vSGVscGVyIGRpc2FibGVkKQotCQlmb29GaWxlLmRlbGV0ZSh0cnVlLCBudWxsKTsKLQkJYXNzZXJ0RmFsc2UoZm9vRmlsZS5leGlzdHMoKSk7Ci0KLQkJSUZpbGUgYmFyRmlsZSA9IGVhckNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0RmlsZShCYXJCaW5kaW5nc0hlbHBlci5nZXRGaWxlTmFtZSgpKS5nZXRVbmRlcmx5aW5nRmlsZSgpOwotCQlzcmNGaWxlLmNvcHkobmV3IFBhdGgoYmFyRmlsZS5nZXRGdWxsUGF0aCgpLmxhc3RTZWdtZW50KCkpLCB0cnVlLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShiYXJGaWxlLmV4aXN0cygpKTsKLQotCQloZWxwZXJzID0gY2hlY2tIZWxwZXIoQmFyQmluZGluZ3NIZWxwZXIuY2xhc3MpOwotCQljaGVja0JpbmRpbmdzKGdldEVhckZpbGUoKSwgaGVscGVyc1swXSwgQmFyQmluZGluZ3NIZWxwZXIuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gTm93IGNoZWNrIGJvdGggZm9vSGVscGVyIGFuZCBiYXJIZWxwZXIgKGJvdGggZW5hYmxlZCkKLQkJc3JjRmlsZS5jb3B5KG5ldyBQYXRoKGZvb0ZpbGUuZ2V0RnVsbFBhdGgoKS5sYXN0U2VnbWVudCgpKSwgdHJ1ZSwgbnVsbCk7Ci0JCWFzc2VydFRydWUoZm9vRmlsZS5leGlzdHMoKSk7Ci0KLQkJaGVscGVycyA9IEpORElCaW5kaW5nc0hlbHBlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRCaW5kaW5nc0hlbHBlcnMoZWFyUHJvamVjdCk7Ci0JCWFzc2VydEVxdWFscygyLCBoZWxwZXJzLmxlbmd0aCk7Ci0JCWludCBmb29JbmRleCA9IChoZWxwZXJzWzBdLmdldENsYXNzKCkgPT0gRm9vQmluZGluZ3NIZWxwZXIuY2xhc3MpID8gMCA6IDE7Ci0JCWludCBiYXJJbmRleCA9IChmb29JbmRleCA9PSAwKSA/IDEgOiAwOwotCQlhc3NlcnRUcnVlKGhlbHBlcnNbZm9vSW5kZXhdLmdldENsYXNzKCkgPT0gRm9vQmluZGluZ3NIZWxwZXIuY2xhc3MpOwotCQlhc3NlcnRUcnVlKGhlbHBlcnNbYmFySW5kZXhdLmdldENsYXNzKCkgPT0gQmFyQmluZGluZ3NIZWxwZXIuY2xhc3MpOwotCQlFQVJGaWxlIGVhckZpbGUgPSBnZXRFYXJGaWxlKCk7Ci0JCUlKTkRJQmluZGluZ3NIZWxwZXJbXSB0ZW1wSGVscGVycyA9IEpORElCaW5kaW5nc0hlbHBlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRCaW5kaW5nc0hlbHBlcnMoZWFyRmlsZSk7Ci0JCWFzc2VydEVxdWFscygyLCB0ZW1wSGVscGVycy5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKGhlbHBlcnNbMF0gPT0gdGVtcEhlbHBlcnNbMF0pOwotCQlhc3NlcnRUcnVlKGhlbHBlcnNbMV0gPT0gdGVtcEhlbHBlcnNbMV0pOwotCi0JCWNoZWNrQmluZGluZ3MoZ2V0RWFyRmlsZSgpLCBoZWxwZXJzW2Zvb0luZGV4XSwgRm9vQmluZGluZ3NIZWxwZXIuZ2V0RmlsZU5hbWUoKSk7Ci0JCWNoZWNrQmluZGluZ3MoZ2V0RWFyRmlsZSgpLCBoZWxwZXJzW2JhckluZGV4XSwgQmFyQmluZGluZ3NIZWxwZXIuZ2V0RmlsZU5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJSk5ESUJpbmRpbmdzSGVscGVyW10gY2hlY2tIZWxwZXIoQ2xhc3MgY2xhenopIHRocm93cyBFeGNlcHRpb24gewotCQlJSk5ESUJpbmRpbmdzSGVscGVyW10gaGVscGVycyA9IEpORElCaW5kaW5nc0hlbHBlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRCaW5kaW5nc0hlbHBlcnMoZWFyUHJvamVjdCk7Ci0JCWFzc2VydEVxdWFscygxLCBoZWxwZXJzLmxlbmd0aCk7Ci0JCWlmIChudWxsICE9IGNsYXp6KSB7Ci0JCQlhc3NlcnRUcnVlKGhlbHBlcnNbMF0uZ2V0Q2xhc3MoKSA9PSBjbGF6eik7Ci0JCX0gZWxzZSB7Ci0JCQlhc3NlcnRUcnVlKGhlbHBlcnNbMF0uZ2V0Q2xhc3MoKSAhPSBGb29CaW5kaW5nc0hlbHBlci5jbGFzcyk7Ci0JCQlhc3NlcnRUcnVlKGhlbHBlcnNbMF0uZ2V0Q2xhc3MoKSAhPSBCYXJCaW5kaW5nc0hlbHBlci5jbGFzcyk7Ci0JCX0KLQkJRUFSRmlsZSBlYXJGaWxlID0gZ2V0RWFyRmlsZSgpOwotCQlJSk5ESUJpbmRpbmdzSGVscGVyW10gdGVtcEhlbHBlcnMgPSBKTkRJQmluZGluZ3NIZWxwZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QmluZGluZ3NIZWxwZXJzKGVhckZpbGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGVtcEhlbHBlcnMubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShoZWxwZXJzWzBdID09IHRlbXBIZWxwZXJzWzBdKTsKLQkJcmV0dXJuIGhlbHBlcnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQmluZGluZ3MoRUFSRmlsZSBlYXJGaWxlLCBJSk5ESUJpbmRpbmdzSGVscGVyIGhlbHBlciwgU3RyaW5nIHByZWZpeCkgewotCQlMaXN0IGVqYkphckZpbGVzID0gZWFyRmlsZS5nZXRFSkJKYXJGaWxlcygpOwotCQlFSkJKYXJGaWxlIGVqYkphckZpbGUgPSAoRUpCSmFyRmlsZSkgZWpiSmFyRmlsZXMuZ2V0KDApOwotCQlFSkJKYXIgZWpiSmFyID0gZWpiSmFyRmlsZS5nZXREZXBsb3ltZW50RGVzY3JpcHRvcigpOwotCi0JCUxpc3QgY21wcyA9IGVqYkphci5nZXRDb250YWluZXJNYW5hZ2VkQmVhbnMoKTsKLQkJQ29udGFpbmVyTWFuYWdlZEVudGl0eSBjbXAgPSAoQ29udGFpbmVyTWFuYWdlZEVudGl0eSkgY21wcy5nZXQoMCk7Ci0JCVN0cmluZyBqbmRpTmFtZSA9IGhlbHBlci5nZXRKTkRJTmFtZShjbXApOwotCQlTdHJpbmcgc3VmZml4ID0gcHJlZml4Lmxlbmd0aCgpID4gMCA/IFRlc3RCaW5kaW5nc0hlbHBlci5FSkIgOiBwcmVmaXg7Ci0JCWFzc2VydEVxdWFscyhwcmVmaXggKyBjbXAuZ2V0TmFtZSgpICsgc3VmZml4LCBqbmRpTmFtZSk7Ci0KLQkJam5kaU5hbWUgPSBoZWxwZXIuZ2V0Sk5ESU5hbWVGb3JEZWZhdWx0RGF0YVNvdXJjZShjbXApOwotCQlzdWZmaXggPSBwcmVmaXgubGVuZ3RoKCkgPiAwID8gVGVzdEJpbmRpbmdzSGVscGVyLkNNUCA6IHByZWZpeDsKLQkJYXNzZXJ0RXF1YWxzKHByZWZpeCArIGVqYkphci5nZXREaXNwbGF5TmFtZSgpICsgc3VmZml4LCBqbmRpTmFtZSk7Ci0KLQkJTGlzdCBzZXNzaW9ucyA9IGVqYkphci5nZXRTZXNzaW9uQmVhbnMoKTsKLQotCQlTZXNzaW9uIHNlc3Npb24gPSAoU2Vzc2lvbikgc2Vzc2lvbnMuZ2V0KDApOwotCQkvLyBUT0RPCi0JCS8vIExpc3QgZWpiUmVmcyA9IHNlc3Npb24uZ2V0RWpiUmVmcygpOwotCQkvLyBFamJSZWYgZWpiUmVmID0gKEVqYlJlZikgZWpiUmVmcy5nZXQoMCk7Ci0KLQkJTGlzdCByZXNSZWZzID0gc2Vzc2lvbi5nZXRSZXNvdXJjZVJlZnMoKTsKLQkJUmVzb3VyY2VSZWYgcmVzUmVmID0gKFJlc291cmNlUmVmKSByZXNSZWZzLmdldCgwKTsKLQkJam5kaU5hbWUgPSBoZWxwZXIuZ2V0Sk5ESU5hbWVGb3JSZWYoc2Vzc2lvbiwgcmVzUmVmKTsKLQkJc3VmZml4ID0gcHJlZml4Lmxlbmd0aCgpID4gMCA/IFRlc3RCaW5kaW5nc0hlbHBlci5FSkJfUkVTX1JFRiA6IHByZWZpeDsKLQkJYXNzZXJ0RXF1YWxzKHByZWZpeCArIHJlc1JlZi5nZXROYW1lKCkgKyBzdWZmaXgsIGpuZGlOYW1lKTsKLQotCQlMaXN0IHJlc0VudlJlZnMgPSBzZXNzaW9uLmdldFJlc291cmNlRW52UmVmcygpOwotCQlSZXNvdXJjZUVudlJlZiByZXNFbnZSZWYgPSAoUmVzb3VyY2VFbnZSZWYpIHJlc0VudlJlZnMuZ2V0KDApOwotCQlqbmRpTmFtZSA9IGhlbHBlci5nZXRKTkRJTmFtZUZvclJlZihzZXNzaW9uLCByZXNFbnZSZWYpOwotCQlzdWZmaXggPSBwcmVmaXgubGVuZ3RoKCkgPiAwID8gVGVzdEJpbmRpbmdzSGVscGVyLkVKQl9SRVNfRU5WX1JFRiA6IHByZWZpeDsKLQkJYXNzZXJ0RXF1YWxzKHByZWZpeCArIHJlc0VudlJlZi5nZXROYW1lKCkgKyBzdWZmaXgsIGpuZGlOYW1lKTsKLQotCQlMaXN0IHNlY3VyaXR5Um9sZVJlZnMgPSBzZXNzaW9uLmdldFNlY3VyaXR5Um9sZVJlZnMoKTsKLQkJU2VjdXJpdHlSb2xlUmVmIHNlY3VyaXR5Um9sZVJlZiA9IChTZWN1cml0eVJvbGVSZWYpIHNlY3VyaXR5Um9sZVJlZnMuZ2V0KDApOwotCQlqbmRpTmFtZSA9IGhlbHBlci5nZXRKTkRJTmFtZUZvclJlZihzZXNzaW9uLCBzZWN1cml0eVJvbGVSZWYpOwotCQlzdWZmaXggPSBwcmVmaXgubGVuZ3RoKCkgPiAwID8gVGVzdEJpbmRpbmdzSGVscGVyLkVKQl9TRUNfUk9MRV9SRUYgOiBwcmVmaXg7Ci0JCWFzc2VydEVxdWFscyhwcmVmaXggKyBzZWN1cml0eVJvbGVSZWYuZ2V0TmFtZSgpICsgc3VmZml4LCBqbmRpTmFtZSk7Ci0KLQkJTGlzdCB3YXJGaWxlcyA9IGVhckZpbGUuZ2V0V0FSRmlsZXMoKTsKLQkJV0FSRmlsZSB3YXJGaWxlID0gKFdBUkZpbGUpIHdhckZpbGVzLmdldCgwKTsKLQkJV2ViQXBwIHdlYkFwcCA9IHdhckZpbGUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3IoKTsKLQotCQlyZXNSZWZzID0gd2ViQXBwLmdldFJlc291cmNlUmVmcygpOwotCQlyZXNSZWYgPSAoUmVzb3VyY2VSZWYpIHJlc1JlZnMuZ2V0KDApOwotCQlqbmRpTmFtZSA9IGhlbHBlci5nZXRKTkRJTmFtZUZvclJlZih3ZWJBcHAsIHJlc1JlZik7Ci0JCXN1ZmZpeCA9IHByZWZpeC5sZW5ndGgoKSA+IDAgPyBUZXN0QmluZGluZ3NIZWxwZXIuV0VCX1JFU19SRUYgOiBwcmVmaXg7Ci0JCWFzc2VydEVxdWFscyhwcmVmaXggKyByZXNSZWYuZ2V0TmFtZSgpICsgc3VmZml4LCBqbmRpTmFtZSk7Ci0KLQkJcmVzRW52UmVmcyA9IHNlc3Npb24uZ2V0UmVzb3VyY2VFbnZSZWZzKCk7Ci0JCXJlc0VudlJlZiA9IChSZXNvdXJjZUVudlJlZikgcmVzRW52UmVmcy5nZXQoMCk7Ci0JCWpuZGlOYW1lID0gaGVscGVyLmdldEpORElOYW1lRm9yUmVmKHdlYkFwcCwgcmVzRW52UmVmKTsKLQkJc3VmZml4ID0gcHJlZml4Lmxlbmd0aCgpID4gMCA/IFRlc3RCaW5kaW5nc0hlbHBlci5XRUJfUkVTX0VOVl9SRUYgOiBwcmVmaXg7Ci0JCWFzc2VydEVxdWFscyhwcmVmaXggKyByZXNFbnZSZWYuZ2V0TmFtZSgpICsgc3VmZml4LCBqbmRpTmFtZSk7Ci0KLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYmluZGluZ3NoZWxwZXIvdGVzdHMvRm9vQmluZGluZ3NIZWxwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYmluZGluZ3NoZWxwZXIvdGVzdHMvRm9vQmluZGluZ3NIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTliMThkNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2JpbmRpbmdzaGVscGVyL3Rlc3RzL0Zvb0JpbmRpbmdzSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuYmluZGluZ3NoZWxwZXIudGVzdHM7Ci0KLXB1YmxpYyBjbGFzcyBGb29CaW5kaW5nc0hlbHBlciBleHRlbmRzIFRlc3RCaW5kaW5nc0hlbHBlciB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGaWxlTmFtZSgpewotCQlyZXR1cm4gImZvby50eHQiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZ3NGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldEZpbGVOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9iaW5kaW5nc2hlbHBlci90ZXN0cy9UZXN0QmluZGluZ3NIZWxwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvYmluZGluZ3NoZWxwZXIvdGVzdHMvVGVzdEJpbmRpbmdzSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNmVjYzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9iaW5kaW5nc2hlbHBlci90ZXN0cy9UZXN0QmluZGluZ3NIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5iaW5kaW5nc2hlbHBlci50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uLlJlc291cmNlRW52UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbi5SZXNvdXJjZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uU2VjdXJpdHlSb2xlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5pbnRlcm5hbC5iaW5kaW5ncy5BYnN0cmFjdEpORElCaW5kaW5nc0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuQ29udGFpbmVyTWFuYWdlZEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuRW50ZXJwcmlzZUJlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0QmluZGluZ3NIZWxwZXIgZXh0ZW5kcyBBYnN0cmFjdEpORElCaW5kaW5nc0hlbHBlciB7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEJpbmRpbmdzRmlsZU5hbWUoKTsKLQotCXB1YmxpYyBib29sZWFuIGFwcGxpZXNGb3IoSVByb2plY3QgcHJvamVjdCkgewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJaWYgKG51bGwgPT0gY29tcG9uZW50KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSUZpbGUgYmluZGluZ3NGaWxlID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGaWxlKGdldEJpbmRpbmdzRmlsZU5hbWUoKSkuZ2V0VW5kZXJseWluZ0ZpbGUoKTsKLQkJcmV0dXJuIGJpbmRpbmdzRmlsZS5leGlzdHMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhcHBsaWVzRm9yKEFyY2hpdmUgYXJjaGl2ZSkgewotCQl0cnkgewotCQkJYXJjaGl2ZS5nZXRGaWxlKGdldEJpbmRpbmdzRmlsZU5hbWUoKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9CSiA9ICJvYmoiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkIgPSAiZWpiIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX1JFU19SRUYgPSAiZWpiUmVzUmVmIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX1JFU19FTlZfUkVGID0gImVqYlJlc0VudlJlZiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9TRUNfUk9MRV9SRUYgPSAiZWpiU2VjUm9sZVJlZiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9SRVNfUkVGID0gIndlYlJlc1JlZiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9SRVNfRU5WX1JFRiA9ICJ3ZWJSZXNFbnZSZWYiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTVAgPSAiY21wIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGdldEJpbmRpbmdzRmlsZU5hbWUoKSArIHN1cGVyLmdldEpORElOYW1lKG9iamVjdCkgKyBPQko7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKTkRJTmFtZShFbnRlcnByaXNlQmVhbiBiZWFuKSB7Ci0JCXJldHVybiBnZXRCaW5kaW5nc0ZpbGVOYW1lKCkgKyBzdXBlci5nZXRKTkRJTmFtZShiZWFuKSArIEVKQjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lRm9yUmVmKEVudGVycHJpc2VCZWFuIGJlYW4sIFJlc291cmNlUmVmIHJlc291cmNlUmVmKSB7Ci0JCXJldHVybiBnZXRCaW5kaW5nc0ZpbGVOYW1lKCkgKyBzdXBlci5nZXRKTkRJTmFtZUZvclJlZihiZWFuLCByZXNvdXJjZVJlZikgKyBFSkJfUkVTX1JFRjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lRm9yUmVmKEVudGVycHJpc2VCZWFuIGJlYW4sIFJlc291cmNlRW52UmVmIHJlc291cmNlRW52UmVmKSB7Ci0JCXJldHVybiBnZXRCaW5kaW5nc0ZpbGVOYW1lKCkgKyBzdXBlci5nZXRKTkRJTmFtZUZvclJlZihiZWFuLCByZXNvdXJjZUVudlJlZikgKyBFSkJfUkVTX0VOVl9SRUY7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKTkRJTmFtZUZvclJlZihFbnRlcnByaXNlQmVhbiBiZWFuLCBTZWN1cml0eVJvbGVSZWYgc2VjdXJpdHlSb2xlUmVmKSB7Ci0JCXJldHVybiBnZXRCaW5kaW5nc0ZpbGVOYW1lKCkgKyBzdXBlci5nZXRKTkRJTmFtZUZvclJlZihiZWFuLCBzZWN1cml0eVJvbGVSZWYpICsgRUpCX1NFQ19ST0xFX1JFRjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEpORElOYW1lRm9yUmVmKFdlYkFwcCB3ZWJBcHAsIFJlc291cmNlUmVmIHJlc291cmNlUmVmKSB7Ci0JCXJldHVybiBnZXRCaW5kaW5nc0ZpbGVOYW1lKCkgKyBzdXBlci5nZXRKTkRJTmFtZUZvclJlZih3ZWJBcHAsIHJlc291cmNlUmVmKSArIFdFQl9SRVNfUkVGOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWVGb3JSZWYoV2ViQXBwIHdlYkFwcCwgUmVzb3VyY2VFbnZSZWYgcmVzb3VyY2VFbnZSZWYpIHsKLQkJcmV0dXJuIGdldEJpbmRpbmdzRmlsZU5hbWUoKSArIHN1cGVyLmdldEpORElOYW1lRm9yUmVmKHdlYkFwcCwgcmVzb3VyY2VFbnZSZWYpICsgV0VCX1JFU19FTlZfUkVGOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Sk5ESU5hbWVGb3JEZWZhdWx0RGF0YVNvdXJjZShDb250YWluZXJNYW5hZ2VkRW50aXR5IGJlYW4pIHsKLQkJcmV0dXJuIGdldEJpbmRpbmdzRmlsZU5hbWUoKSArIHN1cGVyLmdldEpORElOYW1lRm9yRGVmYXVsdERhdGFTb3VyY2UoYmVhbikgKyBDTVA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9BcHBDbGllbnRBcnRpZmFjdEVkaXRGVlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9hcGl0ZXN0cy9hcnRpZmFjdGVkaXQvQXBwQ2xpZW50QXJ0aWZhY3RFZGl0RlZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczN2ZkZWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9BcHBDbGllbnRBcnRpZmFjdEVkaXRGVlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmZsZXhpYmxlLnByb2plY3QuYXBpdGVzdHMuYXJ0aWZhY3RlZGl0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuY29tcG9uZW50Y29yZS51dGlsLkFwcENsaWVudEFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIEFwcENsaWVudEFydGlmYWN0RWRpdEZWVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgSVByb2plY3QgYXBwQ2xpZW50UHJvamVjdDsKLQlwcml2YXRlIFN0cmluZyBhcHBDbGllbnRNb2R1bGVOYW1lOwotCQotCi0JcHVibGljIEFwcENsaWVudEFydGlmYWN0RWRpdEZWVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKFRlc3RXb3Jrc3BhY2UuaW5pdCgpKSB7Ci0JCQlhcHBDbGllbnRQcm9qZWN0ID0gVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KFRlc3RXb3Jrc3BhY2UuQVBQX0NMSUVOVF9QUk9KRUNUX05BTUUpOwotCQkJYXBwQ2xpZW50TW9kdWxlTmFtZSA9IFRlc3RXb3Jrc3BhY2UuQVBQX0NMSUVOVF9NT0RVTEVfTkFNRTsKLQkJfSBlbHNlIHsKLQkJCWZhaWwoKTsKLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0aW9uRGlzcG9zZUZ1bmN0aW9uKCkgewotCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvcldyaXRlKGFwcENsaWVudFByb2plY3QpOwotCQkJZWRpdC5hZGRMaXN0ZW5lcihuZXcgRWRpdE1vZGVsTGlzdGVuZXIoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJCQkJcGFzcygpOwotCi0JCQkJfQotCQkJfSk7Ci0JCQlBcHBsaWNhdGlvbkNsaWVudCBjbGllbnQgPSBlZGl0LmdldEFwcGxpY2F0aW9uQ2xpZW50KCk7Ci0JCQl1cGRhdGVDbGllbnQoY2xpZW50KTsKLQkJCWVkaXQuc2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNsaWVudChBcHBsaWNhdGlvbkNsaWVudCBjbGllbnQpIHsKLQkJY2xpZW50LnNldERlc2NyaXB0aW9uKFRlc3RXb3Jrc3BhY2UuRlZUX0RFU0NSSVBUSU9OKTsKLQkJY2xpZW50LnNldERpc3BsYXlOYW1lKFRlc3RXb3Jrc3BhY2UuRlZUX0RJU1BMQVlfTkFNRSk7Ci0JCWNsaWVudC5zZXRMYXJnZUljb24oVGVzdFdvcmtzcGFjZS5GVlRfTEFSR0VfSUNPTik7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFzcygpIHsKLQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyc2lzdGVuY2VGdW5jdGlvbigpIHsKLQkJQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEFwcENsaWVudEFydGlmYWN0RWRpdC5nZXRBcHBDbGllbnRBcnRpZmFjdEVkaXRGb3JXcml0ZShhcHBDbGllbnRQcm9qZWN0KTsKLQkJCUFwcGxpY2F0aW9uQ2xpZW50IGFwcENsaWVudCA9IGVkaXQuZ2V0QXBwbGljYXRpb25DbGllbnQoKTsKLQkJCXBhc3MoYXBwQ2xpZW50KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFzcyhBcHBsaWNhdGlvbkNsaWVudCBhcHBDbGllbnQpIHsKLQkJYm9vbGVhbiBwYXNzID0gYXBwQ2xpZW50LmdldERlc2NyaXB0aW9uKCkuZXF1YWxzKFRlc3RXb3Jrc3BhY2UuRlZUX0RFU0NSSVBUSU9OKSAmJiBhcHBDbGllbnQuZ2V0RGlzcGxheU5hbWUoKS5lcXVhbHMoVGVzdFdvcmtzcGFjZS5GVlRfRElTUExBWV9OQU1FKSAmJiBhcHBDbGllbnQuZ2V0TGFyZ2VJY29uKCkuZXF1YWxzKFRlc3RXb3Jrc3BhY2UuRlZUX0xBUkdFX0lDT04pOwotCQlhc3NlcnRUcnVlKHBhc3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVJlc291cmNlKCkgewotCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvcldyaXRlKGFwcENsaWVudFByb2plY3QpOwotCQkJLy9FTGlzdCByZXNvdXJjZUxpc3QgPSB3YkNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKTsKLQkJCS8vZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJLy99Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50UmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VDb21wb25lbnQoKSB7Ci0JCUNvbXBvbmVudFJlc291cmNlIHJlc291cmNlQ29tcG9uZW50ID0gQ29tcG9uZW50Y29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBvbmVudFJlc291cmNlKCk7Ci0JCUZpbGUgdGVzdEZpbGUgPSBUZXN0V29ya3NwYWNlLkFSVElGQUNUX0VESVRfRlZUX1JFU09VUkNFX1BBVEgudG9GaWxlKCk7Ci0JCWlmICh0ZXN0RmlsZS5leGlzdHMoKSkgewotCQkJcmVzb3VyY2VDb21wb25lbnQuc2V0UnVudGltZVBhdGgoVGVzdFdvcmtzcGFjZS5BUlRJRkFDVF9FRElUX0ZWVF9SRVNPVVJDRV9QQVRIKTsKLQkJCXJlc291cmNlQ29tcG9uZW50LnNldFNvdXJjZVBhdGgoVGVzdFdvcmtzcGFjZS5BUlRJRkFDVF9FRElUX0ZWVF9SRVNPVVJDRV9QQVRIKTsKLQkJfSBlbHNlIHsKLQkJCWZhaWwoIk1pc3Npbmc6IFRlc3RXb3Jrc3BhY2UuQVJUSUZBQ1RfRURJVF9GVlRfUkVTT1VSQ0VfUEFUSCIpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUNvbXBvbmVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvYXBpdGVzdHMvYXJ0aWZhY3RlZGl0L0FwcENsaWVudEFydGlmYWN0RWRpdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9hcGl0ZXN0cy9hcnRpZmFjdGVkaXQvQXBwQ2xpZW50QXJ0aWZhY3RFZGl0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjRiYWEyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9hcGl0ZXN0cy9hcnRpZmFjdGVkaXQvQXBwQ2xpZW50QXJ0aWZhY3RFZGl0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTgwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZmxleGlibGUucHJvamVjdC5hcGl0ZXN0cy5hcnRpZmFjdGVkaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmNvbXBvbmVudGNvcmUudXRpbC5BcHBDbGllbnRBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9ucy5JT3BlcmF0aW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50QXJ0aWZhY3RFZGl0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIElQcm9qZWN0IGFwcENsaWVudFByb2plY3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgYXBwQ2xpZW50TW9kdWxlTmFtZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUX01PREVMX0lEID0gImpzdC5hcHBfY2xpZW50IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGFydGlmYWN0RWRpdEZvclJlYWQ7Ci0JcHJpdmF0ZSBBcnRpZmFjdEVkaXRNb2RlbCBhcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQ7Ci0JcHJpdmF0ZSBFZGl0TW9kZWxMaXN0ZW5lciBlbUxpc3RlbmVyOwotCi0KLQotCXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkFydGlmYWN0VGVzdFN1YiBleHRlbmRzIEFwcENsaWVudEFydGlmYWN0RWRpdCB7Ci0KLQkJcHVibGljIEFwcGxpY2F0aW9uQXJ0aWZhY3RUZXN0U3ViKEFydGlmYWN0RWRpdE1vZGVsIGFuQXJ0aWZhY3RFZGl0TW9kZWwpIHsKLQkJCXN1cGVyKGFuQXJ0aWZhY3RFZGl0TW9kZWwpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgYWRkQXBwQ2xpZW50SWZOZWNlc3NhcnkoWE1MUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCQlzdXBlci5hZGRBcHBDbGllbnRJZk5lY2Vzc2FyeShhUmVzb3VyY2UpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENsZWludCgpIHsKLQkJbmV3IEFwcGxpY2F0aW9uQXJ0aWZhY3RUZXN0U3ViKG51bGwpOwotCi0JfQotCi0JcHJpdmF0ZSBJT3BlcmF0aW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IElPcGVyYXRpb25IYW5kbGVyKCkgewotCi0KLQkJcHVibGljIGJvb2xlYW4gY2FuQ29udGludWUoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0KLQkJcHVibGljIGJvb2xlYW4gY2FuQ29udGludWUoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY2FuQ29udGludWVXaXRoQWxsQ2hlY2soU3RyaW5nIG1lc3NhZ2UpIHsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNhbkNvbnRpbnVlV2l0aEFsbENoZWNrQWxsb3dDYW5jZWwoU3RyaW5nIG1lc3NhZ2UpIHsKLQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCi0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGluZm9ybShTdHJpbmcgbWVzc2FnZSkgewotCi0KLQkJfQotCi0KLQkJcHVibGljIE9iamVjdCBnZXRDb250ZXh0KCkgewotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX07Ci0KLQotCi0JcHVibGljIEFwcENsaWVudEFydGlmYWN0RWRpdFRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKFRlc3RXb3Jrc3BhY2UuaW5pdCgpKSB7Ci0JCQlhcHBDbGllbnRQcm9qZWN0ID0gVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KFRlc3RXb3Jrc3BhY2UuQVBQX0NMSUVOVF9QUk9KRUNUX05BTUUpOwotCQkJYXBwQ2xpZW50TW9kdWxlTmFtZSA9IFRlc3RXb3Jrc3BhY2UuQVBQX0NMSUVOVF9NT0RVTEVfTkFNRTsKLQkJfSBlbHNlIHsKLQkJCWZhaWwoKTsKLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEoyRUVWZXJzaW9uKCkgewotCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvclJlYWQoYXBwQ2xpZW50UHJvamVjdCk7Ci0JCQlpbnQgdmVyc2lvbiA9IGVkaXQuZ2V0SjJFRVZlcnNpb24oKTsKLQkJCUludGVnZXIgaW50ZWdlciA9IG5ldyBJbnRlZ2VyKHZlcnNpb24pOwotCQkJYXNzZXJ0VHJ1ZShpbnRlZ2VyLmVxdWFscyhUZXN0V29ya3NwYWNlLkFQUF9DTElFTlRfUFJPSkVDVF9WRVJTSU9OKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSB7Ci0JCUFwcENsaWVudEFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBBcHBDbGllbnRBcnRpZmFjdEVkaXQuZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yUmVhZChhcHBDbGllbnRQcm9qZWN0KTsKLQkJCVN0cmluZyB1cmkgPSBlZGl0LmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRVUkkoKS50b1N0cmluZygpOwotCQkJYXNzZXJ0VHJ1ZSh1cmkuZXF1YWxzKFRlc3RXb3Jrc3BhY2UuQVBQX0NMSUVOVF9ERF9SRVNPVVJDRV9VUkkpKTsKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpIHsKLQkJQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEFwcENsaWVudEFydGlmYWN0RWRpdC5nZXRBcHBDbGllbnRBcnRpZmFjdEVkaXRGb3JSZWFkKGFwcENsaWVudFByb2plY3QpOwotCQkJRU9iamVjdCBvYmplY3QgPSBlZGl0LmdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpOwotCQkJYXNzZXJ0Tm90TnVsbChvYmplY3QpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTW9kZWxSb290KCkgewotCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvclJlYWQoYXBwQ2xpZW50UHJvamVjdCk7Ci0JCQlFT2JqZWN0IG9iamVjdCA9IGVkaXQuY3JlYXRlTW9kZWxSb290KCk7Ci0JCQlhc3NlcnROb3ROdWxsKG9iamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTW9kZWxSb290aW50KCkgewotCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvclJlYWQoYXBwQ2xpZW50UHJvamVjdCk7Ci0JCQlFT2JqZWN0IG9iamVjdCA9IGVkaXQuY3JlYXRlTW9kZWxSb290KDE0KTsKLQkJCWFzc2VydE5vdE51bGwob2JqZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcHBDbGllbnRBcnRpZmFjdEVkaXRDb21wb25lbnRIYW5kbGVib29sZWFuKCkgewotCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gbmV3IEFwcENsaWVudEFydGlmYWN0RWRpdChhcHBDbGllbnRQcm9qZWN0LCB0cnVlKTsKLQkJCWFzc2VydE5vdE51bGwoZWRpdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgQXBwQ2xpZW50QXJ0aWZhY3RFZGl0KEFydGlmYWN0RWRpdE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBcHBDbGllbnRBcnRpZmFjdEVkaXRBcnRpZmFjdEVkaXRNb2RlbCgpIHsKLQkJQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGVkaXQgPSBuZXcgQXBwQ2xpZW50QXJ0aWZhY3RFZGl0KGdldEFydGlmYWN0RWRpdE1vZGVsZm9yUmVhZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChlZGl0KTsKLQkJZWRpdC5kaXNwb3NlKCk7Ci0JfQotCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy9CVUcvLy8vLy8vLy8vLy8vLwotCi0JcHVibGljIHZvaWQgdGVzdEdldEFwcGxpY2F0aW9uQ2xpZW50WG1pUmVzb3VyY2UoKSB7Ci0JCUFwcENsaWVudEFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBBcHBDbGllbnRBcnRpZmFjdEVkaXQuZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yUmVhZChhcHBDbGllbnRQcm9qZWN0KTsKLQkJCVN0cmluZyB1cmkgPSBlZGl0LmdldEFwcGxpY2F0aW9uQ2xpZW50WG1pUmVzb3VyY2UoKS5nZXRVUkkoKS50b1N0cmluZygpOwotCQkJLy8gVEhJUyBJUyBBIEJVR1xcIC0gY29tbW1lbnRpbmcgb3V0IGFzIHN1Z2dlc3RlZCBieSBEVwotCQkJYm9vbGVhbiB0ZXN0VVJJID0gdXJpLmVxdWFscyhUZXN0V29ya3NwYWNlLkFQUF9DTElFTlRfRERfWE1JX1JFU09VUkNFX1VSSSk7Ci0JCQkvLyBhc3NlcnRUcnVlKHVyaS5lcXVhbHMoVGVzdFdvcmtzcGFjZS5BUFBfQ0xJRU5UX0REX1hNSV9SRVNPVVJDRV9VUkkpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8KLQkJfQotCi0JCWZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZShlZGl0ICE9IG51bGwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFwcENsaWVudElmTmVjZXNzYXJ5KCkgewotCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvclJlYWQoYXBwQ2xpZW50UHJvamVjdCk7Ci0JCQlSZXNvdXJjZSByZXNvdXJjZSA9IGVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkJQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGVkaXQyID0gbmV3IEFwcENsaWVudEFydGlmYWN0RWRpdChnZXRBcnRpZmFjdEVkaXRNb2RlbGZvclJlYWQoKSkgewotCQkJCXByb3RlY3RlZCB2b2lkIGFkZEFwcENsaWVudElmTmVjZXNzYXJ5KFhNTFJlc291cmNlIGFSZXNvdXJjZSkgewotCQkJCQlzdXBlci5hZGRBcHBDbGllbnRJZk5lY2Vzc2FyeShhUmVzb3VyY2UpOwotCQkJCX0KLQkJCX07Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcGFzcygpOyAvLyBwcm90ZWN0ZWQgLSBub3Qgc3VyZSBpZiBuZWVkZWQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTmV3TW9kdWxlKCkgewotCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvclJlYWQoYXBwQ2xpZW50UHJvamVjdCk7Ci0JCQlNb2R1bGUgbW9kdWxlID0gZWRpdC5jcmVhdGVOZXdNb2R1bGUoKTsKLQkJCWFzc2VydE5vdE51bGwobW9kdWxlKTsKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFwcGxpY2F0aW9uQ2xpZW50KCkgewotCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvclJlYWQoYXBwQ2xpZW50UHJvamVjdCk7Ci0JCQlFT2JqZWN0IG9iaiA9IGVkaXQuZ2V0QXBwbGljYXRpb25DbGllbnQoKTsKLQkJCWFzc2VydE5vdE51bGwob2JqKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBcHBDbGllbnRBcnRpZmFjdEVkaXRGb3JSZWFkQ29tcG9uZW50SGFuZGxlKCkgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChhcHBDbGllbnRQcm9qZWN0KTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQllZGl0ID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvclJlYWQoYXBwQ2xpZW50UHJvamVjdCk7Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yV3JpdGVDb21wb25lbnRIYW5kbGUoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCUFwcENsaWVudEFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShhcHBDbGllbnRQcm9qZWN0KTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQllZGl0ID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvcldyaXRlKGFwcENsaWVudFByb2plY3QpOwotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBcHBDbGllbnRBcnRpZmFjdEVkaXRGb3JSZWFkV29ya2JlbmNoQ29tcG9uZW50KCkgewotCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvclJlYWQoYXBwQ2xpZW50UHJvamVjdCk7Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yV3JpdGVXb3JrYmVuY2hDb21wb25lbnQoKSB7Ci0JCUFwcENsaWVudEFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBBcHBDbGllbnRBcnRpZmFjdEVkaXQuZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yV3JpdGUoYXBwQ2xpZW50UHJvamVjdCk7Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNWYWxpZEFwcGxpY2F0aW9uQ2xpZW50TW9kdWxlKCkgewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChhcHBDbGllbnRQcm9qZWN0LCBhcHBDbGllbnRNb2R1bGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShBcnRpZmFjdEVkaXQuaXNWYWxpZEVkaXRhYmxlTW9kdWxlKGNvbXBvbmVudCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlKCkgewotCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvcldyaXRlKGFwcENsaWVudFByb2plY3QpOwotCQkJdHJ5IHsKLQkJCQllZGl0LnNhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZShlZGl0ICE9IG51bGwpOwotCQl9Ci0JCWFzc2VydFRydWUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNhdmVJZk5lY2Vzc2FyeSgpIHsKLQkJQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEFwcENsaWVudEFydGlmYWN0RWRpdC5nZXRBcHBDbGllbnRBcnRpZmFjdEVkaXRGb3JXcml0ZShhcHBDbGllbnRQcm9qZWN0KTsKLQkJCXRyeSB7Ci0JCQkJZWRpdC5zYXZlSWZOZWNlc3NhcnkobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZShlZGl0ICE9IG51bGwpOwotCQl9Ci0JCWFzc2VydFRydWUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNhdmVJZk5lY2Vzc2FyeVdpdGhQcm9tcHQoKSB7Ci0JCUFwcENsaWVudEFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBBcHBDbGllbnRBcnRpZmFjdEVkaXQuZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yV3JpdGUoYXBwQ2xpZW50UHJvamVjdCk7Ci0JCQl0cnkgewotCQkJCWVkaXQuc2F2ZUlmTmVjZXNzYXJ5V2l0aFByb21wdChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBoYW5kbGVyLCB0cnVlKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlwYXNzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZSgpIHsKLQkJQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGVkaXQ7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gbmV3IEFwcENsaWVudEFydGlmYWN0RWRpdChnZXRBcnRpZmFjdEVkaXRNb2RlbGZvclJlYWQoKSk7Ci0JCQllZGl0LmRpc3Bvc2UoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXBhc3MoKTsKLQl9Ci0KLQkvLyAvLy8vLy8vLy8vQlVHLy8vLy8vLy8vLy8vLy8vLwotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnRlbnRNb2RlbFJvb3QoKSB7Ci0JCUFwcENsaWVudEFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBBcHBDbGllbnRBcnRpZmFjdEVkaXQuZ2V0QXBwQ2xpZW50QXJ0aWZhY3RFZGl0Rm9yUmVhZChhcHBDbGllbnRQcm9qZWN0KTsKLQkJCS8vIFRISVMgSVMgQSBCVUdcXCAtIGNvbW1tZW50aW5nIG91dCBhcyBzdWdnZXN0ZWQgYnkgRFcKLQkJCU9iamVjdCBvYmplY3QgPSBlZGl0LmdldENvbnRlbnRNb2RlbFJvb3QoKTsKLQkJCS8vIGFzc2VydE5vdE51bGwob2JqZWN0KTsKLQkJCXBhc3MoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkvLyBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRMaXN0ZW5lcigpIHsKLQkJQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGVkaXQgPSBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCk7Ci0JCXRyeSB7Ci0JCQllZGl0LmFkZExpc3RlbmVyKGdldEVtTGlzdGVuZXIoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlwYXNzKCk7Ci0JCWVkaXQuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBFZGl0TW9kZWxMaXN0ZW5lciBnZXRFbUxpc3RlbmVyKCkgewotCQlpZiAoZW1MaXN0ZW5lciA9PSBudWxsKQotCQkJZW1MaXN0ZW5lciA9IG5ldyBFZGl0TW9kZWxMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJCQkJLy9EZWZhdWx0Ci0JCQkJfQotCQkJfTsKLQkJcmV0dXJuIGVtTGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUxpc3RlbmVyKCkgewotCQlBcHBDbGllbnRBcnRpZmFjdEVkaXQgZWRpdCA9IGdldEFydGlmYWN0RWRpdEZvclJlYWQoKTsKLQkJdHJ5IHsKLQkJCWVkaXQucmVtb3ZlTGlzdGVuZXIoZ2V0RW1MaXN0ZW5lcigpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWVkaXQuZGlzcG9zZSgpOwotCQlwYXNzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0VkaXRNb2RlbCgpIHsKLQkJQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGVkaXQgPSBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCk7Ci0JCWFzc2VydFRydWUoZWRpdC5oYXNFZGl0TW9kZWwoYXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkKSk7Ci0JCWVkaXQuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBcnRpZmFjdEVkaXRNb2RlbCgpIHsKLQkJQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGVkaXQgPSBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCk7Ci0JCWFzc2VydFRydWUoZWRpdC5oYXNFZGl0TW9kZWwoYXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkKSk7Ci0JCWVkaXQuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPYmplY3QoKSB7Ci0JCXBhc3MoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2xhc3MoKSB7Ci0JCUFwcENsaWVudEFydGlmYWN0RWRpdCBlZGl0ID0gZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpOwotCQlhc3NlcnROb3ROdWxsKGVkaXQuZ2V0Q2xhc3MoKSk7Ci0JCWVkaXQuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKLQkJQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGVkaXQgPSBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCk7Ci0JCWludCB5ID0gLTk5OTk5OTk5OTsKLQkJaW50IHggPSBlZGl0Lmhhc2hDb2RlKCk7Ci0JCWFzc2VydFRydWUoeCAhPSB5KTsKLQkJZWRpdC5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGVkaXQgPSBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCk7Ci0JCWFzc2VydFRydWUoZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpLmVxdWFscyhhcnRpZmFjdEVkaXRGb3JSZWFkKSk7Ci0JCWVkaXQuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJcGFzcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGVkaXQgPSBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCk7Ci0JCWFzc2VydFRydWUoZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpLnRvU3RyaW5nKCkgIT0gbnVsbCk7Ci0JCWVkaXQuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb3RpZnkoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGdldEFydGlmYWN0RWRpdEZvclJlYWQoKSkgewotCQkJCWFydGlmYWN0RWRpdEZvclJlYWQubm90aWZ5KCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlhcnRpZmFjdEVkaXRGb3JSZWFkLmRpc3Bvc2UoKTsKLQkJcGFzcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb3RpZnlBbGwoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGdldEFydGlmYWN0RWRpdEZvclJlYWQoKSkgewotCQkJCWFydGlmYWN0RWRpdEZvclJlYWQubm90aWZ5QWxsKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWFydGlmYWN0RWRpdEZvclJlYWQuZGlzcG9zZSgpOwotCQl9Ci0JCXBhc3MoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0bG9uZygpIHsKLQkJbG9uZyB4ID0gMjsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCAoZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpKSB7Ci0JCQkJZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpLndhaXQoeCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWFydGlmYWN0RWRpdEZvclJlYWQuZGlzcG9zZSgpOwotCQl9Ci0JCXBhc3MoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0bG9uZ2ludCgpIHsKLQkJaW50IHggPSAyOwotCQl0cnkgewotCQkJc3luY2hyb25pemVkIChnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkpIHsKLQkJCQlnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkud2FpdCh4KTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGZhaWwoZS5nZXRNZXNzYWdlKCkpOwotCQl9IGZpbmFsbHkgewotCQkJYXJ0aWZhY3RFZGl0Rm9yUmVhZC5kaXNwb3NlKCk7Ci0JCX0KLQkJcGFzcygpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXQoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGdldEFydGlmYWN0RWRpdEZvclJlYWQoKSkgewotCQkJCWdldEFydGlmYWN0RWRpdEZvclJlYWQoKS53YWl0KCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWFydGlmYWN0RWRpdEZvclJlYWQuZGlzcG9zZSgpOwotCQl9Ci0JCXBhc3MoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaW5hbGl6ZSgpIHsKLQkJcGFzcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhc3MoKSB7Ci0JCWFzc2VydFRydWUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIEFydGlmYWN0RWRpdE1vZGVsIGdldEFydGlmYWN0RWRpdE1vZGVsZm9yUmVhZCgpIHsKLQkJRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0ID0gbmV3IEVNRldvcmtiZW5jaENvbnRleHQoYXBwQ2xpZW50UHJvamVjdCk7Ci0JCWFydGlmYWN0RWRpdE1vZGVsRm9yUmVhZCA9IG5ldyBBcnRpZmFjdEVkaXRNb2RlbChFRElUX01PREVMX0lELCBjb250ZXh0LCB0cnVlLCBUZXN0V29ya3NwYWNlLkFQUF9DTElFTlRfTU9EVUxFX1VSSSk7Ci0JCXJldHVybiBhcnRpZmFjdEVkaXRNb2RlbEZvclJlYWQ7Ci0JfQotCi0KLQotCXB1YmxpYyBBcHBDbGllbnRBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpIHsKLQkJYXJ0aWZhY3RFZGl0Rm9yUmVhZCA9IG5ldyBBcHBDbGllbnRBcnRpZmFjdEVkaXQoZ2V0QXJ0aWZhY3RFZGl0TW9kZWxmb3JSZWFkKCkpOwotCQlyZXR1cm4gYXJ0aWZhY3RFZGl0Rm9yUmVhZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9hcGl0ZXN0cy9hcnRpZmFjdGVkaXQvQ29ubmVjdG9yQXJ0aWZhY3RFZGl0RlZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvYXBpdGVzdHMvYXJ0aWZhY3RlZGl0L0Nvbm5lY3RvckFydGlmYWN0RWRpdEZWVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGJlZThhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9hcGl0ZXN0cy9hcnRpZmFjdGVkaXQvQ29ubmVjdG9yQXJ0aWZhY3RFZGl0RlZUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5mbGV4aWJsZS5wcm9qZWN0LmFwaXRlc3RzLmFydGlmYWN0ZWRpdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNsaWVudC5BcHBsaWNhdGlvbkNsaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EuQ29ubmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmpjYS5tb2R1bGVjb3JlLnV0aWwuQ29ubmVjdG9yQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb25uZWN0b3JBcnRpZmFjdEVkaXRGVlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBJUHJvamVjdCBqY2FQcm9qZWN0OwotCXByaXZhdGUgU3RyaW5nIGpjYU1vZHVsZU5hbWU7Ci0KLQotCXB1YmxpYyBDb25uZWN0b3JBcnRpZmFjdEVkaXRGVlRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKFRlc3RXb3Jrc3BhY2UuaW5pdCgpKSB7Ci0JCQlqY2FQcm9qZWN0ID0gVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KFRlc3RXb3Jrc3BhY2UuSkNBX1BST0pFQ1RfTkFNRSk7Ci0JCQlqY2FNb2R1bGVOYW1lID0gVGVzdFdvcmtzcGFjZS5KQ0FfTU9EVUxFX05BTUU7Ci0JCX0gZWxzZSB7Ci0JCQlmYWlsKCk7Ci0KLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0aW9uRGlzcG9zZUZ1bmN0aW9uKCkgewotCQlDb25uZWN0b3JBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvcldyaXRlKGpjYVByb2plY3QpOwotCQkJZWRpdC5hZGRMaXN0ZW5lcihuZXcgRWRpdE1vZGVsTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZWRpdE1vZGVsQ2hhbmdlZChFZGl0TW9kZWxFdmVudCBhbkV2ZW50KSB7Ci0JCQkJCXBhc3MoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJCUNvbm5lY3RvciBjbGllbnQgPSBlZGl0LmdldENvbm5lY3RvcigpOwotCQkJdXBkYXRlQ2xpZW50KGNsaWVudCk7Ci0JCQllZGl0LnNhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2xpZW50KENvbm5lY3RvciBjbGllbnQpIHsKLQkJY2xpZW50LnNldERlc2NyaXB0aW9uKFRlc3RXb3Jrc3BhY2UuRlZUX0RFU0NSSVBUSU9OKTsKLQkJY2xpZW50LnNldERpc3BsYXlOYW1lKFRlc3RXb3Jrc3BhY2UuRlZUX0RJU1BMQVlfTkFNRSk7Ci0JCWNsaWVudC5zZXRMYXJnZUljb24oVGVzdFdvcmtzcGFjZS5GVlRfTEFSR0VfSUNPTik7Ci0KLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYXNzKENvbm5lY3RvciBjbGllbnQpIHsKLQkJYm9vbGVhbiBwYXNzID0gY2xpZW50LmdldERlc2NyaXB0aW9uKCkuZXF1YWxzKFRlc3RXb3Jrc3BhY2UuRlZUX0RFU0NSSVBUSU9OKSAmJiBjbGllbnQuZ2V0RGlzcGxheU5hbWUoKS5lcXVhbHMoVGVzdFdvcmtzcGFjZS5GVlRfRElTUExBWV9OQU1FKSAmJiBjbGllbnQuZ2V0TGFyZ2VJY29uKCkuZXF1YWxzKFRlc3RXb3Jrc3BhY2UuRlZUX0xBUkdFX0lDT04pOwotCQlhc3NlcnRUcnVlKHBhc3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwYXNzKCkgewotCQlhc3NlcnRUcnVlKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJzaXN0ZW5jZUZ1bmN0aW9uKCkgewotCQlDb25uZWN0b3JBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvcldyaXRlKGpjYVByb2plY3QpOwotCQkJQ29ubmVjdG9yIGpjYSA9IGVkaXQuZ2V0Q29ubmVjdG9yKCk7Ci0JCQlwYXNzKGpjYSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhc3MoQXBwbGljYXRpb25DbGllbnQgamNhKSB7Ci0JCWJvb2xlYW4gcGFzcyA9IGpjYS5nZXREZXNjcmlwdGlvbigpLmVxdWFscyhUZXN0V29ya3NwYWNlLkZWVF9ERVNDUklQVElPTikgJiYgamNhLmdldERpc3BsYXlOYW1lKCkuZXF1YWxzKFRlc3RXb3Jrc3BhY2UuRlZUX0RJU1BMQVlfTkFNRSkgJiYgamNhLmdldExhcmdlSWNvbigpLmVxdWFscyhUZXN0V29ya3NwYWNlLkZWVF9MQVJHRV9JQ09OKTsKLQkJYXNzZXJ0VHJ1ZShwYXNzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVSZXNvdXJjZSgpIHsKLQkJQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IENvbm5lY3RvckFydGlmYWN0RWRpdC5nZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JXcml0ZShqY2FQcm9qZWN0KTsKLS8vCQkJRUxpc3QgcmVzb3VyY2VMaXN0ID0gd2JDb21wb25lbnQuZ2V0UmVzb3VyY2VzKCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnRSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZUNvbXBvbmVudCgpIHsKLQkJQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2VDb21wb25lbnQgPSBDb21wb25lbnRjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9uZW50UmVzb3VyY2UoKTsKLQkJRmlsZSB0ZXN0RmlsZSA9IFRlc3RXb3Jrc3BhY2UuQVJUSUZBQ1RfRURJVF9GVlRfUkVTT1VSQ0VfUEFUSC50b0ZpbGUoKTsKLQkJaWYgKHRlc3RGaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXNvdXJjZUNvbXBvbmVudC5zZXRSdW50aW1lUGF0aChUZXN0V29ya3NwYWNlLkFSVElGQUNUX0VESVRfRlZUX1JFU09VUkNFX1BBVEgpOwotCQkJcmVzb3VyY2VDb21wb25lbnQuc2V0U291cmNlUGF0aChUZXN0V29ya3NwYWNlLkFSVElGQUNUX0VESVRfRlZUX1JFU09VUkNFX1BBVEgpOwotCQl9IGVsc2UgewotCQkJZmFpbCgiTWlzc2luZzogVGVzdFdvcmtzcGFjZS5BUlRJRkFDVF9FRElUX0ZWVF9SRVNPVVJDRV9QQVRIIik7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQ29tcG9uZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9Db25uZWN0b3JBcnRpZmFjdEVkaXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvYXBpdGVzdHMvYXJ0aWZhY3RlZGl0L0Nvbm5lY3RvckFydGlmYWN0RWRpdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmOTc0OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvYXBpdGVzdHMvYXJ0aWZhY3RlZGl0L0Nvbm5lY3RvckFydGlmYWN0RWRpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmZsZXhpYmxlLnByb2plY3QuYXBpdGVzdHMuYXJ0aWZhY3RlZGl0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EubW9kdWxlY29yZS51dGlsLkNvbm5lY3RvckFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLQotcHVibGljIGNsYXNzIENvbm5lY3RvckFydGlmYWN0RWRpdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIElQcm9qZWN0IGpjYVByb2plY3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgamNhTW9kdWxlTmFtZTsKLQotCi0JcHVibGljIENvbm5lY3RvckFydGlmYWN0RWRpdFRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKFRlc3RXb3Jrc3BhY2UuaW5pdCgpKSB7Ci0JCQlqY2FQcm9qZWN0ID0gVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KFRlc3RXb3Jrc3BhY2UuSkNBX1BST0pFQ1RfTkFNRSk7Ci0JCQlqY2FNb2R1bGVOYW1lID0gVGVzdFdvcmtzcGFjZS5KQ0FfTU9EVUxFX05BTUU7Ci0JCX0gZWxzZSB7Ci0JCQlmYWlsKCk7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKMkVFVmVyc2lvbigpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgdmMgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChqY2FQcm9qZWN0KTsKLQkJYXNzZXJ0VHJ1ZShKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFZlcnNpb24odmMuZ2V0UHJvamVjdCgpKS5lcXVhbHMoVGVzdFdvcmtzcGFjZS5KQ0FfUFJPSkVDVF9WRVJTSU9OKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKSB7Ci0JCUNvbm5lY3RvckFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBDb25uZWN0b3JBcnRpZmFjdEVkaXQuZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yUmVhZChqY2FQcm9qZWN0KTsKLQkJCVN0cmluZyB1cmkgPSBlZGl0LmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRVUkkoKS50b1N0cmluZygpOwotCQkJYXNzZXJ0VHJ1ZSh1cmkuZXF1YWxzKFRlc3RXb3Jrc3BhY2UuSkNBX0REX1JFU09VUkNFX1VSSSkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTW9kZWxSb290KCkgewotCQlDb25uZWN0b3JBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvcldyaXRlKGpjYVByb2plY3QpOwotCQkJRU9iamVjdCBvYmplY3QgPSBlZGl0LmNyZWF0ZU1vZGVsUm9vdCgpOwotCQkJYXNzZXJ0Tm90TnVsbChvYmplY3QpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTW9kZWxSb290aW50KCkgewotCQlDb25uZWN0b3JBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvclJlYWQoamNhUHJvamVjdCk7Ci0JCQlFT2JqZWN0IG9iamVjdCA9IGVkaXQuY3JlYXRlTW9kZWxSb290KDE0KTsKLQkJCWFzc2VydE5vdE51bGwob2JqZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdENvbm5lY3RvckFydGlmYWN0RWRpdENvbXBvbmVudEhhbmRsZWJvb2xlYW4oKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG51bGw7Ci0JCUNvbm5lY3RvckFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShqY2FQcm9qZWN0KTsKLQkJCXdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWVkaXQgPSBuZXcgQ29ubmVjdG9yQXJ0aWZhY3RFZGl0KGpjYVByb2plY3QsIHRydWUpOwotCQkJYXNzZXJ0Tm90TnVsbChlZGl0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbm5lY3RvckFydGlmYWN0RWRpdEFydGlmYWN0RWRpdE1vZGVsKCkgewotCQlDb25uZWN0b3JBcnRpZmFjdEVkaXQgZWRpdCA9IG5ldyBDb25uZWN0b3JBcnRpZmFjdEVkaXQoZ2V0QXJ0aWZhY3RFZGl0TW9kZWxmb3JSZWFkKCkpOwotCQlhc3NlcnROb3ROdWxsKGVkaXQpOwotCQllZGl0LmRpc3Bvc2UoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JSZWFkQ29tcG9uZW50SGFuZGxlKCkgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQlDb25uZWN0b3JBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChqY2FQcm9qZWN0KTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQllZGl0ID0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvclJlYWQoamNhUHJvamVjdCk7Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yV3JpdGVDb21wb25lbnRIYW5kbGUoKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCUNvbm5lY3RvckFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShqY2FQcm9qZWN0KTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQllZGl0ID0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvcldyaXRlKGpjYVByb2plY3QpOwotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb25uZWN0b3JBcnRpZmFjdEVkaXRGb3JSZWFkV29ya2JlbmNoQ29tcG9uZW50KCkgewotCQlDb25uZWN0b3JBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvclJlYWQoamNhUHJvamVjdCk7Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yV3JpdGVXb3JrYmVuY2hDb21wb25lbnQoKSB7Ci0JCUNvbm5lY3RvckFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBDb25uZWN0b3JBcnRpZmFjdEVkaXQuZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoamNhUHJvamVjdCk7Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNWYWxpZENvbm5lY3Rvck1vZHVsZSgpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoamNhUHJvamVjdCk7Ci0JCWFzc2VydFRydWUoQXJ0aWZhY3RFZGl0LmlzVmFsaWRFZGl0YWJsZU1vZHVsZShjb21wb25lbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29ubmVjdG9yWG1pUmVzb3VyY2UoKSB7Ci0JCUNvbm5lY3RvckFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBDb25uZWN0b3JBcnRpZmFjdEVkaXQuZ2V0Q29ubmVjdG9yQXJ0aWZhY3RFZGl0Rm9yUmVhZChqY2FQcm9qZWN0KTsKLQkJCVN0cmluZyB1cmkgPSBlZGl0LmdldERlcGxveW1lbnREZXNjcmlwdG9yUmVzb3VyY2UoKS5nZXRVUkkoKS50b1N0cmluZygpOwotCQkJYXNzZXJ0VHJ1ZSh1cmkuZXF1YWxzKFRlc3RXb3Jrc3BhY2UuSkNBX0REX1JFU09VUkNFX1VSSSkpOwotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBcHBsaWNhdGlvbklmTmVjZXNzYXJ5KCkgewotCQlwYXNzKCk7IC8vIHByb3RlY3RlZCBtZXRob2QKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwYXNzKCkgewotCQlhc3NlcnRUcnVlKHRydWUpOwotCX0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXRNb2RlbCBnZXRBcnRpZmFjdEVkaXRNb2RlbGZvclJlYWQoKSB7Ci0JCUVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCA9IG5ldyBFTUZXb3JrYmVuY2hDb250ZXh0KGpjYVByb2plY3QpOwotCQlyZXR1cm4gbmV3IEFydGlmYWN0RWRpdE1vZGVsKHRoaXMudG9TdHJpbmcoKSwgY29udGV4dCwgdHJ1ZSwgVGVzdFdvcmtzcGFjZS5KQ0FfTU9EVUxFX1VSSSk7Ci0JfQotCi0KLQotCXB1YmxpYyBDb25uZWN0b3JBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0b3JBcnRpZmFjdEVkaXQoZ2V0QXJ0aWZhY3RFZGl0TW9kZWxmb3JSZWFkKCkpOwotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkgewotCQlDb25uZWN0b3JBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvclJlYWQoamNhUHJvamVjdCk7Ci0JCQlPYmplY3Qgb2JqID0gZWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQkJCWFzc2VydE5vdE51bGwob2JqKTsKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENvbm5lY3RvcklmTmVjZXNzYXJ5KCkgewotCQlwYXNzKCk7IC8vIHByb3RlY3RlZCBtZXRob2QgbmVlZCB0byBnZXQgY2xhcmlmaWNhdGlvbgotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29ubmVjdG9yKCkgewotCQlDb25uZWN0b3JBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvclJlYWQoamNhUHJvamVjdCk7Ci0JCQlPYmplY3Qgb2JqID0gZWRpdC5nZXRDb25uZWN0b3IoKTsKLQkJCWFzc2VydE5vdE51bGwob2JqKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9FQVJBcnRpZmFjdEVkaXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvYXBpdGVzdHMvYXJ0aWZhY3RlZGl0L0VBUkFydGlmYWN0RWRpdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmYjUzZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvYXBpdGVzdHMvYXJ0aWZhY3RlZGl0L0VBUkFydGlmYWN0RWRpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmZsZXhpYmxlLnByb2plY3QuYXBpdGVzdHMuYXJ0aWZhY3RlZGl0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5VbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5BcnRpZmFjdEVkaXRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgRUFSQXJ0aWZhY3RFZGl0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgSVByb2plY3QgZWFyUHJvamVjdDsKLQlwcml2YXRlIFN0cmluZyBlYXJNb2R1bGVOYW1lOwotCi0JcHVibGljIEVBUkFydGlmYWN0RWRpdFRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKFRlc3RXb3Jrc3BhY2UuaW5pdCgpKSB7Ci0JCQllYXJQcm9qZWN0ID0gVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KFRlc3RXb3Jrc3BhY2UuRUFSX1BST0pFQ1RfTkFNRSk7Ci0JCQllYXJNb2R1bGVOYW1lID0gVGVzdFdvcmtzcGFjZS5FQVJfTU9EVUxFX05BTUU7Ci0JCX0gZWxzZSB7Ci0JCQlmYWlsKCk7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKMkVFVmVyc2lvbigpIHsKLQkJRUFSQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKGVhclByb2plY3QpOwotCQkJaW50IHZlcnNpb24gPSBlZGl0LmdldEoyRUVWZXJzaW9uKCk7Ci0JCQlJbnRlZ2VyIGludGVnZXIgPSBuZXcgSW50ZWdlcih2ZXJzaW9uKTsKLQkJCWFzc2VydFRydWUoaW50ZWdlci5lcXVhbHMoVGVzdFdvcmtzcGFjZS5FQVJfUFJPSkVDVF9WRVJTSU9OKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEoyRUVNb2R1bGVSZWZlcmVuY2VzKCkgewotCQlFQVJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoZWFyUHJvamVjdCk7Ci0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIGoyZWVNb2R1bGVSZWZzID0gZWRpdC5nZXRKMkVFTW9kdWxlUmVmZXJlbmNlcygpOwotCQkJYXNzZXJ0VHJ1ZShqMmVlTW9kdWxlUmVmcy5sZW5ndGg+MCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpIHsKLQkJRUFSQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkKGVhclByb2plY3QpOwotCQkJU3RyaW5nIHVyaSA9IGVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCQlhc3NlcnRUcnVlKHVyaS5lcXVhbHMoVGVzdFdvcmtzcGFjZS5FQVJfRERfUkVTT1VSQ0VfVVJJKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTW9kZWxSb290KCkgewotCQlFQVJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvcldyaXRlKGVhclByb2plY3QpOwotCQkJRU9iamVjdCBvYmplY3QgPSBlZGl0LmNyZWF0ZU1vZGVsUm9vdCgpOwotCQkJYXNzZXJ0Tm90TnVsbChvYmplY3QpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZShlZGl0ICE9IG51bGwpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTW9kZWxSb290aW50KCkgewotCQlFQVJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoZWFyUHJvamVjdCk7Ci0JCQlFT2JqZWN0IG9iamVjdCA9IGVkaXQuY3JlYXRlTW9kZWxSb290KDE0KTsKLQkJCWFzc2VydE5vdE51bGwob2JqZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoZWRpdCAhPSBudWxsKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEVBUkFydGlmYWN0RWRpdENvbXBvbmVudEhhbmRsZWJvb2xlYW4oKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG51bGw7Ci0JCUVBUkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShlYXJQcm9qZWN0KTsKLQkJCXdiQ29tcG9uZW50ID0gbW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQkJCWVkaXQgPSBuZXcgRUFSQXJ0aWZhY3RFZGl0KGVhclByb2plY3QsIHRydWUpOwotCQkJYXNzZXJ0Tm90TnVsbChlZGl0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVBUkFydGlmYWN0RWRpdEFydGlmYWN0RWRpdE1vZGVsKCkgewotCQlFQVJBcnRpZmFjdEVkaXQgZWRpdCA9IG5ldyBFQVJBcnRpZmFjdEVkaXQoZ2V0QXJ0aWZhY3RFZGl0TW9kZWxmb3JSZWFkKCkpOwotCQlhc3NlcnROb3ROdWxsKGVkaXQpOwotCQllZGl0LmRpc3Bvc2UoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkQ29tcG9uZW50SGFuZGxlKCkgewotCQlTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSBudWxsOwotCQlFQVJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChlYXJQcm9qZWN0KTsKLQkJCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQllZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoZWFyUHJvamVjdCk7Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpIHsKLQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RUFSQXJ0aWZhY3RFZGl0Rm9yV3JpdGVDb21wb25lbnRIYW5kbGUoKSB7Ci0JCUVBUkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBFQVJBcnRpZmFjdEVkaXQuZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoZWFyUHJvamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRFQVJBcnRpZmFjdEVkaXRGb3JSZWFkV29ya2JlbmNoQ29tcG9uZW50KCkgewotCQlFQVJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoZWFyUHJvamVjdCk7Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRFQVJBcnRpZmFjdEVkaXRGb3JXcml0ZVdvcmtiZW5jaENvbXBvbmVudCgpIHsKLQkJRUFSQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JXcml0ZShlYXJQcm9qZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoZWRpdCAhPSBudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ZhbGlkRUFSTW9kdWxlKCkgewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotCQl0cnkgewotCQkJY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWFyUHJvamVjdCwgZWFyTW9kdWxlTmFtZSk7Ci0JCQlFQVJBcnRpZmFjdEVkaXQuaXNWYWxpZEVBUk1vZHVsZShjb21wb25lbnQpOwotCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJYm9vbGVhbiBpc1ZhbGlkID0gQXJ0aWZhY3RFZGl0LmlzVmFsaWRFZGl0YWJsZU1vZHVsZShjb21wb25lbnQpOwotCQlhc3NlcnRUcnVlKGlzVmFsaWQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNWYWxpZEVBUkVkaXRhYmxlTW9kdWxlKCkgewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotCQl0cnkgewotCQkJY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZWFyUHJvamVjdCwgZWFyTW9kdWxlTmFtZSk7Ci0JCQlFQVJBcnRpZmFjdEVkaXQuaXNWYWxpZEVBUk1vZHVsZShjb21wb25lbnQpOwotCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJYm9vbGVhbiBpc1ZhbGlkID0gQXJ0aWZhY3RFZGl0LmlzVmFsaWRFZGl0YWJsZU1vZHVsZShjb21wb25lbnQpOwotCQlhc3NlcnRUcnVlKGlzVmFsaWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBcHBsaWNhdGlvblhtaVJlc291cmNlKCkgewotCQlFQVJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoZWFyUHJvamVjdCk7Ci0JCQlTdHJpbmcgdXJpID0gZWRpdC5nZXRBcHBsaWNhdGlvblhtaVJlc291cmNlKCkuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJCWFzc2VydFRydWUodXJpLmVxdWFscyhUZXN0V29ya3NwYWNlLkVBUl9ERF9SRVNPVVJDRV9VUkkpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoZWRpdCAhPSBudWxsKTsKLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFwcGxpY2F0aW9uKCkgewotCQlFQVJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoZWFyUHJvamVjdCk7Ci0JCQllZGl0LmNyZWF0ZU1vZGVsUm9vdCgpOwotCQkJRU9iamVjdCBvYmogPSBlZGl0LmdldEFwcGxpY2F0aW9uKCk7Ci0JCQlhc3NlcnROb3ROdWxsKG9iaik7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoZWRpdCAhPSBudWxsKTsKLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFwcGxpY2F0aW9uSWZOZWNlc3NhcnkoKSB7Ci0JCUVBUkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBFQVJBcnRpZmFjdEVkaXQuZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yUmVhZChlYXJQcm9qZWN0KTsKLQkJCQotCQkJLy8gL0J1ZwotCQkJLyoKLQkJCSAqIGFzc2VydFRydWUoZWRpdC51cmlFeGlzdHMoVGVzdFdvcmtzcGFjZS5FSkJfTU9EVUxFX1VSSS50b1N0cmluZygpKSk7Ci0JCQkgKi8KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCQlwYXNzKCk7IC8vIHByb3RlY3RlZCBtZXRob2QKLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vLy9CVUcgV29ya2JlbmNoIE1vZHVsZSBub3QgaW5pdGFsaXplZFxcXFxcXFxcXFxcXFxcXFxcXFxcXFwKLQlwdWJsaWMgdm9pZCB0ZXN0VXJpRXhpc3RzKCkgewotCQlFQVJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoZWFyUHJvamVjdCk7Ci0JCQlib29sZWFuIHVyaUV4aXN0ID0gZWRpdC51cmlFeGlzdHMoVGVzdFdvcmtzcGFjZS5FSkJfTU9EVUxFX1VSSS50b1N0cmluZygpKTsKLQkJCS8vIC9CdWcKLQkJCS8qCi0JCQkgKiBhc3NlcnRUcnVlKGVkaXQudXJpRXhpc3RzKFRlc3RXb3Jrc3BhY2UuRUpCX01PRFVMRV9VUkkudG9TdHJpbmcoKSkpOwotCQkJICovCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vQlVHIENsYXNzQ2FzdEV4Y2VwdGlvbiBcXFxcXFxcXFxcXFxcXFxcXFxcXAotCi0JcHVibGljIHZvaWQgdGVzdEdldFdvcmtiZW5jaFV0aWxNb2R1bGVzKCkgewotCQlFQVJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gRUFSQXJ0aWZhY3RFZGl0LmdldEVBUkFydGlmYWN0RWRpdEZvclJlYWQoZWFyUHJvamVjdCk7Ci0JCQllZGl0LmdldFV0aWxpdHlNb2R1bGVSZWZlcmVuY2VzKCk7Ci0JCQkvLyAvLy8vLy8vLy8vLy8vL2NsYXNzY2FzdCBleGNlcHRpb24KLQkJCS8qCi0JCQkgKiBhc3NlcnROb3ROdWxsKGVkaXQuZ2V0V29ya2JlbmNoVXRpbE1vZHVsZXMod2JDb21wb25lbnQpKTsKLQkJCSAqLwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vL0JVRyBDbGFzc0Nhc3RFeGNlcHRpb24gXFxcXFxcXFxcXFxcXFxcXFxcXFwKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0V29ya2JlbmNoSjJFRU1vZHVsZXMoKSB7Ci0JCUVBUkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBFQVJBcnRpZmFjdEVkaXQuZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yUmVhZChlYXJQcm9qZWN0KTsKLQkJCWVkaXQuZ2V0SjJFRU1vZHVsZVJlZmVyZW5jZXMoKTsKLQkJCS8vIGNsYXNzQ2FzdAotCQkJLy8gYXNzZXJ0Tm90TnVsbChlZGl0LmdldFdvcmtiZW5jaEoyRUVNb2R1bGVzKHdiQ29tcG9uZW50KSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0KLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGFzcygpIHsKLQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgQXJ0aWZhY3RFZGl0TW9kZWwgZ2V0QXJ0aWZhY3RFZGl0TW9kZWxmb3JSZWFkKCkgewotCQlFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQgPSBuZXcgRU1GV29ya2JlbmNoQ29udGV4dChlYXJQcm9qZWN0KTsKLQkJcmV0dXJuIG5ldyBBcnRpZmFjdEVkaXRNb2RlbCh0aGlzLnRvU3RyaW5nKCksIGNvbnRleHQsIHRydWUsIFRlc3RXb3Jrc3BhY2UuQVBQX0NMSUVOVF9NT0RVTEVfVVJJKTsKLQl9Ci0KLQotCi0JcHVibGljIEVBUkFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkgewotCQlyZXR1cm4gbmV3IEVBUkFydGlmYWN0RWRpdChnZXRBcnRpZmFjdEVkaXRNb2RlbGZvclJlYWQoKSk7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9FSkJBcnRpZmFjdEVkaXRGVlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9hcGl0ZXN0cy9hcnRpZmFjdGVkaXQvRUpCQXJ0aWZhY3RFZGl0RlZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYjY3ZGEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9FSkJBcnRpZmFjdEVkaXRGVlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmZsZXhpYmxlLnByb2plY3QuYXBpdGVzdHMuYXJ0aWZhY3RlZGl0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQkphcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5lamIuY29tcG9uZW50Y29yZS51dGlsLkVKQkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLkVkaXRNb2RlbExpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgRUpCQXJ0aWZhY3RFZGl0RlZUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCQotCXByaXZhdGUgSVByb2plY3QgZWpiUHJvamVjdDsKLQlwcml2YXRlIFN0cmluZyBlamJNb2R1bGVOYW1lOwotCi0JcHVibGljIEVKQkFydGlmYWN0RWRpdEZWVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAoVGVzdFdvcmtzcGFjZS5pbml0KCkpIHsKLQkJCWVqYlByb2plY3QgPSBUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoVGVzdFdvcmtzcGFjZS5FSkJfUFJPSkVDVF9OQU1FKTsKLQkJCWVqYk1vZHVsZU5hbWUgPSBUZXN0V29ya3NwYWNlLkVKQl9NT0RVTEVfTkFNRTsKLQkJfSBlbHNlIHsKLQkJCWZhaWwoKTsKLQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbkRpc3Bvc2VGdW5jdGlvbigpIHsKLQkJRUpCQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEVKQkFydGlmYWN0RWRpdC5nZXRFSkJBcnRpZmFjdEVkaXRGb3JXcml0ZShlamJQcm9qZWN0KTsKLQkJCWVkaXQuYWRkTGlzdGVuZXIobmV3IEVkaXRNb2RlbExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGVkaXRNb2RlbENoYW5nZWQoRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgewotCQkJCQlwYXNzKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlFSkJKYXIgY2xpZW50ID0gZWRpdC5nZXRFSkJKYXIoKTsKLQkJCXVwZGF0ZUNsaWVudChjbGllbnQpOwotCQkJZWRpdC5zYXZlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNsaWVudChFSkJKYXIgY2xpZW50KSB7Ci0JCWNsaWVudC5zZXREZXNjcmlwdGlvbihUZXN0V29ya3NwYWNlLkZWVF9ERVNDUklQVElPTik7Ci0JCWNsaWVudC5zZXREaXNwbGF5TmFtZShUZXN0V29ya3NwYWNlLkZWVF9ESVNQTEFZX05BTUUpOwotCQljbGllbnQuc2V0TGFyZ2VJY29uKFRlc3RXb3Jrc3BhY2UuRlZUX0xBUkdFX0lDT04pOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhc3MoKSB7Ci0JCWFzc2VydFRydWUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBlcnNpc3RlbmNlRnVuY3Rpb24oKSB7Ci0JCUVKQkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoZWpiUHJvamVjdCk7Ci0JCQlFSkJKYXIgZWpiID0gZWRpdC5nZXRFSkJKYXIoKTsKLQkJCXBhc3MoZWpiKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFzcyhFSkJKYXIgZWpiKSB7Ci0JCWJvb2xlYW4gcGFzcyA9IGVqYi5nZXREZXNjcmlwdGlvbigpLmVxdWFscyhUZXN0V29ya3NwYWNlLkZWVF9ERVNDUklQVElPTikgJiYgZWpiLmdldERpc3BsYXlOYW1lKCkuZXF1YWxzKFRlc3RXb3Jrc3BhY2UuRlZUX0RJU1BMQVlfTkFNRSkgJiYgZWpiLmdldExhcmdlSWNvbigpLmVxdWFscyhUZXN0V29ya3NwYWNlLkZWVF9MQVJHRV9JQ09OKTsKLQkJYXNzZXJ0VHJ1ZShwYXNzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVSZXNvdXJjZSgpIHsKLQkJRUpCQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEVKQkFydGlmYWN0RWRpdC5nZXRFSkJBcnRpZmFjdEVkaXRGb3JXcml0ZShlamJQcm9qZWN0KTsKLS8vCQkJRUxpc3QgcmVzb3VyY2VMaXN0ID0gd2JDb21wb25lbnQuZ2V0UmVzb3VyY2VzKCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnRSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZUNvbXBvbmVudCgpIHsKLQkJQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2VDb21wb25lbnQgPSBDb21wb25lbnRjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9uZW50UmVzb3VyY2UoKTsKLQkJRmlsZSB0ZXN0RmlsZSA9IFRlc3RXb3Jrc3BhY2UuQVJUSUZBQ1RfRURJVF9GVlRfUkVTT1VSQ0VfUEFUSC50b0ZpbGUoKTsKLQkJaWYgKHRlc3RGaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXNvdXJjZUNvbXBvbmVudC5zZXRSdW50aW1lUGF0aChUZXN0V29ya3NwYWNlLkFSVElGQUNUX0VESVRfRlZUX1JFU09VUkNFX1BBVEgpOwotCQkJcmVzb3VyY2VDb21wb25lbnQuc2V0U291cmNlUGF0aChUZXN0V29ya3NwYWNlLkFSVElGQUNUX0VESVRfRlZUX1JFU09VUkNFX1BBVEgpOwotCQl9IGVsc2UgewotCQkJZmFpbCgiTWlzc2luZzogVGVzdFdvcmtzcGFjZS5BUlRJRkFDVF9FRElUX0ZWVF9SRVNPVVJDRV9QQVRIIik7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQ29tcG9uZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9FSkJBcnRpZmFjdEVkaXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvYXBpdGVzdHMvYXJ0aWZhY3RlZGl0L0VKQkFydGlmYWN0RWRpdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc5NDM4My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvYXBpdGVzdHMvYXJ0aWZhY3RlZGl0L0VKQkFydGlmYWN0RWRpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmZsZXhpYmxlLnByb2plY3QuYXBpdGVzdHMuYXJ0aWZhY3RlZGl0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uTW9kdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmNvbXBvbmVudGNvcmUudXRpbC5FSkJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLlhNTFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5BcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEVKQkFydGlmYWN0RWRpdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIElQcm9qZWN0IGVqYlByb2plY3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgZWpiTW9kdWxlTmFtZTsKLQotCXB1YmxpYyBFSkJBcnRpZmFjdEVkaXRUZXN0KCkgewotCQlzdXBlcigpOwotCi0JCWlmIChUZXN0V29ya3NwYWNlLmluaXQoKSkgewotCQkJZWpiUHJvamVjdCA9IFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdChUZXN0V29ya3NwYWNlLkVKQl9QUk9KRUNUX05BTUUpOwotCQkJZWpiTW9kdWxlTmFtZSA9IFRlc3RXb3Jrc3BhY2UuRUpCX01PRFVMRV9OQU1FOwotCQl9IGVsc2UgewotCQkJZmFpbCgpOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SjJFRVZlcnNpb24oKSB7Ci0JCUVKQkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yUmVhZChlamJQcm9qZWN0KTsKLQkJCVN0cmluZyB2ZXJzaW9uID0gbmV3IEludGVnZXIoZWRpdC5nZXRKMkVFVmVyc2lvbigpKS50b1N0cmluZygpOwotCQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uLmVxdWFscyhUZXN0V29ya3NwYWNlLkVKQl9QUk9KRUNUX1ZFUlNJT04pKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkgewotCQlFSkJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQoZWpiUHJvamVjdCk7Ci0JCQlTdHJpbmcgdXJpID0gZWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJlc291cmNlKCkuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJCWFzc2VydFRydWUodXJpLmVxdWFscyhUZXN0V29ya3NwYWNlLkVKQl9ERF9SRVNPVVJDRV9VUkkpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoZWRpdCAhPSBudWxsKTsKLQkJfQotCX0KLQotCS8vIC8vLy8vQlVHIGluIFBsYXRmb3JtVVJMXFxcXFxcXFxcXFwKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSB7Ci0JCUVKQkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yUmVhZChlamJQcm9qZWN0KTsKLQkJCWVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0JCQkvLyAvLy8vL0JVRyBpbiBQbGF0Zm9ybVVSTFxcXFxcXFxcXFxcdHVybmluZyB0ZXN0IG9mZi8vLy8KLQkJCS8qCi0JCQkgKiBFT2JqZWN0IG9iamVjdCA9IGVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7IGFzc2VydE5vdE51bGwob2JqZWN0KTsKLQkJCSAqLwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZShlZGl0ICE9IG51bGwpOwotCQl9Ci0JfQotCi0JLy8gLy8vLy8vLy8vLy8vL0JVRyBpbiBQbGF0Zm9ybVVSTFxcXFxcXFxcXFxcCi0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNb2RlbFJvb3QoKSB7Ci0JCUVKQkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoZWpiUHJvamVjdCk7Ci0JCQllZGl0LmNyZWF0ZU1vZGVsUm9vdCgpOwotCQkJLy8gLy8vL0JVRyB0dXJuaW5nIG9mZlxcXFxcXFxcXFxcXFwKLQkJCS8qCi0JCQkgKiBFT2JqZWN0IG9iamVjdCA9IGVkaXQuY3JlYXRlTW9kZWxSb290KCk7IGFzc2VydE5vdE51bGwob2JqZWN0KTsKLQkJCSAqLwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZShlZGl0ICE9IG51bGwpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBFT2JqZWN0IGNyZWF0ZU1vZGVsUm9vdChpbnQpCi0JICovCi0JLy8gLy8vLy8vLy8vLy8vLy8vQlVHIGluIFBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbgotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNb2RlbFJvb3RpbnQoKSB7Ci0JCUVKQkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIC8vLy8vLy9CVUcgaW4gUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uCi0JCQllZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQoZWpiUHJvamVjdCk7Ci0JCQllZGl0LmNyZWF0ZU1vZGVsUm9vdCgxNCk7Ci0JCQkvKgotCQkJICogRU9iamVjdCBvYmplY3QgPSBlZGl0LmNyZWF0ZU1vZGVsUm9vdCgxNCk7IGFzc2VydE5vdE51bGwob2JqZWN0KTsKLQkJCSAqLwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZShlZGl0ICE9IG51bGwpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIEVKQkFydGlmYWN0RWRpdChDb21wb25lbnRIYW5kbGUsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEVKQkFydGlmYWN0RWRpdENvbXBvbmVudEhhbmRsZWJvb2xlYW4oKSB7Ci0JCUVKQkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBuZXcgRUpCQXJ0aWZhY3RFZGl0KGVqYlByb2plY3QsIHRydWUpOwotCQkJYXNzZXJ0Tm90TnVsbChlZGl0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3Igdm9pZCBFSkJBcnRpZmFjdEVkaXQoQXJ0aWZhY3RFZGl0TW9kZWwpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEVKQkFydGlmYWN0RWRpdEFydGlmYWN0RWRpdE1vZGVsKCkgewotCQlFSkJBcnRpZmFjdEVkaXQgZWRpdCA9IG5ldyBFSkJBcnRpZmFjdEVkaXQoZ2V0QXJ0aWZhY3RFZGl0TW9kZWxmb3JSZWFkKCkpOwotCQlhc3NlcnROb3ROdWxsKGVkaXQpOwotCQllZGl0LmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RUpCSmFyWG1pUmVzb3VyY2UoKSB7Ci0JCUVKQkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yUmVhZChlamJQcm9qZWN0KTsKLQkJCVN0cmluZyB1cmkgPSBlZGl0LmdldEVKQkphclhtaVJlc291cmNlKCkudG9TdHJpbmcoKTsKLQkJCS8vIFRISVMgSVMgQSBCVUdcXCAtIGNvbW1tZW50aW5nIG91dCBhcyBzdWdnZXN0ZWQgYnkgRFcKLQkJCS8vIGFzc2VydFRydWUodXJpLmVxdWFscyhUZXN0V29ya3NwYWNlLkVKQl9ERF9YTUlfUkVTT1VSQ0VfVVJJKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vL0J1ZyB0dXJuaW5nIHRlc3Qgb2ZmXFxcXFxcXFxcXFwKLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNFSkJDbGllbnRKQVJQcm9qZWN0KCkgewotCQlFSkJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQoZWpiUHJvamVjdCk7Ci0JCQllZGl0Lmhhc0VKQkNsaWVudEpBUlByb2plY3QoKTsKLQkJCS8vIC8vLy8vQlVHXFxcXFxcXFxcXFwKLQkJCS8vIGJvb2xlYW4gYm9vbCA9IGVkaXQuaGFzRUpCQ2xpZW50SkFSUHJvamVjdChlamJQcm9qZWN0KTsKLQkJCS8vIGFzc2VydEVxdWFscyhib29sLCB0cnVlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVOZXdNb2R1bGUoKSB7Ci0JCUVKQkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBFSkJBcnRpZmFjdEVkaXQuZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yUmVhZChlamJQcm9qZWN0KTsKLQkJCU1vZHVsZSBtb2R1bGUgPSBlZGl0LmNyZWF0ZU5ld01vZHVsZSgpOwotCQkJYXNzZXJ0Tm90TnVsbChtb2R1bGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy9idWdcXFxcXFxcXFxcXFxcCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RUpCQ2xpZW50SmFyTW9kdWxlKCkgewotCQlFSkJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQoZWpiUHJvamVjdCk7Ci0JCQllZGl0LmdldEVKQkNsaWVudEphck1vZHVsZSgpOwotCQkJLy8gLy8vLy8vLy8vYnVnXFxcXFxcXFwKLQkJCS8vIFdvcmtiZW5jaENvbXBvbmVudCBjb21wID0gZWRpdC5nZXRFSkJDbGllbnRKYXJNb2R1bGUoZWpiUHJvamVjdCk7Ci0JCQkvLyBhc3NlcnROb3ROdWxsKGNvbXApOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEVKQkphcigpIHsKLQkJRUpCQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEVKQkFydGlmYWN0RWRpdC5nZXRFSkJBcnRpZmFjdEVkaXRGb3JSZWFkKGVqYlByb2plY3QpOwotCQkJRUpCSmFyIGphciA9IGVkaXQuZ2V0RUpCSmFyKCk7Ci0JCQlhc3NlcnROb3ROdWxsKGphcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVwbG95bWVueURlc2NyaXB0b3JUeXBlKCkgewotCQlFSkJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQoZWpiUHJvamVjdCk7Ci0JCQlpbnQgdHlwZSA9IGVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JUeXBlKCk7Ci0JCQlhc3NlcnRUcnVlKHR5cGUgPj0gMCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkRUpCSmFySWZOZWNlc3NhcnkoKSB7Ci0JCUVKQkFydGlmYWN0RWRpdCB0ZXN0ID0gbmV3IEVKQkFydGlmYWN0RWRpdChnZXRBcnRpZmFjdEVkaXRNb2RlbGZvclJlYWQoKSkgewotCQkJcHJvdGVjdGVkIHZvaWQgYWRkRUpCSmFySWZOZWNlc3NhcnkoWE1MUmVzb3VyY2UgYVJlc291cmNlKSB7Ci0JCQkJLy8gVE9ETyBhZGQgdGVzdAotCQkJCXN1cGVyLmFkZEVKQkphcklmTmVjZXNzYXJ5KGFSZXNvdXJjZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHRlc3QoKSB7Ci0JCQkJYWRkRUpCSmFySWZOZWNlc3NhcnkobnVsbCk7Ci0JCQl9Ci0JCX07Ci0KLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIEVKQkFydGlmYWN0RWRpdCBnZXRFSkJBcnRpZmFjdEVkaXRGb3JSZWFkKENvbXBvbmVudEhhbmRsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RUpCQXJ0aWZhY3RFZGl0Rm9yUmVhZENvbXBvbmVudEhhbmRsZSgpIHsKLQkJRUpCQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEVKQkFydGlmYWN0RWRpdC5nZXRFSkJBcnRpZmFjdEVkaXRGb3JSZWFkKGVqYlByb2plY3QpOwotCQkJYXNzZXJ0VHJ1ZShlZGl0ICE9IG51bGwpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBFSkJBcnRpZmFjdEVkaXQgZ2V0RUpCQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoQ29tcG9uZW50SGFuZGxlKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRFSkJBcnRpZmFjdEVkaXRGb3JXcml0ZUNvbXBvbmVudEhhbmRsZSgpIHsKLQkJRUpCQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEVKQkFydGlmYWN0RWRpdC5nZXRFSkJBcnRpZmFjdEVkaXRGb3JXcml0ZShlamJQcm9qZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoZWRpdCAhPSBudWxsKTsKLQkJfQotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgRUpCQXJ0aWZhY3RFZGl0IGdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQoV29ya2JlbmNoQ29tcG9uZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRFSkJBcnRpZmFjdEVkaXRGb3JSZWFkV29ya2JlbmNoQ29tcG9uZW50KCkgewotCQlFSkJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvclJlYWQoZWpiUHJvamVjdCk7Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIEVKQkFydGlmYWN0RWRpdCBnZXRFSkJBcnRpZmFjdEVkaXRGb3JXcml0ZShXb3JrYmVuY2hDb21wb25lbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldEVKQkFydGlmYWN0RWRpdEZvcldyaXRlV29ya2JlbmNoQ29tcG9uZW50KCkgewotCQlFSkJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gRUpCQXJ0aWZhY3RFZGl0LmdldEVKQkFydGlmYWN0RWRpdEZvcldyaXRlKGVqYlByb2plY3QpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZShlZGl0ICE9IG51bGwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzVmFsaWRFSkJNb2R1bGUoKSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGVqYlByb2plY3QsZWpiTW9kdWxlTmFtZSk7Ci0JCWJvb2xlYW4gdmFsaWQgPSBBcnRpZmFjdEVkaXQuaXNWYWxpZEVkaXRhYmxlTW9kdWxlKGNvbXBvbmVudCk7Ci0JCWFzc2VydFRydWUodmFsaWQpOwotCX0KLQotCXB1YmxpYyBBcnRpZmFjdEVkaXRNb2RlbCBnZXRBcnRpZmFjdEVkaXRNb2RlbGZvclJlYWQoKSB7Ci0JCUVNRldvcmtiZW5jaENvbnRleHQgY29udGV4dCA9IG5ldyBFTUZXb3JrYmVuY2hDb250ZXh0KGVqYlByb2plY3QpOwotCQlyZXR1cm4gbmV3IEFydGlmYWN0RWRpdE1vZGVsKHRoaXMudG9TdHJpbmcoKSwgY29udGV4dCwgdHJ1ZSwgVGVzdFdvcmtzcGFjZS5BUFBfQ0xJRU5UX01PRFVMRV9VUkkpOwotCX0KLQotCXB1YmxpYyBFSkJBcnRpZmFjdEVkaXQgZ2V0QXJ0aWZhY3RFZGl0Rm9yUmVhZCgpIHsKLQkJcmV0dXJuIG5ldyBFSkJBcnRpZmFjdEVkaXQoZ2V0QXJ0aWZhY3RFZGl0TW9kZWxmb3JSZWFkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhc3MoKSB7Ci0JCWFzc2VydFRydWUodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9FYXJBcnRpRmFjdEVkaXRGVlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9hcGl0ZXN0cy9hcnRpZmFjdGVkaXQvRWFyQXJ0aUZhY3RFZGl0RlZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTkyMzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9FYXJBcnRpRmFjdEVkaXRGVlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmZsZXhpYmxlLnByb2plY3QuYXBpdGVzdHMuYXJ0aWZhY3RlZGl0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbXBvbmVudGNvcmUudXRpbC5FQVJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRjb3JlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIEVhckFydGlGYWN0RWRpdEZWVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQkKLQotCXByaXZhdGUgSVByb2plY3QgZWFyUHJvamVjdDsKLQlwcml2YXRlIFN0cmluZyBlYXJNb2R1bGVOYW1lOwotCi0JcHVibGljIEVhckFydGlGYWN0RWRpdEZWVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAoVGVzdFdvcmtzcGFjZS5pbml0KCkpIHsKLQkJCWVhclByb2plY3QgPSBUZXN0V29ya3NwYWNlLmdldFRhcmdldFByb2plY3QoVGVzdFdvcmtzcGFjZS5FQVJfUFJPSkVDVF9OQU1FKTsKLQkJCWVhck1vZHVsZU5hbWUgPSBUZXN0V29ya3NwYWNlLkVBUl9NT0RVTEVfTkFNRTsKLQkJfSBlbHNlIHsKLQkJCWZhaWwoKTsKLQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGlvbkRpc3Bvc2VGdW5jdGlvbigpIHsKLQkJRUFSQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JXcml0ZShlYXJQcm9qZWN0KTsKLQkJCWVkaXQuYWRkTGlzdGVuZXIobmV3IEVkaXRNb2RlbExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGVkaXRNb2RlbENoYW5nZWQoRWRpdE1vZGVsRXZlbnQgYW5FdmVudCkgewotCQkJCQlwYXNzKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlBcHBsaWNhdGlvbiBjbGllbnQgPSBlZGl0LmdldEFwcGxpY2F0aW9uKCk7Ci0JCQl1cGRhdGVDbGllbnQoY2xpZW50KTsKLQkJCWVkaXQuc2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNsaWVudChBcHBsaWNhdGlvbiBjbGllbnQpIHsKLQkJY2xpZW50LnNldERlc2NyaXB0aW9uKFRlc3RXb3Jrc3BhY2UuRlZUX0RFU0NSSVBUSU9OKTsKLQkJY2xpZW50LnNldERpc3BsYXlOYW1lKFRlc3RXb3Jrc3BhY2UuRlZUX0RJU1BMQVlfTkFNRSk7Ci0JCWNsaWVudC5zZXRMYXJnZUljb24oVGVzdFdvcmtzcGFjZS5GVlRfTEFSR0VfSUNPTik7Ci0KLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYXNzKEFwcGxpY2F0aW9uIGNsaWVudCkgewotCQlib29sZWFuIHBhc3MgPSBjbGllbnQuZ2V0RGVzY3JpcHRpb24oKS5lcXVhbHMoVGVzdFdvcmtzcGFjZS5GVlRfREVTQ1JJUFRJT04pICYmIGNsaWVudC5nZXREaXNwbGF5TmFtZSgpLmVxdWFscyhUZXN0V29ya3NwYWNlLkZWVF9ESVNQTEFZX05BTUUpICYmIGNsaWVudC5nZXRMYXJnZUljb24oKS5lcXVhbHMoVGVzdFdvcmtzcGFjZS5GVlRfTEFSR0VfSUNPTik7Ci0JCWFzc2VydFRydWUocGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhc3MoKSB7Ci0JCWFzc2VydFRydWUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBlcnNpc3RlbmNlRnVuY3Rpb24oKSB7Ci0JCUVBUkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBFQVJBcnRpZmFjdEVkaXQuZ2V0RUFSQXJ0aWZhY3RFZGl0Rm9yV3JpdGUoZWFyUHJvamVjdCk7Ci0JCQlBcHBsaWNhdGlvbiBlYXIgPSBlZGl0LmdldEFwcGxpY2F0aW9uKCk7Ci0JCQlwYXNzKGVhcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhc3MoQXBwbGljYXRpb25DbGllbnQgZWFyKSB7Ci0JCWJvb2xlYW4gcGFzcyA9IGVhci5nZXREZXNjcmlwdGlvbigpLmVxdWFscyhUZXN0V29ya3NwYWNlLkZWVF9ERVNDUklQVElPTikgJiYgZWFyLmdldERpc3BsYXlOYW1lKCkuZXF1YWxzKFRlc3RXb3Jrc3BhY2UuRlZUX0RJU1BMQVlfTkFNRSkgJiYgZWFyLmdldExhcmdlSWNvbigpLmVxdWFscyhUZXN0V29ya3NwYWNlLkZWVF9MQVJHRV9JQ09OKTsKLQkJYXNzZXJ0VHJ1ZShwYXNzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVSZXNvdXJjZSgpIHsKLQkJRUFSQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IEVBUkFydGlmYWN0RWRpdC5nZXRFQVJBcnRpZmFjdEVkaXRGb3JXcml0ZShlYXJQcm9qZWN0KTsKLS8vCQkJRUxpc3QgcmVzb3VyY2VMaXN0ID0gd2JDb21wb25lbnQuZ2V0UmVzb3VyY2VzKCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnRSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZUNvbXBvbmVudCgpIHsKLQkJQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2VDb21wb25lbnQgPSBDb21wb25lbnRjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9uZW50UmVzb3VyY2UoKTsKLQkJRmlsZSB0ZXN0RmlsZSA9IFRlc3RXb3Jrc3BhY2UuQVJUSUZBQ1RfRURJVF9GVlRfUkVTT1VSQ0VfUEFUSC50b0ZpbGUoKTsKLQkJaWYgKHRlc3RGaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXNvdXJjZUNvbXBvbmVudC5zZXRSdW50aW1lUGF0aChUZXN0V29ya3NwYWNlLkFSVElGQUNUX0VESVRfRlZUX1JFU09VUkNFX1BBVEgpOwotCQkJcmVzb3VyY2VDb21wb25lbnQuc2V0U291cmNlUGF0aChUZXN0V29ya3NwYWNlLkFSVElGQUNUX0VESVRfRlZUX1JFU09VUkNFX1BBVEgpOwotCQl9IGVsc2UgewotCQkJZmFpbCgiTWlzc2luZzogVGVzdFdvcmtzcGFjZS5BUlRJRkFDVF9FRElUX0ZWVF9SRVNPVVJDRV9QQVRIIik7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlQ29tcG9uZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9FbnRlcnByaXNlQXJ0aWZhY3RFZGl0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9FbnRlcnByaXNlQXJ0aWZhY3RFZGl0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGY2MzgxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9hcGl0ZXN0cy9hcnRpZmFjdGVkaXQvRW50ZXJwcmlzZUFydGlmYWN0RWRpdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZmxleGlibGUucHJvamVjdC5hcGl0ZXN0cy5hcnRpZmFjdGVkaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21wb25lbnRjb3JlLkVudGVycHJpc2VBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tcG9uZW50Y29yZS51dGlsLkVBUkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlN0cnVjdHVyZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLldvcmtiZW5jaENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5FTUZXb3JrYmVuY2hDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgRW50ZXJwcmlzZUFydGlmYWN0RWRpdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBlYXJQcm9qZWN0OwotCXByaXZhdGUgU3RyaW5nIGVhck1vZHVsZU5hbWU7Ci0KLQlwdWJsaWMgRW50ZXJwcmlzZUFydGlmYWN0RWRpdFRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChUZXN0V29ya3NwYWNlLmluaXQoKSkgewotCQkJZWFyUHJvamVjdCA9IFRlc3RXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdChUZXN0V29ya3NwYWNlLkVBUl9QUk9KRUNUX05BTUUpOwotCQkJZWFyTW9kdWxlTmFtZSA9IFRlc3RXb3Jrc3BhY2UuRUFSX01PRFVMRV9OQU1FOwotCQl9IGVsc2UgewotCQkJZmFpbCgpOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50ZXJwcmlzZUFydGlmYWN0RWRpdENvbXBvbmVudEhhbmRsZWJvb2xlYW4oKSB7Ci0JCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCVdvcmtiZW5jaENvbXBvbmVudCB3YkNvbXBvbmVudCA9IG51bGw7Ci0JCUVudGVycHJpc2VBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yV3JpdGUoZWFyUHJvamVjdCk7Ci0JCQl3YkNvbXBvbmVudCA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50KCk7Ci0JCQllZGl0ID0gbmV3IEVBUkFydGlmYWN0RWRpdChlYXJQcm9qZWN0LCB0cnVlKTsKLQkJCWFzc2VydE5vdE51bGwoZWRpdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKSB7Ci0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50ZXJwcmlzZUFydGlmYWN0RWRpdEFydGlmYWN0RWRpdE1vZGVsKCkgewotCQlFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IGVkaXQgPSBuZXcgRUFSQXJ0aWZhY3RFZGl0KGdldEFydGlmYWN0RWRpdE1vZGVsZm9yUmVhZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChlZGl0KTsKLQkJZWRpdC5kaXNwb3NlKCk7Ci0JfQotCi0KLQkvLy8vLy8vLy8vQlVHCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkgewotCQlFbnRlcnByaXNlQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IG5ldyBFQVJBcnRpZmFjdEVkaXQoZWFyUHJvamVjdCx0cnVlKTsKLQkJCWVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0JCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL0JVR1xcXFxcXFxcXFxcCi0JCQkvL2Fzc2VydE5vdE51bGwoZWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIGZhaWwoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgQXJ0aWZhY3RFZGl0TW9kZWwgZ2V0QXJ0aWZhY3RFZGl0TW9kZWxmb3JSZWFkKCkgewotCQlFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQgPSBuZXcgRU1GV29ya2JlbmNoQ29udGV4dChlYXJQcm9qZWN0KTsKLQkJcmV0dXJuIG5ldyBBcnRpZmFjdEVkaXRNb2RlbCh0aGlzLnRvU3RyaW5nKCksIGNvbnRleHQsIHRydWUsIFRlc3RXb3Jrc3BhY2UuQVBQX0NMSUVOVF9NT0RVTEVfVVJJKTsKLQl9Ci0KLQotCi0JcHVibGljIEVBUkFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkgewotCQlyZXR1cm4gbmV3IEVBUkFydGlmYWN0RWRpdChnZXRBcnRpZmFjdEVkaXRNb2RlbGZvclJlYWQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvYXBpdGVzdHMvYXJ0aWZhY3RlZGl0L0oyRUVBcnRpZmFjdEVkaXRBUElBbGxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvYXBpdGVzdHMvYXJ0aWZhY3RlZGl0L0oyRUVBcnRpZmFjdEVkaXRBUElBbGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OGM2MTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9KMkVFQXJ0aWZhY3RFZGl0QVBJQWxsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5mbGV4aWJsZS5wcm9qZWN0LmFwaXRlc3RzLmFydGlmYWN0ZWRpdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuYXJ0aWZhY3RlZGl0LnRlc3RzLkFydGlmYWN0RWRpdEFQSVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuU2ltcGxlVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSjJFRUFydGlmYWN0RWRpdEFQSUFsbFRlc3QgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBBcnRpZmFjdEVkaXRBUElUZXN0cygpOwotCX0KLQotCXB1YmxpYyBKMkVFQXJ0aWZhY3RFZGl0QVBJQWxsVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQkJYWRkVGVzdChuZXcgU2ltcGxlVGVzdFN1aXRlKEFwcENsaWVudEFydGlmYWN0RWRpdFRlc3QuY2xhc3MpKTsKLQkJLy9hZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoQXBwQ2xpZW50QXJ0aWZhY3RFZGl0RlZUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFNpbXBsZVRlc3RTdWl0ZShDb25uZWN0b3JBcnRpZmFjdEVkaXRUZXN0LmNsYXNzKSk7Ci0JCS8vYWRkVGVzdChuZXcgU2ltcGxlVGVzdFN1aXRlKENvbm5lY3RvckFydGlmYWN0RWRpdEZWVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoRUFSQXJ0aWZhY3RFZGl0VGVzdC5jbGFzcykpOwotCQkvL2FkZFRlc3QobmV3IFNpbXBsZVRlc3RTdWl0ZShFYXJBcnRpRmFjdEVkaXRGVlRlc3QuY2xhc3MpKTsKLQkJYWRkVGVzdChuZXcgU2ltcGxlVGVzdFN1aXRlKFdlYkFydGlmYWN0RWRpdFRlc3QuY2xhc3MpKTsKLQkJLy9hZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoV2ViQXJ0aWZhY3RFZGl0RlZUZXN0LmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFNpbXBsZVRlc3RTdWl0ZShFSkJBcnRpZmFjdEVkaXRUZXN0LmNsYXNzKSk7Ci0JCS8vYWRkVGVzdChuZXcgU2ltcGxlVGVzdFN1aXRlKEVKQkFydGlmYWN0RWRpdEZWVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoRW50ZXJwcmlzZUFydGlmYWN0RWRpdFRlc3QuY2xhc3MpKTsKLQkJYWRkVGVzdChuZXcgU2ltcGxlVGVzdFN1aXRlKFdTRERBcnRpZmFjdEVkaXRGVlRlc3QuY2xhc3MpKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9KYXhSUENNYXBBcnRpZmFjdEVkaXRGVlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9hcGl0ZXN0cy9hcnRpZmFjdGVkaXQvSmF4UlBDTWFwQXJ0aWZhY3RFZGl0RlZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZWM2ZTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9KYXhSUENNYXBBcnRpZmFjdEVkaXRGVlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZmxleGlibGUucHJvamVjdC5hcGl0ZXN0cy5hcnRpZmFjdGVkaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbXBvbmVudGNvcmUudXRpbC5KYXhSUENNYXBBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmNvbXBvbmVudGNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViQXBwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgSmF4UlBDTWFwQXJ0aWZhY3RFZGl0RlZUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBJUHJvamVjdCB3ZWJQcm9qZWN0OwotCXByaXZhdGUgU3RyaW5nIHdlYk1vZHVsZU5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgc2VydmVyQ29udGV4dERhdGEgPSBUZXN0V29ya3NwYWNlLldFQl9TRVJWRVJfQ09OVEVYVF9ST09UICsgIlRlc3QiOwotCi0JcHVibGljIEpheFJQQ01hcEFydGlmYWN0RWRpdEZWVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKFRlc3RXb3Jrc3BhY2UuaW5pdCgpKSB7Ci0JCQl3ZWJQcm9qZWN0ID0gVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KFRlc3RXb3Jrc3BhY2UuV0VCX1BST0pFQ1RfTkFNRSk7Ci0JCQl3ZWJNb2R1bGVOYW1lID0gVGVzdFdvcmtzcGFjZS5XRUJfTU9EVUxFX05BTUU7Ci0JCX0gZWxzZSB7Ci0JCQlmYWlsKCk7Ci0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2xpZW50KFdlYlNlcnZpY2VzIGNsaWVudCkgewotCQljbGllbnQuc2V0RGVzY3JpcHRpb24oVGVzdFdvcmtzcGFjZS5GVlRfREVTQ1JJUFRJT04pOwotCQljbGllbnQuc2V0RGlzcGxheU5hbWUoVGVzdFdvcmtzcGFjZS5GVlRfRElTUExBWV9OQU1FKTsKLQkJY2xpZW50LnNldExhcmdlSWNvbihUZXN0V29ya3NwYWNlLkZWVF9MQVJHRV9JQ09OKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwYXNzKCkgewotCQlhc3NlcnRUcnVlKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJzaXN0ZW5jZUZ1bmN0aW9uKCkgewotCQlKYXhSUENNYXBBcnRpZmFjdEVkaXQgamF4ZWRpdCA9IG51bGw7Ci0JCVdlYkFydGlmYWN0RWRpdCB3ZWJlZGl0ID0gbnVsbDsKLQkJCi0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQod2ViUHJvamVjdCx3ZWJNb2R1bGVOYW1lKTsKLQkJCQotCQkJamF4ZWRpdCA9IEpheFJQQ01hcEFydGlmYWN0RWRpdC5nZXRKYXhSUENNYXBBcnRpZmFjdEVkaXRGb3JSZWFkKGNvbXApOwotCQkJamF4ZWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoIldlYkFydGlmYWN0RWRpdFRlc3QvV2ViQXJ0aWZhY3RFZGl0TW9kdWxlL1dlYkNvbnRlbnQvV0VCLUlORi90ZXN0bWFwLnhtbCIpOwotCQkJamF4ZWRpdC5kaXNwb3NlKCk7Ci0JCQl3ZWJlZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvcldyaXRlKGNvbXApOwotCQkJV2ViQXBwIHdlYmFwcCA9IHdlYmVkaXQuZ2V0V2ViQXBwKCk7Ci0JCQl3ZWJlZGl0LnNhdmVJZk5lY2Vzc2FyeShudWxsKTsKLQkJCXdlYmVkaXQuZGlzcG9zZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFzcyhXZWJTZXJ2aWNlcyB3ZWJzZXJ2aWNlKSB7Ci0JCWJvb2xlYW4gcGFzcyA9IHdlYnNlcnZpY2UuZ2V0RGVzY3JpcHRpb24oKS5lcXVhbHMoVGVzdFdvcmtzcGFjZS5GVlRfREVTQ1JJUFRJT04pICYmIAotCQkJd2Vic2VydmljZS5nZXREaXNwbGF5TmFtZSgpLmVxdWFscyhUZXN0V29ya3NwYWNlLkZWVF9ESVNQTEFZX05BTUUpICYmCi0JCQl3ZWJzZXJ2aWNlLmdldExhcmdlSWNvbigpLmVxdWFscyhUZXN0V29ya3NwYWNlLkZWVF9MQVJHRV9JQ09OKTsKLQkJYXNzZXJ0VHJ1ZShwYXNzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVSZXNvdXJjZSgpIHsKLQkJV2ViQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JXcml0ZSh3ZWJQcm9qZWN0KTsKLS8vCQkJRUxpc3QgcmVzb3VyY2VMaXN0ID0gd2JDb21wb25lbnQuZ2V0UmVzb3VyY2VzKCk7Ci0vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCi0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9hcGl0ZXN0cy9hcnRpZmFjdGVkaXQvVGVzdDBfN1dvcmtzcGFjZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9UZXN0MF83V29ya3NwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjhhYTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9UZXN0MF83V29ya3NwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZmxleGlibGUucHJvamVjdC5hcGl0ZXN0cy5hcnRpZmFjdGVkaXQ7Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXRvb2xzLmNvbW1vbi50ZXN0LmFwaXRvb2xzLlByb2plY3RVbnppcFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMucGx1Z2luLkhlYWRsZXNzVGVzdHNQbHVnaW47Ci0KLQotCi1wdWJsaWMgY2xhc3MgVGVzdDBfN1dvcmtzcGFjZSB7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIElQYXRoIHdvcmtzcGFjZUxvY2F0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFSVElGQUNUX0VESVRfRlZUX1JFU09VUkNFX1BBVEhfTkFNRSA9ICIvQXJ0aWZhY3RFZGl0RnVuY3Rpb25UZXN0UmVzb3VyY2UudHh0IjsKLQlwdWJsaWMgc3RhdGljIElQYXRoIEFSVElGQUNUX0VESVRfRlZUX1JFU09VUkNFX1BBVEggPSB3b3Jrc3BhY2VMb2NhdGlvbi5hcHBlbmQoQVJUSUZBQ1RfRURJVF9GVlRfUkVTT1VSQ0VfUEFUSF9OQU1FKTsKLQkJCi0JcHJpdmF0ZSBzdGF0aWMgUGF0aCB6aXBGaWxlUGF0aCA9IG5ldyBQYXRoKCIvVGVzdERhdGEvR2VucmFsQXJ0aWZhY3RUZXN0L1RFU1QwXzcuemlwIik7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gcHJvamVjdE5hbWVzID0gbmV3IFN0cmluZ1tdeyIuSkVURW1pdHRlcnMiLCAiTXlFYXIiLCAiTXlFYXJDbGllbnQiLCAiTXlFYXJDb25uZWN0b3IiLCAiTXlFYXJFSkIiLCJUZXN0V2ViIiwiVGVzdFdlYkVBUiIsIlV0aWwxIn07Ci0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRXb3Jrc3BhY2U7Ci0JCi0KLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9JTkYgPSAiTUVUQS1JTkYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lORiA9ICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBnZXRUYXJnZXRQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY3JlYXRlUHJvamVjdHMoKSB7Ci0JCUlQYXRoIGxvY2FsWmlwUGF0aCA9IGdldExvY2FsUGF0aCgpOwotCQlQcm9qZWN0VW56aXBVdGlsIHV0aWwgPSBuZXcgUHJvamVjdFVuemlwVXRpbChsb2NhbFppcFBhdGgsIHByb2plY3ROYW1lcyk7Ci0JCXJldHVybiB1dGlsLmNyZWF0ZVByb2plY3RzKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVBhdGggZ2V0TG9jYWxQYXRoKCkgewotCQlVUkwgdXJsID0gSGVhZGxlc3NUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCkuZmluZCh6aXBGaWxlUGF0aCk7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQYXRoKHVybC5nZXRQYXRoKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbml0KCkgewotCQkvLyByZXZpc2l0Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRUYXJnZXRQcm9qZWN0KCJNeUVhciIpOwotCQlpZiAocHJvamVjdC5leGlzdHMoKSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gY3JlYXRlUHJvamVjdHMoKTsKLQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBpc1ZhbGlkV29ya3NwYWNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9hcGl0ZXN0cy9hcnRpZmFjdGVkaXQvVGVzdFdvcmtzcGFjZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9UZXN0V29ya3NwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MDUyMGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9UZXN0V29ya3NwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmZsZXhpYmxlLnByb2plY3QuYXBpdGVzdHMuYXJ0aWZhY3RlZGl0OwotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXRvb2xzLmNvbW1vbi50ZXN0LmFwaXRvb2xzLlByb2plY3RVbnppcFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMucGx1Z2luLkhlYWRsZXNzVGVzdHNQbHVnaW47Ci0KLQotCi1wdWJsaWMgY2xhc3MgVGVzdFdvcmtzcGFjZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfUFJPSkVDVF9OQU1FID0gIkVBUkFydGlmYWN0RWRpdFRlc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX01PRFVMRV9OQU1FID0gIkVBUkFydGlmYWN0TW9kdWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX1BST0pFQ1RfVkVSU0lPTiA9ICIxLjQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFSX0REX1JFU09VUkNFX1VSSSA9ICJwbGF0Zm9ybTovcmVzb3VyY2UvRUFSQXJ0aWZhY3RNb2R1bGUvRUFSQXJ0aWZhY3RNb2R1bGUvTUVUQS1JTkYvYXBwbGljYXRpb24ueG1sIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBUl9ERF9YTUlfUkVTT1VSQ0VfVVJJID0gInBsYXRmb3JtOi9yZXNvdXJjZS8vRUFSQXJ0aWZhY3RFZGl0VGVzdC9FQVJBcnRpZmFjdE1vZHVsZS9lamJNb2R1bGUvTUVUQS1JTkYvZWpiLWphci54bWkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBFQVJfTU9EVUxFX1VSSSA9IFVSSS5jcmVhdGVVUkkoIm1vZHVsZTovcmVzb3VyY2UvRUFSQXJ0aWZhY3RFZGl0VGVzdC9FQVJBcnRpZmFjdE1vZHVsZSIpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9QUk9KRUNUX05BTUUgPSAiQXBwbGljYXRpb25DbGllbnRBcnRpZmFjdEVkaXRUZXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9DTElFTlRfTU9EVUxFX05BTUUgPSAiQXBwbGljYXRpb25DbGllbnRNb2R1bGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9QUk9KRUNUX1ZFUlNJT04gPSAiMS40IjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9ERF9SRVNPVVJDRV9VUkkgPSAicGxhdGZvcm06L3Jlc291cmNlL0FwcGxpY2F0aW9uQ2xpZW50TW9kdWxlL0FwcGxpY2F0aW9uQ2xpZW50TW9kdWxlL2FwcENsaWVudE1vZHVsZS9NRVRBLUlORi9hcHBsaWNhdGlvbi1jbGllbnQueG1sIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX0NMSUVOVF9ERF9YTUlfUkVTT1VSQ0VfVVJJID0gInBsYXRmb3JtOi9yZXNvdXJjZS9BcHBsaWNhdGlvbkNsaWVudE1vZHVsZS9BcHBsaWNhdGlvbkNsaWVudE1vZHVsZS9hcHBDbGllbnRNb2R1bGUvTUVUQS1JTkYvYXBwbGljYXRpb24tY2xpZW50LnhtaSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIEFQUF9DTElFTlRfTU9EVUxFX1VSSSA9IFVSSS5jcmVhdGVVUkkoIm1vZHVsZTovcmVzb3VyY2UvQXBwbGljYXRpb25DbGllbnRBcnRpZmFjdEVkaXRUZXN0L0FwcGxpY2F0aW9uQ2xpZW50TW9kdWxlIik7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCX1BST0pFQ1RfTkFNRSA9ICJFSkJBcnRpZmFjdEVkaXRUZXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9NT0RVTEVfTkFNRSA9ICJFSkJBcnRpZmFjdEVkaXRNb2R1bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfUFJPSkVDVF9WRVJTSU9OID0gIjIuMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfRERfUkVTT1VSQ0VfVVJJID0gInBsYXRmb3JtOi9yZXNvdXJjZS9FQVJBcnRpZmFjdEVkaXRUZXN0L0VBUkFydGlmYWN0TW9kdWxlL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtbCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9ERF9YTUlfUkVTT1VSQ0VfVVJJID0gInBsYXRmb3JtOi9yZXNvdXJjZS9FQVJBcnRpZmFjdEVkaXRUZXN0L0VBUkFydGlmYWN0TW9kdWxlL01FVEEtSU5GL2FwcGxpY2F0aW9uLnhtaSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIEVKQl9NT0RVTEVfVVJJID0gVVJJLmNyZWF0ZVVSSSgibW9kdWxlOi9yZXNvdXJjZS9FQVJBcnRpZmFjdEVkaXRUZXN0L0VBUkFydGlmYWN0TW9kdWxlIik7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfUFJPSkVDVF9OQU1FID0gIldlYkFydGlmYWN0RWRpdFRlc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX01PRFVMRV9OQU1FID0gIldlYkFydGlmYWN0RWRpdE1vZHVsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfUFJPSkVDVF9WRVJTSU9OID0gIjIuNCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9ERF9SRVNPVVJDRV9VUkkgPSAicGxhdGZvcm06L3Jlc291cmNlL1dlYkFydGlmYWN0RWRpdE1vZHVsZS9XZWJBcnRpZmFjdEVkaXRNb2R1bGUvV2ViQ29udGVudC9XRUItSU5GL3dlYi54bWwiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfRERfWE1JX1JFU09VUkNFX1VSSSA9ICJwbGF0Zm9ybTovcmVzb3VyY2UvV2ViQXJ0aWZhY3RFZGl0TW9kdWxlL1dlYkFydGlmYWN0RWRpdE1vZHVsZS9XZWJDb250ZW50L1dFQi1JTkYvd2ViLnhtaSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIFdFQl9NT0RVTEVfVVJJID0gVVJJLmNyZWF0ZVVSSSgibW9kdWxlOi9yZXNvdXJjZS9XZWJBcnRpZmFjdEVkaXRUZXN0L1dlYkFydGlmYWN0RWRpdE1vZHVsZSIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9TRVJWRVJfQ09OVEVYVF9ST09UID0gIldlYkNvbnRlbnQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX1BST0pFQ1RfTkFNRSA9ICJKQ0FBcnRpZmFjdEVkaXRUZXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpDQV9NT0RVTEVfTkFNRSA9ICJKQ0FBcnRpZmFjdEVkaXRUZXN0TW9kdWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX1BST0pFQ1RfVkVSU0lPTiA9ICIxLjUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkNBX0REX1JFU09VUkNFX1VSSSA9ICJwbGF0Zm9ybTovcmVzb3VyY2UvSkNBQXJ0aWZhY3RFZGl0VGVzdE1vZHVsZS9KQ0FBcnRpZmFjdEVkaXRUZXN0TW9kdWxlL2Nvbm5lY3Rvck1vZHVsZS9NRVRBLUlORi9yYS54bWwiOy8vJE5PTi1OTFMtMSQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBVUkkgSkNBX01PRFVMRV9VUkkgPSBVUkkuY3JlYXRlVVJJKCJtb2R1bGU6L3Jlc291cmNlL0pDQUFydGlmYWN0RWRpdFRlc3QvSkNBQXJ0aWZhY3RFZGl0TW9kdWxlIik7Ci0gICAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVlRfREVTQ1JJUFRJT04gPSAiRlZUIERlc2NyaXB0aW9uIFRlc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZWVF9ESVNQTEFZX05BTUUgPSAiRlZUIERpc3BsYXlOYW1lIFRlc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZWVF9MQVJHRV9JQ09OID0gImZ2dExhcmdlSWNvbi5naWYiOwotCXB1YmxpYyBzdGF0aWMgSVBhdGggd29ya3NwYWNlTG9jYXRpb24gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVJUSUZBQ1RfRURJVF9GVlRfUkVTT1VSQ0VfUEFUSF9OQU1FID0gIi9BcnRpZmFjdEVkaXRGdW5jdGlvblRlc3RSZXNvdXJjZS50eHQiOwotCXB1YmxpYyBzdGF0aWMgSVBhdGggQVJUSUZBQ1RfRURJVF9GVlRfUkVTT1VSQ0VfUEFUSCA9IHdvcmtzcGFjZUxvY2F0aW9uLmFwcGVuZChBUlRJRkFDVF9FRElUX0ZWVF9SRVNPVVJDRV9QQVRIX05BTUUpOwotCQkKLQlwcml2YXRlIHN0YXRpYyBQYXRoIHppcEZpbGVQYXRoID0gbmV3IFBhdGgoIi9UZXN0RGF0YS9HZW5yYWxBcnRpZmFjdFRlc3QvSjJFRUFydGlmYWN0RWRpdFRlc3RQcm9qZWN0cy56aXAiKTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBwcm9qZWN0TmFtZXMgPSBuZXcgU3RyaW5nW117RUFSX1BST0pFQ1RfTkFNRSwgQVBQX0NMSUVOVF9QUk9KRUNUX05BTUUsIEVKQl9QUk9KRUNUX05BTUUsIFdFQl9QUk9KRUNUX05BTUUsIEpDQV9QUk9KRUNUX05BTUV9OwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkV29ya3NwYWNlOwotCQotCi0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFfSU5GID0gIk1FVEEtSU5GIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTkYgPSAiV0VCLUlORiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZ2V0VGFyZ2V0UHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNyZWF0ZVByb2plY3RzKCkgewotCQlJUGF0aCBsb2NhbFppcFBhdGggPSBnZXRMb2NhbFBhdGgoKTsKLQkJUHJvamVjdFVuemlwVXRpbCB1dGlsID0gbmV3IFByb2plY3RVbnppcFV0aWwobG9jYWxaaXBQYXRoLCBwcm9qZWN0TmFtZXMpOwotCQlyZXR1cm4gdXRpbC5jcmVhdGVQcm9qZWN0cygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElQYXRoIGdldExvY2FsUGF0aCgpIHsKLQkJVVJMIHVybCA9IEhlYWRsZXNzVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpbmQoemlwRmlsZVBhdGgpOwotCQl0cnkgewotCQkJdXJsID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBuZXcgUGF0aCh1cmwuZ2V0UGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW5pdCgpIHsKLQkJLy8gcmV2aXNpdAotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0VGFyZ2V0UHJvamVjdChBUFBfQ0xJRU5UX1BST0pFQ1RfTkFNRSk7Ci0JCWlmIChwcm9qZWN0LmV4aXN0cygpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBjcmVhdGVQcm9qZWN0cygpOwotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWYWxpZFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIGlzVmFsaWRXb3Jrc3BhY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9XU0REQXJ0aWZhY3RFZGl0RlZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvYXBpdGVzdHMvYXJ0aWZhY3RlZGl0L1dTRERBcnRpZmFjdEVkaXRGVlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk3NWZlOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvYXBpdGVzdHMvYXJ0aWZhY3RlZGl0L1dTRERBcnRpZmFjdEVkaXRGVlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZmxleGlibGUucHJvamVjdC5hcGl0ZXN0cy5hcnRpZmFjdGVkaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWJzZXJ2aWNlLmNvbXBvbmVudGNvcmUudXRpbC5XU0REQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYnNlcnZpY2Uud3NkZC5XZWJTZXJ2aWNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbi5FZGl0TW9kZWxMaXN0ZW5lcjsKLQotcHVibGljIGNsYXNzIFdTRERBcnRpZmFjdEVkaXRGVlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIElQcm9qZWN0IHdlYlByb2plY3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgd2ViTW9kdWxlTmFtZTsKLQlwcml2YXRlIFN0cmluZyBzZXJ2ZXJDb250ZXh0RGF0YSA9IFRlc3RXb3Jrc3BhY2UuV0VCX1NFUlZFUl9DT05URVhUX1JPT1QgKyAiVGVzdCI7Ci0KLQlwdWJsaWMgV1NEREFydGlmYWN0RWRpdEZWVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKFRlc3RXb3Jrc3BhY2UuaW5pdCgpKSB7Ci0JCQl3ZWJQcm9qZWN0ID0gVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KFRlc3RXb3Jrc3BhY2UuV0VCX1BST0pFQ1RfTkFNRSk7Ci0JCQl3ZWJNb2R1bGVOYW1lID0gVGVzdFdvcmtzcGFjZS5XRUJfTU9EVUxFX05BTUU7Ci0JCX0gZWxzZSB7Ci0JCQlmYWlsKCk7Ci0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb25EaXNwb3NlRnVuY3Rpb24oKSB7Ci0JCVdTRERBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gV1NEREFydGlmYWN0RWRpdC5nZXRXU0REQXJ0aWZhY3RFZGl0Rm9yV3JpdGUod2ViUHJvamVjdCk7Ci0JCQllZGl0LmFkZExpc3RlbmVyKG5ldyBFZGl0TW9kZWxMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJCQkJcGFzcygpOwotCQkJCX0KLQkJCX0pOwotCQkJV2ViU2VydmljZXMgY2xpZW50ID0gZWRpdC5nZXRXZWJTZXJ2aWNlcygpOwotCQkJdXBkYXRlQ2xpZW50KGNsaWVudCk7Ci0JCQllZGl0LnNhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2xpZW50KFdlYlNlcnZpY2VzIGNsaWVudCkgewotCQljbGllbnQuc2V0RGVzY3JpcHRpb24oVGVzdFdvcmtzcGFjZS5GVlRfREVTQ1JJUFRJT04pOwotCQljbGllbnQuc2V0RGlzcGxheU5hbWUoVGVzdFdvcmtzcGFjZS5GVlRfRElTUExBWV9OQU1FKTsKLQkJY2xpZW50LnNldExhcmdlSWNvbihUZXN0V29ya3NwYWNlLkZWVF9MQVJHRV9JQ09OKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwYXNzKCkgewotCQlhc3NlcnRUcnVlKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJzaXN0ZW5jZUZ1bmN0aW9uKCkgewotCQlXU0REQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IFdTRERBcnRpZmFjdEVkaXQuZ2V0V1NEREFydGlmYWN0RWRpdEZvcldyaXRlKHdlYlByb2plY3QpOwotCQkJV2ViU2VydmljZXMgd2ViID0gZWRpdC5nZXRXZWJTZXJ2aWNlcygpOwotCQkJcGFzcyh3ZWIpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYXNzKFdlYlNlcnZpY2VzIHdlYnNlcnZpY2UpIHsKLQkJYm9vbGVhbiBwYXNzID0gd2Vic2VydmljZS5nZXREZXNjcmlwdGlvbigpLmVxdWFscyhUZXN0V29ya3NwYWNlLkZWVF9ERVNDUklQVElPTikgJiYgCi0JCQl3ZWJzZXJ2aWNlLmdldERpc3BsYXlOYW1lKCkuZXF1YWxzKFRlc3RXb3Jrc3BhY2UuRlZUX0RJU1BMQVlfTkFNRSkgJiYKLQkJCXdlYnNlcnZpY2UuZ2V0TGFyZ2VJY29uKCkuZXF1YWxzKFRlc3RXb3Jrc3BhY2UuRlZUX0xBUkdFX0lDT04pOwotCQlhc3NlcnRUcnVlKHBhc3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVJlc291cmNlKCkgewotCQlXZWJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvcldyaXRlKHdlYlByb2plY3QpOwotLy8JCQlFTGlzdCByZXNvdXJjZUxpc3QgPSB3YkNvbXBvbmVudC5nZXRSZXNvdXJjZXMoKTsKLS8vCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVzb3VyY2VMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9XZWJBcnRpZmFjdEVkaXRGVlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9hcGl0ZXN0cy9hcnRpZmFjdGVkaXQvV2ViQXJ0aWZhY3RFZGl0RlZUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NWJmMzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2FwaXRlc3RzL2FydGlmYWN0ZWRpdC9XZWJBcnRpZmFjdEVkaXRGVlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmZsZXhpYmxlLnByb2plY3QuYXBpdGVzdHMuYXJ0aWZhY3RlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uQ29tbW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb24uUGFyYW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5kZXBsb3lhYmxlcy5KMkVFRmxleFByb2pEZXBsb3lhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uV2ViYXBwbGljYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24uRWRpdE1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKLQotcHVibGljIGNsYXNzIFdlYkFydGlmYWN0RWRpdEZWVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgSVByb2plY3Qgd2ViUHJvamVjdDsKLS8vCXByaXZhdGUgU3RyaW5nIHNlcnZlckNvbnRleHREYXRhID0gVGVzdFdvcmtzcGFjZS5XRUJfU0VSVkVSX0NPTlRFWFRfUk9PVCArICJUZXN0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFdlYkFydGlmYWN0RWRpdEZWVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKFRlc3RXb3Jrc3BhY2UuaW5pdCgpKSB7Ci0JCQl3ZWJQcm9qZWN0ID0gVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KFRlc3RXb3Jrc3BhY2UuV0VCX1BST0pFQ1RfTkFNRSk7Ci0JCX0gZWxzZSB7Ci0JCQlmYWlsKCk7Ci0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb25EaXNwb3NlRnVuY3Rpb24oKSB7Ci0JCVdlYkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBXZWJBcnRpZmFjdEVkaXQuZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yV3JpdGUod2ViUHJvamVjdCk7Ci0JCQllZGl0LmFkZExpc3RlbmVyKG5ldyBFZGl0TW9kZWxMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBlZGl0TW9kZWxDaGFuZ2VkKEVkaXRNb2RlbEV2ZW50IGFuRXZlbnQpIHsKLQkJCQkJcGFzcygpOwotCQkJCX0KLQkJCX0pOwotCQkJV2ViQXBwIGNsaWVudCA9IGVkaXQuZ2V0V2ViQXBwKCk7Ci0JCQl1cGRhdGVDbGllbnQoY2xpZW50KTsKLQkJCWVkaXQuc2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVwbG95YWJsZVJlc291cmNlR2F0aGVyKCkgewotCQlJVmlydHVhbENvbXBvbmVudCB3ZWJDb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQod2ViUHJvamVjdCk7Ci0JCUoyRUVGbGV4UHJvakRlcGxveWFibGUgZGVwbG95YWJsZSA9IG5ldyBKMkVFRmxleFByb2pEZXBsb3lhYmxlKHdlYlByb2plY3QsICB3ZWJDb21wKTsKLQkJdHJ5IHsKLQkJCUlNb2R1bGVSZXNvdXJjZVtdIHJlc291cmNlcyA9IGRlcGxveWFibGUubWVtYmVycygpOwotCQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZXMubGVuZ3RoPjEpOwotCQkJaW50IG51bU9mTW9kdWxlUmVzb3VyY2VGb2xkZXJzID0gMDsKLQkJCWZvciAoaW50IGk9MDsgaTxyZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocmVzb3VyY2VzW2ldIGluc3RhbmNlb2YgSU1vZHVsZUZvbGRlcikKLQkJCQkJbnVtT2ZNb2R1bGVSZXNvdXJjZUZvbGRlcnMrKzsKLQkJCX0KLQkJCWFzc2VydFRydWUobnVtT2ZNb2R1bGVSZXNvdXJjZUZvbGRlcnM9PTIpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ2xpZW50KFdlYkFwcCBjbGllbnQpIHsKLQkJY2xpZW50LnNldERlc2NyaXB0aW9uKFRlc3RXb3Jrc3BhY2UuRlZUX0RFU0NSSVBUSU9OKTsKLQkJY2xpZW50LnNldERpc3BsYXlOYW1lKFRlc3RXb3Jrc3BhY2UuRlZUX0RJU1BMQVlfTkFNRSk7Ci0JCWNsaWVudC5zZXRMYXJnZUljb24oVGVzdFdvcmtzcGFjZS5GVlRfTEFSR0VfSUNPTik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhc3MoKSB7Ci0JCWFzc2VydFRydWUodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBlcnNpc3RlbmNlRnVuY3Rpb24oKSB7Ci0JCVdlYkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBXZWJBcnRpZmFjdEVkaXQuZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yV3JpdGUod2ViUHJvamVjdCk7Ci0JCQlXZWJBcHAgd2ViID0gZWRpdC5nZXRXZWJBcHAoKTsKLQkJCQotCQkJCi0JCQlGaWx0ZXIgZmlsdGVyID0gV2ViYXBwbGljYXRpb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVGaWx0ZXIoKTsKLQkgICAgICAgIGZpbHRlci5zZXROYW1lKCJXb29ob29GaWx0ZXIiKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgZmlsdGVyLnNldEZpbHRlckNsYXNzTmFtZSgid3RwLnRlc3QuV2hvb0hvbyIpOyAvLyROT04tTkxTLTEkCi0JICAgICAgICAKLQkgICAgICAgIFBhcmFtVmFsdWUgdmFsdWUgPSBDb21tb25GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVQYXJhbVZhbHVlKCk7Ci0JICAgICAgICB2YWx1ZS5zZXROYW1lKCJQYXJhbTEiKTsgLy8kTk9OLU5MUy0xJAotCSAgICAgICAgdmFsdWUuc2V0VmFsdWUoIlZhbHVlMSIpOyAvLyROT04tTkxTLTEkCi0JICAgICAgICBMaXN0IGluaXRQYXJhbXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JICAgICAgICBpbml0UGFyYW1zLmFkZCh2YWx1ZSk7Ci0JICAgICAgICAKLQkgICAgICAgIGlmIChpbml0UGFyYW1zICE9IG51bGwpIHsKLQkgICAgICAgICAgICBmaWx0ZXIuZ2V0SW5pdFBhcmFtVmFsdWVzKCkuYWRkQWxsKGluaXRQYXJhbXMpOwotCSAgICAgICAgfSAKLQotCSAgICAgICAgRUxpc3QgZmlsdGVycyA9IHdlYi5nZXRGaWx0ZXJzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkgICAgICAgIAotCSAgICAgICAgZmlsdGVycy5hZGQoZmlsdGVyKTsKLQkJCWVkaXQuc2F2ZUlmTmVjZXNzYXJ5KG51bGwpOwotCQkJCi0JCQlwYXNzKHdlYik7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhc3MoV2ViQXBwIHdlYikgewotCQlib29sZWFuIHBhc3MgPSB3ZWIuZ2V0RGVzY3JpcHRpb24oKS5lcXVhbHMoVGVzdFdvcmtzcGFjZS5GVlRfREVTQ1JJUFRJT04pICYmIHdlYi5nZXREaXNwbGF5TmFtZSgpLmVxdWFscyhUZXN0V29ya3NwYWNlLkZWVF9ESVNQTEFZX05BTUUpICYmIHdlYi5nZXRMYXJnZUljb24oKS5lcXVhbHMoVGVzdFdvcmtzcGFjZS5GVlRfTEFSR0VfSUNPTik7Ci0JCWFzc2VydFRydWUocGFzcyk7Ci0JfQotCi0vLwlwcml2YXRlIHZvaWQgdmFsaWRhdGVSZXNvdXJjZSgpIHsKLS8vCQlXZWJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0vLwkJdHJ5IHsKLS8vCQkJQ29tcG9uZW50SGFuZGxlIGhhbmRsZSA9IENvbXBvbmVudEhhbmRsZS5jcmVhdGUod2ViUHJvamVjdCx3ZWJNb2R1bGVOYW1lKTsKLS8vCQkJZWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JXcml0ZShoYW5kbGUpOwotLy8vLwkJCUVMaXN0IHJlc291cmNlTGlzdCA9IHdiQ29tcG9uZW50LmdldFJlc291cmNlcygpOwotLy8vLwkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlc291cmNlTGlzdC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLS8vLy8JCQl9Ci0vLwkJfSBmaW5hbGx5IHsKLS8vCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotLy8JCQkJZWRpdC5kaXNwb3NlKCk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0KLS8vCXByaXZhdGUgQ29tcG9uZW50UmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VDb21wb25lbnQoKSB7Ci0vLwkJQ29tcG9uZW50UmVzb3VyY2UgcmVzb3VyY2VDb21wb25lbnQgPSBDb21wb25lbnRjb3JlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ29tcG9uZW50UmVzb3VyY2UoKTsKLS8vCQlGaWxlIHRlc3RGaWxlID0gVGVzdFdvcmtzcGFjZS5BUlRJRkFDVF9FRElUX0ZWVF9SRVNPVVJDRV9QQVRILnRvRmlsZSgpOwotLy8JCWlmICh0ZXN0RmlsZS5leGlzdHMoKSkgewotLy8JCQlyZXNvdXJjZUNvbXBvbmVudC5zZXRSdW50aW1lUGF0aChUZXN0V29ya3NwYWNlLkFSVElGQUNUX0VESVRfRlZUX1JFU09VUkNFX1BBVEgpOwotLy8JCQlyZXNvdXJjZUNvbXBvbmVudC5zZXRTb3VyY2VQYXRoKFRlc3RXb3Jrc3BhY2UuQVJUSUZBQ1RfRURJVF9GVlRfUkVTT1VSQ0VfUEFUSCk7Ci0vLwkJfSBlbHNlIHsKLS8vCQkJZmFpbCgiTWlzc2luZzogVGVzdFdvcmtzcGFjZS5BUlRJRkFDVF9FRElUX0ZWVF9SRVNPVVJDRV9QQVRIIik7IC8vJE5PTi1OTFMtMSQKLS8vCQl9Ci0vLwkJcmV0dXJuIHJlc291cmNlQ29tcG9uZW50OwotLy8JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvYXBpdGVzdHMvYXJ0aWZhY3RlZGl0L1dlYkFydGlmYWN0RWRpdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9hcGl0ZXN0cy9hcnRpZmFjdGVkaXQvV2ViQXJ0aWZhY3RFZGl0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2QzMDQ2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9hcGl0ZXN0cy9hcnRpZmFjdGVkaXQvV2ViQXJ0aWZhY3RFZGl0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZmxleGlibGUucHJvamVjdC5hcGl0ZXN0cy5hcnRpZmFjdGVkaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5TZXJ2bGV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLlNlcnZsZXRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5pbnRlcm5hbC5pbXBsLldlYmFwcGxpY2F0aW9uRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQXJ0aWZhY3RFZGl0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFdlYkFydGlmYWN0RWRpdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIElQcm9qZWN0IHdlYlByb2plY3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgd2ViTW9kdWxlTmFtZTsKLQlwcml2YXRlIFN0cmluZyBzZXJ2ZXJDb250ZXh0RGF0YSA9IFRlc3RXb3Jrc3BhY2UuV0VCX1NFUlZFUl9DT05URVhUX1JPT1QgKyAiVGVzdCI7Ci0KLQlwdWJsaWMgV2ViQXJ0aWZhY3RFZGl0VGVzdCgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKFRlc3RXb3Jrc3BhY2UuaW5pdCgpKSB7Ci0JCQl3ZWJQcm9qZWN0ID0gVGVzdFdvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KFRlc3RXb3Jrc3BhY2UuV0VCX1BST0pFQ1RfTkFNRSk7Ci0JCQl3ZWJNb2R1bGVOYW1lID0gVGVzdFdvcmtzcGFjZS5XRUJfTU9EVUxFX05BTUU7Ci0JCX0gZWxzZSB7Ci0JCQlmYWlsKCk7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKMkVFVmVyc2lvbigpIHsKLQkJV2ViQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKHdlYlByb2plY3QpOwotCQkJZWRpdC5nZXRXZWJBcHAoKS5zZXREZXNjcmlwdGlvbigidGVzdCIpOwotCQkJaW50IHZlcnNpb24gPSBlZGl0LmdldEoyRUVWZXJzaW9uKCk7Ci0JCQlJbnRlZ2VyIGludGVnZXIgPSBuZXcgSW50ZWdlcih2ZXJzaW9uKTsKLQkJCWFzc2VydFRydWUoaW50ZWdlci5lcXVhbHMoVGVzdFdvcmtzcGFjZS5XRUJfUFJPSkVDVF9WRVJTSU9OKSk7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpIHsKLQkJV2ViQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKHdlYlByb2plY3QpOwotCQkJU3RyaW5nIHVyaSA9IGVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpLmdldFVSSSgpLnRvU3RyaW5nKCk7Ci0JCQkvLyBhc3NlcnRUcnVlKHVyaS5lcXVhbHMoVGVzdFdvcmtzcGFjZS5XRUJfRERfUkVTT1VSQ0VfVVJJKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0b2RvCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCkgewotCQlXZWJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQod2ViUHJvamVjdCk7Ci0JCQllZGl0LmdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpOwotCQkJLy8gLy8vLy9CVUcgaW4gUGxhdGZvcm1VUkxcXFxcXFxcXFxcXHR1cm5pbmcgdGVzdCBvZmYvLy8vCi0JCQlFT2JqZWN0IG9iamVjdCA9IGVkaXQuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSb290KCk7Ci0JCQlhc3NlcnROb3ROdWxsKG9iamVjdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIEVPYmplY3QgY3JlYXRlTW9kZWxSb290KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTW9kZWxSb290KCkgewotCQlXZWJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvcldyaXRlKHdlYlByb2plY3QpOwotCQkJZWRpdC5jcmVhdGVNb2RlbFJvb3QoKTsKLQkJCS8vIC8vLy9CVUcgdHVybmluZyBvZmZcXFxcXFxcXFxcXFxcCi0JCQkvKgotCQkJICogRU9iamVjdCBvYmplY3QgPSBlZGl0LmNyZWF0ZU1vZGVsUm9vdCgpOyBhc3NlcnROb3ROdWxsKG9iamVjdCk7Ci0JCQkgKi8KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoZWRpdCAhPSBudWxsKTsKLQkJfQotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgRU9iamVjdCBjcmVhdGVNb2RlbFJvb3QoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNb2RlbFJvb3RpbnQoKSB7Ci0JCVdlYkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIC8vLy8vLy9CVUcgaW4gUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uCi0JCQllZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQod2ViUHJvamVjdCk7Ci0JCQllZGl0LmNyZWF0ZU1vZGVsUm9vdCgxNCk7Ci0JCQkvKgotCQkJICogRU9iamVjdCBvYmplY3QgPSBlZGl0LmNyZWF0ZU1vZGVsUm9vdCgxNCk7IGFzc2VydE5vdE51bGwob2JqZWN0KTsKLQkJCSAqLwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQkJYXNzZXJ0VHJ1ZShlZGl0ICE9IG51bGwpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIFdlYkFydGlmYWN0RWRpdChDb21wb25lbnRIYW5kbGUsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdlYkFydGlmYWN0RWRpdENvbXBvbmVudEhhbmRsZWJvb2xlYW4oKSB7Ci0JCVdlYkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBuZXcgV2ViQXJ0aWZhY3RFZGl0KHdlYlByb2plY3QsIHRydWUpOwotCQkJYXNzZXJ0Tm90TnVsbChlZGl0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciBXZWJBcnRpZmFjdEVkaXQgZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZChDb21wb25lbnRIYW5kbGUpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldFdlYkFydGlmYWN0RWRpdEZvclJlYWRDb21wb25lbnRIYW5kbGUoKSB7Ci0JCVdlYkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBXZWJBcnRpZmFjdEVkaXQuZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZCh3ZWJQcm9qZWN0KTsKLQkJCWFzc2VydFRydWUoZWRpdCAhPSBudWxsKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQ2xhc3MgdW5kZXIgdGVzdCBmb3IgQXJ0aWZhY3RFZGl0IGdldFdlYkFydGlmYWN0RWRpdEZvcldyaXRlKENvbXBvbmVudEhhbmRsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0V2ViQXJ0aWZhY3RFZGl0Rm9yV3JpdGVDb21wb25lbnRIYW5kbGUoKSB7Ci0JCVdlYkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBXZWJBcnRpZmFjdEVkaXQuZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yV3JpdGUod2ViUHJvamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIFdlYkFydGlmYWN0RWRpdCBnZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKFdvcmtiZW5jaENvbXBvbmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZFdvcmtiZW5jaENvbXBvbmVudCgpIHsKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIFdlYkFydGlmYWN0RWRpdCBnZXRXZWJBcnRpZmFjdEVkaXRGb3JXcml0ZShXb3JrYmVuY2hDb21wb25lbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldFdlYkFydGlmYWN0RWRpdEZvcldyaXRlV29ya2JlbmNoQ29tcG9uZW50KCkgewotCQlXZWJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQod2ViUHJvamVjdCk7Ci0JCQlhc3NlcnRUcnVlKGVkaXQgIT0gbnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNWYWxpZFdlYk1vZHVsZSgpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHdlYlByb2plY3QpOwotCQkJV2ViQXJ0aWZhY3RFZGl0LmlzVmFsaWRXZWJNb2R1bGUoY29tcG9uZW50KTsKLQkJfSBjYXRjaCAoVW5yZXNvbHZlYWJsZVVSSUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJQXJ0aWZhY3RFZGl0LmlzVmFsaWRFZGl0YWJsZU1vZHVsZShjb21wb25lbnQpOwotCQlhc3NlcnRUcnVlKEFydGlmYWN0RWRpdC5pc1ZhbGlkRWRpdGFibGVNb2R1bGUoY29tcG9uZW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzVmFsaWRFZGl0TW9kdWxlKCkgewotCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotCQl0cnkgewotCQkJY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQod2ViUHJvamVjdCk7Ci0JCQlXZWJBcnRpZmFjdEVkaXQuaXNWYWxpZFdlYk1vZHVsZShjb21wb25lbnQpOwotCQl9IGNhdGNoIChVbnJlc29sdmVhYmxlVVJJRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQlBcnRpZmFjdEVkaXQuaXNWYWxpZEVkaXRhYmxlTW9kdWxlKGNvbXBvbmVudCk7Ci0JCWFzc2VydFRydWUoQXJ0aWZhY3RFZGl0LmlzVmFsaWRFZGl0YWJsZU1vZHVsZShjb21wb25lbnQpKTsKLQl9Ci0KLQkvKgotCSAqIENsYXNzIHVuZGVyIHRlc3QgZm9yIHZvaWQgV2ViQXJ0aWZhY3RFZGl0KEFydGlmYWN0RWRpdE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXZWJBcnRpZmFjdEVkaXRBcnRpZmFjdEVkaXRNb2RlbCgpIHsKLQkJV2ViQXJ0aWZhY3RFZGl0IGVkaXQgPSBuZXcgV2ViQXJ0aWZhY3RFZGl0KGdldEFydGlmYWN0RWRpdE1vZGVsZm9yUmVhZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChlZGl0KTsKLQkJZWRpdC5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiBDbGFzcyB1bmRlciB0ZXN0IGZvciB2b2lkIFdlYkFydGlmYWN0RWRpdChNb2R1bGVDb3JlTmF0dXJlLCBXb3JrYmVuY2hDb21wb25lbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdlYkFydGlmYWN0RWRpdE1vZHVsZUNvcmVOYXR1cmVXb3JrYmVuY2hDb21wb25lbnRib29sZWFuKCkgewotCQlXZWJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gbmV3IFdlYkFydGlmYWN0RWRpdCh3ZWJQcm9qZWN0LCB0cnVlKTsKLQkJCWFzc2VydE5vdE51bGwoZWRpdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2VydmxldFZlcnNpb24oKSB7Ci0JCVdlYkFydGlmYWN0RWRpdCBlZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVkaXQgPSBXZWJBcnRpZmFjdEVkaXQuZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZCh3ZWJQcm9qZWN0KTsKLQkJCWFzc2VydFRydWUoZWRpdC5nZXRTZXJ2bGV0VmVyc2lvbigpID09IDI0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRXZWJBcHBJZk5lY2Vzc2FyeSgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SlNQVmVyc2lvbigpIHsKLQkJV2ViQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKHdlYlByb2plY3QpOwotCQkJYXNzZXJ0VHJ1ZShlZGl0LmdldEpTUFZlcnNpb24oKSA9PSAyMCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVwbG95bWVudERlc2NyaXB0b3JQYXRoKCkgewotCQlXZWJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQod2ViUHJvamVjdCk7Ci0JCQllZGl0LmdldERlcGxveW1lbnREZXNjcmlwdG9yUGF0aCgpOwotCQkJYXNzZXJ0Tm90TnVsbChlZGl0LmdldERlcGxveW1lbnREZXNjcmlwdG9yUGF0aCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRMaWJNb2R1bGVzKCkgewotCQlXZWJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQod2ViUHJvamVjdCk7Ci0JCQllZGl0LmdldExpYk1vZHVsZXMoKTsKLQkJCS8vIC8vYnVnIG1vZHVsZSBpbiBlZGl0bW9kZWwgbmV2ZXIgaW5pdGlhbGl6ZWRcXFxcCi0JCQkvLyBhc3NlcnROb3ROdWxsKGVkaXQuZ2V0TGliTW9kdWxlcygpKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIC8vLy8vLy8vLy8vL0J1Z1xcXFxcXFxcXFxcXFxcXFxcXFxcXFxcCi0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTGliTW9kdWxlcygpIHsKLQkJV2ViQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKHdlYlByb2plY3QpOwotCQkJUmVmZXJlbmNlZENvbXBvbmVudCByZWZDb21wID0gQ29tcG9uZW50Y29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCWVkaXQuYWRkTGliTW9kdWxlcyhuZXcgUmVmZXJlbmNlZENvbXBvbmVudFtde3JlZkNvbXB9KTsKLQkJCS8vIC8vLy8vLy8vLy8vLy8vL2J1Z1xcXFxcXFwgb3duZXItLS1XZWJBcnRpZmFjdEVkaXQgLT4gcmVmZXJlbmNlQ29tcG9uZW50cygpICE9IG51bGwKLQkJCS8vIG5lZWRzIHRvIGluc3VyZSBvd25lcgotCQkJLyoKLQkJCSAqIFJlZmVyZW5jZWRDb21wb25lbnQgcmVmQ29tcCA9Ci0JCQkgKiBDb21wb25lbnRjb3JlRmFjdG9yeUltcGwuZUlOU1RBTkNFLmNyZWF0ZVJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJCSAqIGVkaXQuYWRkTGliTW9kdWxlcyhuZXcgUmVmZXJlbmNlZENvbXBvbmVudFtde3JlZkNvbXB9KTsKLQkJCSAqIGFzc2VydFRydWUoZWRpdC5nZXRMaWJNb2R1bGVzKCkubGVuZ3RoID4gMCk7Ci0JCQkgKi8KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTZXJ2ZXJDb250ZXh0Um9vdCgpIHsKLQkJV2ViQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKHdlYlByb2plY3QpOwotCQkJZWRpdC5nZXRTZXJ2ZXJDb250ZXh0Um9vdCgpOwotCQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vQlVHLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCQkvLyAvL2VkaXQuZ2V0U2VydmVyQ29udGV4dFJvb3QoKTsKLQkJCS8vIGFzc2VydFRydWUoZWRpdC5nZXRTZXJ2ZXJDb250ZXh0Um9vdCgpLmVxdWFscyhUZXN0V29ya3NwYWNlLldFQl9TRVJWRVJfQ09OVEVYVF9ST09UKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZWRpdCAhPSBudWxsKSB7Ci0JCQkJZWRpdC5kaXNwb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vQlVHLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZXJ2ZXJDb250ZXh0Um9vdCgpIHsKLQkJV2ViQXJ0aWZhY3RFZGl0IGVkaXQgPSBudWxsOwotCQl0cnkgewotCQkJZWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JSZWFkKHdlYlByb2plY3QpOwotCQkJZWRpdC5zZXRTZXJ2ZXJDb250ZXh0Um9vdChzZXJ2ZXJDb250ZXh0RGF0YSk7Ci0JCQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy9CVUcvLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJCS8vIC8vZWRpdC5nZXRTZXJ2ZXJDb250ZXh0Um9vdCgpOwotCQkJLy8gZWRpdC5zZXRTZXJ2ZXJDb250ZXh0Um9vdChzZXJ2ZXJDb250ZXh0RGF0YSk7Ci0JCQkvLyBTdHJpbmcgdGVzdERhdGEgPSBlZGl0LmdldFNlcnZlckNvbnRleHRSb290KCk7Ci0JCQkvLyBhc3NlcnRUcnVlKHRlc3REYXRhLmVxdWFscyhzZXJ2ZXJDb250ZXh0RGF0YSkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVkaXQgIT0gbnVsbCkgewotCQkJCWVkaXQuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIEFydGlmYWN0RWRpdE1vZGVsIGdldEFydGlmYWN0RWRpdE1vZGVsZm9yUmVhZCgpIHsKLQkJRU1GV29ya2JlbmNoQ29udGV4dCBjb250ZXh0ID0gbmV3IEVNRldvcmtiZW5jaENvbnRleHQod2ViUHJvamVjdCk7Ci0JCXJldHVybiBuZXcgQXJ0aWZhY3RFZGl0TW9kZWwodGhpcy50b1N0cmluZygpLCBjb250ZXh0LCB0cnVlLCBUZXN0V29ya3NwYWNlLkFQUF9DTElFTlRfTU9EVUxFX1VSSSk7Ci0JfQotCi0JcHVibGljIFdlYkFydGlmYWN0RWRpdCBnZXRBcnRpZmFjdEVkaXRGb3JSZWFkKCkgewotCQlyZXR1cm4gbmV3IFdlYkFydGlmYWN0RWRpdChnZXRBcnRpZmFjdEVkaXRNb2RlbGZvclJlYWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTZXJ2bGV0KCkgewotCQlXZWJBcnRpZmFjdEVkaXQgZWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlXZWJhcHBsaWNhdGlvbkZhY3RvcnlJbXBsIGZhY3RvcnkgPSBuZXcgV2ViYXBwbGljYXRpb25GYWN0b3J5SW1wbCgpOwotCQkJZWRpdCA9IFdlYkFydGlmYWN0RWRpdC5nZXRXZWJBcnRpZmFjdEVkaXRGb3JXcml0ZSh3ZWJQcm9qZWN0KTsKLQkJCVdlYkFwcCB3ZWJhcHAgPSBlZGl0LmdldFdlYkFwcCgpOwotCQkJU2VydmxldCBzZXJ2bGV0ID0gZmFjdG9yeS5jcmVhdGVTZXJ2bGV0KCk7Ci0JCQlTZXJ2bGV0VHlwZSBzZXJ2bGV0VHlwZSA9IGZhY3RvcnkuY3JlYXRlU2VydmxldFR5cGUoKTsKLQkJCXNlcnZsZXQuc2V0V2ViVHlwZShzZXJ2bGV0VHlwZSk7Ci0JCQlzZXJ2bGV0LnNldFNlcnZsZXROYW1lKCJzZXJ2bGV0RGVzY3JpcHRvci5fbmFtZSIpOwotCQkJc2VydmxldFR5cGUuc2V0Q2xhc3NOYW1lKCJzZXJ2bGV0RGVzY3JpcHRvci5fY2xhc3NOYW1lIik7Ci0JCQkvLyBpZihzZXJ2bGV0RGVzY3JpcHRvci5fZGlzcGxheU5hbWUgIT0gbnVsbCl7Ci0JCQlzZXJ2bGV0LnNldERpc3BsYXlOYW1lKCJzZXJ2bGV0RGVzY3JpcHRvci5fZGlzcGxheU5hbWUiKTsKLQkJCS8vIH0KLQkJCQotCQkJd2ViYXBwLmdldFNlcnZsZXRzKCkuYWRkKHNlcnZsZXQpOwotCQkJd2ViYXBwLnNldERlc2NyaXB0aW9uKCJ0ZXN0Iik7Ci0JCQllZGl0LnNhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkvKgotCQkJICogaWYoc2VydmxldERlc2NyaXB0b3IuX2xvYWRPblN0YXJ0dXAgIT0gbnVsbCl7Ci0JCQkgKiBzZXJ2bGV0LnNldExvYWRPblN0YXJ0dXAoc2VydmxldERlc2NyaXB0b3IuX2xvYWRPblN0YXJ0dXApOyB9Ci0JCQkgKiBpZihzZXJ2bGV0RGVzY3JpcHRvci5fcGFyYW1zICE9IG51bGwpeyBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPQotCQkJICogc2VydmxldC5nZXRQYXJhbXNBc1Byb3BlcnRpZXMoKTsgcHJvcGVydGllcy5wdXRBbGwoc2VydmxldERlc2NyaXB0b3IuX3BhcmFtcyk7IH0KLQkJCSAqLwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCS8vIFRPRE8KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChlZGl0ICE9IG51bGwpIHsKLQkJCQllZGl0LmRpc3Bvc2UoKTsKLQkJCX0KLQkJCWFzc2VydFRydWUoZWRpdCAhPSBudWxsKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2Z2dGVzdHMvQXJjaGl2ZUNvbXBvbmVudENyZWF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2Z2dGVzdHMvQXJjaGl2ZUNvbXBvbmVudENyZWF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTIwZjVhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9mdnRlc3RzL0FyY2hpdmVDb21wb25lbnRDcmVhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZmxleGlibGUucHJvamVjdC5mdnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GYWNldERhdGFNb2RlbE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLlZpcnR1YWxBcmNoaXZlQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0KLXB1YmxpYyBjbGFzcyBBcmNoaXZlQ29tcG9uZW50Q3JlYXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShBcmNoaXZlQ29tcG9uZW50Q3JlYXRpb25UZXN0LmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJjaGl2ZUNvbXBvbmVudENyZWF0aW9uVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJjaGl2ZUNvbXBvbmVudENyZWF0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlV2ViQ29tcG9uZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNyZWF0ZVdlYkNvbXBvbmVudCgyNCwgIlRlc3RXZWIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIAotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXZWJDb21wb25lbnQoaW50IGoyZWVWZXJzaW9uLCBTdHJpbmcgYU1vZHVsZU5hbWUpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLSAgICAgICAgbW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIGFNb2R1bGVOYW1lKTsKLSAgICAgICAgRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBtb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0gICAgICAgIElEYXRhTW9kZWwgd2ViTW9kZWwgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoSjJFRVByb2plY3RVdGlsaXRpZXMuRFlOQU1JQ19XRUIpOwotICAgICAgICB3ZWJNb2RlbC5zZXRJbnRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT04sajJlZVZlcnNpb24pOwotICAgICAgICBtb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLSAgICAgICAgCi0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QoYU1vZHVsZU5hbWUpOwotICAgICAgICBpZiggcHJvamVjdC5leGlzdHMoKSl7Ci0gICAgICAgIAlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLSAgICAgICAgCWNyZWF0ZUFyY2hpdmVDb21wb25lbnQoY29tcG9uZW50KTsKLSAgICAgICAgfQkKLSAgICB9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVBcmNoaXZlQ29tcG9uZW50KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCl7Ci0JCQotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoIkpVTklUX0hPTUUvanVuaXQuamFyIik7IC8vJE5PTi1OTFMtMSQKLQotCi0JCUlQYXRoIHJlc29sdmVkUGF0aCA9IEphdmFDb3JlLmdldFJlc29sdmVkVmFyaWFibGVQYXRoKHBhdGgpOwotCi0JCWphdmEuaW8uRmlsZSBmaWxlID0gbmV3IGphdmEuaW8uRmlsZShyZXNvbHZlZFBhdGgudG9PU1N0cmluZygpKTsKLQkJaWYoIGZpbGUuaXNGaWxlKCkgJiYgZmlsZS5leGlzdHMoKSl7Ci0JCQlTdHJpbmcgdHlwZSA9IFZpcnR1YWxBcmNoaXZlQ29tcG9uZW50LlZBUkFSQ0hJVkVUWVBFICsgSVBhdGguU0VQQVJBVE9SOwotCQkJCi0JCQlJVmlydHVhbENvbXBvbmVudCBhcmNoaXZlID0gQ29tcG9uZW50Q29yZS5jcmVhdGVBcmNoaXZlQ29tcG9uZW50KCBjb21wb25lbnQuZ2V0UHJvamVjdCgpLCB0eXBlICsKLQkJCQkJcGF0aC50b1N0cmluZygpKTsKLQkJCQotCQkJQXJyYXlMaXN0IHZsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSVZpcnR1YWxSZWZlcmVuY2VbXSBvbGRyZWZzID0gY29tcG9uZW50LmdldFJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgb2xkcmVmcy5sZW5ndGg7IGorKykgewotCQkJCUlWaXJ0dWFsUmVmZXJlbmNlIHJlZiA9IG9sZHJlZnNbal07Ci0JCQkJdmxpc3QuYWRkKHJlZik7Ci0JCQl9CQkKLQkJCi0JCQlJVmlydHVhbFJlZmVyZW5jZSByZWYgPSBDb21wb25lbnRDb3JlLmNyZWF0ZVJlZmVyZW5jZSggY29tcG9uZW50LCBhcmNoaXZlLCBuZXcgUGF0aCgiL1dFQi1JTkYvbGliIikgKTsgLy8kTk9OLU5MUy0xJAotCQkJdmxpc3QuYWRkKHJlZik7CQotCQkJCi0JCQlJVmlydHVhbFJlZmVyZW5jZVtdIHJlZnMgPSBuZXcgSVZpcnR1YWxSZWZlcmVuY2Vbdmxpc3Quc2l6ZSgpXTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgdmxpc3Quc2l6ZSgpOyBqKyspIHsKLQkJCQlJVmlydHVhbFJlZmVyZW5jZSB0bXByZWYgPSAoSVZpcnR1YWxSZWZlcmVuY2UpIHZsaXN0LmdldChqKTsKLQkJCQlyZWZzW2pdID0gdG1wcmVmOwotCQkJfQkJCQkKLQkJCWNvbXBvbmVudC5zZXRSZWZlcmVuY2VzKHJlZnMpOwotCQl9Ci0JfQkgICAgCi0gfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2Z2dGVzdHMvRUpCQXJ0aWZhY3RFZGl0RnZUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvZnZ0ZXN0cy9FSkJBcnRpZmFjdEVkaXRGdlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1NGQyZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvZnZ0ZXN0cy9FSkJBcnRpZmFjdEVkaXRGdlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5mbGV4aWJsZS5wcm9qZWN0LmZ2dGVzdHM7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgRUpCQXJ0aWZhY3RFZGl0RnZUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvZnZ0ZXN0cy9KMkVFRmxleFByb2pEZXBsb3lhYmxlUGVyZlRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9mdnRlc3RzL0oyRUVGbGV4UHJvakRlcGxveWFibGVQZXJmVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGIyNWYxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9mdnRlc3RzL0oyRUVGbGV4UHJvakRlcGxveWFibGVQZXJmVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5mbGV4aWJsZS5wcm9qZWN0LmZ2dGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ldG9vbHMuY29tbW9uLnRlc3QuYXBpdG9vbHMuUHJvamVjdFVuemlwVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGVwbG95YWJsZXMuSjJFRUZsZXhQcm9qRGVwbG95YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5pbnRlcm5hbC5Nb2R1bGVGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLm1vZGVsLklNb2R1bGVSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5wbHVnaW4uSGVhZGxlc3NUZXN0c1BsdWdpbjsKLQotcHVibGljIGNsYXNzIEoyRUVGbGV4UHJvakRlcGxveWFibGVQZXJmVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHByb2plY3ROYW1lcyA9IG5ldyBTdHJpbmdbXXsid2FyIn07IC8vJE5PTi1OTFMtMSQ7Ci0JcHJpdmF0ZSBzdGF0aWMgUGF0aCB6aXBGaWxlUGF0aCA9IG5ldyBQYXRoKCIvVGVzdERhdGEvR2VucmFsQXJ0aWZhY3RUZXN0L3BlcmZXQVIuemlwIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKEoyRUVGbGV4UHJvakRlcGxveWFibGVQZXJmVGVzdC5jbGFzcyk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RNZW1iZXJzUGVyZm9ybWFuY2UoKSB7Ci0JCVByb2plY3RVbnppcFV0aWwgdXRpbCA9IG5ldyBQcm9qZWN0VW56aXBVdGlsKGdldExvY2FsUGF0aCgpLCBwcm9qZWN0TmFtZXMpOwotCQl1dGlsLmNyZWF0ZVByb2plY3RzKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWVzWzBdKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCUoyRUVGbGV4UHJvakRlcGxveWFibGUgZGVwbG95YWJsZSA9IG5ldyBKMkVFRmxleFByb2pEZXBsb3lhYmxlKHByb2plY3QsIGNvbXBvbmVudCk7Ci0JCXRyeSB7Ci0JCQlJTW9kdWxlUmVzb3VyY2VbXSBtZW1iZXJzID0gZGVwbG95YWJsZS5tZW1iZXJzKCk7Ci0JCQlhc3NlcnRUcnVlKG1lbWJlcnMubGVuZ3RoPT0zKTsKLQkJCWludCB2ZXJpZmllZCA9IDA7Ci0JCQlmb3IgKGludCBpPTA7IGk8bWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gbWVtYmVyc1tpXS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKCJNRVRBLUlORiIpKSB7Ci0JCQkJCUlNb2R1bGVSZXNvdXJjZSBtYW5pZmVzdCA9ICgoTW9kdWxlRm9sZGVyKW1lbWJlcnNbaV0pLm1lbWJlcnMoKVswXTsKLQkJCQkJYXNzZXJ0VHJ1ZShtYW5pZmVzdC5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpLmVxdWFscygiTUVUQS1JTkYiKSk7Ci0JCQkJCWFzc2VydFRydWUobWFuaWZlc3QuZ2V0TmFtZSgpLmVxdWFscygiTUFOSUZFU1QuTUYiKSk7Ci0JCQkJCXZlcmlmaWVkKys7Ci0JCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscygiV0VCLUlORiIpKSB7Ci0JCQkJCUlNb2R1bGVSZXNvdXJjZVtdIHdlYkluZiA9ICgoTW9kdWxlRm9sZGVyKW1lbWJlcnNbaV0pLm1lbWJlcnMoKTsKLQkJCQkJYXNzZXJ0VHJ1ZSh3ZWJJbmYubGVuZ3RoPT0yKTsKLQkJCQkJZm9yIChpbnQgaj0wOyBqPHdlYkluZi5sZW5ndGg7IGorKykgewotCQkJCQkJSU1vZHVsZVJlc291cmNlIHdlYlJlc291cmNlID0gd2ViSW5mW2pdOwotCQkJCQkJYXNzZXJ0VHJ1ZSh3ZWJSZXNvdXJjZS5nZXRNb2R1bGVSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpLmVxdWFscygiV0VCLUlORiIpKTsKLQkJCQkJCWFzc2VydFRydWUod2ViUmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscygid2ViLnhtbCIpIHx8IHdlYlJlc291cmNlLmdldE5hbWUoKS5lcXVhbHMoImNsYXNzZXMiKSk7Ci0JCQkJCX0KLQkJCQkJdmVyaWZpZWQrKzsKLQkJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzKCJwa2cwIikpIHsKLQkJCQkJYXNzZXJ0VHJ1ZSgoKE1vZHVsZUZvbGRlciltZW1iZXJzW2ldKS5tZW1iZXJzKCkubGVuZ3RoPjApOwotCQkJCQl2ZXJpZmllZCsrOwotCQkJCX0KLQkJCX0KLQkJCWFzc2VydFRydWUodmVyaWZpZWQ9PTMpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJUGF0aCBnZXRMb2NhbFBhdGgoKSB7Ci0JCVVSTCB1cmwgPSBIZWFkbGVzc1Rlc3RzUGx1Z2luLmdldERlZmF1bHQoKS5maW5kKHppcEZpbGVQYXRoKTsKLQkJdHJ5IHsKLQkJCXVybCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbmV3IFBhdGgodXJsLmdldFBhdGgoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9mbGV4aWJsZS9wcm9qZWN0L2Z2dGVzdHMvUG9ydGVkQ29tcG9uZW50Q3JlYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvZnZ0ZXN0cy9Qb3J0ZWRDb21wb25lbnRDcmVhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4ZGQ5Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvZnZ0ZXN0cy9Qb3J0ZWRDb21wb25lbnRDcmVhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUuZmxleGlibGUucHJvamVjdC5mdnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5jcmVhdGlvbi5BcHBDbGllbnRGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm9qZWN0Lm9wZXJhdGlvbnMuRWpiRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5qY2EucHJvamVjdC5mYWNldC5Db25uZWN0b3JGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuRUFSRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIucHJvamVjdC5mYWNldC5JV2ViRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GYWNldERhdGFNb2RlbE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0KLXB1YmxpYyBjbGFzcyBQb3J0ZWRDb21wb25lbnRDcmVhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX1BST0pFQ1RfTkFNRSA9ICJGbGV4aWJsZSI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFBvcnRlZENvbXBvbmVudENyZWF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFBvcnRlZENvbXBvbmVudENyZWF0aW9uVGVzdCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9ydGVkQ29tcG9uZW50Q3JlYXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIC8qCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUZsZXhpYmxlUHJvamVjdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotICAgICAgICBkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUZsZXhpYmxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIERFRkFVTFRfUFJPSkVDVF9OQU1FICsgIl8iKTsKLSAgICAgICAgZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotICAgIH0KLSAgICAqLwotICAgIAotCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSmF2YVV0aWx0eUNvbXBvbmVudCgpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgICAgIC8vY3JlYXRlRmxleGlibGVKYXZhUHJvamVjdChERUZBVUxUX1BST0pFQ1RfTkFNRSArICJfSmF2YVV0aWwiKTsKLS8vICAgICAgICBjcmVhdGVKYXZhVXRpbENvbXBvbmVudChERUZBVUxUX1BST0pFQ1RfTkFNRSArICJfSmF2YVV0aWwiLCBERUZBVUxUX1BST0pFQ1RfTkFNRSArICJfSmF2YVV0aWwiKTsKLS8vICAgIH0KLS8vCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQ29ubmVjdG9yQ29tcG9uZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAvLyBjcmVhdGVGbGV4aWJsZUphdmFQcm9qZWN0KERFRkFVTFRfUFJPSkVDVF9OQU1FICsgIl9Db25uZWN0b3JQcm9qZWN0Iik7Ci0vLyAgICAgICAgY3JlYXRlQ29ubmVjdG9yQ29tcG9uZW50KDE1LCAiVGVzdENvbm5lY3RvciIsIERFRkFVTFRfUFJPSkVDVF9OQU1FICsgIl9Db25uZWN0b3JQcm9qZWN0Iik7Ci0vLyAgICB9Ci0vLwotLy8gICAgCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlV2ViQ29tcG9uZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgIC8vICBjcmVhdGVGbGV4aWJsZUphdmFQcm9qZWN0KERFRkFVTFRfUFJPSkVDVF9OQU1FKyJfV2ViUHJvamVjdCIpOwotLy8gICAgICAgIGNyZWF0ZVdlYkNvbXBvbmVudCgyNCwgIlRlc3RXZWIiLCBERUZBVUxUX1BST0pFQ1RfTkFNRSsiX1dlYlByb2plY3QiKTsKLS8vICAgIH0KLS8vICAgIAotLy8gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFwcENsaWVudENvbXBvbmVudCgpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgICAvLyAgY3JlYXRlRmxleGlibGVKYXZhUHJvamVjdChERUZBVUxUX1BST0pFQ1RfTkFNRSsiX0FwcENsaWVudFByb2plY3QiKTsKLS8vICAgICAgICBjcmVhdGVBcHBDbGllbnRDb21wb25lbnQoMTQsICJUZXN0QXBwQ2xpZW50IiwgREVGQVVMVF9QUk9KRUNUX05BTUUrIl9BcHBDbGllbnRQcm9qZWN0Iik7Ci0vLyAgICB9Ci0vLyAgICAKLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFamJDb21wb25lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgICAgIC8vIGNyZWF0ZUZsZXhpYmxlSmF2YVByb2plY3QoREVGQVVMVF9QUk9KRUNUX05BTUUrIl9FSkJQcm9qZWN0Iik7Ci0vLyAgICAgICAgY3JlYXRlRWpiQ29tcG9uZW50KDIxLCAiVGVzdEVKQiIsIERFRkFVTFRfUFJPSkVDVF9OQU1FKyJfRUpCUHJvamVjdCIpOwotLy8gICAgfQotLy8gICAgCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRUFSQ29tcG9uZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAgICAvLyBjcmVhdGVGbGV4aWJsZUphdmFQcm9qZWN0KERFRkFVTFRfUFJPSkVDVF9OQU1FKyJfRUFSUHJvamVjdCIpOwotLy8gICAgICAgIGNyZWF0ZUVBUkNvbXBvbmVudCgxNCwgIlRlc3RFQVIiLCBERUZBVUxUX1BST0pFQ1RfTkFNRSsiX0VBUlByb2plY3QiKTsKLS8vICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlQ29ubmVjdG9yQ29tcG9uZW50KGludCBqMmVlVmVyc2lvbiwgU3RyaW5nIGFNb2R1bGVOYW1lLCBTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQ29ubmVjdG9yRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLSAgICAgICAgbW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLSAgICAgICAgRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBtb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0gICAgICAgIElEYXRhTW9kZWwgamNhTW9kZWwgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoSjJFRVByb2plY3RVdGlsaXRpZXMuSkNBKTsKLSAgICAgICAgamNhTW9kZWwuc2V0SW50UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OLGoyZWVWZXJzaW9uKTsKLSAgICAgICAgbW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVXZWJDb21wb25lbnQoaW50IGoyZWVWZXJzaW9uLCBTdHJpbmcgYU1vZHVsZU5hbWUsIFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgSURhdGFNb2RlbCBtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBXZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotICAgICAgICBtb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotICAgICAgICBGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLSAgICAgICAgSURhdGFNb2RlbCB3ZWJNb2RlbCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQik7Ci0gICAgICAgIHdlYk1vZGVsLnNldEludFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTixqMmVlVmVyc2lvbik7Ci0gICAgICAgIG1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVBcHBDbGllbnRDb21wb25lbnQoaW50IGoyZWVWZXJzaW9uLCBTdHJpbmcgYU1vZHVsZU5hbWUsIFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgSURhdGFNb2RlbCBtb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBcHBDbGllbnRGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotICAgICAgICBtb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotICAgICAgICBGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLSAgICAgICAgSURhdGFNb2RlbCBhcHBDbGllbnRNb2RlbCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChKMkVFUHJvamVjdFV0aWxpdGllcy5BUFBMSUNBVElPTl9DTElFTlQpOwotICAgICAgICBhcHBDbGllbnRNb2RlbC5zZXRJbnRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT04sajJlZVZlcnNpb24pOwotICAgICAgICBtb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUVqYkNvbXBvbmVudChpbnQgajJlZVZlcnNpb24sIFN0cmluZyBhTW9kdWxlTmFtZSwgU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uewotICAgICAgICBJRGF0YU1vZGVsIG1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVqYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIG1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBwcm9qZWN0TmFtZSk7Ci0gICAgICAgIEZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotICAgICAgICBJRGF0YU1vZGVsIGVqYk1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKEoyRUVQcm9qZWN0VXRpbGl0aWVzLkVKQik7Ci0gICAgICAgIGVqYk1vZGVsLnNldEludFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTixqMmVlVmVyc2lvbik7Ci0gICAgICAgIG1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgY3JlYXRlRUFSQ29tcG9uZW50KGludCBqMmVlVmVyc2lvbiwgU3RyaW5nIGFNb2R1bGVOYW1lLCBTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRUFSRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLSAgICAgICAgbW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLSAgICAgICAgRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBtb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0gICAgICAgIElEYXRhTW9kZWwgZWFyTW9kZWwgPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoSjJFRVByb2plY3RVdGlsaXRpZXMuRU5URVJQUklTRV9BUFBMSUNBVElPTik7Ci0gICAgICAgIGVhck1vZGVsLnNldEludFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTixqMmVlVmVyc2lvbik7Ci0gICAgICAgIG1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlV2ViQ29tcG9uZW50V2l0aFVzZXJEZWZpbmVkRm9sZGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLSAgICAgICAgICBtb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgIlRlc3RXZWIyNCIpOyAvLyROT04tTkxTLTEkICAgCi0gICAgICAgICAgRmFjZXREYXRhTW9kZWxNYXAgbWFwID0gKEZhY2V0RGF0YU1vZGVsTWFwKSBtb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0gICAgICAgICAgSURhdGFNb2RlbCB3ZWJNb2RlbCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQik7Ci0gICAgICAgICAgd2ViTW9kZWwuc2V0SW50UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OLDI0KTsKLSAgICAgICAgICB3ZWJNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsZmFsc2UpOwotICAgICAgICAgIHdlYk1vZGVsLnNldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5DT05GSUdfRk9MREVSLCJ3ZWIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHdlYk1vZGVsLnNldFN0cmluZ1Byb3BlcnR5KElXZWJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVIsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIG1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotICAgICAgfSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQXBwQ2xpZW50Q29tcG9uZW50V2l0aFVzZXJEZWZpbmVkRm9sZGVycygpIHRocm93cyBFeGNlcHRpb257Ci0gICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQXBwQ2xpZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLSAgICAgICAgbW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsICJUZXN0QXBwMTUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLSAgICAgICAgSURhdGFNb2RlbCBhcHBDbGllbnRNb2RlbCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChKMkVFUHJvamVjdFV0aWxpdGllcy5BUFBMSUNBVElPTl9DTElFTlQpOwotICAgICAgICBhcHBDbGllbnRNb2RlbC5zZXRJbnRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT04sMTQpOyAKLSAgICAgICAgYXBwQ2xpZW50TW9kZWwuc2V0U3RyaW5nUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTkZJR19GT0xERVIsICJzcmMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhcHBDbGllbnRNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsIGZhbHNlKTsKLSAgICAgICAgbW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0gICAgfSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9mdnRlc3RzL1Byb2plY3RNaWdyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvZnZ0ZXN0cy9Qcm9qZWN0TWlncmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGEzNTFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC9mdnRlc3RzL1Byb2plY3RNaWdyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmZsZXhpYmxlLnByb2plY3QuZnZ0ZXN0czsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmZsZXhpYmxlLnByb2plY3QudGVzdHMuTWlncmF0ZTA3RUpCVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5KYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGU7Ci0KLXB1YmxpYyAgY2xhc3MgUHJvamVjdE1pZ3JhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9QUk9KRUNUX05BTUUgPSAiVGVzdEphdmFQcm9qIjsJCi0JCi0JcHVibGljIFByb2plY3RNaWdyYXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgUHJvamVjdE1pZ3JhdGlvblRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQkKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgLy9yZXR1cm4gbmV3IFNpbXBsZVRlc3RTdWl0ZShQcm9qZWN0TWlncmF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlVGVzdFN1aXRlKE1pZ3JhdGUwN0VKQlRlc3QuY2xhc3MpOwotICAgIH0KLQkKLSAgICAKLQlwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdE1pZ3JhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlydW5BbGwoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUphdmFQcm9qZWN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChERUZBVUxUX1BST0pFQ1RfTkFNRSk7Ci0JCQotCQlpZiggcHJvamVjdC5leGlzdHMoKSl7Ci0JCQlwcm9qZWN0LmRlbGV0ZSggdHJ1ZSwgdHJ1ZSwgbnVsbCApOwotCQl9Ci0JCQotLy8JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgVGVzdEphdmFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsJCi0vLwkJbW9kZWwuc2V0UHJvcGVydHkoSVRlc3RKYXZhUHJvamVjdENyZWF0aW9uUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIERFRkFVTFRfUFJPSkVDVF9OQU1FKTsKLS8vCQkKLS8vCQlTdHJpbmdbXSBzcmNGb2xkZXIgPSBuZXcgU3RyaW5nWzJdOwotLy8JCXNyY0ZvbGRlclswXSA9IG5ldyBTdHJpbmcoIlNyYzEiKTsKLS8vCQlzcmNGb2xkZXJbMV0gPSBuZXcgU3RyaW5nKCJTcmMyIik7Ci0vLwkJCi0vLwkJbW9kZWwuc2V0UHJvcGVydHkoSVRlc3RKYXZhUHJvamVjdENyZWF0aW9uUHJvcGVydGllcy5TT1VSQ0VfRk9MREVSUywgc3JjRm9sZGVyKTsKLS8vCQl0cnkgewotLy8JCQltb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLS8vCQl9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZSkgewotLy8JCQllLnByaW50U3RhY2tUcmFjZSgpOwotLy8JCX0KLQotCX0KLQkKLQlwcml2YXRlIElQYXRoIGdldE91dHB1dFBhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQlTdHJpbmcgb3V0cHV0TG9jYXRpb24gPSAiYmluIjsKLQkJcmV0dXJuIHByb2plY3QuZ2V0RnVsbFBhdGgoKS5hcHBlbmQob3V0cHV0TG9jYXRpb24pOwotCX0JCi0JCi0JCi0JcHVibGljIHZvaWQgcnVuQWxsKCl7Ci0JCXRyeSB7Ci0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJY3JlYXRlSmF2YVByb2plY3QobW9uaXRvcik7Ci0JCQltaWdyYXRlUHJvamVjdChERUZBVUxUX1BST0pFQ1RfTkFNRSk7Ci0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWlncmF0ZVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKXsJCi0JCUlEYXRhTW9kZWwgbW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSmF2YVByb2plY3RNaWdyYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJbW9kZWwuc2V0UHJvcGVydHkoIElKYXZhUHJvamVjdE1pZ3JhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FLCBwcm9qZWN0TmFtZSk7Ci0KLQkJdHJ5IHsKLQkJCW1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKCBudWxsLCBudWxsICk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9CQkKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvdGVzdHMvRmxleGlibGVQcm9qZWN0RWRpdFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC90ZXN0cy9GbGV4aWJsZVByb2plY3RFZGl0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODVkMjhkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC90ZXN0cy9GbGV4aWJsZVByb2plY3RFZGl0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE0LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5mbGV4aWJsZS5wcm9qZWN0LnRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgdmlqYXliCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRmxleGlibGVQcm9qZWN0RWRpdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC90ZXN0cy9NaWdyYXRlMDdFSkJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL2ZsZXhpYmxlL3Byb2plY3QvdGVzdHMvTWlncmF0ZTA3RUpCVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTRkOTZhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvZmxleGlibGUvcHJvamVjdC90ZXN0cy9NaWdyYXRlMDdFSkJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmZsZXhpYmxlLnByb2plY3QudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5FSkJKYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLmNvbXBvbmVudGNvcmUudXRpbC5FSkJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZmxleGlibGUucHJvamVjdC5hcGl0ZXN0cy5hcnRpZmFjdGVkaXQuVGVzdDBfN1dvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLQotcHVibGljIGNsYXNzIE1pZ3JhdGUwN0VKQlRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBlamJQcm9qZWN0LHdlYlByb2plY3Q7Ci0JcHVibGljIE1pZ3JhdGUwN0VKQlRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKFRlc3QwXzdXb3Jrc3BhY2UuaW5pdCgpKSB7Ci0JCQllamJQcm9qZWN0ID0gVGVzdDBfN1dvcmtzcGFjZS5nZXRUYXJnZXRQcm9qZWN0KCJNeUVhckVKQiIpOwotCQkJd2ViUHJvamVjdCA9IFRlc3QwXzdXb3Jrc3BhY2UuZ2V0VGFyZ2V0UHJvamVjdCgiVGVzdFdlYiIpOwotCQl9IGVsc2UgewotCQkJZmFpbCgpOwotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFzcygpIHsKLQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRGYWNldEZyb21Qcm9qZWN0KElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXJldHVybiBKMkVFUHJvamVjdFV0aWxpdGllcy5nZXRKMkVFUHJvamVjdFR5cGUoYVByb2plY3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaWdyYXRlKCkgewotCQlFSkJBcnRpZmFjdEVkaXQgZWpiZWRpdCA9IG51bGw7Ci0JCVdlYkFydGlmYWN0RWRpdCB3ZWJFZGl0ID0gbnVsbDsKLQkJCi0JCQotCQkJLy9SdW4gZnVsbCBidWlsZCB0byBzdGFydCBtaWdyYXRpb24KLQkJCXRyeSB7Ci0JCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCQotCQkJSVNjaGVkdWxpbmdSdWxlIHJ1bGU9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpLmJ1aWxkUnVsZSgpOwotCQkJSUpvYk1hbmFnZXIgbWFuYWdlcj0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpOwotCQkJdHJ5IHsKLQkJCQltYW5hZ2VyLmJlZ2luUnVsZShydWxlLCBudWxsKTsKLQotCQkJCXRyeSB7Ci0JCQkJZWpiZWRpdCA9IEVKQkFydGlmYWN0RWRpdC5nZXRFSkJBcnRpZmFjdEVkaXRGb3JSZWFkKGVqYlByb2plY3QpOwotCQkJCWlmIChlamJlZGl0ICE9IG51bGwpIHsKLQkJCQkJRUpCSmFyIGVqYiA9IGVqYmVkaXQuZ2V0RUpCSmFyKCk7Ci0JCQkJCWFzc2VydFRydWUoZWpiICE9IG51bGwpOwotCQkJCX0KLQkJCQl3ZWJFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQod2ViUHJvamVjdCk7Ci0JCQkJaWYgKHdlYkVkaXQgIT0gbnVsbCkgewotCQkJCQlXZWJBcHAgd2ViID0gd2ViRWRpdC5nZXRXZWJBcHAoKTsKLQkJCQkJYXNzZXJ0VHJ1ZSh3ZWIgIT0gbnVsbCk7Ci0JCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChlamJlZGl0ICE9IG51bGwpIHsKLQkJCQkJCWVqYmVkaXQuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJCWlmICh3ZWJFZGl0ICE9IG51bGwpIHsKLQkJCQkJCXdlYkVkaXQuZGlzcG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGZpbmFsbHkgewotCQkJCW1hbmFnZXIuZW5kUnVsZShydWxlKTsKLQkJCX0KLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC90ZXN0cy9FamJQcm9qZWN0RmFjZXRDcmVhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC90ZXN0cy9FamJQcm9qZWN0RmFjZXRDcmVhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2NGQ2Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Byb2plY3QvZmFjZXQvdGVzdHMvRWpiUHJvamVjdEZhY2V0Q3JlYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQudGVzdHM7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLnByb2plY3Qub3BlcmF0aW9ucy5FamJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFamJQcm9qZWN0RmFjZXRDcmVhdGlvblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JCi0JcHVibGljIEVqYlByb2plY3RGYWNldENyZWF0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIEVqYlByb2plY3RGYWNldENyZWF0aW9uVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVRlc3RTdWl0ZShFamJQcm9qZWN0RmFjZXRDcmVhdGlvblRlc3QuY2xhc3MpOwotICAgIH0KLQotICAgcHVibGljIHZvaWQgdGVzdEVqYkNyZWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSURhdGFNb2RlbCBkbSA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKCBuZXcgRWpiRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJZG0uc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsICJUZXN0RUpCRmFjZXQiKTsgLy8kTk9OLU5MUy0xJAotCQlkbS5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L3Rlc3RzL1Byb2plY3RGYWNldENyZWF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS9wcm9qZWN0L2ZhY2V0L3Rlc3RzL1Byb2plY3RGYWNldENyZWF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2E1ZTZkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvcHJvamVjdC9mYWNldC90ZXN0cy9Qcm9qZWN0RmFjZXRDcmVhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC50ZXN0czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3QuQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5SdW50aW1lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIFByb2plY3RGYWNldENyZWF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQkKLQlwdWJsaWMgUHJvamVjdEZhY2V0Q3JlYXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgUHJvamVjdEZhY2V0Q3JlYXRpb25UZXN0KCkgewotCQlzdXBlcigpOwotCX0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlVGVzdFN1aXRlKFByb2plY3RGYWNldENyZWF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgfQotCi0gICBwdWJsaWMgdm9pZCB0ZXN0V2ViQ3JlYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0UHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSgiU2FtcGxlV2ViUHJvamVjdCIsbnVsbCxuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJLy8gU2V0IHJ1bnRpbWUgaWYgYXZhaWxhYmxlCi0JCXNldFJ1bnRpbWUoZmFjZXRQcm9qKTsKLQkJCi0JCVNldCBhY3Rpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJCi0JCS8vU2V0dGluZyB1cCB0aGUgamF2YSBhbmQgd2ViIGluc3RhbGwgYWN0aW9uCi0JCWFjdGlvbnMuYWRkKHNldHVwSmF2YUluc3RhbGxBY3Rpb24oKSk7Ci0JCWFjdGlvbnMuYWRkKHNldHVwV2ViSW5zdGFsbEFjdGlvbigpKTsKLQkJCi0JCQotCQlmYWNldFByb2oubW9kaWZ5KCBhY3Rpb25zLG51bGwpOwotCQkKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KGZhY2V0UHJvai5nZXRQcm9qZWN0KCkpOwotCQlhc3NlcnRUcnVlKEoyRUVQcm9qZWN0VXRpbGl0aWVzLmlzRHluYW1pY1dlYlByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpKTsKLQkJCi0gICAgfQotCi0JcHJpdmF0ZSBJRmFjZXRlZFByb2plY3QuQWN0aW9uIHNldHVwV2ViSW5zdGFsbEFjdGlvbigpIHsKLQkJSVByb2plY3RGYWNldFZlcnNpb24gd2ViZmFjZXR2ZXJzaW9uID0gIFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldCggImpzdC53ZWIiICkuZ2V0VmVyc2lvbiggIjIuNCIgKTsKLQkJCi0JCUlGYWNldGVkUHJvamVjdC5BY3Rpb24gYWN0aW9uID0gbmV3IElGYWNldGVkUHJvamVjdC5BY3Rpb24oIEFjdGlvbi5UeXBlLklOU1RBTEwsIHdlYmZhY2V0dmVyc2lvbiwgbnVsbCApOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbiBzZXR1cEphdmFJbnN0YWxsQWN0aW9uKCkgewotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiB3ZWJmYWNldHZlcnNpb24gPSAgUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KCAianN0LmphdmEiICkuZ2V0VmVyc2lvbiggIjEuNCIgKTsKLQkJSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbiBhY3Rpb24gPSBuZXcgSUZhY2V0ZWRQcm9qZWN0LkFjdGlvbiggQWN0aW9uLlR5cGUuSU5TVEFMTCwgd2ViZmFjZXR2ZXJzaW9uLCBudWxsICk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UnVudGltZShJRmFjZXRlZFByb2plY3QgZmFjZXRQcm9qKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vU2V0dGluZyB0aGUgcnVudGltZQotLy8JCVJ1bnRpbWVNYW5hZ2VyLmJyaWRnZSgpOwotCQl0cnkgewotCQlJUnVudGltZSBydW50aW1lID0gUnVudGltZU1hbmFnZXIuZ2V0UnVudGltZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQiKTsKLQkJZmFjZXRQcm9qLnNldFJ1bnRpbWUocnVudGltZSxudWxsKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJ1bnRpbWUgbm90IGZvdW5kOiBvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdCIpOwotCQl9Ci0JCQotCX0JCQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWEwOGM2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gQXByIDEsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLmJ2dDsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQganVuaXQudGV4dHVpLlRlc3RSdW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLnBsdWdpbi5BbGxQbHVnaW5UZXN0czsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEF1dG9tYXRlZEJWVCBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBiYXNlRGlyZWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXIgKyAiVGVzdERhdGEiICsgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzIik7Ci0gICAgICAgICAgICBVUkwgdXJsID0gcGx1Z2luRGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCk7IAotICAgICAgICAJQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCkuZ2V0RmlsZSgpICsgIlRlc3REYXRhIisgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IAotCQkJU3lzdGVtLmVyci5wcmludGxuKCJVc2luZyB3b3JraW5nIGRpcmVjdG9yeSBzaW5jZSBhIHdvcmtzcGFjZSBVUkwgY291bGQgbm90IGJlIGxvY2F0ZWQuIik7Ci0JCX0gCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgdW5pbXBsZW1lbnRlZE1ldGhvZHM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIHVuaW1wbGVtZW50ZWRNZXRob2RzID0gMDsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gICAgICAgIGlmICh1bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5DYWxscyB0byB3YXJuVW5pbXBsOiAiICsgdW5pbXBsZW1lbnRlZE1ldGhvZHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEF1dG9tYXRlZEJWVCgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSkgQXV0b21hdGVkQlZULnN1aXRlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VpdGUudGVzdENvdW50KCk7IGkrKykgewotICAgICAgICAgICAgYWRkVGVzdChzdWl0ZS50ZXN0QXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0IGZvciBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0LmJ2dCIpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KEFsbFBsdWdpblRlc3RzLnN1aXRlKCkpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9idnQvQXV0b21hdGVkQlZURWNsaXBzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9idnQvQXV0b21hdGVkQlZURWNsaXBzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODZlMTU3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVEVjbGlwc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE1hciAyNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMuYnZ0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkQlZURWNsaXBzZSBleHRlbmRzIEF1dG9tYXRlZEJWVCB7Ci0JCi0JcHVibGljIEF1dG9tYXRlZEJWVEVjbGlwc2UoKXsKLQkJc3VwZXIoKTsKLQkJSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMiKTsKLSAgICAgICAgVVJMIHVybCA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpOwotICAgICAgICB0cnkgewotICAgICAgICAJQXV0b21hdGVkQlZULmJhc2VEaXJlY3RvcnkgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCkuZ2V0RmlsZSgpICsgIlRlc3REYXRhIisgamF2YS5pby5GaWxlLnNlcGFyYXRvckNoYXI7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL21vZHVsZWNvcmUvQWxsVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvbW9kdWxlY29yZS9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTg0MjhlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvbW9kdWxlY29yZS9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDE4LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5tb2R1bGVjb3JlOwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC50ZXN0cy5FamJQcm9qZWN0RmFjZXRDcmVhdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLS8qKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCQotCXB1YmxpYyBzdGF0aWMgSVJ1bnRpbWUgSk9OQVNfVE9NQ0FUX1JVTlRJTUUgPSBjcmVhdGVKT05BU1J1bnRpbWUoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpewotICAgICAgICByZXR1cm4gbmV3IEFsbFRlc3RzKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBBbGxUZXN0cygpewotICAgICAgICBzdXBlcigiTW9kdWxlQ29yZSBUZXN0cyIpOwotICAgICAgICAvL2FkZFRlc3QoUHJvamVjdEZhY2V0Q3JlYXRpb25UZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KEVqYlByb2plY3RGYWNldENyZWF0aW9uVGVzdC5zdWl0ZSgpKTsKLSAgICB9Ci0JcHVibGljIHN0YXRpYyBJUnVudGltZSBjcmVhdGVKT05BU1J1bnRpbWUoKSB7IAotCSAgICAgICBTdHJpbmcgcyA9ICJEOi9KT25BUy00LjMuMi9saWIiOwotCSAgICAgICBpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKLQkgICAgICAgICAgcmV0dXJuIG51bGw7Ci0JICAgICAgIHRyeSB7Ci0JICAgICAgICAgIElSdW50aW1lVHlwZSBydCA9IFNlcnZlckNvcmUuZmluZFJ1bnRpbWVUeXBlKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiKTsKLQkgICAgICAgICAgSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IHJ0LmNyZWF0ZVJ1bnRpbWUobnVsbCwgbnVsbCk7Ci0JICAgICAgICAgIHdjLnNldExvY2F0aW9uKG5ldyBQYXRoKHMpKTsKLQkgICAgICAgICAgcmV0dXJuIHdjLnNhdmUodHJ1ZSwgbnVsbCk7Ci0JICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JICAgICAgICAgIHJldHVybiBudWxsOwotCSAgICAgICB9Ci0JICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS9qc3QvajJlZS90ZXN0cy9tb2R1bGVjb3JlL0ZsZXhpYmxlUHJvamVjdEJ1aWxkZXJUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL21vZHVsZWNvcmUvRmxleGlibGVQcm9qZWN0QnVpbGRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZjMTg1OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL21vZHVsZWNvcmUvRmxleGlibGVQcm9qZWN0QnVpbGRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMubW9kdWxlY29yZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkNvbXBvbmVudGNvcmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Qcm9qZWN0Q29tcG9uZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuUmVmZXJlbmNlZENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuU3RydWN0dXJlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuV29ya2JlbmNoQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEZsZXhpYmxlUHJvamVjdEJ1aWxkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9fUkVTT1VSQ0VfVVJJX1BST1RPQ09MID0gIm1vZHVsZTovcmVzb3VyY2UvIjsKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBFTUZXb3JrYmVuY2hDb250ZXh0IGVtZkNvbnRleHQ7Ci0KLQlwdWJsaWMgRmxleGlibGVQcm9qZWN0QnVpbGRlclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJLy8gcmV0dXJuIG5ldyBUZXN0U3VpdGUoTW9kdWxlRWRpdE1vZGVsVGVzdC5jbGFzcyk7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgRmxleGlibGVQcm9qZWN0QnVpbGRlclRlc3QoInRlc3RGbGV4aWJsZVByb2plY3RCdWlsZGVyT3V0cHV0IikpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2Muc2V0QXV0b0J1aWxkaW5nKGZhbHNlKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNldERlc2NyaXB0aW9uKGRlc2MpOwotCQlnZXRQcm9qZWN0Rm9yV2ViTW9kdWxlQW5kTG9jYWxXZWJMaWIoKS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCWdldFByb2plY3RGb3JSZW1vdGVXZWJMaWIoKS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEZsZXhpYmxlUHJvamVjdEJ1aWxkZXJPdXRwdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2V0dXBDb250ZW50KCk7Ci0JCWJ1aWxkUHJvamVjdHMoKTsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBidWlsZFByb2plY3RzKCkgewotCQl0cnkgewotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPOiBoYW5kbGUgZXhjZXB0aW9uCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXR1cENvbnRlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RydWN0dXJlRWRpdCBsb2NhbE1vZHVsZUNvcmUgPSBudWxsOwotCQl0cnkgewotCQkJZ2V0UHJvamVjdEZvcldlYk1vZHVsZUFuZExvY2FsV2ViTGliKCk7Ci0KLQkJCUlQcm9qZWN0IGNvbnRhaW5pbmdQcm9qZWN0ID0gU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdChnZXRXZWJNb2R1bGVVUkkoKSk7Ci0JCQlsb2NhbE1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShjb250YWluaW5nUHJvamVjdCk7Ci0KLQkJCWNyZWF0ZUxvY2FsTW9kdWxlcyhsb2NhbE1vZHVsZUNvcmUpOwotCi0JCQkvLyB3aWxsIHNldHVwIGFuZCBoYW5kbGUgY3JlYXRpbmcgdGhlIG1vZHVsZXMgbW9kZWwKLQkJCWdldFByb2plY3RGb3JSZW1vdGVXZWJMaWIoKTsKLQotCQkJV29ya2JlbmNoQ29tcG9uZW50IHdlYk1vZHVsZSA9IGxvY2FsTW9kdWxlQ29yZS5nZXRDb21wb25lbnQoKTsKLQotCQkJYWRkRGVwZW5kZW50TW9kdWxlKHdlYk1vZHVsZSwgbmV3IFBhdGgoIldFQi1JTkYvbGliIiksIGdldExvY2FsV2ViTGlicmFyeU1vZHVsZVVSSSgpKTsKLQkJCWFkZERlcGVuZGVudE1vZHVsZSh3ZWJNb2R1bGUsIG5ldyBQYXRoKCJXRUItSU5GL2xpYiIpLCBnZXRSZW1vdGVXZWJMaWJyYXJ5TW9kdWxlVVJJKCkpOwotCi0JCQlsb2NhbE1vZHVsZUNvcmUuc2F2ZUlmTmVjZXNzYXJ5KG51bGwpOwotCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAobG9jYWxNb2R1bGVDb3JlICE9IG51bGwpCi0JCQkJbG9jYWxNb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJfQotCi0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3RGb3JXZWJNb2R1bGVBbmRMb2NhbFdlYkxpYigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0V2ViUHJvamVjdChnZXRXZWJNb2R1bGVBbmRMb2NhbFdlYkxpYk1vZHVsZVByb2plY3ROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0Rm9yUmVtb3RlV2ViTGliKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRKYXZhUHJvamVjdChnZXRSZW1vdGVXZWJMaWJNb2R1bGVQcm9qZWN0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdlYk1vZHVsZUFuZExvY2FsV2ViTGliTW9kdWxlUHJvamVjdE5hbWUoKSB7Ci0JCXJldHVybiAiTXlNb2R1bGVzUHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlbW90ZVdlYkxpYk1vZHVsZVByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gIlJlbW90ZVdlYkxpYlByb2plY3QiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFdlYlByb2plY3QoU3RyaW5nIGFQcm9qZWN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoYVByb2plY3ROYW1lKTsKLQkJaWYgKCFwcm9qZWN0LmV4aXN0cygpKQotCQkJcHJvamVjdCA9IGNyZWF0ZVdlYlByb2plY3QoYVByb2plY3ROYW1lKTsKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldEphdmFQcm9qZWN0KFN0cmluZyBhUHJvamVjdE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGFQcm9qZWN0TmFtZSk7Ci0JCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJLy8gY3JlYXRlSmF2YVByb2plY3QoYVByb2plY3ROYW1lKTsKLQkJfQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgY3JlYXRlV2ViUHJvamVjdChTdHJpbmcgYVByb2plY3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGFQcm9qZWN0TmFtZSk7Ci0JCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgYVByb2plY3ROYW1lKTsKLQkJCWRhdGFNb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGFQcm9qZWN0TmFtZSk7Ci0JfQotCi0JLy8gcHVibGljIElQcm9qZWN0IGNyZWF0ZUphdmFQcm9qZWN0KFN0cmluZyBhUHJvamVjdE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCS8vCi0JLy8gcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChhUHJvamVjdE5hbWUpOwotCS8vIGlmICghcHJvamVjdC5leGlzdHMoKSkgewotCS8vIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3Ci0JLy8gVGVzdEphdmFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkvLyBkYXRhTW9kZWwuc2V0UHJvcGVydHkoSVRlc3RKYXZhUHJvamVjdENyZWF0aW9uUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIGFQcm9qZWN0TmFtZSk7Ci0JLy8gZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksbnVsbCk7Ci0JLy8gcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChhUHJvamVjdE5hbWUpOwotCS8vIE1vZHVsZUNvcmVOYXR1cmUuYWRkTW9kdWxlQ29yZU5hdHVyZUlmTmVjZXNzYXJ5KHByb2plY3QsIG51bGwpOwotCS8vCi0JLy8gTW9kdWxlU3RydWN0dXJhbE1vZGVsIHN0cnVjdHVyYWxNb2RlbCA9IG51bGw7Ci0JLy8gdHJ5IHsKLQkvLyBzdHJ1Y3R1cmFsTW9kZWwgPQotCS8vIE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KS5nZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGb3JXcml0ZSh0aGlzKTsKLQkvLyBzdHJ1Y3R1cmFsTW9kZWwucHJlcGFyZVByb2plY3RNb2R1bGVzSWZOZWNlc3NhcnkoKTsKLQkvLyBTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSAoU3RydWN0dXJlRWRpdCkKLQkvLyBzdHJ1Y3R1cmFsTW9kZWwuZ2V0QWRhcHRlcihTdHJ1Y3R1cmVFZGl0LkFEQVBURVJfVFlQRSk7Ci0JLy8gU3RyaW5nIGRlcGxveWVkTmFtZSA9IGFQcm9qZWN0TmFtZSArICIuamFyIjsKLQkvLyBVUkkgbW9kdWxlVVJJID0gVVJJLmNyZWF0ZVVSSShNT0RVTEVfX1JFU09VUkNFX1VSSV9QUk9UT0NPTCArIGFQcm9qZWN0TmFtZSArIElQYXRoLlNFUEFSQVRPUgotCS8vICsgZGVwbG95ZWROYW1lKTsKLQkvLyBXb3JrYmVuY2hDb21wb25lbnQgdXRpbGl0eU1vZHVsZSA9IGFkZFdvcmtiZW5jaE1vZHVsZShtb2R1bGVDb3JlLmdldENvbXBvbmVudE1vZGVsUm9vdCgpLAotCS8vIGRlcGxveWVkTmFtZSwgbW9kdWxlVVJJKTsKLQkvLyBJUmVzb3VyY2Ugc291cmNlRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoInNyYyIpOwotCS8vIGFkZFJlc291cmNlKHV0aWxpdHlNb2R1bGUsIHNvdXJjZUZvbGRlciwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCS8vIHN0cnVjdHVyYWxNb2RlbC5zYXZlSWZOZWNlc3NhcnkodGhpcyk7Ci0JLy8gfSBmaW5hbGx5IHsKLQkvLyBpZiAoc3RydWN0dXJhbE1vZGVsICE9IG51bGwpCi0JLy8gc3RydWN0dXJhbE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGFQcm9qZWN0TmFtZSk7Ci0JLy8gfQotCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2UoV29ya2JlbmNoQ29tcG9uZW50IGFNb2R1bGUsIElSZXNvdXJjZSBhU291cmNlRmlsZSwgU3RyaW5nIGFEZXBsb3lQYXRoKSB7Ci0JCUNvbXBvbmVudFJlc291cmNlIHJlc291cmNlID0gQ29tcG9uZW50Y29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBvbmVudFJlc291cmNlKCk7Ci0JCXJlc291cmNlLnNldFNvdXJjZVBhdGgoYVNvdXJjZUZpbGUuZ2V0RnVsbFBhdGgoKSk7Ci0JCXJlc291cmNlLnNldFJ1bnRpbWVQYXRoKG5ldyBQYXRoKGFEZXBsb3lQYXRoKSk7Ci0JCWFNb2R1bGUuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQl9Ci0KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGFkZFdvcmtiZW5jaE1vZHVsZShQcm9qZWN0Q29tcG9uZW50cyB0aGVNb2R1bGVzLCBTdHJpbmcgYURlcGxveWVkTmFtZSwgVVJJIGFIYW5kbGUpIHsKLQkJV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IENvbXBvbmVudGNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrYmVuY2hDb21wb25lbnQoKTsKLQkJbW9kdWxlLnNldE5hbWUoYURlcGxveWVkTmFtZSk7Ci0JCXRoZU1vZHVsZXMuZ2V0Q29tcG9uZW50cygpLmFkZChtb2R1bGUpOwotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERlcGVuZGVudE1vZHVsZShXb3JrYmVuY2hDb21wb25lbnQgYU1vZHVsZSwgSVBhdGggYURlcGxveWVkUGF0aCwgVVJJIGFIYW5kbGUpIHsKLQkJUmVmZXJlbmNlZENvbXBvbmVudCBhQ2xhc3NwYXRoRGVwZW5kZW50TW9kdWxlID0gQ29tcG9uZW50Y29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJYUNsYXNzcGF0aERlcGVuZGVudE1vZHVsZS5zZXRSdW50aW1lUGF0aChhRGVwbG95ZWRQYXRoKTsKLQkJYUNsYXNzcGF0aERlcGVuZGVudE1vZHVsZS5zZXRIYW5kbGUoYUhhbmRsZSk7Ci0JCWFNb2R1bGUuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKS5hZGQoYUNsYXNzcGF0aERlcGVuZGVudE1vZHVsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlTG9jYWxNb2R1bGVzKFN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJUHJvamVjdENvbXBvbmVudHMgcHJvamVjdE1vZHVsZXMgPSBtb2R1bGVDb3JlLmdldENvbXBvbmVudE1vZGVsUm9vdCgpOwotCi0JCVdvcmtiZW5jaENvbXBvbmVudCB3ZWJMaWJyYXJ5TW9kdWxlID0gYWRkV29ya2JlbmNoTW9kdWxlKHByb2plY3RNb2R1bGVzLCBnZXRMb2NhbFdlYkxpYnJhcnlEZXBsb3llZE5hbWUoKSwgZ2V0TG9jYWxXZWJMaWJyYXJ5TW9kdWxlVVJJKCkpOwotCQlJRm9sZGVyIGxvY2FsV2ViTGlicmFyeSA9IGdldFByb2plY3RGb3JXZWJNb2R1bGVBbmRMb2NhbFdlYkxpYigpLmdldEZvbGRlcihnZXRMb2NhbFdlYkxpYnJhcnlGb2xkZXJOYW1lKCkpOwotCQlpZiAoIWxvY2FsV2ViTGlicmFyeS5leGlzdHMoKSkKLQkJCWxvY2FsV2ViTGlicmFyeS5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCWFkZFJlc291cmNlKHdlYkxpYnJhcnlNb2R1bGUsIGxvY2FsV2ViTGlicmFyeSwgIi8iKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldFdlYk1vZHVsZVVSSSgpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoTU9EVUxFX19SRVNPVVJDRV9VUklfUFJPVE9DT0wgKyBnZXRXZWJNb2R1bGVBbmRMb2NhbFdlYkxpYk1vZHVsZVByb2plY3ROYW1lKCkgKyBJUGF0aC5TRVBBUkFUT1IgKyBnZXRXZWJNb2R1bGVEZXBsb3llZE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFVSSSBnZXRMb2NhbFdlYkxpYnJhcnlNb2R1bGVVUkkoKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKE1PRFVMRV9fUkVTT1VSQ0VfVVJJX1BST1RPQ09MICsgZ2V0V2ViTW9kdWxlQW5kTG9jYWxXZWJMaWJNb2R1bGVQcm9qZWN0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsgZ2V0TG9jYWxXZWJMaWJyYXJ5RGVwbG95ZWROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0UmVtb3RlV2ViTGlicmFyeU1vZHVsZVVSSSgpIHsKLQkJcmV0dXJuIFVSSS5jcmVhdGVVUkkoTU9EVUxFX19SRVNPVVJDRV9VUklfUFJPVE9DT0wgKyBnZXRSZW1vdGVXZWJMaWJNb2R1bGVQcm9qZWN0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsgZ2V0UmVtb3RlV2ViTGlicmFyeURlcGxveWVkTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdlYk1vZHVsZURlcGxveWVkTmFtZSgpIHsKLQkJcmV0dXJuIGdldFdlYk1vZHVsZUFuZExvY2FsV2ViTGliTW9kdWxlUHJvamVjdE5hbWUoKSArICIud2FyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxXZWJMaWJyYXJ5RGVwbG95ZWROYW1lKCkgewotCQlyZXR1cm4gIkxvY2FsV2ViTGlicmFyeS5qYXIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZW1vdGVXZWJMaWJyYXJ5RGVwbG95ZWROYW1lKCkgewotCQlyZXR1cm4gZ2V0UmVtb3RlV2ViTGliTW9kdWxlUHJvamVjdE5hbWUoKSArICIuamFyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlc0ZvbGRlcigpIHsKLQkJcmV0dXJuICJNeVdlYk1vZHVsZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRlc3RSZXNvdXJjZVBhdGgoKSB7Ci0JCXJldHVybiAiV0VCLUlORi93ZWIueG1sIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxXZWJMaWJyYXJ5Rm9sZGVyTmFtZSgpIHsKLQkJcmV0dXJuICJXZWJMaWJyYXJ5Q29udGVudHMiOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvbW9kdWxlY29yZS9Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWxUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL2pzdC9qMmVlL3Rlc3RzL21vZHVsZWNvcmUvTW9kdWxlU3RydWN0dXJhbE1vZGVsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWIyYWM3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2UvanN0L2oyZWUvdGVzdHMvbW9kdWxlY29yZS9Nb2R1bGVTdHJ1Y3R1cmFsTW9kZWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLm1vZHVsZWNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIuY29tcG9uZW50Y29yZS51dGlsLldlYkFydGlmYWN0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLk1vZHVsZUNvcmVOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLkFydGlmYWN0RWRpdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Db21wb25lbnRSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuQ29tcG9uZW50Y29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLlByb2plY3RDb21wb25lbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5SZWZlcmVuY2VkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5Xb3JrYmVuY2hDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLmltcGwuQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLlBsYXRmb3JtVVJMTW9kdWxlQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwuaW1wbC5SZXNvdXJjZVRyZWVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLlNvdXJjZVBhdGhQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLkVNRldvcmtiZW5jaENvbnRleHQ7Ci0KLS8qKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGNsYXNzIGlzIGV4cGVyaW1lbnRhbCB1bnRpbCBmdWxseSBkb2N1bWVudGVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTW9kdWxlU3RydWN0dXJhbE1vZGVsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9fUkVTT1VSQ0VfVVJJX1BST1RPQ09MID0gIm1vZHVsZTovcmVzb3VyY2UvIjsKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJpdmF0ZSBFTUZXb3JrYmVuY2hDb250ZXh0IGVtZkNvbnRleHQ7Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIElNb2R1bGVUeXBlc0NvbnN0YW50cyB7Ci0JCVN0cmluZyBNT0RVTEVfVFlQRV9XRUIgPSAib3JnLmVjbGlwc2UuanN0Lm1vZHVsZXMud2ViIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JcHVibGljIE1vZHVsZVN0cnVjdHVyYWxNb2RlbFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQkvLyByZXR1cm4gbmV3IFRlc3RTdWl0ZShNb2R1bGVFZGl0TW9kZWxUZXN0LmNsYXNzKTsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxUZXN0KCJ0ZXN0UmVzb2x2ZURlcGVuZGVudE1vZHVsZSIpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlnZXRQcm9qZWN0Rm9yV2ViTW9kdWxlQW5kTG9jYWxXZWJMaWIoKS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCWdldFByb2plY3RGb3JSZW1vdGVXZWJMaWIoKS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCXNldHVwQ29udGVudCgpOwotCQlzdXBlci5zZXRVcCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8qIFdlIG5lZWQgdG8gZmluZCB0aGUgcHJvamVjdCAqLwotCQkJbW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvclJlYWQoU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdChnZXRXZWJNb2R1bGVVUkkoKSkpOwotCi0JCQlXb3JrYmVuY2hDb21wb25lbnQgbW9kdWxlID0gbW9kdWxlQ29yZS5nZXRXb3JrYmVuY2hNb2R1bGVzKClbMF07Ci0JCQlSZXNvdXJjZVRyZWVSb290IHNvdXJjZVJvb3QgPSBuZXcgUmVzb3VyY2VUcmVlUm9vdChtb2R1bGUsIFNvdXJjZVBhdGhQcm92aWRlci5JTlNUQU5DRSk7Ci0JCQlDb21wb25lbnRSZXNvdXJjZVtdIHJlc291cmNlcyA9IHNvdXJjZVJvb3QuZmluZE1vZHVsZVJlc291cmNlcyhVUkkuY3JlYXRlVVJJKCIvV2ViQ29udGVudC9XRUItSU5GL3dlYi54bWwiKSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzb3VyY2VzWzBdICE9IG51bGwgPyByZXNvdXJjZXNbMF0uZ2V0U291cmNlUGF0aCgpLnRvU3RyaW5nKCkgOiAiTk9UIEZPVU5EIik7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb2R1bGVDb3JlICE9IG51bGwpCi0JCQkJbW9kdWxlQ29yZS5kaXNwb3NlKCk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlRGVwZW5kZW50TW9kdWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IGNvbnRhaW5pbmdQcm9qZWN0ID0gU3RydWN0dXJlRWRpdC5nZXRDb250YWluaW5nUHJvamVjdChnZXRXZWJNb2R1bGVVUkkoKSk7Ci0JCQltb2R1bGVDb3JlID0gU3RydWN0dXJlRWRpdC5nZXRTdHJ1Y3R1cmVFZGl0Rm9yUmVhZChjb250YWluaW5nUHJvamVjdCk7Ci0JCQlXb3JrYmVuY2hDb21wb25lbnRbXSBtb2R1bGVzID0gbW9kdWxlQ29yZS5nZXRXb3JrYmVuY2hNb2R1bGVzKCk7Ci0JCQlQcm9qZWN0Q29tcG9uZW50cyBwbSA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50TW9kZWxSb290KCk7Ci0JCQlDbGFzcyBjbGF6eiA9IG1vZHVsZUNvcmUuZ2V0Q2xhc3MoKTsKLQkJCVN0cmluZyBuYW1lID0gU3RydWN0dXJlRWRpdC5nZXREZXBsb3llZE5hbWUoZ2V0V2ViTW9kdWxlVVJJKCkpOwotCQkJTGlzdCBkZXBlbmRlbnRNb2R1bGVzID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW9kdWxlOiAiICsgbW9kdWxlc1tpXS5nZXROYW1lKCkpOwotCQkJCUxpc3QgbGlzdCA9IG1vZHVsZXNbaV0uZ2V0UmVzb3VyY2VzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsaXN0LnNpemUoKTsgaisrKSB7Ci0JCQkJCUNvbXBvbmVudFJlc291cmNlIHdtciA9IChDb21wb25lbnRSZXNvdXJjZSkgbGlzdC5nZXQoaik7Ci0JCQkJCUlSZXNvdXJjZSBlciA9IFN0cnVjdHVyZUVkaXQuZ2V0RWNsaXBzZVJlc291cmNlKHdtcik7Ci0JCQkJfQotCQkJCS8vIHRlc3QgbW9kdWxlY29yZSBBUEkKLQkJCQlkZXBlbmRlbnRNb2R1bGVzID0gbW9kdWxlc1tpXS5nZXRSZWZlcmVuY2VkQ29tcG9uZW50cygpOwotCQkJCWZvciAoaW50IGRlcGVuZGVudEluZGV4ID0gMDsgZGVwZW5kZW50SW5kZXggPCBkZXBlbmRlbnRNb2R1bGVzLnNpemUoKTsgZGVwZW5kZW50SW5kZXgrKykgewotCQkJCQlSZWZlcmVuY2VkQ29tcG9uZW50IGRlcGVuZGVudE1vZHVsZSA9IChSZWZlcmVuY2VkQ29tcG9uZW50KSBkZXBlbmRlbnRNb2R1bGVzLmdldChkZXBlbmRlbnRJbmRleCk7Ci0JCQkJCVdvcmtiZW5jaENvbXBvbmVudCByZXNvbHZlZE1vZHVsZSA9IG1vZHVsZUNvcmUuZmluZENvbXBvbmVudEJ5VVJJKGRlcGVuZGVudE1vZHVsZS5nZXRIYW5kbGUoKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXHREZXBlbmRlbnRNb2R1bGU6ICIgKyByZXNvbHZlZE1vZHVsZS5nZXROYW1lKCkgKyAiIGluICIgKyByZXNvbHZlZE1vZHVsZS5nZXRIYW5kbGUoKSk7Ci0JCQkJCWJvb2xlYW4gYiA9IG1vZHVsZUNvcmUuaXNMb2NhbERlcGVuZGVuY3koZGVwZW5kZW50TW9kdWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKQotCQkJCW1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvYWRSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUFydGlmYWN0RWRpdE1vZGVsIGFydGlmYWN0TW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJVVJJIG1vZHVsZVVSSSA9IFVSSS5jcmVhdGVVUkkoTU9EVUxFX19SRVNPVVJDRV9VUklfUFJPVE9DT0wgKyBnZXRXZWJNb2R1bGVBbmRMb2NhbFdlYkxpYk1vZHVsZVByb2plY3ROYW1lKCkgKyAiLyIgKyBnZXRXZWJNb2R1bGVBbmRMb2NhbFdlYkxpYk1vZHVsZVByb2plY3ROYW1lKCkgKyAiLndhciIpOwotCQkJYXJ0aWZhY3RNb2RlbCA9IGdldE5hdHVyZShnZXRQcm9qZWN0Rm9yV2ViTW9kdWxlQW5kTG9jYWxXZWJMaWIoKSkuZ2V0QXJ0aWZhY3RFZGl0TW9kZWxGb3JSZWFkKG1vZHVsZVVSSSwgdGhpcyk7Ci0JCQlXZWJBcnRpZmFjdEVkaXQgZWRpdFV0aWxpdHkgPSAoV2ViQXJ0aWZhY3RFZGl0KSBhcnRpZmFjdE1vZGVsLmdldEFkYXB0ZXIoV2ViQXJ0aWZhY3RFZGl0LkFEQVBURVJfVFlQRSk7Ci0KLQkJCVdlYkFwcCB3ZWJBcHAgPSAoV2ViQXBwKSBlZGl0VXRpbGl0eS5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQkJCWlmICh3ZWJBcHAgPT0gbnVsbCkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlYWQgZmFpbGVkLiIpOwotCQkJZWxzZQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgV2ViQXBwOiAiICsgd2ViQXBwLmdldERpc3BsYXlOYW1lKCkpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGFydGlmYWN0TW9kZWwgIT0gbnVsbCkKLQkJCQlhcnRpZmFjdE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VVJJQVBJKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKE1PRFVMRV9fUkVTT1VSQ0VfVVJJX1BST1RPQ09MICsgZ2V0V2ViTW9kdWxlQW5kTG9jYWxXZWJMaWJNb2R1bGVQcm9qZWN0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsgZ2V0V2ViTW9kdWxlRGVwbG95ZWROYW1lKCkgKyAiLndhciIgKyBJUGF0aC5TRVBBUkFUT1IgKyBnZXRUZXN0UmVzb3VyY2VQYXRoKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVSSSA6IFwiIiArIHVyaS50b1N0cmluZygpICsgIlwiIiArICIgd2l0aCBzY2hlbWUgXCIiICsgdXJpLnNjaGVtZSgpICsgIlwiIGhhcyAiICsgdXJpLnNlZ21lbnRDb3VudCgpICsgIiBzZWdtZW50cy4gVGhleSBhcmUgLi4uIik7Ci0JCVN0cmluZ1tdIHNlZ21lbnRzID0gdXJpLnNlZ21lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlsiICsgaSArICJdOiAiICsgc2VnbWVudHNbaV0pOwotCi0KLQkJLyogRGV0ZXJtaW5lIGlmIHRoZSBVUkkgaXMgZm9yIGEgcmVzb3VyY2Ugb3IgYmluYXJ5IG1vZHVsZSAqLwotCi0JCWlmIChQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uUkVTT1VSQ0VfTU9EVUxFLmVxdWFscyhzZWdtZW50c1swXSkpIHsKLQkJCVN0cnVjdHVyZUVkaXQgbW9kdWxlQ29yZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW1vZHVsZUNvcmUgPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKFN0cnVjdHVyZUVkaXQuZ2V0Q29udGFpbmluZ1Byb2plY3QodXJpKSk7Ci0JCQkJQ29tcG9uZW50UmVzb3VyY2VbXSByZXNvdXJjZSA9IG1vZHVsZUNvcmUuZmluZFJlc291cmNlc0J5UnVudGltZVBhdGgodXJpKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzb3VyY2UgIT0gbnVsbCA/IHJlc291cmNlWzBdLmdldFNvdXJjZVBhdGgoKS50b1N0cmluZygpIDogIk5PVCBGT1VORCIpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAobW9kdWxlQ29yZSAhPSBudWxsKQotCQkJCQltb2R1bGVDb3JlLmRpc3Bvc2UoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChQbGF0Zm9ybVVSTE1vZHVsZUNvbm5lY3Rpb24uQklOQVJZX01PRFVMRS5lcXVhbHMoc2VnbWVudHNbMF0pKSB7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMb2FkaW5nRG9jdW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQXJ0aWZhY3RFZGl0TW9kZWxGYWN0b3J5KCk7Ci0KLQkJVVJJIG1vZHVsZVVSSSA9IFVSSS5jcmVhdGVVUkkoUGxhdGZvcm1VUkxNb2R1bGVDb25uZWN0aW9uLk1PRFVMRV9QUk9UT0NPTCArIElQYXRoLlNFUEFSQVRPUiArIGdldFdlYk1vZHVsZUFuZExvY2FsV2ViTGliTW9kdWxlUHJvamVjdE5hbWUoKSArIElQYXRoLlNFUEFSQVRPUiArIGdldFdlYk1vZHVsZURlcGxveWVkTmFtZSgpKTsKLQkJVVJJIGRkVVJJID0gVVJJLmNyZWF0ZVVSSShJUGF0aC5TRVBBUkFUT1IgKyAiV0VCLUlORiIgKyBJUGF0aC5TRVBBUkFUT1IgKyAid2ViLnhtbCIpOwotCi0JCU1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwYXJhbXMucHV0KEFydGlmYWN0RWRpdE1vZGVsRmFjdG9yeS5QQVJBTV9NT0RVTEVfVVJJLCBtb2R1bGVVUkkpOwotCQlFTUZXb3JrYmVuY2hDb250ZXh0IGNvbnRleHQgPSBjcmVhdGVFTUZXb3JrYmVuY2hDb250ZXh0KCk7Ci0JCUFydGlmYWN0RWRpdE1vZGVsIGVkaXRNb2RlbCA9IChBcnRpZmFjdEVkaXRNb2RlbCkgZmFjdG9yeS5jcmVhdGVFZGl0TW9kZWxGb3JXcml0ZShJTW9kdWxlVHlwZXNDb25zdGFudHMuTU9EVUxFX1RZUEVfV0VCLCBjb250ZXh0LCBwYXJhbXMpOwotCQlSZXNvdXJjZSBkZFJlc291cmNlID0gZWRpdE1vZGVsLmdldFJlc291cmNlKGRkVVJJKTsKLQkJRU9iamVjdCByb290T2JqZWN0ID0gKEVPYmplY3QpIGRkUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5nZXQoMCk7Ci0JCWlmIChyb290T2JqZWN0ID09IG51bGwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlYWQgZmFpbGVkLiIpOwotCQllbHNlCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZvdW5kIFdlYkFwcDogIiArICgoV2ViQXBwKSByb290T2JqZWN0KS5nZXREaXNwbGF5TmFtZSgpKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldHVwQ29udGVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJ1Y3R1cmVFZGl0IGxvY2FsTW9kdWxlQ29yZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlnZXRQcm9qZWN0Rm9yV2ViTW9kdWxlQW5kTG9jYWxXZWJMaWIoKTsKLQotCQkJSVByb2plY3QgY29udGFpbmluZ1Byb2plY3QgPSBTdHJ1Y3R1cmVFZGl0LmdldENvbnRhaW5pbmdQcm9qZWN0KGdldFdlYk1vZHVsZVVSSSgpKTsKLQkJCWxvY2FsTW9kdWxlQ29yZSA9IFN0cnVjdHVyZUVkaXQuZ2V0U3RydWN0dXJlRWRpdEZvcldyaXRlKGNvbnRhaW5pbmdQcm9qZWN0KTsKLQotCQkJY3JlYXRlTG9jYWxNb2R1bGVzKGxvY2FsTW9kdWxlQ29yZSk7Ci0KLQkJCS8vIHdpbGwgc2V0dXAgYW5kIGhhbmRsZSBjcmVhdGluZyB0aGUgbW9kdWxlcyBtb2RlbAotCQkJZ2V0UHJvamVjdEZvclJlbW90ZVdlYkxpYigpOwotCi0JCQlXb3JrYmVuY2hDb21wb25lbnQgd2ViTW9kdWxlID0gbG9jYWxNb2R1bGVDb3JlLmdldENvbXBvbmVudCgpOwotCi0JCQlhZGREZXBlbmRlbnRNb2R1bGUod2ViTW9kdWxlLCBuZXcgUGF0aCgiV0VCLUlORi9saWIiKSwgZ2V0TG9jYWxXZWJMaWJyYXJ5TW9kdWxlVVJJKCkpOwotCQkJYWRkRGVwZW5kZW50TW9kdWxlKHdlYk1vZHVsZSwgbmV3IFBhdGgoIldFQi1JTkYvbGliIiksIGdldFJlbW90ZVdlYkxpYnJhcnlNb2R1bGVVUkkoKSk7Ci0KLQkJCWxvY2FsTW9kdWxlQ29yZS5zYXZlSWZOZWNlc3NhcnkobnVsbCk7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChsb2NhbE1vZHVsZUNvcmUgIT0gbnVsbCkKLQkJCQlsb2NhbE1vZHVsZUNvcmUuZGlzcG9zZSgpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVMb2NhbE1vZHVsZXMoU3RydWN0dXJlRWRpdCBtb2R1bGVDb3JlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlQcm9qZWN0Q29tcG9uZW50cyBwcm9qZWN0TW9kdWxlcyA9IG1vZHVsZUNvcmUuZ2V0Q29tcG9uZW50TW9kZWxSb290KCk7Ci0KLQkJV29ya2JlbmNoQ29tcG9uZW50IHdlYkxpYnJhcnlNb2R1bGUgPSBhZGRXb3JrYmVuY2hNb2R1bGUocHJvamVjdE1vZHVsZXMsIGdldExvY2FsV2ViTGlicmFyeURlcGxveWVkTmFtZSgpLCBnZXRMb2NhbFdlYkxpYnJhcnlNb2R1bGVVUkkoKSk7Ci0JCUlGb2xkZXIgbG9jYWxXZWJMaWJyYXJ5ID0gZ2V0UHJvamVjdEZvcldlYk1vZHVsZUFuZExvY2FsV2ViTGliKCkuZ2V0Rm9sZGVyKGdldExvY2FsV2ViTGlicmFyeUZvbGRlck5hbWUoKSk7Ci0JCWlmICghbG9jYWxXZWJMaWJyYXJ5LmV4aXN0cygpKQotCQkJbG9jYWxXZWJMaWJyYXJ5LmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJYWRkUmVzb3VyY2Uod2ViTGlicmFyeU1vZHVsZSwgbG9jYWxXZWJMaWJyYXJ5LCAiLyIpOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRNb2R1bGVSZWxhdGl2ZUZpbGUoU3RyaW5nIGFNb2R1bGVSZWxhdGl2ZVBhdGgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0UHJvamVjdEZvcldlYk1vZHVsZUFuZExvY2FsV2ViTGliKCkuZ2V0RmlsZShuZXcgUGF0aChnZXRNb2R1bGVzRm9sZGVyKCkgKyBJUGF0aC5TRVBBUkFUT1IgKyBhTW9kdWxlUmVsYXRpdmVQYXRoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2UoV29ya2JlbmNoQ29tcG9uZW50IGFNb2R1bGUsIElSZXNvdXJjZSBhU291cmNlRmlsZSwgU3RyaW5nIGFEZXBsb3lQYXRoKSB7Ci0JCUNvbXBvbmVudFJlc291cmNlIHJlc291cmNlID0gQ29tcG9uZW50Y29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNvbXBvbmVudFJlc291cmNlKCk7Ci0JCXJlc291cmNlLnNldFNvdXJjZVBhdGgoYVNvdXJjZUZpbGUuZ2V0RnVsbFBhdGgoKSk7Ci0JCXJlc291cmNlLnNldFJ1bnRpbWVQYXRoKG5ldyBQYXRoKGFEZXBsb3lQYXRoKSk7Ci0JCWFNb2R1bGUuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQl9Ci0KLQlwdWJsaWMgV29ya2JlbmNoQ29tcG9uZW50IGFkZFdvcmtiZW5jaE1vZHVsZShQcm9qZWN0Q29tcG9uZW50cyB0aGVNb2R1bGVzLCBTdHJpbmcgYURlcGxveWVkTmFtZSwgVVJJIGFIYW5kbGUpIHsKLQkJV29ya2JlbmNoQ29tcG9uZW50IG1vZHVsZSA9IENvbXBvbmVudGNvcmVGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVXb3JrYmVuY2hDb21wb25lbnQoKTsKLQkJbW9kdWxlLnNldE5hbWUoYURlcGxveWVkTmFtZSk7Ci0JCXRoZU1vZHVsZXMuZ2V0Q29tcG9uZW50cygpLmFkZChtb2R1bGUpOwotCQlyZXR1cm4gbW9kdWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERlcGVuZGVudE1vZHVsZShXb3JrYmVuY2hDb21wb25lbnQgYU1vZHVsZSwgSVBhdGggYURlcGxveWVkUGF0aCwgVVJJIGFIYW5kbGUpIHsKLQkJUmVmZXJlbmNlZENvbXBvbmVudCBhQ2xhc3NwYXRoRGVwZW5kZW50TW9kdWxlID0gQ29tcG9uZW50Y29yZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVJlZmVyZW5jZWRDb21wb25lbnQoKTsKLQkJYUNsYXNzcGF0aERlcGVuZGVudE1vZHVsZS5zZXRSdW50aW1lUGF0aChhRGVwbG95ZWRQYXRoKTsKLQkJYUNsYXNzcGF0aERlcGVuZGVudE1vZHVsZS5zZXRIYW5kbGUoYUhhbmRsZSk7Ci0JCWFNb2R1bGUuZ2V0UmVmZXJlbmNlZENvbXBvbmVudHMoKS5hZGQoYUNsYXNzcGF0aERlcGVuZGVudE1vZHVsZSk7Ci0JfQotCi0KLQlwdWJsaWMgRU1GV29ya2JlbmNoQ29udGV4dCBjcmVhdGVFTUZXb3JrYmVuY2hDb250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChlbWZDb250ZXh0ID09IG51bGwpCi0JCQllbWZDb250ZXh0ID0gbmV3IEVNRldvcmtiZW5jaENvbnRleHQoZ2V0UHJvamVjdEZvcldlYk1vZHVsZUFuZExvY2FsV2ViTGliKCkpOwotCQlyZXR1cm4gZW1mQ29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdEZvcldlYk1vZHVsZUFuZExvY2FsV2ViTGliKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRXZWJQcm9qZWN0KGdldFdlYk1vZHVsZUFuZExvY2FsV2ViTGliTW9kdWxlUHJvamVjdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3RGb3JSZW1vdGVXZWJMaWIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEphdmFQcm9qZWN0KGdldFJlbW90ZVdlYkxpYk1vZHVsZVByb2plY3ROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRXZWJQcm9qZWN0KFN0cmluZyBhUHJvamVjdE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGFQcm9qZWN0TmFtZSk7Ci0JCWlmICghcHJvamVjdC5leGlzdHMoKSkKLQkJCXByb2plY3QgPSBjcmVhdGVXZWJQcm9qZWN0KGFQcm9qZWN0TmFtZSk7Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCXB1YmxpYyBJUHJvamVjdCBnZXRKYXZhUHJvamVjdChTdHJpbmcgYVByb2plY3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChhUHJvamVjdE5hbWUpOwotCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCS8vIGNyZWF0ZUphdmFQcm9qZWN0KGFQcm9qZWN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGNyZWF0ZVdlYlByb2plY3QoU3RyaW5nIGFQcm9qZWN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChhUHJvamVjdE5hbWUpOwotCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIGFQcm9qZWN0TmFtZSk7Ci0JCQkvLyBkYXRhTW9kZWwuc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuSVNfRkxFWElCTEVfUFJPSkVDVCwKLQkJCS8vIEJvb2xlYW4uVFJVRSk7Ci0JCQkvLyBkYXRhTW9kZWwuc2V0UHJvcGVydHkoSVdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLAotCQkJLy8gQm9vbGVhbi5GQUxTRSk7Ci0JCQkvLyBkYXRhTW9kZWwuc2V0UHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1NFUlZFUl9UQVJHRVQsCi0JCQkvLyBCb29sZWFuLkZBTFNFKTsKLQkJCS8vIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShXZWJNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbC5TRVJWRVJfVEFSR0VUX0lELAotCQkJLy8gQWxsUGx1Z2luVGVzdHMuSk9OQVNfU0VSVkVSLmdldElkKCkpOwotCQkJZGF0YU1vZGVsLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIG51bGwpOwotCQl9Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoYVByb2plY3ROYW1lKTsKLQl9Ci0KLQkvLyBwdWJsaWMgSVByb2plY3QgY3JlYXRlSmF2YVByb2plY3QoU3RyaW5nIGFQcm9qZWN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JLy8KLQkvLyBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGFQcm9qZWN0TmFtZSk7Ci0JLy8gaWYgKCFwcm9qZWN0LmV4aXN0cygpKSB7Ci0JLy8gSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcKLQkvLyBUZXN0SmF2YVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCS8vIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJVGVzdEphdmFQcm9qZWN0Q3JlYXRpb25Qcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgYVByb2plY3ROYW1lKTsKLQkvLyBkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0JLy8gcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChhUHJvamVjdE5hbWUpOwotCS8vIE1vZHVsZUNvcmVOYXR1cmUuYWRkTW9kdWxlQ29yZU5hdHVyZUlmTmVjZXNzYXJ5KHByb2plY3QsIG51bGwpOwotCS8vCi0JLy8gTW9kdWxlU3RydWN0dXJhbE1vZGVsIHN0cnVjdHVyYWxNb2RlbCA9IG51bGw7Ci0JLy8gdHJ5IHsKLQkvLyBzdHJ1Y3R1cmFsTW9kZWwgPQotCS8vIE1vZHVsZUNvcmVOYXR1cmUuZ2V0TW9kdWxlQ29yZU5hdHVyZShwcm9qZWN0KS5nZXRNb2R1bGVTdHJ1Y3R1cmFsTW9kZWxGb3JXcml0ZSh0aGlzKTsKLQkvLyBzdHJ1Y3R1cmFsTW9kZWwucHJlcGFyZVByb2plY3RNb2R1bGVzSWZOZWNlc3NhcnkoKTsKLQkvLyBTdHJ1Y3R1cmVFZGl0IG1vZHVsZUNvcmUgPSAoU3RydWN0dXJlRWRpdCkKLQkvLyBzdHJ1Y3R1cmFsTW9kZWwuZ2V0QWRhcHRlcihTdHJ1Y3R1cmVFZGl0LkFEQVBURVJfVFlQRSk7Ci0JLy8gU3RyaW5nIGRlcGxveWVkTmFtZSA9IGFQcm9qZWN0TmFtZSArICIuamFyIjsKLQkvLyBVUkkgbW9kdWxlVVJJID0gVVJJLmNyZWF0ZVVSSShNT0RVTEVfX1JFU09VUkNFX1VSSV9QUk9UT0NPTCArIGFQcm9qZWN0TmFtZSArIElQYXRoLlNFUEFSQVRPUgotCS8vICsgZGVwbG95ZWROYW1lKTsKLQkvLyBXb3JrYmVuY2hDb21wb25lbnQgdXRpbGl0eU1vZHVsZSA9IGFkZFdvcmtiZW5jaE1vZHVsZShtb2R1bGVDb3JlLmdldENvbXBvbmVudE1vZGVsUm9vdCgpLAotCS8vIGRlcGxveWVkTmFtZSwgbW9kdWxlVVJJKTsKLQkvLyBJUmVzb3VyY2Ugc291cmNlRm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIoInNyYyIpOwotCS8vIGFkZFJlc291cmNlKHV0aWxpdHlNb2R1bGUsIHNvdXJjZUZvbGRlciwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCS8vIHN0cnVjdHVyYWxNb2RlbC5zYXZlSWZOZWNlc3NhcnkodGhpcyk7Ci0JLy8gfSBmaW5hbGx5IHsKLQkvLyBpZiAoc3RydWN0dXJhbE1vZGVsICE9IG51bGwpCi0JLy8gc3RydWN0dXJhbE1vZGVsLnJlbGVhc2VBY2Nlc3ModGhpcyk7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGFQcm9qZWN0TmFtZSk7Ci0JLy8gfQotCi0JcHVibGljIE1vZHVsZUNvcmVOYXR1cmUgZ2V0TmF0dXJlKElQcm9qZWN0IGFQcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKE1vZHVsZUNvcmVOYXR1cmUpIGFQcm9qZWN0LmdldE5hdHVyZShNb2R1bGVDb3JlTmF0dXJlLk1PRFVMRV9OQVRVUkVfSUQpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFVSSSBnZXRXZWJNb2R1bGVVUkkoKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKE1PRFVMRV9fUkVTT1VSQ0VfVVJJX1BST1RPQ09MICsgZ2V0V2ViTW9kdWxlQW5kTG9jYWxXZWJMaWJNb2R1bGVQcm9qZWN0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsgZ2V0V2ViTW9kdWxlRGVwbG95ZWROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBVUkkgZ2V0TG9jYWxXZWJMaWJyYXJ5TW9kdWxlVVJJKCkgewotCQlyZXR1cm4gVVJJLmNyZWF0ZVVSSShNT0RVTEVfX1JFU09VUkNFX1VSSV9QUk9UT0NPTCArIGdldFdlYk1vZHVsZUFuZExvY2FsV2ViTGliTW9kdWxlUHJvamVjdE5hbWUoKSArIElQYXRoLlNFUEFSQVRPUiArIGdldExvY2FsV2ViTGlicmFyeURlcGxveWVkTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldFJlbW90ZVdlYkxpYnJhcnlNb2R1bGVVUkkoKSB7Ci0JCXJldHVybiBVUkkuY3JlYXRlVVJJKE1PRFVMRV9fUkVTT1VSQ0VfVVJJX1BST1RPQ09MICsgZ2V0UmVtb3RlV2ViTGliTW9kdWxlUHJvamVjdE5hbWUoKSArIElQYXRoLlNFUEFSQVRPUiArIGdldFJlbW90ZVdlYkxpYnJhcnlEZXBsb3llZE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXZWJNb2R1bGVBbmRMb2NhbFdlYkxpYk1vZHVsZVByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gIk15TW9kdWxlc1Byb2plY3QiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZW1vdGVXZWJMaWJNb2R1bGVQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuICJSZW1vdGVXZWJMaWJQcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2ViTW9kdWxlRGVwbG95ZWROYW1lKCkgewotCQlyZXR1cm4gZ2V0V2ViTW9kdWxlQW5kTG9jYWxXZWJMaWJNb2R1bGVQcm9qZWN0TmFtZSgpICsgIi53YXIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbFdlYkxpYnJhcnlEZXBsb3llZE5hbWUoKSB7Ci0JCXJldHVybiAiTG9jYWxXZWJMaWJyYXJ5LmphciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlbW90ZVdlYkxpYnJhcnlEZXBsb3llZE5hbWUoKSB7Ci0JCXJldHVybiBnZXRSZW1vdGVXZWJMaWJNb2R1bGVQcm9qZWN0TmFtZSgpICsgIi5qYXIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNb2R1bGVzRm9sZGVyKCkgewotCQlyZXR1cm4gIk15V2ViTW9kdWxlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGVzdFJlc291cmNlUGF0aCgpIHsKLQkJcmV0dXJuICJXRUItSU5GL3dlYi54bWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbFdlYkxpYnJhcnlGb2xkZXJOYW1lKCkgewotCQlyZXR1cm4gIldlYkxpYnJhcnlDb250ZW50cyI7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvYXBwY2xpZW50L29wZXJhdGlvbnMvQWxsVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvYXBwY2xpZW50L29wZXJhdGlvbnMvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZiNDFjYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2FwcGNsaWVudC9vcGVyYXRpb25zL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuYXBwY2xpZW50Lm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmhlYWRsZXNzLnRlc3RzLnNhdmVzdHJhdGVneS5BcHBDbGllbnRJbXBvcnRPcGVyYXRpb25UZXN0OwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpewotICAgICAgICByZXR1cm4gbmV3IEFsbFRlc3RzKCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBBbGxUZXN0cygpewotICAgICAgICBzdXBlcigiQXBwIENsaWVudCBUZXN0cyIpOwotICAgICAgICBhZGRUZXN0KEFwcENsaWVudEV4cG9ydE9wZXJhdGlvblRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIGFkZFRlc3QoQXBwQ2xpZW50SW1wb3J0T3BlcmF0aW9uVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChBcHBDbGllbnRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LnN1aXRlKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvYXBwY2xpZW50L29wZXJhdGlvbnMvQXBwQ2xpZW50RXhwb3J0T3BlcmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9hcHBjbGllbnQvb3BlcmF0aW9ucy9BcHBDbGllbnRFeHBvcnRPcGVyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZjgwYzYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9hcHBjbGllbnQvb3BlcmF0aW9ucy9BcHBDbGllbnRFeHBvcnRPcGVyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNiwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmFwcGNsaWVudC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5BcHBDbGllbnRDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuaGVhZGxlc3MudGVzdHMuc2F2ZXN0cmF0ZWd5LkFwcENsaWVudEltcG9ydE9wZXJhdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmhlYWRsZXNzLnRlc3RzLnNhdmVzdHJhdGVneS5Nb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFwcENsaWVudEV4cG9ydE9wZXJhdGlvblRlc3QgZXh0ZW5kcyBNb2R1bGVFeHBvcnRPcGVyYXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQXBwQ2xpZW50RXhwb3J0T3BlcmF0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRlc3RTdWl0ZShBcHBDbGllbnRFeHBvcnRPcGVyYXRpb25UZXN0LmNsYXNzKTsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdENhc2UjZ2V0TW9kZWxJbnN0YW5jZSgpCi0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0TW9kZWxJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBcHBDbGllbnRDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZUV4cG9ydE9wZXJhdGlvblRlc3RDYXNlI2dldEltcG9ydFRlc3RDYXNlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdENhc2UgZ2V0SW1wb3J0VGVzdENhc2UoKSB7Ci0JCXJldHVybiBuZXcgQXBwQ2xpZW50SW1wb3J0T3BlcmF0aW9uVGVzdCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJvdGVjdGVkIElQcm9qZWN0W10gZ2V0RXhwb3J0YWJsZVByb2plY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0W10gcHJvanMgPSBzdXBlci5nZXRFeHBvcnRhYmxlUHJvamVjdHMoKTsKLQkJTGlzdCBmaWx0ZXJlZFByb2pzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2pzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvanNbaV07Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNBcHBsaWNhdGlvbkNsaWVudFByb2plY3QoY29tcC5nZXRQcm9qZWN0KCkpKQotCQkJCWZpbHRlcmVkUHJvanMuYWRkKHByb2plY3QpOwotCQl9Ci0JCXJldHVybiAoSVByb2plY3RbXSkgZmlsdGVyZWRQcm9qcy50b0FycmF5KG5ldyBJUHJvamVjdFtmaWx0ZXJlZFByb2pzLnNpemUoKV0pOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvYXBwY2xpZW50L29wZXJhdGlvbnMvQXBwQ2xpZW50UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9hcHBjbGllbnQvb3BlcmF0aW9ucy9BcHBDbGllbnRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZWVjZDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9hcHBjbGllbnQvb3BlcmF0aW9ucy9BcHBDbGllbnRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBOb3YgNiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmFwcGNsaWVudC5vcGVyYXRpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbmNsaWVudC5pbnRlcm5hbC5jcmVhdGlvbi5BcHBDbGllbnRGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRmFjZXREYXRhTW9kZWxNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdDsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0IGV4dGVuZHMgTW9kdWxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBERUZBVUxUX1BST0pFQ1RfTkFNRSA9ICJTaW1wbGVBcHBDbGllbnQiOwotICAgIAotICAgIC8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEFwcENsaWVudFByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVUZXN0U3VpdGUoQXBwQ2xpZW50UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIElEYXRhTW9kZWwgZ2V0Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgQXBwQ2xpZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElEYXRhTW9kZWwgZ2V0Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxXaXRoRWFyKCkgewotICAgICAgICBJRGF0YU1vZGVsIG1vZGVsID0gIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBcHBDbGllbnRGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotICAgICAgICBGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLSAgICAgICAgSURhdGFNb2RlbCBmYWNldERNID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKEoyRUVQcm9qZWN0VXRpbGl0aWVzLkFQUExJQ0FUSU9OX0NMSUVOVCk7Ci0gICAgICAgIGZhY2V0RE0uc2V0Qm9vbGVhblByb3BlcnR5KCBJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgdHJ1ZSApOwotICAgICAgICByZXR1cm4gbW9kZWw7Ci0gICAgfSAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvYXBwY2xpZW50L29wZXJhdGlvbnMvRmxleGlibGVBcHBDbGllbnRNb2R1bGVDcmVhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvYXBwY2xpZW50L29wZXJhdGlvbnMvRmxleGlibGVBcHBDbGllbnRNb2R1bGVDcmVhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM0ZGZjOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2FwcGNsaWVudC9vcGVyYXRpb25zL0ZsZXhpYmxlQXBwQ2xpZW50TW9kdWxlQ3JlYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuYXBwY2xpZW50Lm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb24uQXBwQ2xpZW50RmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuT3BlcmF0aW9uVGVzdENhc2U7Ci0KLQotcHVibGljIGNsYXNzIEZsZXhpYmxlQXBwQ2xpZW50TW9kdWxlQ3JlYXRpb25UZXN0IGV4dGVuZHMgT3BlcmF0aW9uVGVzdENhc2UgewotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9QUk9KRUNUX05BTUUgPSAiU2ltcGxlQXBwQ2xpZW50UHJvamVjdCI7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9NT0RVTEVfTkFNRT0gIlNpbXBsZUFwcENsaWVudE1vZHVsZSI7Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShGbGV4aWJsZUFwcENsaWVudE1vZHVsZUNyZWF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgY3JlYXRlQXBwQ2xpZW50TW9kdWxlKERFRkFVTFRfTU9EVUxFX05BTUUpOwotICAgIH0KLQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUFwcENsaWVudE1vZHVsZShTdHJpbmcgbW9kdWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gZ2V0RmxleGlibGVBcHBDbGllbnRNb2R1bGVDcmVhdGlvbigpOwotICAgICAgICBkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIERFRkFVTFRfUFJPSkVDVF9OQU1FKTsKLSAgICAgICAgcnVuQW5kVmVyaWZ5KGRhdGFNb2RlbCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBJRGF0YU1vZGVsIGdldEZsZXhpYmxlQXBwQ2xpZW50TW9kdWxlQ3JlYXRpb24oKXsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBBcHBDbGllbnRGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvZWFyL29wZXJhdGlvbnMvQWxsVGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvZWFyL29wZXJhdGlvbnMvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5NWZiYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2Vhci9vcGVyYXRpb25zL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuZWFyLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCl7Ci0gICAgICAgIHJldHVybiBuZXcgQWxsVGVzdHMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEFsbFRlc3RzKCl7Ci0gICAgICAgIHN1cGVyKCJFQVIgVGVzdHMiKTsKLSAgICAgLy8gICBhZGRUZXN0KEVBUkV4cG9ydE9wZXJhdGlvblRlc3Quc3VpdGUoKSk7Ci0gICAgICAgLy9hZGRUZXN0KEVBUkltcG9ydE9wZXJhdGlvblRlc3Quc3VpdGUoKSk7Ci0gICAgIC8vICAgYWRkVGVzdChFQVJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LnN1aXRlKCkpOwotICAgICAgIC8vIGFkZFRlc3QoRUFSQ29tcG9uZW50Q3JlYXRpb25UZXN0LnN1aXRlKCkpOwotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvZWFyL29wZXJhdGlvbnMvRUFSRXhwb3J0T3BlcmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9lYXIvb3BlcmF0aW9ucy9FQVJFeHBvcnRPcGVyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlM2I4YmYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9lYXIvb3BlcmF0aW9ucy9FQVJFeHBvcnRPcGVyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNiwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kCi0gKiBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmVhci5vcGVyYXRpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5PcGVyYXRpb25UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIENoYW5nZW1lCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlCi0gKiBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVBUkV4cG9ydE9wZXJhdGlvblRlc3QgZXh0ZW5kcyBPcGVyYXRpb25UZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOwotCi0gICAgcHVibGljIEVBUkV4cG9ydE9wZXJhdGlvblRlc3QoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotICAgIHB1YmxpYyBFQVJFeHBvcnRPcGVyYXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlVGVzdFN1aXRlKEVBUkV4cG9ydE9wZXJhdGlvblRlc3QuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBleHBvcnRFQVJQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgSVBhdGggZXhwb3J0UGF0aCwgYm9vbGVhbiBleHBvcnRTb3VyY2UpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgCUVudGVycHJpc2VBcHBsaWNhdGlvbkV4cG9ydERhdGFNb2RlbCBtb2RlbCA9IG5ldyBFbnRlcnByaXNlQXBwbGljYXRpb25FeHBvcnREYXRhTW9kZWwoKTsKLS8vICAgICAgICBtb2RlbC5zZXRQcm9wZXJ0eShFbnRlcnByaXNlQXBwbGljYXRpb25FeHBvcnREYXRhTW9kZWwuUFJPSkVDVF9OQU1FLCBwcm9qZWN0TmFtZSk7Ci0vLyAgICAgICAgbW9kZWwuc2V0UHJvcGVydHkoRW50ZXJwcmlzZUFwcGxpY2F0aW9uRXhwb3J0RGF0YU1vZGVsLkFSQ0hJVkVfREVTVElOQVRJT04sIGV4cG9ydFBhdGgudG9PU1N0cmluZygpKTsKLS8vICAgICAgICBtb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoRW50ZXJwcmlzZUFwcGxpY2F0aW9uRXhwb3J0RGF0YU1vZGVsLkVYUE9SVF9TT1VSQ0VfRklMRVMsIGV4cG9ydFNvdXJjZSk7Ci0vLyAgICAgICAgcnVuQW5kVmVyaWZ5KG1vZGVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXhwb3J0RUFSUHJvamVjdFdpdGhNZXRhRGF0YShTdHJpbmcgcHJvamVjdE5hbWUsIElQYXRoIGV4cG9ydFBhdGgsIGJvb2xlYW4gZXhwb3J0U291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgIAlFbnRlcnByaXNlQXBwbGljYXRpb25FeHBvcnREYXRhTW9kZWwgbW9kZWwgPSBuZXcgRW50ZXJwcmlzZUFwcGxpY2F0aW9uRXhwb3J0RGF0YU1vZGVsKCk7Ci0vLyAgICAgICAgbW9kZWwuc2V0UHJvcGVydHkoRW50ZXJwcmlzZUFwcGxpY2F0aW9uRXhwb3J0RGF0YU1vZGVsLlBST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotLy8gICAgICAgIG1vZGVsLnNldFByb3BlcnR5KEVudGVycHJpc2VBcHBsaWNhdGlvbkV4cG9ydERhdGFNb2RlbC5BUkNISVZFX0RFU1RJTkFUSU9OLCBleHBvcnRQYXRoLnRvT1NTdHJpbmcoKSk7Ci0vLyAgICAgICAgbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEVudGVycHJpc2VBcHBsaWNhdGlvbkV4cG9ydERhdGFNb2RlbC5FWFBPUlRfU09VUkNFX0ZJTEVTLCBleHBvcnRTb3VyY2UpOwotLy8gICAgICAgIG1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShFbnRlcnByaXNlQXBwbGljYXRpb25FeHBvcnREYXRhTW9kZWwuT1ZFUldSSVRFX0VYSVNUSU5HLCB0cnVlKTsKLS8vICAgICAgICBtb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoRW50ZXJwcmlzZUFwcGxpY2F0aW9uRXhwb3J0RGF0YU1vZGVsLklOQ0xVREVfQlVJTERfUEFUSF9BTkRfTUVUQV9GSUxFUywgdHJ1ZSk7Ci0vLyAgICAgICAgcnVuQW5kVmVyaWZ5KG1vZGVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RUFSMTJFeHBvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gIlRlc3QxMldFQkVKQkVBUiI7Ci0gICAgICAgIFN0cmluZyBlYXJOYW1lID0gIlRlc3REYXRhIiArIGZpbGVTZXAgKyAiRUFSSW1wb3J0VGVzdHMiICsgZmlsZVNlcCArICJUZXN0MTJXRUJFSkJFQVIuZWFyIjsKLSAgICAgICAgRUFSSW1wb3J0T3BlcmF0aW9uVGVzdC5sb2FkKHByb2plY3ROYW1lLCBlYXJOYW1lKTsKLSAgICAgICAgZXhwb3J0RUFSUHJvamVjdCgiVGVzdDEyV0VCRUpCRUFSIiwgSjJFRVBsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5hcHBlbmQoIlRlc3QxMldFQkVKQkVBUi5lYXIiKSwgZmFsc2UpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RUFSRXhwb3J0V2l0aE1ldGFEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9ICJUZXN0MTRXRUJFSkJFQVJXaXRoTWV0YURhdGEiOwotICAgICAgICBTdHJpbmcgZWFyTmFtZSA9ICJUZXN0RGF0YSIgKyBmaWxlU2VwICsgIkVBUkltcG9ydFRlc3RzIiArIGZpbGVTZXAgKyAiVGVzdDE0V0VCRUpCRUFSV2l0aE1ldGFEYXRhLmVhciI7Ci0gICAgICAgIEVBUkltcG9ydE9wZXJhdGlvblRlc3QubG9hZChwcm9qZWN0TmFtZSwgZWFyTmFtZSk7Ci0gICAgICAgIGV4cG9ydEVBUlByb2plY3RXaXRoTWV0YURhdGEoIlRlc3QxNFdFQkVKQkVBUldpdGhNZXRhRGF0YSIsIEoyRUVQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkuYXBwZW5kKCJUZXN0MTRXRUJFSkJFQVJXaXRoTWV0YURhdGEuZWFyIiksIHRydWUpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RUFSRXhwb3J0V2l0aFNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSAiVGVzdDE0V0VCRUpCRUFSIjsKLSAgICAgICAgU3RyaW5nIGVhck5hbWUgPSAiVGVzdERhdGEiICsgZmlsZVNlcCArICJFQVJJbXBvcnRUZXN0cyIgKyBmaWxlU2VwICsgIlRlc3QxNFdFQkVKQkVBUi5lYXIiOwotICAgICAgICBFQVJJbXBvcnRPcGVyYXRpb25UZXN0LmxvYWQocHJvamVjdE5hbWUsIGVhck5hbWUpOwotICAgICAgICBleHBvcnRFQVJQcm9qZWN0KCJUZXN0MTRXRUJFSkJFQVIiLCBKMkVFUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLmFwcGVuZCgiVGVzdDE0V0VCRUpCRUFSLmVhciIpLCB0cnVlKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvZWFyL29wZXJhdGlvbnMvRUFSSW1wb3J0T3BlcmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9lYXIvb3BlcmF0aW9ucy9FQVJJbXBvcnRPcGVyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTE0YzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9lYXIvb3BlcmF0aW9ucy9FQVJJbXBvcnRPcGVyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5lYXIub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuRUFSQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5FQVJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuRmlsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaW1wbC5XQVJGaWxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuTG9nVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlByb2plY3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuU2ltcGxlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5oZWFkbGVzcy50ZXN0cy5zYXZlc3RyYXRlZ3kuTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMucGx1Z2luLkhlYWRsZXNzVGVzdHNQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciB2aWpheWIKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUKLSAqIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRUFSSW1wb3J0T3BlcmF0aW9uVGVzdCBleHRlbmRzIE1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbGVTZXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuc2VwYXJhdG9yIik7Ci0KLSAgIAotCi0gICAgcHVibGljIEVBUkltcG9ydE9wZXJhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0VXRpbGl0eUphcnNJbkVBUihFQVJGaWxlIGVhckZpbGUpIHsKLSAgICAgICAgTGlzdCB1dGlsSmFycyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExpc3QgZmlsZXMgPSBlYXJGaWxlLmdldEFyY2hpdmVGaWxlcygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIEZpbGVJbXBsIGZpbGUgPSAoRmlsZUltcGwpIGZpbGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZS5pc0FyY2hpdmUoKSAmJiAhZmlsZS5pc01vZHVsZUZpbGUoKSAmJiBmaWxlLmdldFVSSSgpLmVuZHNXaXRoKCIuamFyIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgdXRpbEphcnMuYWRkKGZpbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdXRpbEphcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEVBUkltcG9ydFJvb3RMb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgCUVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbCBpbXBvcnRNb2RlbCA9IG51bGw7Ci0vLyAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gIlRlc3QxM1dFQkVKQkVBUiI7Ci0vLyAgICAgICAgU3RyaW5nIGVhck5hbWUgPSBnZXRGdWxsVGVzdERhdGFQYXRoKCJUZXN0RGF0YSIgKyBmaWxlU2VwICsgIkVBUkltcG9ydFRlc3RzIiArIGZpbGVTZXAgKyAiVGVzdDEzV0VCRUpCRUFSLmVhciIpOwotLy8gICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgIGltcG9ydE1vZGVsID0gbmV3IEVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbCgpOwotLy8gICAgICAgICAgICBpbXBvcnRNb2RlbC5zZXRQcm9wZXJ0eShFQVJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLS8vICAgICAgICAgICAgaW1wb3J0TW9kZWwuc2V0UHJvcGVydHkoRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsLkZJTEVfTkFNRSwgZWFyTmFtZSk7Ci0vLyAgICAgICAgICAgIGltcG9ydE1vZGVsLnNldEludFByb3BlcnR5KEVBUkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkNPTVBPTkVOVF9WRVJTSU9OLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0vLyAgICAgICAgICAgIC8vaW1wb3J0TW9kZWwuc2V0UHJvcGVydHkoRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuUFJPSkVDVF9MT0NBVElPTiwgImM6IiArIGZpbGVTZXAgKyAiRUFSVGVzdFRlbXAiKTsKLS8vICAgICAgICAgICAgaW1wb3J0TW9kZWwuc2V0UHJvcGVydHkoRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsLk5FU1RFRF9NT0RVTEVfUk9PVCwgImM6IiArIGZpbGVTZXAgKyAiRUFSVGVzdE1vZHVsZXNUZW1wIik7Ci0vLyAgICAgICAgICAgIHJ1bkFuZFZlcmlmeShpbXBvcnRNb2RlbCk7Ci0vLyAgICAgICAgfSBmaW5hbGx5IHsKLS8vICAgICAgICAgICAgaW1wb3J0TW9kZWwuZGlzcG9zZSgpOwotLy8gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy9UT0RPIE00IEFjdGlvbiBJdGVtIC0gZW5hYmxlIHRoZSB1dGlsIGphciB0ZXN0cyBhZnRlciB0aGUgZml4ZXMgZm9yIHV0aWwgamFyIGltcG9ydCBhcmUgYXZhaWxhYmxlIGluIE00Ci0KLSAgICAvKnB1YmxpYyB2b2lkIHRlc3RJbXBvcnRTb21lVXRpbGl0eUphcnNFeHBsb2RlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSAiVXRpbGl0eUphclRlc3RFQVIiOwotICAgICAgICBTdHJpbmcgZWFyTmFtZSA9IGdldEZ1bGxUZXN0RGF0YVBhdGgoIlRlc3REYXRhIiArIGZpbGVTZXAgKyAiRUFSSW1wb3J0VGVzdHMiICsgZmlsZVNlcCArICJVdGlsaXR5SmFyVGVzdEVBUi5lYXIiKTsKLSAgICAgICAgRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsIGltcG9ydE1vZGVsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGltcG9ydE1vZGVsID0gbmV3IEVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbCgpOwotICAgICAgICAgICAgaW1wb3J0TW9kZWwuc2V0UHJvcGVydHkoRW50ZXJwcmlzZUFwcGxpY2F0aW9uQ3JlYXRpb25EYXRhTW9kZWwuUFJPSkVDVF9OQU1FLCBwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBpbXBvcnRNb2RlbC5zZXRQcm9wZXJ0eShFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWwuRklMRV9OQU1FLCBlYXJOYW1lKTsKLSAgICAgICAgICAgIGltcG9ydE1vZGVsLnNldEludFByb3BlcnR5KEVudGVycHJpc2VBcHBsaWNhdGlvbkNyZWF0aW9uRGF0YU1vZGVsLkFQUExJQ0FUSU9OX1ZFUlNJT04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLSAgICAgICAgICAgIEVBUkZpbGUgZmlsZSA9IGltcG9ydE1vZGVsLmdldEVBUkZpbGUoKTsKLSAgICAgICAgICAgIExpc3QgdXRpbEphcnMgPSBnZXRVdGlsaXR5SmFyc0luRUFSKGZpbGUpOwotICAgICAgICAgICAgaWYgKCF1dGlsSmFycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICB1dGlsSmFycy5yZW1vdmUoMCk7Ci0gICAgICAgICAgICAgICAgdXRpbEphcnMucmVtb3ZlKDIpOwotICAgICAgICAgICAgICAgIGltcG9ydE1vZGVsLnNldFByb3BlcnR5KEVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbC5VVElMSVRZX0xJU1QsIHV0aWxKYXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vVE9ETyB0byBiZSBjaGFuZ2VkIHdoZW4gdGhlIG5ldyBwcm9wZXJ0eSBpcyBhdmFpbGFibGUsIEVBUkltcG9ydERhdGFNb2RlbC5DUkVBVEVfQklOQVJZX1BST0pFQ1QgaXMKLSAgICAgICAgICAgIC8vIHJlbW92ZWQKLSAgICAgICAgICAgIC8vaW1wb3J0TW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEVBUkltcG9ydERhdGFNb2RlbC5DUkVBVEVfQklOQVJZX1BST0pFQ1QsIGZhbHNlKTsKLSAgICAgICAgICAgIHJ1bkFuZFZlcmlmeShpbXBvcnRNb2RlbCk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpbXBvcnRNb2RlbC5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0VXRpbGl0eUphcnNFeHBsb2RlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSAiVXRpbGl0eUphclRlc3RFQVIiOwotICAgICAgICBTdHJpbmcgZWFyTmFtZSA9IGdldEZ1bGxUZXN0RGF0YVBhdGgoIlRlc3REYXRhIiArIGZpbGVTZXAgKyAiRUFSSW1wb3J0VGVzdHMiICsgZmlsZVNlcCArICJVdGlsaXR5SmFyVGVzdEVBUi5lYXIiKTsKLSAgICAgICAgRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsIGltcG9ydE1vZGVsID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGltcG9ydE1vZGVsID0gbmV3IEVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbCgpOwotICAgICAgICAgICAgaW1wb3J0TW9kZWwuc2V0UHJvcGVydHkoRW50ZXJwcmlzZUFwcGxpY2F0aW9uQ3JlYXRpb25EYXRhTW9kZWwuUFJPSkVDVF9OQU1FLCBwcm9qZWN0TmFtZSk7Ci0gICAgICAgICAgICBpbXBvcnRNb2RlbC5zZXRQcm9wZXJ0eShFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWwuRklMRV9OQU1FLCBlYXJOYW1lKTsKLSAgICAgICAgICAgIGltcG9ydE1vZGVsLnNldEludFByb3BlcnR5KEVudGVycHJpc2VBcHBsaWNhdGlvbkNyZWF0aW9uRGF0YU1vZGVsLkFQUExJQ0FUSU9OX1ZFUlNJT04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8zX0lEKTsKLSAgICAgICAgICAgIEVBUkZpbGUgZmlsZSA9IGltcG9ydE1vZGVsLmdldEVBUkZpbGUoKTsKLSAgICAgICAgICAgIExpc3QgdXRpbEphcnMgPSBnZXRVdGlsaXR5SmFyc0luRUFSKGZpbGUpOwotICAgICAgICAgICAgaWYgKCF1dGlsSmFycy5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgaW1wb3J0TW9kZWwuc2V0UHJvcGVydHkoRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsLlVUSUxJVFlfTElTVCwgdXRpbEphcnMpOwotICAgICAgICAgICAgLy9UT0RPIHRvIGJlIGNoYW5nZWQgd2hlbiB0aGUgbmV3IHByb3BlcnR5IGlzIGF2YWlsYWJsZSwgRUFSSW1wb3J0RGF0YU1vZGVsLkNSRUFURV9CSU5BUllfUFJPSkVDVCBpcwotICAgICAgICAgICAgLy8gcmVtb3ZlZAotICAgICAgICAgICAgLy9pbXBvcnRNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoRUFSSW1wb3J0RGF0YU1vZGVsLkNSRUFURV9CSU5BUllfUFJPSkVDVCwgZmFsc2UpOwotICAgICAgICAgICAgcnVuQW5kVmVyaWZ5KGltcG9ydE1vZGVsKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGltcG9ydE1vZGVsLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0V2ViTGliV2l0aE1ldGFEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9ICJZb3VyQ29tcGFueUV4YW1wbGVFQVIiOwotICAgICAgICBTdHJpbmcgZWFyTmFtZSA9IGdldEZ1bGxUZXN0RGF0YVBhdGgoIlRlc3REYXRhIiArIGZpbGVTZXAgKyAiRUFSSW1wb3J0VGVzdHMiICsgZmlsZVNlcCArICJZb3VyQ29tcGFueUV4YW1wbGVFQVIuZWFyIik7Ci0gICAgICAgIEVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbCBpbXBvcnRNb2RlbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbXBvcnRNb2RlbCA9IG5ldyBFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWwoKTsKLSAgICAgICAgICAgIGltcG9ydE1vZGVsLnNldFByb3BlcnR5KEVudGVycHJpc2VBcHBsaWNhdGlvbkNyZWF0aW9uRGF0YU1vZGVsLlBST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotICAgICAgICAgICAgaW1wb3J0TW9kZWwuc2V0UHJvcGVydHkoRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsLkZJTEVfTkFNRSwgZWFyTmFtZSk7Ci0gICAgICAgICAgICBpbXBvcnRNb2RlbC5zZXRJbnRQcm9wZXJ0eShFbnRlcnByaXNlQXBwbGljYXRpb25DcmVhdGlvbkRhdGFNb2RlbC5BUFBMSUNBVElPTl9WRVJTSU9OLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0gICAgICAgICAgICBFQVJGaWxlIGZpbGUgPSBpbXBvcnRNb2RlbC5nZXRFQVJGaWxlKCk7Ci0gICAgICAgICAgICBMaXN0IHdlYkxpYnMgPSBnZXRXZWJMaWJzKGZpbGUpOwotICAgICAgICAgICAgLy9UT0RPIHRvIGJlIGNoYW5nZWQgd2hlbiB0aGUgbmV3IHByb3BlcnR5IGlzIGF2YWlsYWJsZSwgRUFSSW1wb3J0RGF0YU1vZGVsLkNSRUFURV9CSU5BUllfUFJPSkVDVCBpcwotICAgICAgICAgICAgLy8gcmVtb3ZlZAotICAgICAgICAgICAgLy9pbXBvcnRNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoRUFSSW1wb3J0RGF0YU1vZGVsLkNSRUFURV9CSU5BUllfUFJPSkVDVCwgZmFsc2UpOwotICAgICAgICAgICAgTGlzdCBwcm9qZWN0TW9kZWxzID0gaW1wb3J0TW9kZWwuZ2V0UHJvamVjdE1vZGVscygpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0TW9kZWxzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2plY3RNb2RlbHMuZ2V0KGkpIGluc3RhbmNlb2YgSjJFRU1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsKSB7Ci0gICAgICAgICAgICAgICAgICAgIEoyRUVNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbCBwcm9qZWN0RGF0YU1vZGVsID0gKEoyRUVNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbCkgcHJvamVjdE1vZGVscy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0RGF0YU1vZGVsLmdldEoyRUVOYXR1cmVJRCgpLmVxdWFscyhKMkVFV2ViTmF0dXJlUnVudGltZS5KMkVFX05BVFVSRV9JRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3REYXRhTW9kZWwuc2V0UHJvcGVydHkoV2ViTW9kdWxlQ3JlYXRpb25EYXRhTW9kZWwuSkFSX0xJU1RfVEVYVF9VSSwgd2ViTGlicyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbXBvcnRNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsLlBSRVNFUlZFX1BST0pFQ1RfTUVUQURBVEEsIHRydWUpOwotICAgICAgICAgICAgcnVuQW5kVmVyaWZ5KGltcG9ydE1vZGVsKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGltcG9ydE1vZGVsLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0qLwotICAgIC8vVE9ETyBNNCBBY3Rpb24gSXRlbSAtIGVuYWJsZSB0aGUgdXRpbCBqYXIgdGVzdHMgYWZ0ZXIgdGhlIGZpeGVzIGZvciB1dGlsIGphciBpbXBvcnQgYXJlIGF2YWlsYWJsZSBpbiBNNAotICAgIC8qcHVibGljIHZvaWQgdGVzdEltcG9ydFV0aWxpdHlKYXJzQW5kV2ViTGliV2l0aE1ldGFEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9ICJVdGlsaXR5SmFyV2ViTGliV2l0aE1ldGFEYXRhRmlsZXNFQVIiOwotICAgICAgICBTdHJpbmcgZWFyTmFtZSA9IGdldEZ1bGxUZXN0RGF0YVBhdGgoIlRlc3REYXRhIiArIGZpbGVTZXAgKyAiRUFSSW1wb3J0VGVzdHMiICsgZmlsZVNlcCArICJVdGlsaXR5SmFyV2ViTGliV2l0aE1ldGFEYXRhRmlsZXNFQVIuZWFyIik7Ci0gICAgICAgIEVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbCBpbXBvcnRNb2RlbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbXBvcnRNb2RlbCA9IG5ldyBFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWwoKTsKLSAgICAgICAgICAgIGltcG9ydE1vZGVsLnNldFByb3BlcnR5KEVudGVycHJpc2VBcHBsaWNhdGlvbkNyZWF0aW9uRGF0YU1vZGVsLlBST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotICAgICAgICAgICAgaW1wb3J0TW9kZWwuc2V0UHJvcGVydHkoRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsLkZJTEVfTkFNRSwgZWFyTmFtZSk7Ci0gICAgICAgICAgICBpbXBvcnRNb2RlbC5zZXRJbnRQcm9wZXJ0eShFbnRlcnByaXNlQXBwbGljYXRpb25DcmVhdGlvbkRhdGFNb2RlbC5BUFBMSUNBVElPTl9WRVJTSU9OLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfM19JRCk7Ci0gICAgICAgICAgICBFQVJGaWxlIGZpbGUgPSBpbXBvcnRNb2RlbC5nZXRFQVJGaWxlKCk7Ci0gICAgICAgICAgICBMaXN0IHV0aWxKYXJzID0gZ2V0VXRpbGl0eUphcnNJbkVBUihmaWxlKTsKLSAgICAgICAgICAgIGlmICghdXRpbEphcnMuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIGltcG9ydE1vZGVsLnNldFByb3BlcnR5KEVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbC5VVElMSVRZX0xJU1QsIHV0aWxKYXJzKTsKLSAgICAgICAgICAgIExpc3Qgd2ViTGlicyA9IGdldFdlYkxpYnMoZmlsZSk7Ci0gICAgICAgICAgICAvL1RPRE8gdG8gYmUgY2hhbmdlZCB3aGVuIHRoZSBuZXcgcHJvcGVydHkgaXMgYXZhaWxhYmxlLCBFQVJJbXBvcnREYXRhTW9kZWwuQ1JFQVRFX0JJTkFSWV9QUk9KRUNUIGlzCi0gICAgICAgICAgICAvLyByZW1vdmVkCi0gICAgICAgICAgICAvL2ltcG9ydE1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShFQVJJbXBvcnREYXRhTW9kZWwuQ1JFQVRFX0JJTkFSWV9QUk9KRUNULCBmYWxzZSk7Ci0gICAgICAgICAgICBMaXN0IHByb2plY3RNb2RlbHMgPSBpbXBvcnRNb2RlbC5nZXRQcm9qZWN0TW9kZWxzKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RNb2RlbHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvamVjdE1vZGVscy5nZXQoaSkgaW5zdGFuY2VvZiBKMkVFTW9kdWxlQ3JlYXRpb25EYXRhTW9kZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgSjJFRU1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsIHByb2plY3REYXRhTW9kZWwgPSAoSjJFRU1vZHVsZUNyZWF0aW9uRGF0YU1vZGVsKSBwcm9qZWN0TW9kZWxzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb2plY3REYXRhTW9kZWwuZ2V0SjJFRU5hdHVyZUlEKCkuZXF1YWxzKEoyRUVXZWJOYXR1cmVSdW50aW1lLkoyRUVfTkFUVVJFX0lEKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdERhdGFNb2RlbC5zZXRQcm9wZXJ0eShXZWJNb2R1bGVDcmVhdGlvbkRhdGFNb2RlbC5KQVJfTElTVF9URVhUX1VJLCB3ZWJMaWJzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGltcG9ydE1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWwuUFJFU0VSVkVfUFJPSkVDVF9NRVRBREFUQSwgZmFsc2UpOwotICAgICAgICAgICAgcnVuQW5kVmVyaWZ5KGltcG9ydE1vZGVsKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGltcG9ydE1vZGVsLmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0qLwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBMaXN0IGdldFdlYkxpYnMoRUFSRmlsZSBlYXJGaWxlKSB7Ci0gICAgICAgIExpc3QgZmlsZXMgPSBlYXJGaWxlLmdldEFyY2hpdmVGaWxlcygpOwotICAgICAgICBMaXN0IHdlYkxpYnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIEZpbGVJbXBsIGZpbGUgPSAoRmlsZUltcGwpIGZpbGVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChmaWxlLmlzV0FSRmlsZSgpKSB7Ci0gICAgICAgICAgICAgICAgTGlzdCB3ZWJMaWIgPSAoKFdBUkZpbGVJbXBsKSBmaWxlKS5nZXRMaWJBcmNoaXZlcygpOwotICAgICAgICAgICAgICAgIGlmICghd2ViTGliLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICAgICAgd2ViTGlicy5hZGRBbGwod2ViTGliKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gd2ViTGliczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGdWxsVGVzdERhdGFQYXRoKFN0cmluZyBkYXRhUGF0aCkgewotICAgIAl0cnkgewotICAgIAkgIHJldHVybiBQcm9qZWN0VXRpbGl0eS5nZXRGdWxsRmlsZU5hbWUoSGVhZGxlc3NUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCksZGF0YVBhdGgpOwotICAgIAl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQllLnByaW50U3RhY2tUcmFjZSgpOwotICAgIAl9Ci0gICAgCXJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0RUFSMTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgICAgICBTdHJpbmcgcHJvamVjdE5hbWUgPSAiVGVzdDE0V0VCRUpCRUFSIjsKLS8vICAgICAgICBTdHJpbmcgZWFyTmFtZSA9IGdldEZ1bGxUZXN0RGF0YVBhdGgoIlRlc3REYXRhIiArIGZpbGVTZXAgKyAiRUFSSW1wb3J0VGVzdHMiICsgZmlsZVNlcCArICJUZXN0MTRXRUJFSkJFQVIuZWFyIik7Ci0vLyAgICAgICAgRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsIGltcG9ydE1vZGVsID0gbnVsbDsKLS8vICAgICAgICB0cnkgewotLy8gICAgICAgICAgICBpbXBvcnRNb2RlbCA9IG5ldyBFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWwoKTsKLS8vICAgICAgICAgICAgaW1wb3J0TW9kZWwuc2V0UHJvcGVydHkoRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsLlBST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotLy8gICAgICAgICAgICBpbXBvcnRNb2RlbC5zZXRQcm9wZXJ0eShFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWwuRklMRV9OQU1FLCBlYXJOYW1lKTsKLS8vICAgICAgICAgICAgcnVuQW5kVmVyaWZ5KGltcG9ydE1vZGVsKTsKLS8vICAgICAgICB9IGZpbmFsbHkgewotLy8gICAgICAgICAgICBpbXBvcnRNb2RlbC5kaXNwb3NlKCk7Ci0vLyAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVUZXN0U3VpdGUoRUFSSW1wb3J0T3BlcmF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltcG9ydFByb2plY3ROYW1lQ29sbGlzaW9uRm9yRUFSSW1wb3J0KCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIGVhck5hbWUgPSAiVGVzdERhdGEiICsgZmlsZVNlcCArICJFQVJJbXBvcnRUZXN0cyIgKyBmaWxlU2VwICsgIlRlc3QxM1dFQkVKQkVBUi5lYXIiOwotICAgICAgICAgICAgbG9hZChudWxsLCBlYXJOYW1lKTsKLSAgICAgICAgICAgIGxvYWQobnVsbCwgZWFyTmFtZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEltcG9ydEVBUjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBwcm9qZWN0TmFtZSA9ICJUZXN0MTJXRUJFSkJFQVIiOwotICAgICAgICBTdHJpbmcgZWFyTmFtZSA9ICJUZXN0RGF0YSIgKyBmaWxlU2VwICsgIkVBUkltcG9ydFRlc3RzIiArIGZpbGVTZXAgKyAiVGVzdDEyV0VCRUpCRUFSLmVhciI7Ci0gICAgICAgIGxvYWQocHJvamVjdE5hbWUsIGVhck5hbWUpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0RUFSMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gIlRlc3QxM1dFQkVKQkVBUiI7Ci0gICAgICAgIFN0cmluZyBlYXJOYW1lID0gIlRlc3REYXRhIiArIGZpbGVTZXAgKyAiRUFSSW1wb3J0VGVzdHMiICsgZmlsZVNlcCArICJUZXN0MTNXRUJFSkJFQVIuZWFyIjsKLSAgICAgICAgbG9hZChwcm9qZWN0TmFtZSwgZWFyTmFtZSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0QWxsRUFSSW1wb3J0UHJvamVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHByb2plY3ROYW1lID0gIkVBUlRlc3QiOwotICAgICAgICBTdHJpbmcgZWFyTmFtZSA9ICJUZXN0RGF0YSIgKyBmaWxlU2VwICsgIkVBUkltcG9ydFRlc3RzIiArIGZpbGVTZXA7Ci0gICAgICAgIExpc3QgcHJvamVjdHMgPSBQcm9qZWN0VXRpbGl0eS5nZXRFYXJzSW5EaXJlY3RvcnkoSGVhZGxlc3NUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCksZ2V0RnVsbFRlc3REYXRhUGF0aChlYXJOYW1lKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGRlbGV0ZUFsbFByb2plY3RzKCk7Ci0gICAgICAgICAgICBMb2dVdGlsaXR5LmdldEluc3RhbmNlKCkucmVzZXRMb2dnaW5nKCk7Ci0gICAgICAgICAgICBsb2FkKHByb2plY3ROYW1lLCBlYXJOYW1lICsgcHJvamVjdHMuZ2V0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkKFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIGVhck5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWwgaW1wb3J0TW9kZWwgPSBudWxsOwotCQkvLyB0cnkgewotCQkvLyBpbXBvcnRNb2RlbCA9IG5ldyBFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWwoKTsKLQkJLy8gaW1wb3J0TW9kZWwuc2V0UHJvcGVydHkoRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsLlBST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotCQkvLyBpbXBvcnRNb2RlbC5zZXRQcm9wZXJ0eShFbnRlcnByaXNlQXBwbGljYXRpb25JbXBvcnREYXRhTW9kZWwuRklMRV9OQU1FLAotCQkvLyBnZXRGdWxsVGVzdERhdGFQYXRoKGVhck5hbWUpKTsKLQkJLy8gcnVuQW5kVmVyaWZ5KGltcG9ydE1vZGVsKTsKLQkJLy8gfSBmaW5hbGx5IHsKLQkJLy8gaW1wb3J0TW9kZWwuZGlzcG9zZSgpOwotCQkvLyAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGdldEFyY2hpdmVJbkVBUihTdHJpbmcgZWFyRmlsZVVSSSkgewotICAgICAgICBDb21tb25hcmNoaXZlRmFjdG9yeSBmYWN0b3J5ID0gQ29tbW9uYXJjaGl2ZUZhY3RvcnkuZUlOU1RBTkNFOwotICAgICAgICBMaXN0IG1vZHVsZUFyY2hpdmVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXJjaGl2ZSBhcmNoaXZlID0gZmFjdG9yeS5vcGVuQXJjaGl2ZShlYXJGaWxlVVJJKTsKLSAgICAgICAgICAgIExpc3QgZmlsZXMgPSBhcmNoaXZlLmdldEZpbGVzKCk7Ci0gICAgICAgICAgICBpZiAoIWZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlQXJjaGl2ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IChGaWxlKSBmaWxlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxlLmlzQXJjaGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVBcmNoaXZlcy5hZGQoZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKE9wZW5GYWlsdXJlRXhjZXB0aW9uIG9lKSB7Ci0gICAgICAgICAgICBvZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbW9kdWxlQXJjaGl2ZXM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREaXJlY3RvcnkoKSB7Ci0JCXJldHVybiAiRUFSSW1wb3J0VGVzdHMiOwotCX0KLQotICAgIHByb3RlY3RlZCBMaXN0IGdldEltcG9ydGFibGVBcmNoaXZlRmlsZU5hbWVzKCkgewotCQlyZXR1cm4gUHJvamVjdFV0aWxpdHkuZ2V0RWFyc0luRGlyZWN0b3J5KEhlYWRsZXNzVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLCBURVNUU19QQVRIKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBnZXRNb2RlbEluc3RhbmNlKCkgewotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVBUkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9lYXIvb3BlcmF0aW9ucy9FQVJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2Vhci9vcGVyYXRpb25zL0VBUlByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVlNDA3OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2Vhci9vcGVyYXRpb25zL0VBUlByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIE9jdCAyNywgMjAwMwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZAotICogQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5lYXIub3BlcmF0aW9uczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGU7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUKLSAqIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVBUlByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLk9wZXJhdGlvblRlc3RDYXNlIHsKLSAgICBwdWJsaWMgRUFSUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdChTdHJpbmcgc3RyaW5nKSB7Ci0JCXN1cGVyKHN0cmluZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVRlc3RTdWl0ZShFQVJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LmNsYXNzKTsKLSAgICB9Ci0KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgICAgIGNyZWF0ZVNpbXBsZUVBUigiU2ltcGxlRUFSIik7Ci0vLyAgICB9Ci0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgICAgICBFQVJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCBkYXRhTW9kZWwgPSBuZXcgRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKTsKLS8vICAgICAgICBkYXRhTW9kZWwuc2V0UHJvcGVydHkoRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuUFJPSkVDVF9OQU1FLCAiU2ltcGxlRUFSIik7Ci0vLyAgICAgICAvLyBkYXRhTW9kZWwuc2V0UHJvcGVydHkoRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuUFJPSkVDVF9MT0NBVElPTiwgImM6L3RlbXAvIik7Ci0vLyAgICAgICAgcnVuQW5kVmVyaWZ5KGRhdGFNb2RlbCk7Ci0vLyAgICB9Ci0vLwotLy8gICAgcHVibGljIHZvaWQgdGVzdFZlcnNpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgCUVBUkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsIGRhdGFNb2RlbCA9IG5ldyBFQVJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpOwotLy8gICAgICAgIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShFQVJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5QUk9KRUNUX05BTUUsICJTaW1wbGVFQVIiKTsKLS8vICAgICAgICBkYXRhTW9kZWwuc2V0SW50UHJvcGVydHkoRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQ09NUE9ORU5UX1ZFUlNJT04sIEoyRUVWZXJzaW9uQ29uc3RhbnRzLkoyRUVfMV8yX0lEKTsKLS8vICAgICAgICBydW5BbmRWZXJpZnkoZGF0YU1vZGVsKTsKLS8vICAgIH0KLS8vCi0vLyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbjEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAJRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwgZGF0YU1vZGVsID0gbmV3IEVBUkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsKCk7Ci0vLyAgICAgICAgZGF0YU1vZGVsLnNldFByb3BlcnR5KEVBUkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLlBST0pFQ1RfTkFNRSwgIlNpbXBsZUVBUiIpOwotLy8gICAgICAgIGRhdGFNb2RlbC5zZXRJbnRQcm9wZXJ0eShFQVJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5DT01QT05FTlRfVkVSU0lPTiwgSjJFRVZlcnNpb25Db25zdGFudHMuSjJFRV8xXzNfSUQpOwotLy8gICAgICAgIHJ1bkFuZFZlcmlmeShkYXRhTW9kZWwpOwotLy8gICAgfQotLy8KLS8vICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uMTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vICAgIAlFQVJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCBkYXRhTW9kZWwgPSBuZXcgRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKTsKLS8vICAgICAgICBkYXRhTW9kZWwuc2V0UHJvcGVydHkoRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuUFJPSkVDVF9OQU1FLCAiU2ltcGxlRUFSIik7Ci0vLyAgICAgICAgZGF0YU1vZGVsLnNldEludFByb3BlcnR5KEVBUkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLkNPTVBPTkVOVF9WRVJTSU9OLCBKMkVFVmVyc2lvbkNvbnN0YW50cy5KMkVFXzFfNF9JRCk7Ci0vLyAgICAgICAgcnVuQW5kVmVyaWZ5KGRhdGFNb2RlbCk7Ci0vLyAgICB9Ci0vLwotLy8gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVNpbXBsZUVBUihTdHJpbmcgZWFyTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLyAgICAJRUFSQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwgZGF0YU1vZGVsID0gbmV3IEVBUkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsKCk7Ci0vLyAgICAgICAgZGF0YU1vZGVsLnNldFByb3BlcnR5KEVBUkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLlBST0pFQ1RfTkFNRSwgZWFyTmFtZSk7Ci0vLyAgICAgICAgcnVuQW5kVmVyaWZ5KGRhdGFNb2RlbCk7Ci0vLyAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvajJlZS9vcGVyYXRpb25zL01vZHVsZUV4cG9ydE9wZXJhdGlvblRlc3RDYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2oyZWUvb3BlcmF0aW9ucy9Nb2R1bGVFeHBvcnRPcGVyYXRpb25UZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTE4OWRiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvajJlZS9vcGVyYXRpb25zL01vZHVsZUV4cG9ydE9wZXJhdGlvblRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDYsIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLk9wZXJhdGlvblRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuUHJvamVjdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmhlYWRsZXNzLnRlc3RzLnNhdmVzdHJhdGVneS5Nb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5hcHBjbGllbnQub3BlcmF0aW9ucy5BcHBDbGllbnRFeHBvcnRPcGVyYXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmVqYi5vcGVyYXRpb25zLkVKQkV4cG9ydE9wZXJhdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuamNhLm9wZXJhdGlvbnMuUkFSRXhwb3J0T3BlcmF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5wbHVnaW4uSGVhZGxlc3NUZXN0c1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy53ZWIub3BlcmF0aW9ucy5XZWJFeHBvcnRPcGVyYXRpb25UZXN0OwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2R1bGVFeHBvcnRPcGVyYXRpb25UZXN0Q2FzZSBleHRlbmRzIE9wZXJhdGlvblRlc3RDYXNlIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGV4cG9ydFNvdXJjZUZpbGVzID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gb3ZlcndyaXRlRXhpc3RpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkYXRhTW9kZWxTaG91bGRCZVZhbGlkID0gdHJ1ZTsKLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgVEVTVFNfT1VUUFVUX1BBVEg7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJBUkV4cG9ydE9wZXJhdGlvblRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRUpCRXhwb3J0T3BlcmF0aW9uVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShXZWJFeHBvcnRPcGVyYXRpb25UZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFwcENsaWVudEV4cG9ydE9wZXJhdGlvblRlc3QuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHVibGljIE1vZHVsZUV4cG9ydE9wZXJhdGlvblRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCi0JCVN0cmluZyByZWxhdGl2ZU91dHB1dFRlc3RzUGF0aCA9ICJUZXN0RGF0YSIgKyBGaWxlLnNlcGFyYXRvciArIGdldE91dHB1dERpcmVjdG9yeSgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCVRFU1RTX09VVFBVVF9QQVRIID0gZ2V0T3V0cHV0UGF0aChyZWxhdGl2ZU91dHB1dFRlc3RzUGF0aCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0UGF0aChTdHJpbmcgcmVsUGF0aCkgewotCQl0cnl7Ci0JCQlyZXR1cm4gUHJvamVjdFV0aWxpdHkuZ2V0RnVsbEZpbGVOYW1lKEhlYWRsZXNzVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLHJlbFBhdGgpOwotCQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuT3BlcmF0aW9uVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWV4cG9ydFNvdXJjZUZpbGVzID0gZmFsc2U7Ci0JCW92ZXJ3cml0ZUV4aXN0aW5nID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPdXRwdXREaXJlY3RvcnkoKXsKLQkgICAgcmV0dXJuICJ0ZXN0T3V0cHV0IjsKLQl9Ci0JcHJvdGVjdGVkIGFic3RyYWN0IE1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlIGdldEltcG9ydFRlc3RDYXNlKCk7Ci0JcHJvdGVjdGVkIGFic3RyYWN0IElEYXRhTW9kZWwgZ2V0TW9kZWxJbnN0YW5jZSgpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdENhc2UjZ2V0RXhwb3J0YWJsZVByb2plY3RzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2plY3RbXSBnZXRFeHBvcnRhYmxlUHJvamVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCWRlbGV0ZUFsbFByb2plY3RzKCk7Ci0JCU1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlIGltcG9ydFRlc3RDYXNlID0gZ2V0SW1wb3J0VGVzdENhc2UoKTsgCi0JCWltcG9ydFRlc3RDYXNlLnRlc3RBbGxJbXBvcnRUZXN0Q2FzZXMoKTsKLQotCQkvLyBpZiB0aGUgcHJvamVjdHMgYXJlbid0IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LCB0aGUgcHJldmlvdXMKLQkJLy8gbGluZSB3aWxsIGZhaWwgc28gdGhlcmUncyBubyBuZWVkIHRvIHZlcmlmeQotCQlyZXR1cm4gUHJvamVjdFV0aWxpdHkuZ2V0QWxsUHJvamVjdHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhwb3J0KElWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIGZpbGVuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBnZXRNb2RlbEluc3RhbmNlKCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuQVJDSElWRV9ERVNUSU5BVElPTiwgVEVTVFNfT1VUUFVUX1BBVEggKyBmaWxlbmFtZSk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKMkVFQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIuQ09NUE9ORU5ULCBjb21wb25lbnQpOwotCQlkYXRhTW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEoyRUVDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlci5FWFBPUlRfU09VUkNFX0ZJTEVTLCBleHBvcnRTb3VyY2VGaWxlcyk7Ci0JCWRhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSjJFRUNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyLk9WRVJXUklURV9FWElTVElORywgb3ZlcndyaXRlRXhpc3RpbmcpOwotCi0JCWlmIChkYXRhTW9kZWxTaG91bGRCZVZhbGlkKQotCQkJcnVuQW5kVmVyaWZ5KGRhdGFNb2RlbCk7Ci0JCWVsc2UKLQkJCXZlcmlmeUludmFsaWREYXRhTW9kZWwoZGF0YU1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsV2l0aEV4cG9ydFNvdXJjZUZpbGVzV2l0aE92ZXJ3cml0ZUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWV4cG9ydFNvdXJjZUZpbGVzID0gdHJ1ZTsKLQkJb3ZlcndyaXRlRXhpc3RpbmcgPSB0cnVlOwotCi0JCXRlc3RBbGxFeHBvcnRUZXN0Q2FzZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsV2l0aEV4cG9ydFNvdXJjZUZpbGVzV2l0aG91dE92ZXJ3cml0ZUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWV4cG9ydFNvdXJjZUZpbGVzID0gdHJ1ZTsKLQkJb3ZlcndyaXRlRXhpc3RpbmcgPSBmYWxzZTsKLQotCQl0ZXN0QWxsRXhwb3J0VGVzdENhc2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbFdpdGhvdXRFeHBvcnRTb3VyY2VGaWxlc1dpdGhvdXRPdmVyd3JpdGVFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlleHBvcnRTb3VyY2VGaWxlcyA9IGZhbHNlOwotCQlvdmVyd3JpdGVFeGlzdGluZyA9IGZhbHNlOwotCi0JCXRlc3RBbGxFeHBvcnRUZXN0Q2FzZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsV2l0aG91dEV4cG9ydFNvdXJjZUZpbGVzV2l0aE92ZXJ3cml0ZUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWV4cG9ydFNvdXJjZUZpbGVzID0gZmFsc2U7Ci0JCW92ZXJ3cml0ZUV4aXN0aW5nID0gdHJ1ZTsKLQotCQl0ZXN0QWxsRXhwb3J0VGVzdENhc2VzKCk7Ci0JfQotCi0vLwlwdWJsaWMgdm9pZCB0ZXN0T3ZlcndyaXRlUHJvamVjdEV4cG9ydEZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCi0vLwkJdGVzdEFsbFdpdGhvdXRFeHBvcnRTb3VyY2VGaWxlc1dpdGhvdXRPdmVyd3JpdGVFeGlzdGluZygpOwotLy8JCWRhdGFNb2RlbFNob3VsZEJlVmFsaWQgPSBmYWxzZTsKLS8vCQl0ZXN0QWxsV2l0aG91dEV4cG9ydFNvdXJjZUZpbGVzV2l0aG91dE92ZXJ3cml0ZUV4aXN0aW5nKCk7Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcndyaXRlUHJvamVjdEV4cG9ydFN1Y2NlZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy9UT0RPOiBVbmNvbW1lbnQgdGhlIHNlY29uZCBsaW5lIHRvIHRlc3QgdGhlIGZpbGUgbG9jayB0ZXN0cy4gCi0JCS8vQ29tbWVudGluZyBpdCBvdXQgZm9yIG5vdyB0byBnZXQgYSBjbGVhcmFuY2Ugb24gUkMxIGZvciAwLjcgcmVsZWFzZQotCQl0ZXN0QWxsV2l0aG91dEV4cG9ydFNvdXJjZUZpbGVzV2l0aE92ZXJ3cml0ZUV4aXN0aW5nKCk7Ci0JCS8vdGVzdEFsbFdpdGhvdXRFeHBvcnRTb3VyY2VGaWxlc1dpdGhPdmVyd3JpdGVFeGlzdGluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxFeHBvcnRUZXN0Q2FzZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlGaWxlIGV4cG9ydERpcmVjdG9yeSA9IG5ldyBGaWxlKFRFU1RTX09VVFBVVF9QQVRIKTsKLQkJaWYgKGV4cG9ydERpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlGaWxlW10gY29udGVudHMgPSBleHBvcnREaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFjb250ZW50c1tpXS5pc0RpcmVjdG9yeSgpKQotCQkJCQljb250ZW50c1tpXS5kZWxldGUoKTsKLQkJCX0KLQkJfQotCQlJUHJvamVjdFtdIHByb2plY3RzID0gZ2V0RXhwb3J0YWJsZVByb2plY3RzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCXRlc3RFeHBvcnQoQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdHNbaV0pLCBnZXRGaWxlTmFtZShwcm9qZWN0c1tpXS5nZXROYW1lKCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoU3RyaW5nIGJhc2VOYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKGJhc2VOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgoZXhwb3J0U291cmNlRmlsZXMpID8gIl93aXRoU291cmNlIiA6ICJfd2l0aG91dFNvdXJjZSIpLmFwcGVuZChnZXRNb2R1bGVFeHBvcnRGaWxlRXh0KCkpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlRXhwb3J0RmlsZUV4dCgpIHsKLQkJcmV0dXJuICIuamFyIjsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2oyZWUvb3BlcmF0aW9ucy9Nb2R1bGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2oyZWUvb3BlcmF0aW9ucy9Nb2R1bGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZWNmYjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL29wZXJhdGlvbnMvTW9kdWxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5EYXRhTW9kZWxWZXJpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLk9wZXJhdGlvblRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmFwcGNsaWVudC5vcGVyYXRpb25zLkFwcENsaWVudFByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuZWpiLm9wZXJhdGlvbnMuRUpCUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLnZlcmlmaWVycy5EYXRhTW9kZWxWZXJpZmllckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuamNhLm9wZXJhdGlvbnMuQ29ubmVjdG9yUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy53ZWIub3BlcmF0aW9ucy5XZWJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTW9kdWxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdCBleHRlbmRzIE9wZXJhdGlvblRlc3RDYXNlIHsKLQlwcml2YXRlIGxvbmcgY29tcG9uZW50U2VlZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfUFJPSkVDVF9OQU1FID0gIlNpbXBsZVByb2plY3QiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9FQVJfUFJPSkVDVF9OQU1FID0gIlNpbXBsZUVBUlByb2plY3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9DT01QT05FTlRfTkFNRSA9ICJTaW1wbGVDb21wb25lbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9FQVJfQ09NUE9ORU5UX05BTUUgPSAiU2ltcGxlRUFSQ29tcG9uZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfQ09NUE9ORU5UX1dJVEhfRUFSID0gIkNvbXBvbmVudCI7IC8vJE5PTi1OTFMtMSQJCQotICAgIAotICAgIC8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIE1vZHVsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0U3VpdGUoQXBwQ2xpZW50UHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3RTdWl0ZShFSkJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LmNsYXNzKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKFdlYlByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QuY2xhc3MpOyAKLSAgICAgICAgc3VpdGUuYWRkVGVzdFN1aXRlKENvbm5lY3RvclByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QuY2xhc3MpOyAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgY3JlYXRlU2ltcGxlTW9kdWxlKERFRkFVTFRfQ09NUE9ORU5UX05BTUUgKyBjb21wb25lbnRTZWVkKTsKLSAgICB9Ci0gICAgCi0vL1RPIERPOiBUaGlzIG1ldGhvZCB0aHJvd3MgZXhjZXB0aW9uIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb246IDAKLQotICAgIAotLy8gICAgcHVibGljIHZvaWQgdGVzdE91dHB1dENvbnRhaW5lcigpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgCWNyZWF0ZVNpbXBsZU1vZHVsZShERUZBVUxUX0NPTVBPTkVOVF9OQU1FICsgY29tcG9uZW50U2VlZCk7Ci0vLyAgICAJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChERUZBVUxUX0NPTVBPTkVOVF9OQU1FICsgY29tcG9uZW50U2VlZCk7Ci0vLyAgICAJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0vLyAgICAJaWYgKCFKMkVFUHJvamVjdFV0aWxpdGllcy5pc0R5bmFtaWNXZWJQcm9qZWN0KGNvbXBvbmVudC5nZXRQcm9qZWN0KCkpIHx8ICFKMkVFUHJvamVjdFV0aWxpdGllcy5pc0FwcGxpY2F0aW9uQ2xpZW50UHJvamVjdChjb21wb25lbnQuZ2V0UHJvamVjdCgpKSkgewotLy8gICAgCQlJQ29udGFpbmVyW10gb3VwdXRDb250YWluZXJzID0gSjJFRVByb2plY3RVdGlsaXRpZXMuZ2V0T3V0cHV0Q29udGFpbmVycyhjb21wb25lbnQuZ2V0UHJvamVjdCgpKTsKLS8vICAgIAkJYXNzZXJ0Tm90TnVsbChvdXB1dENvbnRhaW5lcnNbMF0pOwotLy8gICAgCX0KLS8vICAgIH0KLQotCi0vLwlwcml2YXRlIHZvaWQgY3JlYXRlU2ltcGxlRUFSTW9kdWxlKFN0cmluZyBjb21wb25lbnROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotLy8gICAgICAgIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FLCBjb21wb25lbnROYW1lKTsKLS8vICAgICAgICBydW5BbmRWZXJpZnkoZGF0YU1vZGVsKTsKLS8vCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVNpbXBsZU1vZHVsZShTdHJpbmcgY29tcG9uZW50TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gZ2V0Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKTsKLSAgICAgICAgZGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBjb21wb25lbnROYW1lKTsKLSAgICAgICAgcnVuQW5kVmVyaWZ5KGRhdGFNb2RlbCxmYWxzZSx0cnVlKTsKLSAgICB9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSURhdGFNb2RlbCBnZXRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpOwotCXB1YmxpYyBhYnN0cmFjdCBJRGF0YU1vZGVsIGdldENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsV2l0aEVhcigpOwotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB2ZXJpZnlEYXRhTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHRocm93cyBFeGNlcHRpb257Ci0JICAgIERhdGFNb2RlbFZlcmlmaWVyIHZlcmlmaWVyID0gRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlVmVyaWZpZXIoZGF0YU1vZGVsKTsKLQkgICAgdmVyaWZpZXIudmVyaWZ5KGRhdGFNb2RlbCk7Ci0JfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZHRvRUFSKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNyZWF0ZU1vZHVsZVdpdGhFQVIoREVGQVVMVF9DT01QT05FTlRfV0lUSF9FQVIgKyBjb21wb25lbnRTZWVkKTsKLSAgICB9CQotICAgIAotCXB1YmxpYyB2b2lkIGNyZWF0ZU1vZHVsZVdpdGhFQVIoU3RyaW5nIGNvbXBvbmVudE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IGdldENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsV2l0aEVhcigpOwotICAgICAgICBpZiggZGF0YU1vZGVsICE9IG51bGwgKXsKLQkgICAgICAgIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJSjJFRUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUsIGNvbXBvbmVudE5hbWUpOwotCSAgICAgICAgcnVuQW5kVmVyaWZ5KGRhdGFNb2RlbCxmYWxzZSx0cnVlKTsKLSAgICAgICAgfQotICAgIH0gIAkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvajJlZS9vcGVyYXRpb25zL1JhbmRvbU9iamVjdEdlbmVyYXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL29wZXJhdGlvbnMvUmFuZG9tT2JqZWN0R2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MjVmMzUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL29wZXJhdGlvbnMvUmFuZG9tT2JqZWN0R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDYsIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZAotICogQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotCi0vKioKLSAqIEBhdXRob3IgYmxhbmNldHQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUKLSAqIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgUmFuZG9tT2JqZWN0R2VuZXJhdG9yIHsKLSAgICBwcm90ZWN0ZWQgc3RhdGljIFJhbmRvbU9iamVjdEdlbmVyYXRvciByYW5kb21PYmplY3RHZW5lcmF0b3I7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgUmFuZG9tIHJhbmRvbUdlbmVyYXRvciA9IG5ldyBSYW5kb20oKTsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbWF4TnVtT2ZMZXR0ZXJzSW5Xb3JkcyA9IDE1OwotICAgIHByaXZhdGUgc3RhdGljIGludCBtYXhOdW1iZXJPZlByb2plY3RzQ3JlYXRlZCA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHVwcGVyQ2FzZVNlZWQgPSA2NTsgLy9BU0NJSSAnQScKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbG93ZXJDYXNlU2VlZCA9IDk3OyAvL0FTQ0lJICdhJwotICAgIHByaXZhdGUgc3RhdGljIGludCBpbnZhbGlkQ2hhclNlZWQgPSAzMzsKLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgbnVtYmVyU2VlZCA9IDQ4OwotICAgIHByaXZhdGUgc3RhdGljIGludCBhbHBoYWJldFJhbmdlID0gMjU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHN5bWJvbFJhbmdlID0gMTU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IG51bWJlclJhbmdlID0gOTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvcnJlY3RSYW5kb21Qcm9qZWN0TmFtZXMoKSB7Ci0gICAgICAgIGludCBudW1PZmxldHRlckluV29yZCA9IE1hdGgubWF4KHJhbmRvbUdlbmVyYXRvci5uZXh0SW50KG1heE51bU9mTGV0dGVyc0luV29yZHMgKyAxKSwgMik7Ci0gICAgICAgIFN0cmluZyBzdHJpbmcgPSBuZXcgU3RyaW5nKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtT2ZsZXR0ZXJJbldvcmQ7IGkrKykgewotICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nICsgY3JlYXRlUmFuZG9tQ2hhcmFjdGVySW5BbHBoYWJldFJhbmdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVSYW5kb21OdW1iZXJzKCkgewotICAgICAgICBjaGFyIHJhbmRvbUNoYXI7Ci0gICAgICAgIGludCByYW5kb21JbnQgPSByYW5kb21HZW5lcmF0b3IubmV4dEludChudW1iZXJSYW5nZSArIDEpOwotICAgICAgICByYW5kb21DaGFyID0gKGNoYXIpIChyYW5kb21JbnQgKyBudW1iZXJTZWVkKTsKLSAgICAgICAgcmV0dXJuIChuZXcgQ2hhcmFjdGVyKHJhbmRvbUNoYXIpKS50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVJhbmRvbUludmFpbGRDaGFyYWN0ZXJzKCkgewotICAgICAgICBjaGFyIHJhbmRvbUNoYXI7Ci0gICAgICAgIGludCByYW5kb21JbnQgPSByYW5kb21HZW5lcmF0b3IubmV4dEludChzeW1ib2xSYW5nZSArIDEpOwotICAgICAgICByYW5kb21DaGFyID0gKGNoYXIpIChyYW5kb21JbnQgKyBpbnZhbGlkQ2hhclNlZWQpOwotICAgICAgICByZXR1cm4gKG5ldyBDaGFyYWN0ZXIocmFuZG9tQ2hhcikpLnRvU3RyaW5nKCk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgaW50IGNyZWF0ZVJhbmRvbVByb2plY3ROdW1iZXIoKSB7Ci0gICAgICAgIHJldHVybiByYW5kb21HZW5lcmF0b3IubmV4dEludChtYXhOdW1iZXJPZlByb2plY3RzQ3JlYXRlZCArIDEpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVJhbmRvbUNoYXJhY3RlckluQWxwaGFiZXRSYW5nZSgpIHsKLSAgICAgICAgY2hhciByYW5kb21DaGFyOwotICAgICAgICBpbnQgcmFuZG9tSW50ID0gcmFuZG9tR2VuZXJhdG9yLm5leHRJbnQoYWxwaGFiZXRSYW5nZSArIDEpOwotICAgICAgICBpZiAoKHJhbmRvbUludCAlIDIpID09IDApCi0gICAgICAgICAgICByYW5kb21DaGFyID0gKGNoYXIpIChyYW5kb21JbnQgKyBsb3dlckNhc2VTZWVkKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmFuZG9tQ2hhciA9IChjaGFyKSAocmFuZG9tSW50ICsgdXBwZXJDYXNlU2VlZCk7Ci0gICAgICAgIHJldHVybiBDaGFyYWN0ZXIudG9TdHJpbmcocmFuZG9tQ2hhcik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlSW52YWxpZFJhbmRvbVByb2plY3ROYW1lKCkgewotICAgICAgICBpbnQgbnVtT2ZsZXR0ZXJJbldvcmQgPSByYW5kb21HZW5lcmF0b3IubmV4dEludChtYXhOdW1PZkxldHRlcnNJbldvcmRzICsgMSk7Ci0gICAgICAgIFN0cmluZyBzdHJpbmcgPSBuZXcgU3RyaW5nKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtT2ZsZXR0ZXJJbldvcmQ7IGkrKykgewotICAgICAgICAgICAgc3RyaW5nLmNvbmNhdChjcmVhdGVSYW5kb21JbnZhaWxkQ2hhcmFjdGVycygpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvcnJlY3RSYW5kb21Qcm9qZWN0TmFtZXNBbGxDaGFycygpIHsKLSAgICAgICAgaW50IG51bU9mbGV0dGVySW5Xb3JkID0gTWF0aC5tYXgocmFuZG9tR2VuZXJhdG9yLm5leHRJbnQobWF4TnVtT2ZMZXR0ZXJzSW5Xb3JkcyArIDEpLCAyKTsKLSAgICAgICAgU3RyaW5nIHN0cmluZyA9IG5ldyBTdHJpbmcoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1PZmxldHRlckluV29yZDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocmFuZG9tR2VuZXJhdG9yLm5leHRJbnQoKSAlIDUgPT0gMCkgewotICAgICAgICAgICAgICAgIENoYXJhY3RlciBjID0gbmV3IENoYXJhY3RlcignJCcpOwotICAgICAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZyArIGMudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJhbmRvbUdlbmVyYXRvci5uZXh0SW50KCkgJSAyID09IDApIHsKLSAgICAgICAgICAgICAgICBDaGFyYWN0ZXIgYyA9IG5ldyBDaGFyYWN0ZXIoJ18nKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcgKyBjLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJpbmcgKz0gY3JlYXRlUmFuZG9tQ2hhcmFjdGVySW5BbHBoYWJldFJhbmdlKCk7Ci0gICAgICAgICAgICBpZiAocmFuZG9tR2VuZXJhdG9yLm5leHRJbnQoKSAlIDMgPT0gMCkKLSAgICAgICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcgKyBjcmVhdGVSYW5kb21OdW1iZXJzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgbnVtT2ZsZXR0ZXJJbldvcmQgLSAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJhbmRvbU9iamVjdEdlbmVyYXRvciBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgaWYgKHJhbmRvbU9iamVjdEdlbmVyYXRvciA9PSBudWxsKQotICAgICAgICAgICAgcmFuZG9tT2JqZWN0R2VuZXJhdG9yID0gbmV3IFJhbmRvbU9iamVjdEdlbmVyYXRvcigpOwotICAgICAgICByZXR1cm4gcmFuZG9tT2JqZWN0R2VuZXJhdG9yOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9BcHBDbGllbnRFeHBvcnREYXRhTW9kZWxWZXJpZmllci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9BcHBDbGllbnRFeHBvcnREYXRhTW9kZWxWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWZkYTk4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvajJlZS92ZXJpZmllcnMvQXBwQ2xpZW50RXhwb3J0RGF0YU1vZGVsVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLnZlcmlmaWVyczsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRFeHBvcnREYXRhTW9kZWxWZXJpZmllciBleHRlbmRzIE1vZHVsZUV4cG9ydERhdGFNb2RlbFZlcmlmaWVyIHsKLSAKLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvajJlZS92ZXJpZmllcnMvQXBwQ2xpZW50SW1wb3J0RGF0YU1vZGVsVmVyaWZpZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvajJlZS92ZXJpZmllcnMvQXBwQ2xpZW50SW1wb3J0RGF0YU1vZGVsVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk4NDVjZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2oyZWUvdmVyaWZpZXJzL0FwcENsaWVudEltcG9ydERhdGFNb2RlbFZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS52ZXJpZmllcnM7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50SW1wb3J0RGF0YU1vZGVsVmVyaWZpZXIgZXh0ZW5kcyBNb2R1bGVJbXBvcnREYXRhTW9kZWxWZXJpZmllciB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvajJlZS92ZXJpZmllcnMvQXBwQ2xpZW50UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvajJlZS92ZXJpZmllcnMvQXBwQ2xpZW50UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4YmE3OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2oyZWUvdmVyaWZpZXJzL0FwcENsaWVudFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS52ZXJpZmllcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uY2xpZW50LmNvbXBvbmVudGNvcmUudXRpbC5BcHBDbGllbnRBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY2xpZW50LkFwcGxpY2F0aW9uQ2xpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBDbGllbnRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxWZXJpZmllciBleHRlbmRzIE1vZHVsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyIHsKLSAvKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUudmVyaWZpZXJzLkoyRUVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxWZXJpZmllciN2ZXJpZnlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwoY29tLmlibS5ldG9vbHMuYXBwbGljYXRpb24ub3BlcmF0aW9ucy5KMkVFUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsKQotICovCi0JcHVibGljIHZvaWQgdmVyaWZ5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsKElEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgT2JqZWN0IGtleSA9IG5ldyBPYmplY3QoKTsKLQkJQXBwQ2xpZW50QXJ0aWZhY3RFZGl0IGFwcENsaWVudEVkaXQgPSBudWxsOwotCQkKLSAgICAgICAgdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2ogPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpKTsKLQkJCU9iamVjdCBkZCA9IG51bGw7Ci0JCQlhcHBDbGllbnRFZGl0ID0gQXBwQ2xpZW50QXJ0aWZhY3RFZGl0LmdldEFwcENsaWVudEFydGlmYWN0RWRpdEZvclJlYWQocHJvaik7Ci0gICAgICAgCQlpZihhcHBDbGllbnRFZGl0ICE9IG51bGwpIAotICAgICAgIAkJCWRkID0gKEFwcGxpY2F0aW9uQ2xpZW50KSBhcHBDbGllbnRFZGl0LmdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpOwotCQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIkRlcGxveW1lbnQgRGVzY3JpcHRvciBOdWxsIiwgZGQpOwotICAgICAgICB9IGZpbmFsbHkgewotCQkJaWYoIGFwcENsaWVudEVkaXQgIT0gbnVsbCApCi0JCQkJYXBwQ2xpZW50RWRpdC5kaXNwb3NlKCk7Ci0JCX0KLS8vICAgICAgICBpZiAoZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5BRERfVE9fRUFSKSkgewotLy8gICAgICAgICAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gZGF0YU1vZGVsLmdldEVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsKCkuZ2V0VGFyZ2V0UHJvamVjdCgpOwotLy8gICAgICAgICAgICBFQVJFZGl0TW9kZWwgZWFyID0gbnVsbDsKLS8vICAgICAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJFQVIgZG9lc24ndCBleGlzdDoiLCBlYXJQcm9qZWN0LmV4aXN0cygpKTsKLS8vICAgICAgICAgICAgICAgIEVBUk5hdHVyZVJ1bnRpbWUgcnVudGltZSA9IEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShlYXJQcm9qZWN0KTsKLS8vICAgICAgICAgICAgICAgIC8vRU1GV29ya2JlbmNoQ29udGV4dCBlbWZXb3JrYmVuY2hDb250ZXh0ID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY3JlYXRlRU1GQ29udGV4dChlYXJQcm9qZWN0LCBudWxsKTsKLS8vICAgICAgICAgICAgICAgIGVhciA9IChFQVJFZGl0TW9kZWwpIHJ1bnRpbWUuZ2V0RWRpdE1vZGVsRm9yUmVhZChJRUFSTmF0dXJlQ29uc3RhbnRzLkVESVRfTU9ERUxfSUQsIGtleSk7Ci0vLyAgICAgICAgICAgICAgICBlYXIuZ2V0TW9kdWxlTWFwcGluZyhkYXRhTW9kZWwuZ2V0VGFyZ2V0UHJvamVjdCgpKTsKLS8vICAgICAgICAgICAgICAgIC8vVE9ETwotLy8gICAgICAgICAgICB9IGZpbmFsbHkgewotLy8gICAgICAgICAgICAgICAgZWFyLnJlbGVhc2VBY2Nlc3Moa2V5KTsKLS8vICAgICAgICAgICAgfQotLy8KLS8vICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9EYXRhTW9kZWxWZXJpZmllckZhY3RvcnkuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvajJlZS92ZXJpZmllcnMvRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NTg3ODIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9EYXRhTW9kZWxWZXJpZmllckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA1LCAyMDA0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS52ZXJpZmllcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuamNhLnZlcmlmaWVycy5KQ0FFeHBvcnREYXRhTW9kZWxWZXJpZmllcjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5IGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5EYXRhTW9kZWxWZXJpZmllckZhY3RvcnkgewotCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkRhdGFNb2RlbFZlcmlmaWVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5EYXRhTW9kZWxWZXJpZmllckZhY3RvcnkgZmFjdCA9IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCWluaXRKMkVFRGF0YU1vZGVsVmVyaWZpZXJzTWFwKGZhY3QuZ2V0RGF0YU1vZGVsVmVyaWZpZXJzTWFwKCkpOwotCQlyZXR1cm4gZmFjdDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRhdGFNb2RlbFZlcmlmaWVyc01hcC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdEoyRUVEYXRhTW9kZWxWZXJpZmllcnNNYXAoTWFwIHZlcmlmaWVyTWFwKSB7Ci0JCQotCQkJLy92ZXJpZmllck1hcC5wdXQoRUpCTW9kdWxlSW1wb3J0RGF0YU1vZGVsLmNsYXNzLmdldE5hbWUoKSwgRUpCSW1wb3J0RGF0YU1vZGVsVmVyaWZpZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCS8vdmVyaWZpZXJNYXAucHV0KENvbm5lY3Rvck1vZHVsZUltcG9ydERhdGFNb2RlbC5jbGFzcy5nZXROYW1lKCksSkNBSW1wb3J0RGF0YU1vZGVsVmVyaWZpZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCS8vdmVyaWZpZXJNYXAucHV0KFdlYk1vZHVsZUltcG9ydERhdGFNb2RlbC5jbGFzcy5nZXROYW1lKCksIFdlYkltcG9ydERhdGFNb2RlbFZlcmlmaWVyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQkvL3ZlcmlmaWVyTWFwLnB1dChBcHBDbGllbnRNb2R1bGVJbXBvcnREYXRhTW9kZWwuY2xhc3MuZ2V0TmFtZSgpLCBBcHBDbGllbnRJbXBvcnREYXRhTW9kZWxWZXJpZmllci5jbGFzcy5nZXROYW1lKCkpOwotCQkJCi0vLwkJCXZlcmlmaWVyTWFwLnB1dChFSkJNb2R1bGVFeHBvcnREYXRhTW9kZWwuY2xhc3MuZ2V0TmFtZSgpLCBFSkJFeHBvcnREYXRhTW9kZWxWZXJpZmllci5jbGFzcy5nZXROYW1lKCkpOwotCQkJdmVyaWZpZXJNYXAucHV0KEpDQUV4cG9ydERhdGFNb2RlbFZlcmlmaWVyLmNsYXNzLmdldE5hbWUoKSwgSkNBRXhwb3J0RGF0YU1vZGVsVmVyaWZpZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLS8vCQkJdmVyaWZpZXJNYXAucHV0KFdlYk1vZHVsZUV4cG9ydERhdGFNb2RlbC5jbGFzcy5nZXROYW1lKCksIFdlYkV4cG9ydERhdGFNb2RlbFZlcmlmaWVyLmNsYXNzLmdldE5hbWUoKSk7Ci0vLwkJCXZlcmlmaWVyTWFwLnB1dChBcHBDbGllbnRNb2R1bGVFeHBvcnREYXRhTW9kZWwuY2xhc3MuZ2V0TmFtZSgpLCBBcHBDbGllbnRFeHBvcnREYXRhTW9kZWxWZXJpZmllci5jbGFzcy5nZXROYW1lKCkpOwotLy9UT0RPOiBhZGQgdmVyaWZpZXJzIGZvciBuZXcgSURhdGFNb2RlbHMJCQkKLS8vCQkJdmVyaWZpZXJNYXAucHV0KFdlYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLmNsYXNzLmdldE5hbWUoKSwgV2ViUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLS8vCQkJdmVyaWZpZXJNYXAucHV0KEVBUkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLmNsYXNzLmdldE5hbWUoKSwgRUFSUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLS8vCQkJdmVyaWZpZXJNYXAucHV0KEVqYkNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLmNsYXNzLmdldE5hbWUoKSwgRUpCUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLS8vCQkJdmVyaWZpZXJNYXAucHV0KEFwcENsaWVudENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsLmNsYXNzLmdldE5hbWUoKSxBcHBDbGllbnRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxWZXJpZmllci5jbGFzcy5nZXROYW1lKCkpOwotCQkJCi0vLwkJCXZlcmlmaWVyTWFwLnB1dChGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbC5jbGFzcy5nZXROYW1lKCksRmxleGlibGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxWZXJpZmllci5jbGFzcy5nZXROYW1lKCkpOwotLy8JCQl2ZXJpZmllck1hcC5wdXQoRmxleGlibGVKYXZhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsLmNsYXNzLmdldE5hbWUoKSxGbGV4aWJsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyLmNsYXNzLmdldE5hbWUoKSk7Ci0KLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2oyZWUvdmVyaWZpZXJzL0VBUkV4cG9ydERhdGFNb2RlbFZlcmlmaWVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2oyZWUvdmVyaWZpZXJzL0VBUkV4cG9ydERhdGFNb2RlbFZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OTY5OTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9FQVJFeHBvcnREYXRhTW9kZWxWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUudmVyaWZpZXJzOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVBUkV4cG9ydERhdGFNb2RlbFZlcmlmaWVyIGV4dGVuZHMgSjJFRUV4cG9ydERhdGFNb2RlbFZlcmlmaWVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9FQVJJbXBvcnREYXRhTW9kZWxWZXJpZmllci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9FQVJJbXBvcnREYXRhTW9kZWxWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDdlZDQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvajJlZS92ZXJpZmllcnMvRUFSSW1wb3J0RGF0YU1vZGVsVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLnZlcmlmaWVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFQVJJbXBvcnREYXRhTW9kZWxWZXJpZmllciBleHRlbmRzIEoyRUVJbXBvcnREYXRhTW9kZWxWZXJpZmllciB7Ci0KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSURhdGFNb2RlbCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnZlcmlmeShtb2RlbCk7Ci0vLyAgICAgICAgRW50ZXJwcmlzZUFwcGxpY2F0aW9uSW1wb3J0RGF0YU1vZGVsIGltcG9ydE1vZGVsID0gKEVudGVycHJpc2VBcHBsaWNhdGlvbkltcG9ydERhdGFNb2RlbCltb2RlbDsKLS8vICAgICAgICBMaXN0IGxpc3QgPSBpbXBvcnRNb2RlbC5nZXRFQVJGaWxlKCkuZ2V0TW9kdWxlRmlsZXMoKTsKLS8vICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotLy8gICAgICAgICAgICBNb2R1bGVGaWxlIGVsZW1lbnQgPSAoTW9kdWxlRmlsZSkgaXRlci5uZXh0KCk7Ci0vLyAgICAgICAgICAgIFN0cmluZyB1cmkgPSBlbGVtZW50LmdldFVSSSgpOwotLy8gICAgICAgICAgICBQcm9qZWN0VXRpbGl0eS52ZXJpZnlQcm9qZWN0KHVyaS5zdWJzdHJpbmcoMCwgdXJpLmluZGV4T2YoIi4iKSksIHRydWUpOwotLy8gICAgICAgIH0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2oyZWUvdmVyaWZpZXJzL0VBUlByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2oyZWUvdmVyaWZpZXJzL0VBUlByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNzc4MmEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9FQVJQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUudmVyaWZpZXJzOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVBUlByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyIGV4dGVuZHMgSjJFRVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9KMkVFRXhwb3J0RGF0YU1vZGVsVmVyaWZpZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvajJlZS92ZXJpZmllcnMvSjJFRUV4cG9ydERhdGFNb2RlbFZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YTQxNDguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9KMkVFRXhwb3J0RGF0YU1vZGVsVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLnZlcmlmaWVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkRhdGFNb2RlbFZlcmlmaWVyOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVFeHBvcnREYXRhTW9kZWxWZXJpZmllciBleHRlbmRzIERhdGFNb2RlbFZlcmlmaWVyIHsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLnZlcmlmaWVycy5EYXRhTW9kZWxWZXJpZmllciN2ZXJpZnkob3JnLmVjbGlwc2Uud3RwLmNvbW1vbi5vcGVyYXRpb24uV1RQT3BlcmF0aW9uRGF0YU1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIHZlcmlmeShJRGF0YU1vZGVsIG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudmVyaWZ5KG1vZGVsKTsKLQkJCi0vLwkJU3RyaW5nIGFyY2hpdmVEZXN0aW5hdGlvbiA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEoyRUVNb2R1bGVFeHBvcnREYXRhTW9kZWwuQVJDSElWRV9ERVNUSU5BVElPTik7Ci0vLwkJRmlsZSBhcmNoaXZlID0gbmV3IEZpbGUoYXJjaGl2ZURlc3RpbmF0aW9uKTsKLS8vCQlBc3NlcnQuYXNzZXJ0VHJ1ZSgiVGhlIGV4cG9ydGVkIGFyY2hpdmUgbXVzdCBleGlzdC4iLCBhcmNoaXZlLmV4aXN0cygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvajJlZS92ZXJpZmllcnMvSjJFRUltcG9ydERhdGFNb2RlbFZlcmlmaWVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2oyZWUvdmVyaWZpZXJzL0oyRUVJbXBvcnREYXRhTW9kZWxWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWRiMGIzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvajJlZS92ZXJpZmllcnMvSjJFRUltcG9ydERhdGFNb2RlbFZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNSwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUudmVyaWZpZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkRhdGFNb2RlbFZlcmlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuUHJvamVjdFV0aWxpdHk7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEoyRUVJbXBvcnREYXRhTW9kZWxWZXJpZmllciBleHRlbmRzIERhdGFNb2RlbFZlcmlmaWVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS52ZXJpZmllcnMuRGF0YU1vZGVsVmVyaWZpZXIjdmVyaWZ5KG9yZy5lY2xpcHNlLnd0cC5jb21tb24ub3BlcmF0aW9uLldUUE9wZXJhdGlvbkRhdGFNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2ZXJpZnkoSURhdGFNb2RlbCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3VwZXIudmVyaWZ5KG1vZGVsKTsKLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdFV0aWxpdHkudmVyaWZ5QW5kUmV0dXJuUHJvamVjdChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJSjJFRU1vZHVsZUltcG9ydERhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVF9OQU1FKSwgdHJ1ZSk7Ci0KLQkJLy8gU3RyaW5nIHNlcnZlclRhcmdldElkID0KLQkJLy8gbW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUoyRUVNb2R1bGVJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLlNFUlZFUl9UQVJHRVRfSUQpOwotCQkvLyBJUnVudGltZSBzdHQgPSBTZXJ2ZXJDb3JlLmdldFByb2plY3RQcm9wZXJ0aWVzKHByb2plY3QpLmdldFJ1bnRpbWVUYXJnZXQoKTsKLQkJLy8gLyogZmFpbCBiZWNhdXNlIGV4YWN0bHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgaXMgc2V0ICovCi0JCS8vIGlmIChzZXJ2ZXJUYXJnZXRJZCAhPSBudWxsKSB7Ci0JCS8vIGlmIChzdHQgPT0gbnVsbCkKLQkJLy8gQXNzZXJ0LmZhaWwoIlRoZSBzZXJ2ZXIgdGFyZ2V0IG9mIHRoZSBwcm9qZWN0IChOb3QgU2V0KSBkb2VzIG5vdCBtYXRjaCB0aGF0IG9mIHRoZSBtb2RlbAotCQkvLyAoIiArIHNlcnZlclRhcmdldElkICsgIikiKTsKLQkJLy8gLyoKLQkJLy8gKiB3ZSBrbm93IHRoYXQgZWl0aGVyIHN0dCA9PSBudWxsICYmIHNlcnZlclRhcmdldElkID09IG51bGwgT1Igc3R0ICE9IG51bGwgJiYKLQkJLy8gKiBzZXJ2ZXJUYXJnZXRJZCAhPSBudWxsCi0JCS8vICovCi0JCS8vIGVsc2UKLQkJLy8gQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGFjdHVhbCBzZXJ2ZXIgdGFyZ2V0IHNob3VsZCBtYXRjaCB0aGUgbW9kZWwncyBzZXJ2ZXIKLQkJLy8gdGFyZ2V0LiIsc2VydmVyVGFyZ2V0SWQsc3R0LmdldE5hbWUoKSk7Ci0JCS8vIH0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9KMkVFUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvajJlZS92ZXJpZmllcnMvSjJFRVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4M2ZjZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9KMkVFUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLnZlcmlmaWVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLkRhdGFNb2RlbFZlcmlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuUHJvamVjdFV0aWxpdHk7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSjJFRVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyIGV4dGVuZHMgRGF0YU1vZGVsVmVyaWZpZXIgewotCi0JcHVibGljIHZvaWQgdmVyaWZ5KElEYXRhTW9kZWwgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci52ZXJpZnkobW9kZWwpOwkJCi0JCVByb2plY3RVdGlsaXR5LnZlcmlmeVByb2plY3QobW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9QUk9KRUNUX05BTUUpLCB0cnVlKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9Nb2R1bGVFeHBvcnREYXRhTW9kZWxWZXJpZmllci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9Nb2R1bGVFeHBvcnREYXRhTW9kZWxWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTQ3MzhjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvajJlZS92ZXJpZmllcnMvTW9kdWxlRXhwb3J0RGF0YU1vZGVsVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA1LCAyMDA0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS52ZXJpZmllcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogQGF1dGhvciBtZGVsZGVyCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2R1bGVFeHBvcnREYXRhTW9kZWxWZXJpZmllciBleHRlbmRzIEoyRUVFeHBvcnREYXRhTW9kZWxWZXJpZmllciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUudmVyaWZpZXJzLkoyRUVFeHBvcnREYXRhTW9kZWxWZXJpZmllciN2ZXJpZnkob3JnLmVjbGlwc2Uud3RwLmNvbW1vbi5vcGVyYXRpb24uV1RQT3BlcmF0aW9uRGF0YU1vZGVsKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHZlcmlmeShJRGF0YU1vZGVsIG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudmVyaWZ5KG1vZGVsKTsKLQotCQlkb01vZHVsZVNwZWNpZmljVmVyaWZpY2F0aW9uKG1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb01vZHVsZVNwZWNpZmljVmVyaWZpY2F0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2oyZWUvdmVyaWZpZXJzL01vZHVsZUltcG9ydERhdGFNb2RlbFZlcmlmaWVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2oyZWUvdmVyaWZpZXJzL01vZHVsZUltcG9ydERhdGFNb2RlbFZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZjMwYzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9Nb2R1bGVJbXBvcnREYXRhTW9kZWxWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUudmVyaWZpZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZHVsZUltcG9ydERhdGFNb2RlbFZlcmlmaWVyIGV4dGVuZHMgSjJFRUltcG9ydERhdGFNb2RlbFZlcmlmaWVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUudmVyaWZpZXJzLkRhdGFNb2RlbFZlcmlmaWVyI3ZlcmlmeShvcmcuZWNsaXBzZS53dHAuY29tbW9uLm9wZXJhdGlvbi5XVFBPcGVyYXRpb25EYXRhTW9kZWwpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgdmVyaWZ5KElEYXRhTW9kZWwgbW9kZWwpIHRocm93cyBFeGNlcHRpb24geyAKLQkJc3VwZXIudmVyaWZ5KG1vZGVsKTsKLQkJCi0JCWRvTW9kdWxlU3BlY2lmaWNWZXJpZmljYXRpb24obW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBkb01vZHVsZVNwZWNpZmljVmVyaWZpY2F0aW9uKElEYXRhTW9kZWwgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2oyZWUvdmVyaWZpZXJzL01vZHVsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2oyZWUvdmVyaWZpZXJzL01vZHVsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NzQ2MDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qMmVlL3ZlcmlmaWVycy9Nb2R1bGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUudmVyaWZpZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZHVsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyIGV4dGVuZHMgSjJFRVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyIHsKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLnZlcmlmaWVycy5KMkVFUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIjdmVyaWZ5KG9yZy5lY2xpcHNlLnd0cC5jb21tb24ub3BlcmF0aW9uLldUUE9wZXJhdGlvbkRhdGFNb2RlbCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnkoSURhdGFNb2RlbCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHN1cGVyLnZlcmlmeShtb2RlbCk7Ci0gICAgICAgIHZlcmlmeVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbChtb2RlbCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmVyaWZ5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsKElEYXRhTW9kZWwgbW9kZWwpOyAKLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL3BsdWdpbi9BbGxQbHVnaW5UZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9wbHVnaW4vQWxsUGx1Z2luVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFlOTM1ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL3BsdWdpbi9BbGxQbHVnaW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIsIDIwMDQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZAotICogQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5wbHVnaW47Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy50ZXN0cy5Bbm5vdGF0aW9uUHJvdmlkZXJUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmZsZXhpYmxlLnByb2plY3QuZnZ0ZXN0cy5Qcm9qZWN0TWlncmF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZQotICogYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxQbHVnaW5UZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBJUnVudGltZSBKT05BU19TRVJWRVIgPSBjcmVhdGVKT05BU1J1bnRpbWUoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBbGxQbHVnaW5UZXN0cygpOwotICAgIH0KLQotICAgIHB1YmxpYyBBbGxQbHVnaW5UZXN0cygpIHsKLSAgICAgICAgc3VwZXIoKTsKLQkJb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS52ZXJpZmllcnMuRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JICAgICAgYWRkVGVzdChvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5lamIub3BlcmF0aW9ucy5BbGxUZXN0cy5zdWl0ZSgpKTsKLQkgICAgICBhZGRUZXN0KG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLndlYi5vcGVyYXRpb25zLkFsbFRlc3RzLnN1aXRlKCkpOwotCSAgICAgIGFkZFRlc3Qob3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuamNhLm9wZXJhdGlvbnMuQWxsVGVzdHMuc3VpdGUoKSk7Ci0JICAgICAgYWRkVGVzdChvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5lYXIub3BlcmF0aW9ucy5BbGxUZXN0cy5zdWl0ZSgpKTsKLQkgICAgICBhZGRUZXN0KG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmFwcGNsaWVudC5vcGVyYXRpb25zLkFsbFRlc3RzLnN1aXRlKCkpOwotCSAgICAgIGFkZFRlc3Qob3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMubW9kdWxlY29yZS5BbGxUZXN0cy5zdWl0ZSgpKTsKLQkgICAgICBhZGRUZXN0KFByb2plY3RNaWdyYXRpb25UZXN0LnN1aXRlKCkpOwotCSAgICAgIGFkZFRlc3QoQW5ub3RhdGlvblByb3ZpZGVyVGVzdC5zdWl0ZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUnVudGltZSBjcmVhdGVKT05BU1J1bnRpbWUoKSAgewotICAgIAlTdHJpbmcgcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci5qb25hcy40MzIiKTsKLSAgICAJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJdHJ5IHsKLSAgICAJCUlSdW50aW1lVHlwZSBydCA9IFNlcnZlckNvcmUuZmluZFJ1bnRpbWVUeXBlKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLmNvcmUucnVudGltZVR5cGUiKTsKLSAgICAJCUlSdW50aW1lV29ya2luZ0NvcHkgd2MgPSBydC5jcmVhdGVSdW50aW1lKG51bGwsIG51bGwpOwotICAgIAkJd2Muc2V0TG9jYXRpb24obmV3IFBhdGgocykpOwotICAgIAkJcmV0dXJuIHdjLnNhdmUodHJ1ZSwgbnVsbCk7Ci0gICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQllLnByaW50U3RhY2tUcmFjZSgpOwotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvcGx1Z2luL0FsbFRlc3RzU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2oyZWUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvcGx1Z2luL0FsbFRlc3RzU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3YzZlZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL3BsdWdpbi9BbGxUZXN0c1N1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBBcHIgMSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMucGx1Z2luOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXJjaGl2ZS5lbWZ0ZXN0cy5BbGxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5hcnRpZmFjdGVkaXQudGVzdHMuQXJ0aWZhY3RFZGl0QVBJVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC50ZXN0cy5EYXRhTW9kZWxBUElUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5wbHVnaW4uQWxsUGx1Z2luVGVzdHM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0c1N1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VEaXJlY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJUZXN0RGF0YSIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLSAgICAKLSAgICBzdGF0aWMgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMiKTsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKTsgCi0gICAgICAgIAlBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKS5nZXRGaWxlKCkgKyAiVGVzdERhdGEiKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgCi0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIlVzaW5nIHdvcmtpbmcgZGlyZWN0b3J5IHNpbmNlIGEgd29ya3NwYWNlIFVSTCBjb3VsZCBub3QgYmUgbG9jYXRlZC4iKTsKLQkJfSAKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludCB1bmltcGxlbWVudGVkTWV0aG9kczsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdW5pbXBsZW1lbnRlZE1ldGhvZHMgPSAwOwotICAgICAgICBUZXN0UnVubmVyLnJ1bihzdWl0ZSgpKTsKLSAgICAgICAgaWYgKHVuaW1wbGVtZW50ZWRNZXRob2RzID4gMCkgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcbkNhbGxzIHRvIHdhcm5VbmltcGw6ICIgKyB1bmltcGxlbWVudGVkTWV0aG9kcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQWxsVGVzdHNTdWl0ZSgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlID0gKFRlc3RTdWl0ZSkgQXV0b21hdGVkQlZULnN1aXRlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VpdGUudGVzdENvdW50KCk7IGkrKykgewotICAgICAgICAgICAgYWRkVGVzdChzdWl0ZS50ZXN0QXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0IGZvciBvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0LmJ2dCIpOwotICAgICAgICAvL1dTVCBjb21tb24KLSAgICAgICAgc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuY29tcG9uZW50Y29yZS50ZXN0cy5BbGxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChEYXRhTW9kZWxBUElUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChBcnRpZmFjdEVkaXRBUElUZXN0cy5zdWl0ZSgpKTsKLQkJLy9qMmVlLmNvcmUKLSAgICAgICAgc3VpdGUuYWRkVGVzdChBbGxUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgLy9qMmVlCi0gICAgICAgIHN1aXRlLmFkZFRlc3QoQWxsUGx1Z2luVGVzdHMuc3VpdGUoKSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL3BsdWdpbi9IZWFkbGVzc1Rlc3RzUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qMmVlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL3BsdWdpbi9IZWFkbGVzc1Rlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGJhYWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvajJlZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9wbHVnaW4vSGVhZGxlc3NUZXN0c1BsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5wbHVnaW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWFkbGVzc1Rlc3RzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgSGVhZGxlc3NUZXN0c1BsdWdpbiBwbHVnaW47Ci0JLy9SZXNvdXJjZSBidW5kbGUuCi0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEhlYWRsZXNzVGVzdHNQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZT0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53dHAuajJlZS53Yi50ZXN0cy5UZXN0c1BsdWdpblJlc291cmNlcyIpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSGVhZGxlc3NUZXN0c1BsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlPSBnZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlIT1udWxsID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvamNhbW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2pjYS9vcGVyYXRpb25zL0FsbFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qY2Ftb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvamNhL29wZXJhdGlvbnMvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU2ZmExYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qY2Ftb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvamNhL29wZXJhdGlvbnMvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiAyLCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qY2Eub3BlcmF0aW9uczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLSAgICAgICAgcmV0dXJuIG5ldyBBbGxUZXN0cygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQWxsVGVzdHMoKXsKLSAgICAgICAgc3VwZXIoIkpDQSBUZXN0cyIpOwotICAgICAgICBhZGRUZXN0KENvbm5lY3RvclByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIC8vYWRkVGVzdChSQVJFeHBvcnRPcGVyYXRpb25UZXN0LnN1aXRlKCkpOwotICAgICAgICAvL2FkZFRlc3QoUkFSSW1wb3J0T3BlcmF0aW9uVGVzdC5zdWl0ZSgpKTsKLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qY2Ftb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvamNhbW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2pjYS9vcGVyYXRpb25zL0Nvbm5lY3RvclByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwMmE1NC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qY2Ftb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvamNhL29wZXJhdGlvbnMvQ29ubmVjdG9yUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmpjYS5vcGVyYXRpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLnByb2plY3QuZmFjZXQuQ29ubmVjdG9yRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GYWNldERhdGFNb2RlbE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0OwotCi1wdWJsaWMgY2xhc3MgQ29ubmVjdG9yUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdCBleHRlbmRzIE1vZHVsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QgewotICAgIAotICAgIC8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIENvbm5lY3RvclByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY29uc3RydWN0b3Igc3R1YgotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoQ29ubmVjdG9yUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgfQotCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QjZ2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSURhdGFNb2RlbCBnZXRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpIHsKLSAgICAgICAgcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDb25uZWN0b3JGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSURhdGFNb2RlbCBnZXRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFdpdGhFYXIoKSB7Ci0gICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSAgRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IENvbm5lY3RvckZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIEZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCkgbW9kZWwuZ2V0UHJvcGVydHkoSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9ETV9NQVApOwotICAgICAgICBJRGF0YU1vZGVsIGZhY2V0RE0gPSBtYXAuZ2V0RmFjZXREYXRhTW9kZWwoSjJFRVByb2plY3RVdGlsaXRpZXMuSkNBKTsKLSAgICAgICAgZmFjZXRETS5zZXRCb29sZWFuUHJvcGVydHkoIElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLCB0cnVlICk7Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9ICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qY2Ftb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvamNhL29wZXJhdGlvbnMvUkFSRXhwb3J0T3BlcmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvamNhbW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2pjYS9vcGVyYXRpb25zL1JBUkV4cG9ydE9wZXJhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRkODEzZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qY2Ftb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvamNhL29wZXJhdGlvbnMvUkFSRXhwb3J0T3BlcmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDYsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmpjYS5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5qY2Eub3BlcmF0aW9ucy5Db25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmhlYWRsZXNzLnRlc3RzLnNhdmVzdHJhdGVneS5Nb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuaGVhZGxlc3MudGVzdHMuc2F2ZXN0cmF0ZWd5LlJBUkltcG9ydE9wZXJhdGlvblRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZUV4cG9ydE9wZXJhdGlvblRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFJBUkV4cG9ydE9wZXJhdGlvblRlc3QgZXh0ZW5kcyBNb2R1bGVFeHBvcnRPcGVyYXRpb25UZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFJBUkV4cG9ydE9wZXJhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVFeHBvcnRPcGVyYXRpb25UZXN0Q2FzZSNzdWl0ZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShSQVJFeHBvcnRPcGVyYXRpb25UZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdENhc2UjZ2V0TW9kZWxJbnN0YW5jZSgpCi0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0TW9kZWxJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDb25uZWN0b3JDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZUV4cG9ydE9wZXJhdGlvblRlc3RDYXNlI2dldEltcG9ydFRlc3RDYXNlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdENhc2UgZ2V0SW1wb3J0VGVzdENhc2UoKSB7IAotCQlyZXR1cm4gbmV3IFJBUkltcG9ydE9wZXJhdGlvblRlc3QoIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1vZHVsZUV4cG9ydEZpbGVFeHQoKSB7Ci0JCXJldHVybiAiLnJhciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJvdGVjdGVkIElQcm9qZWN0W10gZ2V0RXhwb3J0YWJsZVByb2plY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0W10gcHJvanMgPSBzdXBlci5nZXRFeHBvcnRhYmxlUHJvamVjdHMoKTsKLQkJTGlzdCBmaWx0ZXJlZFByb2pzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2pzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvanNbaV07Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNKQ0FQcm9qZWN0KHByb2plY3QpKQotCQkJCWZpbHRlcmVkUHJvanMuYWRkKHByb2plY3QpOwotCQl9Ci0JCXJldHVybiAoSVByb2plY3RbXSkgZmlsdGVyZWRQcm9qcy50b0FycmF5KG5ldyBJUHJvamVjdFtmaWx0ZXJlZFByb2pzLnNpemUoKV0pOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2pjYW1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qY2EvdmVyaWZpZXJzL0pDQUV4cG9ydERhdGFNb2RlbFZlcmlmaWVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qY2Ftb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvamNhL3ZlcmlmaWVycy9KQ0FFeHBvcnREYXRhTW9kZWxWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGE5YzI1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2pjYW1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qY2EvdmVyaWZpZXJzL0pDQUV4cG9ydERhdGFNb2RlbFZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuamNhLnZlcmlmaWVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUudmVyaWZpZXJzLk1vZHVsZUV4cG9ydERhdGFNb2RlbFZlcmlmaWVyOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEpDQUV4cG9ydERhdGFNb2RlbFZlcmlmaWVyIGV4dGVuZHMgTW9kdWxlRXhwb3J0RGF0YU1vZGVsVmVyaWZpZXIgewotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qY2Ftb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvamNhL3ZlcmlmaWVycy9KQ0FJbXBvcnREYXRhTW9kZWxWZXJpZmllci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvamNhbW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2pjYS92ZXJpZmllcnMvSkNBSW1wb3J0RGF0YU1vZGVsVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4MTVlZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9qY2Ftb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvamNhL3ZlcmlmaWVycy9KQ0FJbXBvcnREYXRhTW9kZWxWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmpjYS52ZXJpZmllcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLnZlcmlmaWVycy5Nb2R1bGVJbXBvcnREYXRhTW9kZWxWZXJpZmllcjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBKQ0FJbXBvcnREYXRhTW9kZWxWZXJpZmllciBleHRlbmRzIE1vZHVsZUltcG9ydERhdGFNb2RlbFZlcmlmaWVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvamNhbW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2pjYS92ZXJpZmllcnMvSkNBUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL2pjYW1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy9qY2EvdmVyaWZpZXJzL0pDQVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzEzNDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvamNhbW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL2pjYS92ZXJpZmllcnMvSkNBUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qY2EudmVyaWZpZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jbGllbnQuQXBwbGljYXRpb25DbGllbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuamNhLm1vZHVsZWNvcmUudXRpbC5Db25uZWN0b3JBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUudmVyaWZpZXJzLk1vZHVsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEpDQVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyIGV4dGVuZHMgTW9kdWxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIgewotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUudmVyaWZpZXJzLk1vZHVsZVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFZlcmlmaWVyI3ZlcmlmeVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbChjb20uaWJtLmV0b29scy5hcHBsaWNhdGlvbi5vcGVyYXRpb25zLkoyRUVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwpCi0gICAgICovCi0JcHVibGljIHZvaWQgdmVyaWZ5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsKElEYXRhTW9kZWwgbW9kZWwpIHsKLSAgICAgICAgT2JqZWN0IGtleSA9IG5ldyBPYmplY3QoKTsKLQkJQ29ubmVjdG9yQXJ0aWZhY3RFZGl0IGpjYUVkaXQgPSBudWxsOwotCQkKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIE9iamVjdCBkZCA9IG51bGw7Ci0JCQlqY2FFZGl0ID0gQ29ubmVjdG9yQXJ0aWZhY3RFZGl0LmdldENvbm5lY3RvckFydGlmYWN0RWRpdEZvclJlYWQoUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FKSkpOwotICAgICAgIAkJaWYoamNhRWRpdCAhPSBudWxsKSAKLSAgICAgICAJCQlkZCA9IChBcHBsaWNhdGlvbkNsaWVudCkgamNhRWRpdC5nZXREZXBsb3ltZW50RGVzY3JpcHRvclJvb3QoKTsKLQkJCUFzc2VydC5hc3NlcnROb3ROdWxsKCJEZXBsb3ltZW50IERlc2NyaXB0b3IgTnVsbCIsIGRkKTsKLSAgICAgICAgfSBmaW5hbGx5IHsKLQkJCWlmKCBqY2FFZGl0ICE9IG51bGwgKQotCQkJCWpjYUVkaXQuZGlzcG9zZSgpOwotCQl9Ci0vLyAgICAgICAgaWYgKGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoV2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwuQUREX1RPX0VBUikpIHsKLS8vICAgICAgICAgICAgSVByb2plY3QgZWFyUHJvamVjdCA9IGRhdGFNb2RlbC5nZXRFYXJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbCgpLmdldFRhcmdldFByb2plY3QoKTsKLS8vICAgICAgICAgICAgRUFSRWRpdE1vZGVsIGVhciA9IG51bGw7Ci0vLyAgICAgICAgICAgIHRyeSB7Ci0vLyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiRUFSIGRvZXNuJ3QgZXhpc3Q6IiwgZWFyUHJvamVjdC5leGlzdHMoKSk7Ci0vLyAgICAgICAgICAgICAgICBFQVJOYXR1cmVSdW50aW1lIHJ1bnRpbWUgPSBFQVJOYXR1cmVSdW50aW1lLmdldFJ1bnRpbWUoZWFyUHJvamVjdCk7Ci0vLyAgICAgICAgICAgICAgICAvL0VNRldvcmtiZW5jaENvbnRleHQgZW1mV29ya2JlbmNoQ29udGV4dCA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmNyZWF0ZUVNRkNvbnRleHQoZWFyUHJvamVjdCwgbnVsbCk7Ci0vLyAgICAgICAgICAgICAgICBlYXIgPSAoRUFSRWRpdE1vZGVsKSBydW50aW1lLmdldEVkaXRNb2RlbEZvclJlYWQoSUVBUk5hdHVyZUNvbnN0YW50cy5FRElUX01PREVMX0lELCBrZXkpOwotLy8gICAgICAgICAgICAgICAgZWFyLmdldE1vZHVsZU1hcHBpbmcoZGF0YU1vZGVsLmdldFRhcmdldFByb2plY3QoKSk7Ci0vLyAgICAgICAgICAgICAgICAvL1RPRE8KLS8vICAgICAgICAgICAgfSBmaW5hbGx5IHsKLS8vICAgICAgICAgICAgICAgIGVhci5yZWxlYXNlQWNjZXNzKGtleSk7Ci0vLyAgICAgICAgICAgIH0KLS8vCi0vLyAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYjI1MDMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMiCi0gICBuYW1lPSJKMkVFIFRlc3RzIFBsdWctaW4iCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5wbHVnaW4uSGVhZGxlc3NUZXN0c1BsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iajJlZS10ZXN0cy5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5mcmFtZXdvcmtzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUud2ViIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmp1bml0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUuamNhIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUudGVzdHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWYiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJzZXJ2aWNlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLnV0aWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC53ZWIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29yZSIvPgotICAgPC9yZXF1aXJlcz4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLmNvbGxlY3Rvci5zdWl0ZXMiPgotICAgICAgPHN1aXRlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMud2ViLm9wZXJhdGlvbnMuQWxsVGVzdHMiCi0gICAgICAgICAgICBuYW1lPSJXZWIgT3BlcmF0aW9ucyIvPgotICAgICAgPHN1aXRlCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS50ZXN0cy5idnQuQXV0b21hdGVkQlZUIgotICAgICAgICAgICAgbmFtZT0iSjJFRSBIZWFkbGVzcyBCVlQgVGVzdHMiLz4KLSAgICAgIDxzdWl0ZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnd0cC5oZWFkbGVzcy50ZXN0cy5zYXZlc3RyYXRlZ3kuQWxsVGVzdHMiCi0gICAgICAgICAgICBuYW1lPSJTYXZlU3RyYXRlZ3kgVGVzdHMiLz4KLSAgICAgIDxzdWl0ZQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmRlZmVjdC50ZXN0cy5EZWZlY3RWZXJpZmljYXRpb25UZXN0c1N1aXRlIgotICAgICAgICAgICAgbmFtZT0iSjJFRSBEZWZlY3QgVmVyaWZpY2F0aW9uIFRlc3RzIi8+Ci0gICAgICAgICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy5jb3JlLmFubm90YXRpb25zUHJvdmlkZXIiPgotICAgICAgPGFubm90YXRpb25zUHJvdmlkZXIKLSAgICAgICAgIGNsYXNzTmFtZT0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5hbm5vdGF0aW9ucy50ZXN0cy5UZXN0QW5ub3RhdGlvblByb3ZpZGVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLQotICAgCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuYmluZGluZ3NoZWxwZXIudGVzdHMuVGVzdEJpbmRpbmdIZWxwZXIiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZS5qbmRpQmluZGluZ3NIZWxwZXJzIj4KLSAgICAgIDxqbmRpQmluZGluZ3NIZWxwZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5iaW5kaW5nc2hlbHBlci50ZXN0cy5Gb29CaW5kaW5nc0hlbHBlciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5iaW5kaW5nc2hlbHBlci50ZXN0cy5mb29CaW5kaW5nc0hlbHBlciIvPgotICAgICAgPGpuZGlCaW5kaW5nc0hlbHBlcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmJpbmRpbmdzaGVscGVyLnRlc3RzLkJhckJpbmRpbmdzSGVscGVyIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmJpbmRpbmdzaGVscGVyLnRlc3RzLmJhckJpbmRpbmdzSGVscGVyIi8+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3NhdmVzdHJhdGVneS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvaGVhZGxlc3MvdGVzdHMvc2F2ZXN0cmF0ZWd5L0FsbFRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9zYXZlc3RyYXRlZ3ktdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2hlYWRsZXNzL3Rlc3RzL3NhdmVzdHJhdGVneS9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGQzZDc3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3NhdmVzdHJhdGVneS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvaGVhZGxlc3MvdGVzdHMvc2F2ZXN0cmF0ZWd5L0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmhlYWRsZXNzLnRlc3RzLnNhdmVzdHJhdGVneTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlNpbXBsZVRlc3RTdWl0ZTsKLQotLyoqCi0gKiBAYXV0aG9yIGpzaG9sbAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgQWxsVGVzdHMoKTsKLQl9Ci0KLQlwdWJsaWMgQWxsVGVzdHMoKSB7Ci0JCXN1cGVyKCJXRUIgVGVzdHMiKTsKLQkJYWRkVGVzdChuZXcgU2ltcGxlVGVzdFN1aXRlKFdlYlNhdmVTdHJhdGVneVRlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFNpbXBsZVRlc3RTdWl0ZShBcHBDbGllbnRTYXZlU3RyYXRlZ3lUZXN0cy5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoQXBwQ2xpZW50SW1wb3J0T3BlcmF0aW9uVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoRUpCSW1wb3J0T3BlcmF0aW9uVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoV2ViSW1wb3J0T3BlcmF0aW9uVGVzdC5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBTaW1wbGVUZXN0U3VpdGUoVGhyZWFkaW5nVGVzdC5jbGFzcykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvc2F2ZXN0cmF0ZWd5LXRlc3RzL29yZy9lY2xpcHNlL3d0cC9oZWFkbGVzcy90ZXN0cy9zYXZlc3RyYXRlZ3kvQXBwQ2xpZW50SW1wb3J0T3BlcmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvc2F2ZXN0cmF0ZWd5LXRlc3RzL29yZy9lY2xpcHNlL3d0cC9oZWFkbGVzcy90ZXN0cy9zYXZlc3RyYXRlZ3kvQXBwQ2xpZW50SW1wb3J0T3BlcmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2FiZTg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3NhdmVzdHJhdGVneS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvaGVhZGxlc3MvdGVzdHMvc2F2ZXN0cmF0ZWd5L0FwcENsaWVudEltcG9ydE9wZXJhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA2LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuaGVhZGxlc3MudGVzdHMuc2F2ZXN0cmF0ZWd5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb25jbGllbnQuaW50ZXJuYWwuY3JlYXRpb24uQXBwQ2xpZW50Q29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50SW1wb3J0T3BlcmF0aW9uVGVzdCBleHRlbmRzIE1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlIHsKLQotCXB1YmxpYyBBcHBDbGllbnRJbXBvcnRPcGVyYXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gIkFwcENsaWVudFRlc3RzIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBnZXRNb2RlbEluc3RhbmNlKCkgewotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEFwcENsaWVudENvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvc2F2ZXN0cmF0ZWd5LXRlc3RzL29yZy9lY2xpcHNlL3d0cC9oZWFkbGVzcy90ZXN0cy9zYXZlc3RyYXRlZ3kvQXBwQ2xpZW50U2F2ZVN0cmF0ZWd5VGVzdHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3NhdmVzdHJhdGVneS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvaGVhZGxlc3MvdGVzdHMvc2F2ZXN0cmF0ZWd5L0FwcENsaWVudFNhdmVTdHJhdGVneVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGI1NzEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvc2F2ZXN0cmF0ZWd5LXRlc3RzL29yZy9lY2xpcHNlL3d0cC9oZWFkbGVzcy90ZXN0cy9zYXZlc3RyYXRlZ3kvQXBwQ2xpZW50U2F2ZVN0cmF0ZWd5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuaGVhZGxlc3MudGVzdHMuc2F2ZXN0cmF0ZWd5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQXJjaGl2ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5Db21tb25hcmNoaXZlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5jb21tb25hcmNoaXZlY29yZS5pbnRlcm5hbC5leGNlcHRpb24uT3BlbkZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuaGVscGVycy5BcmNoaXZlT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuQXBwQ2xpZW50Q29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5hcmNoaXZlLm9wZXJhdGlvbnMuQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotCi1wdWJsaWMgY2xhc3MgQXBwQ2xpZW50U2F2ZVN0cmF0ZWd5VGVzdHMgZXh0ZW5kcyBTYXZlU3RyYXRlZ3lUZXN0IHsKLQotCXByb3RlY3RlZCBDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIGNyZWF0ZVNhdmVTdHJhdGVneShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHsKLQkJcmV0dXJuIG5ldyBBcHBDbGllbnRDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsKGNvbXBvbmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFyY2hpdmUgb3Blbk1vZHVsZUZpbGUoQXJjaGl2ZU9wdGlvbnMgYXJjaGl2ZU9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBDb21tb25hcmNoaXZlRmFjdG9yeS5lSU5TVEFOQ0Uub3BlbkFwcGxpY2F0aW9uQ2xpZW50RmlsZShhcmNoaXZlT3B0aW9ucywgdXJpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZsZXhQcm9qZWN0U2VlZE5hbWUoKSB7Ci0JCXJldHVybiAiQXBwQ2xpZW50LnppcCI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuICJBcHBDbGllbnQiOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Um9vdEFyY2hpdmVGb2xkZXJOYW1lKCkgewotCQlyZXR1cm4gIlRlc3REYXRhIiArIGZpbGVTZXAgKyAiQXBwQ2xpZW50VGVzdHMiOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdFNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlpbXBvcnRBcmNoaXZlKCJBcHBDbGllbnRTb3VyY2UuamFyIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvbWVTb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW1wb3J0QXJjaGl2ZSgiQXBwQ2xpZW50U29tZVNvdXJjZS5qYXIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9Tb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW1wb3J0QXJjaGl2ZSgiQXBwQ2xpZW50Tm9Tb3VyY2UuamFyIik7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3NhdmVzdHJhdGVneS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvaGVhZGxlc3MvdGVzdHMvc2F2ZXN0cmF0ZWd5L0VKQkltcG9ydE9wZXJhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3NhdmVzdHJhdGVneS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvaGVhZGxlc3MvdGVzdHMvc2F2ZXN0cmF0ZWd5L0VKQkltcG9ydE9wZXJhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgyYjE3NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9zYXZlc3RyYXRlZ3ktdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2hlYWRsZXNzL3Rlc3RzL3NhdmVzdHJhdGVneS9FSkJJbXBvcnRPcGVyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNSwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5oZWFkbGVzcy50ZXN0cy5zYXZlc3RyYXRlZ3k7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmVqYi5jb21wb25lbnRjb3JlLnV0aWwuRUpCQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmVqYi5wcm9qZWN0Lm9wZXJhdGlvbnMuRUpCQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlByb2plY3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLnBsdWdpbi5IZWFkbGVzc1Rlc3RzUGx1Z2luOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBFSkJJbXBvcnRPcGVyYXRpb25UZXN0IGV4dGVuZHMgTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShFSkJJbXBvcnRPcGVyYXRpb25UZXN0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgRUpCSW1wb3J0T3BlcmF0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RUpCMjBJbXBvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gIlRlc3QxM0VKQiI7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZ1bGxQYXRoRm9yRUpCSmFyKCJUZXN0MTNFSkIuamFyIik7Ci0JCXRlc3RJbXBvcnQocHJvamVjdE5hbWUsIGZpbGVOYW1lKTsKLQkJSVByb2plY3QgcHJvaiA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCUVKQkFydGlmYWN0RWRpdCBlamJFZGl0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vZWpiRWRpdCA9IEVKQkFydGlmYWN0RWRpdC5nZXRFSkJBcnRpZmFjdEVkaXRGb3JSZWFkKHByb2opOwotCQkJZWpiRWRpdCA9IG5ldyBFSkJBcnRpZmFjdEVkaXQocHJvaix0cnVlLHRydWUpOwotCQkJZWpiRWRpdC5nZXRKMkVFVmVyc2lvbigpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGVqYkVkaXQgIT0gbnVsbCkKLQkJCQllamJFZGl0LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFBhdGhGb3JFSkJKYXIoU3RyaW5nIGphck5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBQcm9qZWN0VXRpbGl0eS5nZXRGdWxsRmlsZU5hbWUoSGVhZGxlc3NUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCksIFRFU1RTX1BBVEggKyBqYXJOYW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGphck5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVKQjIxSW1wb3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRlc3RJbXBvcnQoIlRlc3QxNEVKQiIsIGdldEZ1bGxQYXRoRm9yRUpCSmFyKCJUZXN0MTRFSkIuamFyIikpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gIkVKQkltcG9ydFRlc3RzIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBnZXRNb2RlbEluc3RhbmNlKCkgewotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVKQkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvc2F2ZXN0cmF0ZWd5LXRlc3RzL29yZy9lY2xpcHNlL3d0cC9oZWFkbGVzcy90ZXN0cy9zYXZlc3RyYXRlZ3kvTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdENhc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3NhdmVzdHJhdGVneS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvaGVhZGxlc3MvdGVzdHMvc2F2ZXN0cmF0ZWd5L01vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNTI3ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvc2F2ZXN0cmF0ZWd5LXRlc3RzL29yZy9lY2xpcHNlL3d0cC9oZWFkbGVzcy90ZXN0cy9zYXZlc3RyYXRlZ3kvTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNiwgMjAwNAotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5oZWFkbGVzcy50ZXN0cy5zYXZlc3RyYXRlZ3k7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLk9wZXJhdGlvblRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuUHJvamVjdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMucGx1Z2luLkhlYWRsZXNzVGVzdHNQbHVnaW47Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlIGV4dGVuZHMgT3BlcmF0aW9uVGVzdENhc2UgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGF0YU1vZGVsU2hvdWxkQmVWYWxpZCA9IHRydWU7Ci0JcHVibGljIFN0cmluZyBURVNUU19QQVRIOwotCi0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJBUkltcG9ydE9wZXJhdGlvblRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRUpCSW1wb3J0T3BlcmF0aW9uVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShXZWJJbXBvcnRPcGVyYXRpb25UZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFwcENsaWVudEltcG9ydE9wZXJhdGlvblRlc3QuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHVibGljIE1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQlURVNUU19QQVRIID0gIlRlc3REYXRhIiArIEZpbGUuc2VwYXJhdG9yICsgZ2V0RGlyZWN0b3J5KCkgKyBGaWxlLnNlcGFyYXRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5PcGVyYXRpb25UZXN0Q2FzZSNzZXRVcCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJZGF0YU1vZGVsU2hvdWxkQmVWYWxpZCA9IHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREaXJlY3RvcnkoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJRGF0YU1vZGVsIGdldE1vZGVsSW5zdGFuY2UoKTsKLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnQoU3RyaW5nIHByb2plY3ROYW1lLCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IGdldE1vZGVsSW5zdGFuY2UoKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsIGZpbGVuYW1lKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLQkJaWYgKGRhdGFNb2RlbFNob3VsZEJlVmFsaWQpCi0JCQlydW5EYXRhTW9kZWwoZGF0YU1vZGVsKTsKLQkJZWxzZQotCQkJdmVyaWZ5SW52YWxpZERhdGFNb2RlbChkYXRhTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkYXRhTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXJ2ZXJUYXJnZXRQcm9wZXJ0eShJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQkvLyBkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUphdmFDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuU0VSVkVSX1RBUkdFVF9JRCwKLQkJLy8gQWxsUGx1Z2luVGVzdHMuSk9OQVNfU0VSVkVSLmdldElkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV8wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV8xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV8yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV8zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV80KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV81KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV82KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDYpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV83KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV84KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV85KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEluZGV4KDkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbXBvcnRJbmRleChpbnQgaW5kZXgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0IHByb2plY3RzID0gZ2V0SW1wb3J0YWJsZUFyY2hpdmVGaWxlTmFtZXMoKTsKLQkJaWYgKGluZGV4IDwgcHJvamVjdHMuc2l6ZSgpKSB7Ci0JCQlTdHJpbmcgamFyTmFtZSA9IHByb2plY3RzLmdldChpbmRleCkudG9TdHJpbmcoKTsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGphck5hbWUuc3Vic3RyaW5nKGphck5hbWUubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpICsgMSwgamFyTmFtZS5sZW5ndGgoKSAtIDQpOwotCQkJdGVzdEltcG9ydChwcm9qZWN0TmFtZSwgamFyTmFtZSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBvcnRUZXN0Q2FzZV9yZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3QgcHJvamVjdHMgPSBnZXRJbXBvcnRhYmxlQXJjaGl2ZUZpbGVOYW1lcygpOwotCQlmb3IgKGludCBpID0gMTA7IGkgPCBwcm9qZWN0cy5zaXplKCk7IGkrKykgewotCQkJU3RyaW5nIGphck5hbWUgPSBwcm9qZWN0cy5nZXQoaSkudG9TdHJpbmcoKTsKLQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGphck5hbWUuc3Vic3RyaW5nKGphck5hbWUubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpICsgMSwgamFyTmFtZS5sZW5ndGgoKSAtIDQpOwotCQkJdGVzdEltcG9ydChwcm9qZWN0TmFtZSwgamFyTmFtZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsSW1wb3J0VGVzdENhc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGlzdCBwcm9qZWN0cyA9IGdldEltcG9ydGFibGVBcmNoaXZlRmlsZU5hbWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBqYXJOYW1lID0gcHJvamVjdHMuZ2V0KGkpLnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBqYXJOYW1lLnN1YnN0cmluZyhqYXJOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSArIDEsIGphck5hbWUubGVuZ3RoKCkgLSA0KTsKLQkJCXRlc3RJbXBvcnQocHJvamVjdE5hbWUsIGphck5hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldEltcG9ydGFibGVBcmNoaXZlRmlsZU5hbWVzKCkgewotCQlyZXR1cm4gUHJvamVjdFV0aWxpdHkuZ2V0SmFyc0luRGlyZWN0b3J5KEhlYWRsZXNzVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLCBURVNUU19QQVRIKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFkRmlsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlkYXRhTW9kZWxTaG91bGRCZVZhbGlkID0gZmFsc2U7Ci0JCXRlc3RJbXBvcnQoIkJvYlRoZVByb2plY3QiLCAiQm9iVGhlRmlsZSIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvc2F2ZXN0cmF0ZWd5LXRlc3RzL29yZy9lY2xpcHNlL3d0cC9oZWFkbGVzcy90ZXN0cy9zYXZlc3RyYXRlZ3kvUkFSSW1wb3J0T3BlcmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvc2F2ZXN0cmF0ZWd5LXRlc3RzL29yZy9lY2xpcHNlL3d0cC9oZWFkbGVzcy90ZXN0cy9zYXZlc3RyYXRlZ3kvUkFSSW1wb3J0T3BlcmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmFiNDBjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3NhdmVzdHJhdGVneS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvaGVhZGxlc3MvdGVzdHMvc2F2ZXN0cmF0ZWd5L1JBUkltcG9ydE9wZXJhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA2LCAyMDA0Ci0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmhlYWRsZXNzLnRlc3RzLnNhdmVzdHJhdGVneTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmpjYS5vcGVyYXRpb25zLkNvbm5lY3RvckNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Qcm9qZWN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5wbHVnaW4uSGVhZGxlc3NUZXN0c1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFJBUkltcG9ydE9wZXJhdGlvblRlc3QgZXh0ZW5kcyBNb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNCaW5hcnkgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3ZlcndyaXRlUHJvamVjdCA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShSQVJJbXBvcnRPcGVyYXRpb25UZXN0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgUkFSSW1wb3J0T3BlcmF0aW9uVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpcmVjdG9yeSgpIHsKLQkJcmV0dXJuICJSQVJJbXBvcnRUZXN0cyI7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRJbXBvcnRhYmxlQXJjaGl2ZUZpbGVOYW1lcygpIHsKLQkJcmV0dXJuIFByb2plY3RVdGlsaXR5LmdldFJhcnNJbkRpcmVjdG9yeShIZWFkbGVzc1Rlc3RzUGx1Z2luLmdldERlZmF1bHQoKSwgVEVTVFNfUEFUSCk7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0TW9kZWxJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBDb25uZWN0b3JDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3NhdmVzdHJhdGVneS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvaGVhZGxlc3MvdGVzdHMvc2F2ZXN0cmF0ZWd5L1NhdmVTdHJhdGVneVRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3NhdmVzdHJhdGVneS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvaGVhZGxlc3MvdGVzdHMvc2F2ZXN0cmF0ZWd5L1NhdmVTdHJhdGVneVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzMzcyNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9zYXZlc3RyYXRlZ3ktdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2hlYWRsZXNzL3Rlc3RzL3NhdmVzdHJhdGVneS9TYXZlU3RyYXRlZ3lUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5oZWFkbGVzcy50ZXN0cy5zYXZlc3RyYXRlZ3k7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXRvb2xzLmNvbW1vbi50ZXN0LmFwaXRvb2xzLlByb2plY3RVbnppcFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzLlByb2plY3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLnBsdWdpbi5IZWFkbGVzc1Rlc3RzUGx1Z2luOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2F2ZVN0cmF0ZWd5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmaWxlU2VwID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLnNlcGFyYXRvciIpOwotCi0JcHJvdGVjdGVkIFN0cmluZyBwcm9qZWN0TmFtZTsKLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdDsKLQotCXByb3RlY3RlZCBJVmlydHVhbENvbXBvbmVudCB2Q29tcDsKLQotCXB1YmxpYyBTYXZlU3RyYXRlZ3lUZXN0KCkgewotCQlzdXBlcigpOwotCQlwcm9qZWN0TmFtZSA9IGdldFByb2plY3ROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXRyeSB7Ci0JCQlQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotCQkJcHJvamVjdCA9IG51bGw7Ci0JCQlpZiAoY3JlYXRlUHJvamVjdCgpKSB7Ci0JCQkJcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQl9Ci0JCQl2Q29tcCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNyZWF0ZVByb2plY3QoKSB7Ci0JCUlQYXRoIGxvY2FsWmlwUGF0aCA9IGdldEZsZXhQcm9qZWN0U2VlZCgpOwotCQlQcm9qZWN0VW56aXBVdGlsIHV0aWwgPSBuZXcgUHJvamVjdFVuemlwVXRpbChsb2NhbFppcFBhdGgsIG5ldyBTdHJpbmdbXXtwcm9qZWN0TmFtZX0pOwotCQlyZXR1cm4gdXRpbC5jcmVhdGVQcm9qZWN0cygpOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0RmxleFByb2plY3RTZWVkKCkgewotCQlTdHJpbmcgZmlsZSA9ICJUZXN0RGF0YSIgKyBmaWxlU2VwICsgIlNhdmVTdHJhdGVneVRlc3RzIiArIGZpbGVTZXAgKyBnZXRGbGV4UHJvamVjdFNlZWROYW1lKCk7Ci0JCUlQYXRoIHppcEZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZSk7Ci0KLQkJVVJMIHVybCA9IEhlYWRsZXNzVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLmZpbmQoemlwRmlsZVBhdGgpOwotCQl0cnkgewotCQkJdXJsID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBuZXcgUGF0aCh1cmwuZ2V0UGF0aCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbXBvcnRBcmNoaXZlKFN0cmluZyBhcmNoaXZlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIHVyaSA9IGdldFVyaShhcmNoaXZlTmFtZSk7Ci0JCUFyY2hpdmUgbW9kdWxlRmlsZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCW1vZHVsZUZpbGUgPSBvcGVuTW9kdWxlRmlsZShnZXRBcmNoaXZlT3B0aW9ucygpLCB1cmkpOwotCQkJCUNvbXBvbmVudFNhdmVTdHJhdGVneUltcGwgYVN0cmF0ZWd5ID0gY3JlYXRlU2F2ZVN0cmF0ZWd5KHZDb21wKTsKLQkJCQlhU3RyYXRlZ3kuc2V0UHJvZ3Jlc3NNb25pdG9yKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCW1vZHVsZUZpbGUuc2F2ZShhU3RyYXRlZ3kpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAobnVsbCAhPSBtb2R1bGVGaWxlKSB7Ci0JCQkJCW1vZHVsZUZpbGUuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsIGNyZWF0ZVNhdmVTdHJhdGVneShJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFyY2hpdmUgb3Blbk1vZHVsZUZpbGUoQXJjaGl2ZU9wdGlvbnMgYXJjaGl2ZU9wdGlvbnMsIFN0cmluZyB1cmkpIHRocm93cyBPcGVuRmFpbHVyZUV4Y2VwdGlvbjsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VXJpKFN0cmluZyB3YXJOYW1lKSB7Ci0JCVN0cmluZyBmaWxlID0gZ2V0Um9vdEFyY2hpdmVGb2xkZXJOYW1lKCkgKyBmaWxlU2VwICsgd2FyTmFtZTsKLQkJU3RyaW5nIHVyaSA9IGdldEZ1bGxUZXN0RGF0YVBhdGgoZmlsZSk7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0RnVsbFRlc3REYXRhUGF0aChTdHJpbmcgZGF0YVBhdGgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBQcm9qZWN0VXRpbGl0eS5nZXRGdWxsRmlsZU5hbWUoSGVhZGxlc3NUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCksIGRhdGFQYXRoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuICIiOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBBcmNoaXZlT3B0aW9ucyBnZXRBcmNoaXZlT3B0aW9ucygpIHsKLQkJQXJjaGl2ZU9wdGlvbnMgb3B0cyA9IG5ldyBBcmNoaXZlT3B0aW9ucygpOwotCQlvcHRzLnNldElzUmVhZE9ubHkodHJ1ZSk7Ci0JCXJldHVybiBvcHRzOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RmxleFByb2plY3RTZWVkTmFtZSgpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRSb290QXJjaGl2ZUZvbGRlck5hbWUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvc2F2ZXN0cmF0ZWd5LXRlc3RzL29yZy9lY2xpcHNlL3d0cC9oZWFkbGVzcy90ZXN0cy9zYXZlc3RyYXRlZ3kvVGhyZWFkaW5nVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvc2F2ZXN0cmF0ZWd5LXRlc3RzL29yZy9lY2xpcHNlL3d0cC9oZWFkbGVzcy90ZXN0cy9zYXZlc3RyYXRlZ3kvVGhyZWFkaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjRiOTBmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3NhdmVzdHJhdGVneS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvaGVhZGxlc3MvdGVzdHMvc2F2ZXN0cmF0ZWd5L1RocmVhZGluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmhlYWRsZXNzLnRlc3RzLnNhdmVzdHJhdGVneTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5TdHJ1Y3R1cmVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Qcm9qZWN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5wbHVnaW4uSGVhZGxlc3NUZXN0c1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFRocmVhZGluZ1Rlc3QgZXh0ZW5kcyBNb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIFdFQl9URVNUU19QQVRIOwotCi0JcHVibGljIFRocmVhZGluZ1Rlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCVN0cmluZyByZWxhdGl2ZUltcG9ydFRlc3RzUGF0aCA9ICJUZXN0RGF0YSIgKyBGaWxlLnNlcGFyYXRvciArIGdldERpcmVjdG9yeSgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCVVSTCBmdWxsSW1wb3J0VGVzdHNQYXRoID0gSGVhZGxlc3NUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCkuZmluZChuZXcgUGF0aChyZWxhdGl2ZUltcG9ydFRlc3RzUGF0aCkpOwotCQlXRUJfVEVTVFNfUEFUSCA9IGZ1bGxJbXBvcnRUZXN0c1BhdGguZ2V0UGF0aCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGhyZWFkaW5nVGVzdC5jbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXJlY3RvcnkoKSB7Ci0JCXJldHVybiAiV0FSSW1wb3J0VGVzdHMiOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEltcG9ydGFibGVBcmNoaXZlRmlsZU5hbWVzKCkgewotCQlyZXR1cm4gUHJvamVjdFV0aWxpdHkuZ2V0V2Fyc0luRGlyZWN0b3J5KEhlYWRsZXNzVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLCBXRUJfVEVTVFNfUEFUSCk7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0TW9kZWxJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGhyZWFkaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIExpc3QgcHJvamVjdHMgPSBnZXRJbXBvcnRhYmxlQXJjaGl2ZUZpbGVOYW1lcygpOwotCQlmaW5hbCBJUHJvamVjdFtdIHByb2plY3RBcnJheSA9IG5ldyBJUHJvamVjdFtwcm9qZWN0cy5zaXplKCldOwotCQlmaW5hbCBpbnQgaXRlcmF0aW9uTWF4ID0gMjA7Ci0JCWZvciAoaW50IGl0ZXJhdGlvbkNvdW50ID0gMDsgaXRlcmF0aW9uQ291bnQgPCBpdGVyYXRpb25NYXg7IGl0ZXJhdGlvbkNvdW50KyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW1wb3J0aW5nIFByb2plY3RzICIgKyBpdGVyYXRpb25Db3VudCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIGphck5hbWUgPSBwcm9qZWN0cy5nZXQoaSkudG9TdHJpbmcoKTsKLQkJCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBqYXJOYW1lLnN1YnN0cmluZyhqYXJOYW1lLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSArIDEsIGphck5hbWUubGVuZ3RoKCkgLSA0KTsKLQkJCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IGdldE1vZGVsSW5zdGFuY2UoKTsKLQkJCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUoyRUVDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgamFyTmFtZSk7Ci0JCQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElKMkVFQ29tcG9uZW50SW1wb3J0RGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLQkJCQlydW5EYXRhTW9kZWwoZGF0YU1vZGVsKTsKLQkJCQlwcm9qZWN0QXJyYXlbaV0gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJfQotCQkJZmluYWwgVGhyZWFkW10gdGhyZWFkcyA9IG5ldyBUaHJlYWRbMTAgKyAxMCAqIGl0ZXJhdGlvbkNvdW50XTsKLQotCQkJY2xhc3MgUmVhZHlDb3VudGVyIHsKLQotCQkJCXByaXZhdGUgYm9vbGVhbiBraWxsID0gZmFsc2U7Ci0JCQkJcHJpdmF0ZSBib29sZWFuIHJlYWR5ID0gZmFsc2U7Ci0JCQkJcHJpdmF0ZSBpbnQgY291bnQgPSAwOwotCi0JCQkJcHJpdmF0ZSBpbnQgcmVxdWlyZWRDb3VudCA9IDA7Ci0KLQkJCQlwdWJsaWMgUmVhZHlDb3VudGVyKGludCByZXF1aXJlZENvdW50KSB7Ci0JCQkJCXRoaXMucmVxdWlyZWRDb3VudCA9IHJlcXVpcmVkQ291bnQ7Ci0JCQkJfQotCi0JCQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluY3JlbWVudCgpIHsKLQkJCQkJaWYgKHJlYWR5KSB7Ci0JCQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJCWNvdW50Kys7Ci0JCQkJCWlmIChjb3VudCA9PSByZXF1aXJlZENvdW50KSB7Ci0JCQkJCQlyZWFkeSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVjcmVtZW50KCkgewotCQkJCQljb3VudC0tOwotCQkJCX0KLQotCQkJCXB1YmxpYyBpbnQgZ2V0Q3VycmVudENvdW50KCkgewotCQkJCQlyZXR1cm4gY291bnQ7Ci0JCQkJfQotCi0JCQkJcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzUmVhZHkoKSB7Ci0JCQkJCXJldHVybiByZWFkeSB8fCBraWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1plcm8oKSB7Ci0JCQkJCXJldHVybiBjb3VudCA9PSAwOwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIGlzS2lsbCgpIHsKLQkJCQkJcmV0dXJuIGtpbGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQga2lsbCgpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJLaWxsaW5nISEhISIpOwotCQkJCQlraWxsID0gdHJ1ZTsKLQkJCQl9Ci0KLQkJCX0KLQotCQkJZmluYWwgUmVhZHlDb3VudGVyIHJlYWR5Q291bnRlciA9IG5ldyBSZWFkeUNvdW50ZXIodGhyZWFkcy5sZW5ndGgpOwotCi0JCQlmb3IgKGludCB0aHJlYWRDb3VudCA9IDA7IHRocmVhZENvdW50IDwgdGhyZWFkcy5sZW5ndGg7IHRocmVhZENvdW50KyspIHsKLQkJCQlmaW5hbCBpbnQgdGhyZWFkTnVtID0gdGhyZWFkQ291bnQ7Ci0JCQkJdGhyZWFkc1t0aHJlYWRDb3VudF0gPSBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwcml2YXRlIHZvaWQga2lsbChFeGNlcHRpb24gZSkgewotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCXJlYWR5Q291bnRlci5raWxsKCk7Ci0JCQkJCQlzbGVlcCgxKTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhyZWFkICIgKyB0aHJlYWROdW0gKyAiIHN0YXJ0ZWQuIik7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXJlYWR5Q291bnRlci5pbmNyZW1lbnQoKTsKLQkJCQkJCQlmb3IgKGludCB3YWl0Q291bnQgPSAxOyAhcmVhZHlDb3VudGVyLmlzUmVhZHkoKTsgd2FpdENvdW50ICo9IDIpIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUaHJlYWQgIiArIHRocmVhZE51bSArICIgd2FpdGluZyAgIiArIHdhaXRDb3VudCArICIgY3VycmVudENvdW50PSIgKyByZWFkeUNvdW50ZXIuZ2V0Q3VycmVudENvdW50KCkpOwotCQkJCQkJCQlzbGVlcCh3YWl0Q291bnQpOwotCQkJCQkJCX0KLQkJCQkJCQlmb3IgKGludCBpdGVyYXRpb25Db3VudCA9IDA7IGl0ZXJhdGlvbkNvdW50IDwgaXRlcmF0aW9uTWF4OyBpdGVyYXRpb25Db3VudCsrKSB7Ci0JCQkJCQkJCVN0cnVjdHVyZUVkaXRbXVtdIHJlYWRTdHJ1Y3R1cmVFZGl0cyA9IG5ldyBTdHJ1Y3R1cmVFZGl0W2l0ZXJhdGlvbk1heF1bcHJvamVjdHMuc2l6ZSgpXTsKLQkJCQkJCQkJU3RydWN0dXJlRWRpdFtdW10gd3JpdGVTdHJ1Y3R1cmVFZGl0cyA9IG5ldyBTdHJ1Y3R1cmVFZGl0W3JlYWRTdHJ1Y3R1cmVFZGl0cy5sZW5ndGhdW3Byb2plY3RBcnJheS5sZW5ndGhdOwotCi0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlmb3IgKGludCBzdHJ1Y3R1cmVFZGl0Q291bnQgPSAwOyBzdHJ1Y3R1cmVFZGl0Q291bnQgPCByZWFkU3RydWN0dXJlRWRpdHMubGVuZ3RoOyBzdHJ1Y3R1cmVFZGl0Q291bnQrKykgewotCQkJCQkJCQkJCWZvciAoaW50IHByb2plY3RDb3VudCA9IDA7IHByb2plY3RDb3VudCA8IHByb2plY3RBcnJheS5sZW5ndGg7IHByb2plY3RDb3VudCsrKSB7Ci0JCQkJCQkJCQkJCXJlYWRTdHJ1Y3R1cmVFZGl0c1tzdHJ1Y3R1cmVFZGl0Q291bnRdW3Byb2plY3RDb3VudF0gPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JSZWFkKHByb2plY3RBcnJheVtwcm9qZWN0Q291bnRdKTsKLQkJCQkJCQkJCQkJd3JpdGVTdHJ1Y3R1cmVFZGl0c1tzdHJ1Y3R1cmVFZGl0Q291bnRdW3Byb2plY3RDb3VudF0gPSBTdHJ1Y3R1cmVFZGl0LmdldFN0cnVjdHVyZUVkaXRGb3JXcml0ZShwcm9qZWN0QXJyYXlbcHJvamVjdENvdW50XSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCi0JCQkJCQkJCQlmb3IgKGludCBzdHJ1Y3R1cmVFZGl0Q291bnQgPSAwOyBzdHJ1Y3R1cmVFZGl0Q291bnQgPCByZWFkU3RydWN0dXJlRWRpdHMubGVuZ3RoOyBzdHJ1Y3R1cmVFZGl0Q291bnQrKykgewotCQkJCQkJCQkJCWZvciAoaW50IHByb2plY3RDb3VudCA9IDA7IHByb2plY3RDb3VudCA8IHByb2plY3RzLnNpemUoKTsgcHJvamVjdENvdW50KyspIHsKLQkJCQkJCQkJCQkJaWYgKG51bGwgIT0gcmVhZFN0cnVjdHVyZUVkaXRzW3N0cnVjdHVyZUVkaXRDb3VudF1bcHJvamVjdENvdW50XSkgewotCQkJCQkJCQkJCQkJcmVhZFN0cnVjdHVyZUVkaXRzW3N0cnVjdHVyZUVkaXRDb3VudF1bcHJvamVjdENvdW50XS5nZXRDb21wb25lbnRNb2RlbFJvb3QoKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQlpZiAobnVsbCAhPSB3cml0ZVN0cnVjdHVyZUVkaXRzW3N0cnVjdHVyZUVkaXRDb3VudF1bcHJvamVjdENvdW50XSkgewotCQkJCQkJCQkJCQkJSVByb2plY3QgcHJvamVjdCA9IFN0cnVjdHVyZUVkaXQuZ2V0Q29udGFpbmluZ1Byb2plY3Qod3JpdGVTdHJ1Y3R1cmVFZGl0c1tzdHJ1Y3R1cmVFZGl0Q291bnRdW3Byb2plY3RDb3VudF0uZ2V0Q29tcG9uZW50KCkpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCi0KLQkJCQkJCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCWlmICghZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCJFZGl0IE1vZGVsIGFscmVhZHkgZGlzcG9zZWQiKSkgewotCQkJCQkJCQkJCWtpbGwoZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJaWYgKCFlLmdldE1lc3NhZ2UoKS5lcXVhbHMoIlRoaXMgcmVzb3VyY2UgaGFzIGJlZW4gZGVsZXRlZCBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkLiIpKSB7Ci0JCQkJCQkJCQkJa2lsbChlKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCWtpbGwoZSk7Ci0JCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQlmb3IgKGludCBzdHJ1Y3R1cmVFZGl0Q291bnQgPSAwOyBzdHJ1Y3R1cmVFZGl0Q291bnQgPCByZWFkU3RydWN0dXJlRWRpdHMubGVuZ3RoOyBzdHJ1Y3R1cmVFZGl0Q291bnQrKykgewotCQkJCQkJCQkJCWZvciAoaW50IHByb2plY3RDb3VudCA9IDA7IHByb2plY3RDb3VudCA8IHByb2plY3RBcnJheS5sZW5ndGg7IHByb2plY3RDb3VudCsrKSB7Ci0JCQkJCQkJCQkJCWlmIChudWxsICE9IHJlYWRTdHJ1Y3R1cmVFZGl0c1tzdHJ1Y3R1cmVFZGl0Q291bnRdW3Byb2plY3RDb3VudF0pIHsKLQkJCQkJCQkJCQkJCXJlYWRTdHJ1Y3R1cmVFZGl0c1tzdHJ1Y3R1cmVFZGl0Q291bnRdW3Byb2plY3RDb3VudF0uZGlzcG9zZSgpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCWlmIChudWxsICE9IHdyaXRlU3RydWN0dXJlRWRpdHNbc3RydWN0dXJlRWRpdENvdW50XVtwcm9qZWN0Q291bnRdKSB7Ci0JCQkJCQkJCQkJCQl3cml0ZVN0cnVjdHVyZUVkaXRzW3N0cnVjdHVyZUVkaXRDb3VudF1bcHJvamVjdENvdW50XS5kaXNwb3NlKCk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGhyZWFkICIgKyB0aHJlYWROdW0gKyAiIGZpbnNoZWQuIik7Ci0JCQkJCQkJcmVhZHlDb3VudGVyLmRlY3JlbWVudCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0aW5nIFRocmVhZHMgIiArIGl0ZXJhdGlvbkNvdW50KTsKLQkJCWZvciAoaW50IHRocmVhZENvdW50ID0gMDsgdGhyZWFkQ291bnQgPCB0aHJlYWRzLmxlbmd0aDsgdGhyZWFkQ291bnQrKykgewotCQkJCXRocmVhZHNbdGhyZWFkQ291bnRdLnN0YXJ0KCk7Ci0JCQl9Ci0JCQl3aGlsZSAoIXJlYWR5Q291bnRlci5pc1JlYWR5KCkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk1haW4gVGhyZWFkIFdhaXRpbmcgLS0tLS0tLS0tIik7Ci0JCQkJc2xlZXAoMSk7Ci0JCQl9Ci0JCQlzbGVlcCgxKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQmVmb3JlIERlbGV0aW5nIFByb2plY3RzICIgKyBpdGVyYXRpb25Db3VudCk7Ci0JCQlQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJBZnRlciBEZWxldGluZyBQcm9qZWN0cyAiICsgaXRlcmF0aW9uQ291bnQpOwotCQkJd2hpbGUgKCFyZWFkeUNvdW50ZXIuaXNaZXJvKCkpIHsKLQkJCQlzbGVlcCgxKTsKLQkJCX0KLQkJCWlmIChyZWFkeUNvdW50ZXIuaXNLaWxsKCkpIHsKLQkJCQlmYWlsKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNsZWVwKGludCB0aW1lKSB7Ci0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAodGltZSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9zYXZlc3RyYXRlZ3ktdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2hlYWRsZXNzL3Rlc3RzL3NhdmVzdHJhdGVneS9XZWJJbXBvcnRPcGVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9zYXZlc3RyYXRlZ3ktdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2hlYWRsZXNzL3Rlc3RzL3NhdmVzdHJhdGVneS9XZWJJbXBvcnRPcGVyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkODZmZGQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvc2F2ZXN0cmF0ZWd5LXRlc3RzL29yZy9lY2xpcHNlL3d0cC9oZWFkbGVzcy90ZXN0cy9zYXZlc3RyYXRlZ3kvV2ViSW1wb3J0T3BlcmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDYsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5oZWFkbGVzcy50ZXN0cy5zYXZlc3RyYXRlZ3k7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkNvbXBvbmVudEltcG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Qcm9qZWN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5wbHVnaW4uSGVhZGxlc3NUZXN0c1BsdWdpbjsKLQotcHVibGljIGNsYXNzIFdlYkltcG9ydE9wZXJhdGlvblRlc3QgZXh0ZW5kcyBNb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIFdFQl9URVNUU19QQVRIOwotCi0JcHVibGljIFdlYkltcG9ydE9wZXJhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCVN0cmluZyByZWxhdGl2ZUltcG9ydFRlc3RzUGF0aCA9ICJUZXN0RGF0YSIgKyBGaWxlLnNlcGFyYXRvciArIGdldERpcmVjdG9yeSgpICsgRmlsZS5zZXBhcmF0b3I7Ci0JCVVSTCBmdWxsSW1wb3J0VGVzdHNQYXRoID0gSGVhZGxlc3NUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCkuZmluZChuZXcgUGF0aChyZWxhdGl2ZUltcG9ydFRlc3RzUGF0aCkpOwotCQlXRUJfVEVTVFNfUEFUSCA9IGZ1bGxJbXBvcnRUZXN0c1BhdGguZ2V0UGF0aCgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoV2ViSW1wb3J0T3BlcmF0aW9uVGVzdC5jbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXJlY3RvcnkoKSB7Ci0JCXJldHVybiAiV0FSSW1wb3J0VGVzdHMiOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEltcG9ydGFibGVBcmNoaXZlRmlsZU5hbWVzKCkgewotCQlyZXR1cm4gUHJvamVjdFV0aWxpdHkuZ2V0V2Fyc0luRGlyZWN0b3J5KEhlYWRsZXNzVGVzdHNQbHVnaW4uZ2V0RGVmYXVsdCgpLCBXRUJfVEVTVFNfUEFUSCk7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0TW9kZWxJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBXZWJDb21wb25lbnRJbXBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFdlYkxpYkR1cENsYXNzcGF0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUZXN0IGZvciBkZWZlY3Q6IDEwNTIyNQotCQlMaXN0IHByb2plY3RzID0gZ2V0SW1wb3J0YWJsZUFyY2hpdmVGaWxlTmFtZXMoKTsKLQkJU3RyaW5nIHdhclBhdGggPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9qZWN0cy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBwYXRoID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlpZiAocGF0aC5pbmRleE9mKCJXZWJDb250YWluZXJDbGllbnRBcHAud2FyIikgIT0gLTEpCi0JCQkJd2FyUGF0aCA9IHBhdGg7Ci0JCX0KLQkJU3RyaW5nIHByb2plY3ROYW1lID0gd2FyUGF0aC5zdWJzdHJpbmcod2FyUGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcikgKyAxLCB3YXJQYXRoLmxlbmd0aCgpIC0gNCk7Ci0JCXRlc3RJbXBvcnQocHJvamVjdE5hbWUsd2FyUGF0aCk7Ci0JCQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3NhdmVzdHJhdGVneS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvaGVhZGxlc3MvdGVzdHMvc2F2ZXN0cmF0ZWd5L1dlYlNhdmVTdHJhdGVneVRlc3RzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy9zYXZlc3RyYXRlZ3ktdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2hlYWRsZXNzL3Rlc3RzL3NhdmVzdHJhdGVneS9XZWJTYXZlU3RyYXRlZ3lUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzM1NjZlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3NhdmVzdHJhdGVneS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvaGVhZGxlc3MvdGVzdHMvc2F2ZXN0cmF0ZWd5L1dlYlNhdmVTdHJhdGVneVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmhlYWRsZXNzLnRlc3RzLnNhdmVzdHJhdGVneTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLkFyY2hpdmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuQ29tbW9uYXJjaGl2ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuY29tbW9uYXJjaGl2ZWNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uLk9wZW5GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmhlbHBlcnMuQXJjaGl2ZU9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuYXJjaGl2ZS5vcGVyYXRpb25zLkNvbXBvbmVudFNhdmVTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJDb21wb25lbnRTYXZlU3RyYXRlZ3lJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFdlYlNhdmVTdHJhdGVneVRlc3RzIGV4dGVuZHMgU2F2ZVN0cmF0ZWd5VGVzdCB7Ci0KLQotCXB1YmxpYyBXZWJTYXZlU3RyYXRlZ3lUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWltcG9ydEFyY2hpdmUoIldlYlNvdXJjZS53YXIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29tZVNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlpbXBvcnRBcmNoaXZlKCJXZWJTb21lU291cmNlLndhciIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1NvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlpbXBvcnRBcmNoaXZlKCJXZWJOb1NvdXJjZS53YXIiKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJvb3RBcmNoaXZlRm9sZGVyTmFtZSgpIHsKLQkJcmV0dXJuICJUZXN0RGF0YSIgKyBmaWxlU2VwICsgIldBUkltcG9ydFRlc3RzIjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZsZXhQcm9qZWN0U2VlZE5hbWUoKSB7Ci0JCXJldHVybiAiV2FySW1wb3J0RmxleFByb2plY3QuemlwIjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gIldhckltcG9ydEZsZXhQcm9qZWN0IjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbCBjcmVhdGVTYXZlU3RyYXRlZ3koSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50KSB7Ci0JCXJldHVybiBuZXcgV2ViQ29tcG9uZW50U2F2ZVN0cmF0ZWd5SW1wbChjb21wb25lbnQpOwotCX0KLQotCXByb3RlY3RlZCBBcmNoaXZlIG9wZW5Nb2R1bGVGaWxlKEFyY2hpdmVPcHRpb25zIGFyY2hpdmVPcHRpb25zLCBTdHJpbmcgdXJpKSB0aHJvd3MgT3BlbkZhaWx1cmVFeGNlcHRpb24gewotCQlyZXR1cm4gQ29tbW9uYXJjaGl2ZUZhY3RvcnkuZUlOU1RBTkNFLm9wZW5XQVJGaWxlKGFyY2hpdmVPcHRpb25zLCB1cmkpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWNmMGViLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4KLQotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgZWNsaXBzZS1ob21lLCBhbmQgbGlicmFyeS1maWxlIC0tPgotICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cyIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UudGVzdF8zLjEuMC9saWJyYXJ5LnhtbCIvPgotICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSItRG9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIuam9uYXMuNDMyPSR7am9uYXM0MzJEaXJ9Ii8+IAotICAgICAgICAgICAgCi0gIDxwcm9wZXJ0eSBuYW1lPSJ3b3Jrc3BhY2UiIHZhbHVlPSIke2Jhc2VkaXJ9LyR7cGx1Z2luLW5hbWV9Ii8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8ZGVsZXRlIGRpcj0iJHt3b3Jrc3BhY2V9IiBxdWlldD0idHJ1ZSIvPgotICAgIAotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHt3b3Jrc3BhY2V9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiR7ZXh0cmFWTWFyZ3N9Ii8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotICAgIAotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0JPGRlbGV0ZSBkaXI9IiR7d29ya3NwYWNlfSIgcXVpZXQ9InRydWUiLz4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBydW5zIHRoZSB0ZXN0IHN1aXRlLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIC0tPgotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmNsdWRlcyIgdmFsdWU9Im9yZyoueG1sIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ib3V0cHV0LWZpbGUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfS54bWwiLz4KLSAgICA8L2FudD4KLSAgPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KLQotCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3dlYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy93ZWIvb3BlcmF0aW9ucy9BZGRTZXJ2bGV0T3BlcmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvd2VibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL3dlYi9vcGVyYXRpb25zL0FkZFNlcnZsZXRPcGVyYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjM2Y4MDYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvd2VibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL3dlYi9vcGVyYXRpb25zL0FkZFNlcnZsZXRPcGVyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gTWF5IDEzLCAyMDA0Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuSU5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLm9wZXJhdGlvbnMuTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViLmNvbXBvbmVudGNvcmUudXRpbC5XZWJBcnRpZmFjdEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUud2ViYXBwbGljYXRpb24uU2VydmxldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWJhcHBsaWNhdGlvbi5XZWJBcHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuT3BlcmF0aW9uVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciBqaWFsaW4KLSAqCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFkZFNlcnZsZXRPcGVyYXRpb25UZXN0IGV4dGVuZHMgT3BlcmF0aW9uVGVzdENhc2UgewotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdFQl9QUk9KRUNUX05BTUUgPSAiV2ViUHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBTRVJWTEVUX05BTUUgPSAiU2VydmxldDEiOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcml2YXRlIElEYXRhTW9kZWwgd2ViQ29tcG9uZW50RGF0YU1vZGVsOwotCXByaXZhdGUgSURhdGFNb2RlbCBzZXJ2bGV0RGF0YU1vZGVsOwotICAgIAotICAgIC8qKgotCSAqIEBwYXJhbSBuYW1lCi0JICovCi0JcHVibGljIEFkZFNlcnZsZXRPcGVyYXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQWRkU2VydmxldE9wZXJhdGlvblRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShBZGRTZXJ2bGV0T3BlcmF0aW9uVGVzdC5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFNlcnZsZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJY3JlYXRlV2ViUHJvamVjdChXRUJfUFJPSkVDVF9OQU1FKTsKLSAgICAJV2ViQXJ0aWZhY3RFZGl0IHdlYkVkaXQgPSBudWxsOwotICAgIAlJUHJvamVjdCBwcm9qID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KFdFQl9QUk9KRUNUX05BTUUpOwotICAgIAl0cnkgewotICAgIAkJLy93ZWJFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvcldyaXRlKHByb2opOwotICAgIAkJd2ViRWRpdCA9IG5ldyBXZWJBcnRpZmFjdEVkaXQocHJvaiwgZmFsc2UsIHRydWUgKTsKLSAgICAJCVdlYkFwcCB3ZWJBcHAgPSB3ZWJFZGl0LmdldFdlYkFwcCgpOwotICAgICAgICAJYWRkU2VydmxldChXRUJfUFJPSkVDVF9OQU1FLCBTRVJWTEVUX05BTUUpOwotICAgICAgICAJaWYgKHdlYkFwcCAhPSBudWxsKXsKLSAgICAgICAgCQlTZXJ2bGV0IHNlcnZsZXQgPSB3ZWJBcHAuZ2V0U2VydmxldE5hbWVkKFNFUlZMRVRfTkFNRSk7Ci0gICAgICAgIAkJYXNzZXJ0Tm90TnVsbChzZXJ2bGV0KTsKLSAgICAJCQkvL1RPRE8gbmVlZCB0byBnZXQgdGhlIAotICAgICAgICAJCS8vYWRkSW5pdFBhcmFtcyhzZXJ2bGV0LFdFQl9QUk9KRUNUX05BTUUpOwotICAgICAgICAJfQotICAgIAl9IGZpbmFsbHkgewotICAgIAkJaWYgKHdlYkVkaXQgIT0gbnVsbCkKLSAgICAJCQl3ZWJFZGl0LmRpc3Bvc2UoKTsKLSAgICAJfQotICAgIAkKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgY3JlYXRlV2ViUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotICAgIAl3ZWJDb21wb25lbnREYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLSAgICAJd2ViQ29tcG9uZW50RGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBwcm9qZWN0TmFtZSk7Ci0gICAgCXJ1bkFuZFZlcmlmeSh3ZWJDb21wb25lbnREYXRhTW9kZWwpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcHJvamVjdE5hbWUKLSAgICAgKiBAcGFyYW0gc2VydmxldE5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRTZXJ2bGV0KFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIHNlcnZsZXROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAJc2VydmxldERhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKE5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3ZpZGVyLmNsYXNzKTsKLSAgICAJc2VydmxldERhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLSAgICAJc2VydmxldERhdGFNb2RlbC5zZXRQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT01QT05FTlRfTkFNRSwgcHJvamVjdE5hbWUpOwotICAgIAlzZXJ2bGV0RGF0YU1vZGVsLnNldFByb3BlcnR5KElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRJU1BMQVlfTkFNRSwgc2VydmxldE5hbWUpOwotICAgIAlzZXJ2bGV0RGF0YU1vZGVsLnNldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkNMQVNTX05BTUUsIHNlcnZsZXROYW1lKTsKLSAgICAJc2VydmxldERhdGFNb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoSUFubm90YXRpb25zRGF0YU1vZGVsLlVTRV9BTk5PVEFUSU9OUyxmYWxzZSk7Ci0gICAgICAgIHJ1bkFuZFZlcmlmeShzZXJ2bGV0RGF0YU1vZGVsKTsKLSAgICB9Ci0JCi0JCi0gICAgCi0vLyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRJbml0UGFyYW1zKFNlcnZsZXQgc2VydmxldCxTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotLy8gICAgCWluaXRQYXJhbURhdGFNb2RlbCA9IG5ldyBBZGRTZXJ2bGV0SW5pdFBhcmFtRGF0YU1vZGVsKCk7Ci0vLyAgICAJaW5pdFBhcmFtRGF0YU1vZGVsLnNldFByb3BlcnR5KEFkZFNlcnZsZXRJbml0UGFyYW1EYXRhTW9kZWwuU0VSVkxFVCwgc2VydmxldCk7Ci0vLyAgICAJaW5pdFBhcmFtRGF0YU1vZGVsLnNldFByb3BlcnR5KEFkZFNlcnZsZXRJbml0UGFyYW1EYXRhTW9kZWwuUFJPSkVDVF9OQU1FLHByb2plY3ROYW1lKTsKLS8vICAgIAlmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLS8vICAgICAgICAJU3RyaW5nIHBhcmFtTmFtZSA9ICJwYXJhbSIgKyBTdHJpbmcudmFsdWVPZihpKTsKLS8vICAgICAgICAJU3RyaW5nIHBhcmFtVmFsdWUgPSAidmFsdWUiICsgU3RyaW5nLnZhbHVlT2YoaSk7Ci0vLyAgICAgICAgCWluaXRQYXJhbURhdGFNb2RlbC5zZXRQcm9wZXJ0eShBZGRTZXJ2bGV0SW5pdFBhcmFtRGF0YU1vZGVsLlBBUkFNRVRFUl9OQU1FLCBwYXJhbU5hbWUpOwotLy8gICAgICAgIAlpbml0UGFyYW1EYXRhTW9kZWwuc2V0UHJvcGVydHkoQWRkU2VydmxldEluaXRQYXJhbURhdGFNb2RlbC5QQVJBTUVURVJfVkFMVUUsIHBhcmFtVmFsdWUpOwotLy8gICAgCX0KLS8vICAgICAgICBydW5BbmRWZXJpZnkoaW5pdFBhcmFtRGF0YU1vZGVsKTsKLS8vICAgIH0KLSAgICAKLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3dlYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy93ZWIvb3BlcmF0aW9ucy9BbGxUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvd2VibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL3dlYi9vcGVyYXRpb25zL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzI0YzAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvd2VibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL3dlYi9vcGVyYXRpb25zL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBGZWIgMiwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMud2ViLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuZmxleGlibGUucHJvamVjdC5mdnRlc3RzLkoyRUVGbGV4UHJvakRlcGxveWFibGVQZXJmVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuSVJ1bnRpbWVXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc2VydmVyLmNvcmUuU2VydmVyQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuaGVhZGxlc3MudGVzdHMuc2F2ZXN0cmF0ZWd5LldlYkltcG9ydE9wZXJhdGlvblRlc3Q7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBJUnVudGltZSBUT01DQVRfUlVOVElNRSA9IGNyZWF0ZVJ1bnRpbWUoKTsKLQlwdWJsaWMgc3RhdGljIElSdW50aW1lIEpPTkFTX1RPTUNBVF9SVU5USU1FID0gY3JlYXRlSk9OQVNSdW50aW1lKCk7Ci0JCi0JCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCl7Ci0gICAgICAgIHJldHVybiBuZXcgQWxsVGVzdHMoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEFsbFRlc3RzKCl7Ci0gICAgICAgIHN1cGVyKCJXRUIgVGVzdHMiKTsKLSAgICAgICBhZGRUZXN0KFdlYkltcG9ydE9wZXJhdGlvblRlc3Quc3VpdGUoKSk7Ci0gICAgICAgYWRkVGVzdChXZWJFeHBvcnRPcGVyYXRpb25UZXN0LnN1aXRlKCkpOwotICAgICAgIGFkZFRlc3QoV2ViUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdC5zdWl0ZSgpKTsKLSAgICAgICBhZGRUZXN0KEoyRUVGbGV4UHJvakRlcGxveWFibGVQZXJmVGVzdC5zdWl0ZSgpKTsKLSAgICAgICAvL2FkZFRlc3QoU3RhdGljV2ViUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdC5zdWl0ZSgpKTsKLSAgICAgICBhZGRUZXN0KEFkZFNlcnZsZXRPcGVyYXRpb25UZXN0LnN1aXRlKCkpOwotICAgICAgIC8vIGFkZFRlc3QoV2ViQ29tcG9uZW50Q3JlYXRpb25UZXN0LnN1aXRlKCkpOwotCQkvL2FkZFRlc3QobmV3IFNpbXBsZVRlc3RTdWl0ZShXZWJTYXZlU3RyYXRlZ3lUZXN0cy5jbGFzcykpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElSdW50aW1lIGNyZWF0ZVJ1bnRpbWUoKSAgewotICAgIAlTdHJpbmcgcyA9ICJEOi9Qcm9ncmFtIEZpbGVzL0FwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uL1RvbWNhdCA1LjAiOwotICAgIAlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKLSAgICAJCXJldHVybiBudWxsOwotICAgIAl0cnkgewotICAgIAkJSVJ1bnRpbWVUeXBlIHJ0ID0gU2VydmVyQ29yZS5maW5kUnVudGltZVR5cGUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2ZXIudG9tY2F0LnJ1bnRpbWUuNTAiKTsKLSAgICAJCUlSdW50aW1lV29ya2luZ0NvcHkgd2MgPSBydC5jcmVhdGVSdW50aW1lKG51bGwsIG51bGwpOwotICAgIAkJd2Muc2V0TG9jYXRpb24obmV3IFBhdGgocykpOwotICAgIAkJcmV0dXJuIHdjLnNhdmUodHJ1ZSwgbnVsbCk7Ci0gICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQllLnByaW50U3RhY2tUcmFjZSgpOwotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBJUnVudGltZSBjcmVhdGVKT05BU1J1bnRpbWUoKSAgewotICAgIAlTdHJpbmcgcyA9ICJEOi9KT25BUy00LjMuMiI7Ci0gICAgCWlmIChzID09IG51bGwgfHwgcy5sZW5ndGgoKSA9PSAwKQotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCXRyeSB7Ci0gICAgCQlJUnVudGltZVR5cGUgcnQgPSBTZXJ2ZXJDb3JlLmZpbmRSdW50aW1lVHlwZSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQucnVudGltZS41MCIpOwotICAgIAkJSVJ1bnRpbWVXb3JraW5nQ29weSB3YyA9IHJ0LmNyZWF0ZVJ1bnRpbWUobnVsbCwgbnVsbCk7Ci0gICAgCQl3Yy5zZXRMb2NhdGlvbihuZXcgUGF0aChzKSk7Ci0gICAgCQlyZXR1cm4gd2Muc2F2ZSh0cnVlLCBudWxsKTsKLSAgICAJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotICAgIH0KLSAgICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3dlYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy93ZWIvb3BlcmF0aW9ucy9TdGF0aWNXZWJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy93ZWJtb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvd2ViL29wZXJhdGlvbnMvU3RhdGljV2ViUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmYxZDVjLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3dlYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy93ZWIvb3BlcmF0aW9ucy9TdGF0aWNXZWJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnByb2plY3QuZmFjZXQuU2ltcGxlV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdDsKLQotcHVibGljIGNsYXNzIFN0YXRpY1dlYlByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QgZXh0ZW5kcyBNb2R1bGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0IHsKLQotCXB1YmxpYyBTdGF0aWNXZWJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZShTdGF0aWNXZWJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdCNnZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwoKQotICAgICAqLwotICAgIHB1YmxpYyBJRGF0YU1vZGVsIGdldENvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsKCkgewotICAgICAgICByZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFNpbXBsZVdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVNpbXBsZU1vZHVsZShTdHJpbmcgY29tcG9uZW50TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gZ2V0Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKTsKLSAgICAgICAgZGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBjb21wb25lbnROYW1lKTsKLSAgICAgICBydW5BbmRWZXJpZnkoZGF0YU1vZGVsLGZhbHNlLHRydWUpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSURhdGFNb2RlbCBnZXRDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbFdpdGhFYXIoKSB7Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0gCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy93ZWJtb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvd2ViL29wZXJhdGlvbnMvV2ViRXhwb3J0T3BlcmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvd2VibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL3dlYi9vcGVyYXRpb25zL1dlYkV4cG9ydE9wZXJhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRlZDA0ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy93ZWJtb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvd2ViL29wZXJhdGlvbnMvV2ViRXhwb3J0T3BlcmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA2LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy53ZWIub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvbW1vbmFyY2hpdmVjb3JlLmludGVybmFsLmltcGwuV0FSRmlsZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5KMkVFUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIuYXJjaGl2ZS5vcGVyYXRpb25zLldlYkNvbXBvbmVudEV4cG9ydERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuaGVhZGxlc3MudGVzdHMuc2F2ZXN0cmF0ZWd5Lk1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5oZWFkbGVzcy50ZXN0cy5zYXZlc3RyYXRlZ3kuV2ViSW1wb3J0T3BlcmF0aW9uVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdENhc2U7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0byBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlCi0gKiBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYkV4cG9ydE9wZXJhdGlvblRlc3QgZXh0ZW5kcyBNb2R1bGVFeHBvcnRPcGVyYXRpb25UZXN0Q2FzZSB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGNsdWRlQ29tcGlsZUpzcCA9IGZhbHNlOwotCi0JcHVibGljIFdlYkV4cG9ydE9wZXJhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShXZWJFeHBvcnRPcGVyYXRpb25UZXN0LmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk9wZXJhdGlvblRlc3RDYXNlI3NldFVwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlleGNsdWRlQ29tcGlsZUpzcCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGNsdWRlQ29tcGlsZUpzcE9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWV4Y2x1ZGVDb21waWxlSnNwID0gdHJ1ZTsKLQkJdGVzdEFsbEV4cG9ydFRlc3RDYXNlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZUV4cG9ydE9wZXJhdGlvblRlc3RDYXNlI2dldE1vZGVsSW5zdGFuY2UoKQotCSAqLwotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldE1vZGVsSW5zdGFuY2UoKSB7Ci0JCXJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViQ29tcG9uZW50RXhwb3J0RGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCQotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdENhc2UjZ2V0SW1wb3J0VGVzdENhc2UoKQotCSAqLwotCXByb3RlY3RlZCBNb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZSBnZXRJbXBvcnRUZXN0Q2FzZSgpIHsKLQkJcmV0dXJuIG5ldyBXZWJJbXBvcnRPcGVyYXRpb25UZXN0KCIiKTsKLQl9Ci0JcHJvdGVjdGVkIElQcm9qZWN0W10gZ2V0RXhwb3J0YWJsZVByb2plY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0W10gcHJvanMgPSBzdXBlci5nZXRFeHBvcnRhYmxlUHJvamVjdHMoKTsKLQkJTGlzdCBmaWx0ZXJlZFByb2pzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2pzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvanNbaV07Ci0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChjb21wLmdldFByb2plY3QoKSkpCi0JCQkJZmlsdGVyZWRQcm9qcy5hZGQocHJvamVjdCk7Ci0JCX0KLQkJcmV0dXJuIChJUHJvamVjdFtdKSBmaWx0ZXJlZFByb2pzLnRvQXJyYXkobmV3IElQcm9qZWN0W2ZpbHRlcmVkUHJvanMuc2l6ZSgpXSk7Ci0JCQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1vZHVsZUV4cG9ydEZpbGVFeHQoKSB7Ci0JCXJldHVybiAiLndhciI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFeHBvcnQoSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50LCBTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZXN0RXhwb3J0KGNvbXBvbmVudCxmaWxlbmFtZSk7Ci0JCS8vdmVyaWZ5IHdlYiBkZAotCQl0ZXN0RERFeHBvcnRlZChjb21wb25lbnQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0ZXN0RERFeHBvcnRlZChJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlXZWJBcnRpZmFjdEVkaXQgd2ViRWRpdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl3ZWJFZGl0ID0gV2ViQXJ0aWZhY3RFZGl0LmdldFdlYkFydGlmYWN0RWRpdEZvclJlYWQoY29tcG9uZW50KTsKLQkJCVdBUkZpbGVJbXBsIGFyY2hpdmUgPSAoV0FSRmlsZUltcGwpIHdlYkVkaXQuYXNBcmNoaXZlKHRydWUpOwotCQkJdHJ5IHsKLQkJCVJlc291cmNlIHJlcyA9IGFyY2hpdmUuZ2V0RGVwbG95bWVudERlc2NyaXB0b3JSZXNvdXJjZSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCJXZWIgZGVwbG95bWVudCBkZXNjcmlwdG9yIGlzIG51bGwuIik7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAod2ViRWRpdCAhPW51bGwpCi0JCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3dlYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy93ZWIvb3BlcmF0aW9ucy9XZWJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy93ZWJtb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvd2ViL29wZXJhdGlvbnMvV2ViUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzVlNThhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3dlYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy93ZWIvb3BlcmF0aW9ucy9XZWJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBOb3YgNywgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLndlYi5vcGVyYXRpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnByb2plY3QuZmFjZXQuSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZhY2V0RGF0YU1vZGVsTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3Q7Ci0KLQotcHVibGljIGNsYXNzIFdlYlByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QgZXh0ZW5kcyBNb2R1bGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0IHsKLSAgICAKLSAgICAvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqLwotCXB1YmxpYyBXZWJQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWIKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKFdlYlByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QuY2xhc3MpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25UZXN0I2dldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbCgpCi0gICAgICovCi0gICAgcHVibGljIElEYXRhTW9kZWwgZ2V0Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoKSB7Ci0gICAgICAgIHJldHVybiBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElEYXRhTW9kZWwgZ2V0Q29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWxXaXRoRWFyKCkgewotICAgICAgICBJRGF0YU1vZGVsIG1vZGVsID0gIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBXZWJGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotICAgICAgICBGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLSAgICAgICAgSURhdGFNb2RlbCBmYWNldERNID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKEoyRUVQcm9qZWN0VXRpbGl0aWVzLkRZTkFNSUNfV0VCKTsKLSAgICAgICAgZmFjZXRETS5zZXRCb29sZWFuUHJvcGVydHkoIElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLCB0cnVlICk7Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9IAotICAgIAotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvd2VibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL3dlYi92ZXJpZmllcnMvV2ViRXhwb3J0RGF0YU1vZGVsVmVyaWZpZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3dlYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy93ZWIvdmVyaWZpZXJzL1dlYkV4cG9ydERhdGFNb2RlbFZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNGEzNGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvd2VibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL3dlYi92ZXJpZmllcnMvV2ViRXhwb3J0RGF0YU1vZGVsVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA1LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy53ZWIudmVyaWZpZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS52ZXJpZmllcnMuTW9kdWxlRXhwb3J0RGF0YU1vZGVsVmVyaWZpZXI7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViRXhwb3J0RGF0YU1vZGVsVmVyaWZpZXIgZXh0ZW5kcyBNb2R1bGVFeHBvcnREYXRhTW9kZWxWZXJpZmllciB7Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3dlYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy93ZWIvdmVyaWZpZXJzL1dlYkltcG9ydERhdGFNb2RlbFZlcmlmaWVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy93ZWJtb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvd2ViL3ZlcmlmaWVycy9XZWJJbXBvcnREYXRhTW9kZWxWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODk3ZWExLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5qMmVlLnRlc3RzL3dlYm1vZHVsZS10ZXN0cy9vcmcvZWNsaXBzZS93dHAvajJlZS9oZWFkbGVzcy90ZXN0cy93ZWIvdmVyaWZpZXJzL1dlYkltcG9ydERhdGFNb2RlbFZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKYW4gNSwgMjAwNAotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMud2ViLnZlcmlmaWVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUudmVyaWZpZXJzLk1vZHVsZUltcG9ydERhdGFNb2RlbFZlcmlmaWVyOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlYkltcG9ydERhdGFNb2RlbFZlcmlmaWVyIGV4dGVuZHMgTW9kdWxlSW1wb3J0RGF0YU1vZGVsVmVyaWZpZXIgewotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy93ZWJtb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvd2ViL3ZlcmlmaWVycy9XZWJQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxWZXJpZmllci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMvd2VibW9kdWxlLXRlc3RzL29yZy9lY2xpcHNlL3d0cC9qMmVlL2hlYWRsZXNzL3Rlc3RzL3dlYi92ZXJpZmllcnMvV2ViUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JkMjRkZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QuajJlZS50ZXN0cy93ZWJtb2R1bGUtdGVzdHMvb3JnL2VjbGlwc2Uvd3RwL2oyZWUvaGVhZGxlc3MvdGVzdHMvd2ViL3ZlcmlmaWVycy9XZWJQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxWZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLndlYi52ZXJpZmllcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYi5jb21wb25lbnRjb3JlLnV0aWwuV2ViQXJ0aWZhY3RFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLndlYmFwcGxpY2F0aW9uLldlYkFwcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS52ZXJpZmllcnMuTW9kdWxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXI7Ci0KLS8qKgotICogQGF1dGhvciBBZG1pbmlzdHJhdG9yCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIgZXh0ZW5kcyBNb2R1bGVQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxWZXJpZmllciB7Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS52ZXJpZmllcnMuTW9kdWxlUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsVmVyaWZpZXIjdmVyaWZ5UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsKGNvbS5pYm0uZXRvb2xzLmFwcGxpY2F0aW9uLm9wZXJhdGlvbnMuSjJFRVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB2ZXJpZnlQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwoSURhdGFNb2RlbCBtb2RlbCkgewotICAgICAgICBPYmplY3Qga2V5ID0gbmV3IE9iamVjdCgpOwotCQlXZWJBcnRpZmFjdEVkaXQgd2ViRWRpdCA9IG51bGw7Ci0JCQotICAgICAgICB0cnkgewotICAgICAgICAgICAgSVByb2plY3QgcHJvaiA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSkpOwotICAgICAgICAgICAgT2JqZWN0IGRkID0gbnVsbDsKLQkJCXdlYkVkaXQgPSBXZWJBcnRpZmFjdEVkaXQuZ2V0V2ViQXJ0aWZhY3RFZGl0Rm9yUmVhZChwcm9qKTsKLSAgICAgICAJCWlmKHdlYkVkaXQgIT0gbnVsbCkgCi0gICAgICAgCQkJZGQgPSAoV2ViQXBwKSB3ZWJFZGl0LmdldERlcGxveW1lbnREZXNjcmlwdG9yUm9vdCgpOwotCQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIkRlcGxveW1lbnQgRGVzY3JpcHRvciBOdWxsIiwgZGQpOwotICAgICAgICB9IGZpbmFsbHkgewotCQkJaWYoIHdlYkVkaXQgIT0gbnVsbCApCi0JCQkJd2ViRWRpdC5kaXNwb3NlKCk7Ci0JCX0KLS8vICAgICAgICBpZiAoZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShXZWJDb21wb25lbnRDcmVhdGlvbkRhdGFNb2RlbC5BRERfVE9fRUFSKSkgewotLy8gICAgICAgICAgICBJUHJvamVjdCBlYXJQcm9qZWN0ID0gZGF0YU1vZGVsLmdldEVhckNvbXBvbmVudENyZWF0aW9uRGF0YU1vZGVsKCkuZ2V0VGFyZ2V0UHJvamVjdCgpOwotLy8gICAgICAgICAgICBFQVJFZGl0TW9kZWwgZWFyID0gbnVsbDsKLS8vICAgICAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJFQVIgZG9lc24ndCBleGlzdDoiLCBlYXJQcm9qZWN0LmV4aXN0cygpKTsKLS8vICAgICAgICAgICAgICAgIEVBUk5hdHVyZVJ1bnRpbWUgcnVudGltZSA9IEVBUk5hdHVyZVJ1bnRpbWUuZ2V0UnVudGltZShlYXJQcm9qZWN0KTsKLS8vICAgICAgICAgICAgICAgIC8vRU1GV29ya2JlbmNoQ29udGV4dCBlbWZXb3JrYmVuY2hDb250ZXh0ID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY3JlYXRlRU1GQ29udGV4dChlYXJQcm9qZWN0LCBudWxsKTsKLS8vICAgICAgICAgICAgICAgIGVhciA9IChFQVJFZGl0TW9kZWwpIHJ1bnRpbWUuZ2V0RWRpdE1vZGVsRm9yUmVhZChJRUFSTmF0dXJlQ29uc3RhbnRzLkVESVRfTU9ERUxfSUQsIGtleSk7Ci0vLyAgICAgICAgICAgICAgICBlYXIuZ2V0TW9kdWxlTWFwcGluZyhkYXRhTW9kZWwuZ2V0VGFyZ2V0UHJvamVjdCgpKTsKLS8vICAgICAgICAgICAgICAgIC8vVE9ETwotLy8gICAgICAgICAgICB9IGZpbmFsbHkgewotLy8gICAgICAgICAgICAgICAgZWFyLnJlbGVhc2VBY2Nlc3Moa2V5KTsKLS8vICAgICAgICAgICAgfQotLy8KLS8vICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMzA4MWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0id2VibW9kdWxlLXRvbWNhdC10ZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzNmUzNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXVpLmphcgotdGVzdHMuamFyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzJjMWNmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanN0LmoyZWUuc2VydmxldC50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9FeGFtcGxlMS53YXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9FeGFtcGxlMS53YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMzBhMzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvRXhhbXBsZTEud2FyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvVGVzdDEyV2ViLndhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL1Rlc3QxMldlYi53YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjIwYjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvVGVzdDEyV2ViLndhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL1Rlc3QxM1dlYi53YXIgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9UZXN0MTNXZWIud2FyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmFhOTI2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL1Rlc3QxM1dlYi53YXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9UZXN0MTRXZWIud2FyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvVGVzdDE0V2ViLndhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWViMmEzZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9XQVJJbXBvcnRUZXN0cy9UZXN0MTRXZWIud2FyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvWW91ckNvbXBhbnlFeGFtcGxlLndhciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL1dBUkltcG9ydFRlc3RzL1lvdXJDb21wYW55RXhhbXBsZS53YXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOTYyOGMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvV0FSSW1wb3J0VGVzdHMvWW91ckNvbXBhbnlFeGFtcGxlLndhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL2Fib3V0Lmh0bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkNWFlYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1zb3VyY2UudGVzdHMuamFyID0gd2VibW9kdWxlLXRvbWNhdC10ZXN0cy8KLW91dHB1dC50ZXN0cy5qYXIgPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRlc3RzLmphcixcCi0gICAgICAgICAgICAgICBXQVJJbXBvcnRUZXN0cy8sXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3ZmNjMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotUExVR0lOPW9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzCi1JQk09SUJNClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZjEyMjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMiCi0gICBuYW1lPSIlUExVR0lOIgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lPSIlSUJNIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLlNlcnZsZXRUZXN0c1BsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0idGVzdHMuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5jb21tb24uZnJhbWV3b3JrcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZS53ZWIiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnRlc3RzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmp1bml0Ii8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmoyZWUudGVzdHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuajJlZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIi8+Ci0gICAgICAKLSAgIDwvcmVxdWlyZXM+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvdGVzdC54bWwgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JiYjk4Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gPCEtLSA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfVwuLlwuLiIvPiAtLT4KLQk8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+Ci0JPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBwbHVnaW4tbmFtZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3RfMy4xLjAvbGlicmFyeS54bWwiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLURvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC41MD0ke3Rlc3REaXJ9LyR7dG9tY2F0NTBEaXJ9Ii8+Ci0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0ianN0LWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9qc3RfZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7anN0LWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2pzdC1mb2xkZXJ9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLmJ2dC5BdXRvbWF0ZWRCVlQiIC8+Ci0gICAJICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdGVzdHMvU2VydmxldFRlc3RzUGx1Z2luLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3Rlc3RzL1NlcnZsZXRUZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGIyYTdhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdGVzdHMvU2VydmxldFRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgU2VydmxldFRlc3RzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmxldFRlc3RzUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgU2VydmxldFRlc3RzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTZXJ2bGV0VGVzdHNQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZVN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFNlcnZsZXRUZXN0c1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMuU2VydmxldFRlc3RzUGx1Z2luUmVzb3VyY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90ZXN0cy9idnQvQXV0b21hdGVkQlZULmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjliMmIyOC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy5idnQ7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IGp1bml0LnRleHR1aS5UZXN0UnVubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhpcyBnZW5lcmF0ZWQgY29tbWVudCBnbyB0byAKLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkQlZUIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGJhc2VEaXJlY3RvcnkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhciArICJXQVJJbXBvcnRUZXN0cyIgKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzIikuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIAlBdXRvbWF0ZWRCVlQuYmFzZURpcmVjdG9yeSA9IFBsYXRmb3JtLmFzTG9jYWxVUkwodXJsKS5nZXRGaWxlKCkgKyAiVGVzdERhdGEiKyBqYXZhLmlvLkZpbGUuc2VwYXJhdG9yQ2hhcjsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNpbmcgd29ya2luZyBkaXJlY3Rvcnkgc2luY2UgYSB3b3Jrc3BhY2UgVVJMIGNvdWxkIG5vdCBiZSBsb2NhdGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0gCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgdW5pbXBsZW1lbnRlZE1ldGhvZHM7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIHVuaW1wbGVtZW50ZWRNZXRob2RzID0gMDsKLSAgICAgICAgVGVzdFJ1bm5lci5ydW4oc3VpdGUoKSk7Ci0gICAgICAgIGlmICh1bmltcGxlbWVudGVkTWV0aG9kcyA+IDApIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5DYWxscyB0byB3YXJuVW5pbXBsOiAiICsgdW5pbXBsZW1lbnRlZE1ldGhvZHMpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQXV0b21hdGVkQlZUKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSAoVGVzdFN1aXRlKSBBdXRvbWF0ZWRCVlQuc3VpdGUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdWl0ZS50ZXN0Q291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgICBhZGRUZXN0KHN1aXRlLnRlc3RBdChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIFRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIlRlc3QgZm9yIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLmJ2dCIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIC8vc3VpdGUuYWRkVGVzdChBbGxUb21jYXRUZXN0cy5zdWl0ZSgpKTsKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVEVjbGlwc2UuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdGVzdHMvYnZ0L0F1dG9tYXRlZEJWVEVjbGlwc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0ZmJiNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3Rlc3RzL2J2dC9BdXRvbWF0ZWRCVlRFY2xpcHNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBNYXIgMjUsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzLmJ2dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkQlZURWNsaXBzZSBleHRlbmRzIEF1dG9tYXRlZEJWVCB7Ci0JCi0JcHVibGljIEF1dG9tYXRlZEJWVEVjbGlwc2UoKXsKLQkJc3VwZXIoKTsKLQkJVVJMIHVybCA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMiKS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgCUF1dG9tYXRlZEJWVC5iYXNlRGlyZWN0b3J5ID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpLmdldEZpbGUoKSArICJXQVJJbXBvcnRUZXN0cyIrIGphdmEuaW8uRmlsZS5zZXBhcmF0b3JDaGFyOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9BbGxUb21jYXRUZXN0cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90b21jYXQvdGVzdHMvQWxsVG9tY2F0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ4ZTM1ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9BbGxUb21jYXRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gRmViIDIsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRvbWNhdC50ZXN0czsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zZXJ2ZXIuY29yZS5JUnVudGltZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLklSdW50aW1lV29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNlcnZlci5jb3JlLlNlcnZlckNvcmU7Ci0KLS8qKgotICogQGF1dGhvciBqc2hvbGwKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUb21jYXRUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBJUnVudGltZSBUT01DQVRfUlVOVElNRSA9IGNyZWF0ZVJ1bnRpbWUoKTsKLQkKLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKXsKLSAgICAgICAgcmV0dXJuIG5ldyBBbGxUb21jYXRUZXN0cygpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQWxsVG9tY2F0VGVzdHMoKXsKLSAgICAgICAgc3VwZXIoIldFQiBUZXN0cyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZFRlc3QoV2ViUHJvamVjdENyZWF0aW9uVG9tY2F0VGVzdC5zdWl0ZSgpKTsKLSAgICAgICAgYWRkVGVzdChXZWJJbXBvcnRPcGVyYXRpb25Ub21jYXRUZXN0LnN1aXRlKCkpOwotICAgICAgICBhZGRUZXN0KFdlYkV4cG9ydE9wZXJhdGlvblRvbWNhdFRlc3Quc3VpdGUoKSk7Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIElSdW50aW1lIGNyZWF0ZVJ1bnRpbWUoKSAgewotICAgIAlTdHJpbmcgcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuanN0LnNlcnZlci50b21jYXQuNTAiKTsgLy8kTk9OLU5MUy0xJAotICAgIAkKLSAgICAJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJdHJ5IHsKLSAgICAJCUlSdW50aW1lVHlwZSBydCA9IFNlcnZlckNvcmUuZmluZFJ1bnRpbWVUeXBlKCJvcmcuZWNsaXBzZS5qc3Quc2VydmVyLnRvbWNhdC5ydW50aW1lLjUwIik7IC8vJE5PTi1OTFMtMSQKLSAgICAJCUlSdW50aW1lV29ya2luZ0NvcHkgd2MgPSBydC5jcmVhdGVSdW50aW1lKG51bGwsIG51bGwpOwotICAgIAkJd2Muc2V0TG9jYXRpb24obmV3IFBhdGgocykpOwotICAgIAkJcmV0dXJuIHdjLnNhdmUodHJ1ZSwgbnVsbCk7Ci0gICAgCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgCQllLnByaW50U3RhY2tUcmFjZSgpOwotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLSAgICB9Ci0gICAgCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9XZWJFeHBvcnRPcGVyYXRpb25Ub21jYXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9XZWJFeHBvcnRPcGVyYXRpb25Ub21jYXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMzU5N2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90b21jYXQvdGVzdHMvV2ViRXhwb3J0T3BlcmF0aW9uVG9tY2F0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSmFuIDYsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRvbWNhdC50ZXN0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnByb2plY3QuSjJFRVByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2ViLmFyY2hpdmUub3BlcmF0aW9ucy5XZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuU2ltcGxlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnd0cC5oZWFkbGVzcy50ZXN0cy5zYXZlc3RyYXRlZ3kuTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZUV4cG9ydE9wZXJhdGlvblRlc3RDYXNlOwotCi0vKioKLSAqIEBhdXRob3IgQWRtaW5pc3RyYXRvcgotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8gV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZQotICogR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJFeHBvcnRPcGVyYXRpb25Ub21jYXRUZXN0IGV4dGVuZHMgTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdENhc2UgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhjbHVkZUNvbXBpbGVKc3AgPSBmYWxzZTsKLQotCXB1YmxpYyBXZWJFeHBvcnRPcGVyYXRpb25Ub21jYXRUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUZXN0U3VpdGUoV2ViRXhwb3J0T3BlcmF0aW9uVG9tY2F0VGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuT3BlcmF0aW9uVGVzdENhc2Ujc2V0VXAoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWV4Y2x1ZGVDb21waWxlSnNwID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4Y2x1ZGVDb21waWxlSnNwT24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZXhjbHVkZUNvbXBpbGVKc3AgPSB0cnVlOwotCQl0ZXN0QWxsRXhwb3J0VGVzdENhc2VzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlRXhwb3J0T3BlcmF0aW9uVGVzdENhc2UjZ2V0TW9kZWxJbnN0YW5jZSgpCi0JICovCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0TW9kZWxJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBXZWJDb21wb25lbnRFeHBvcnREYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0JcHJvdGVjdGVkIElQcm9qZWN0W10gZ2V0RXhwb3J0YWJsZVByb2plY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0W10gcHJvanMgPSBzdXBlci5nZXRFeHBvcnRhYmxlUHJvamVjdHMoKTsKLQkJTGlzdCBmaWx0ZXJlZFByb2pzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2pzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvanNbaV07Ci0JCQlpZiAoSjJFRVByb2plY3RVdGlsaXRpZXMuaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkKLQkJCQlmaWx0ZXJlZFByb2pzLmFkZChwcm9qZWN0KTsKLQkJfQotCQlyZXR1cm4gKElQcm9qZWN0W10pIGZpbHRlcmVkUHJvanMudG9BcnJheShuZXcgSVByb2plY3RbZmlsdGVyZWRQcm9qcy5zaXplKCldKTsKLQkJCi0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVFeHBvcnRPcGVyYXRpb25UZXN0Q2FzZSNnZXRJbXBvcnRUZXN0Q2FzZSgpCi0JICovCi0JcHJvdGVjdGVkIE1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlIGdldEltcG9ydFRlc3RDYXNlKCkgewotCQlyZXR1cm4gbmV3IFdlYkltcG9ydE9wZXJhdGlvblRvbWNhdFRlc3QoIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TW9kdWxlRXhwb3J0RmlsZUV4dCgpIHsKLQkJcmV0dXJuICIud2FyIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90b21jYXQvdGVzdHMvV2ViSW1wb3J0T3BlcmF0aW9uVG9tY2F0VGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90b21jYXQvdGVzdHMvV2ViSW1wb3J0T3BlcmF0aW9uVG9tY2F0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmUwYmRiLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC5zZXJ2bGV0LnRlc3RzL3dlYm1vZHVsZS10b21jYXQtdGVzdHMvb3JnL2VjbGlwc2UvanN0L3NlcnZsZXQvdG9tY2F0L3Rlc3RzL1dlYkltcG9ydE9wZXJhdGlvblRvbWNhdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA2LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50b21jYXQudGVzdHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuUHJvamVjdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3RwLmhlYWRsZXNzLnRlc3RzLnNhdmVzdHJhdGVneS5Nb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5wbHVnaW4uSGVhZGxlc3NUZXN0c1BsdWdpbjsKLQotLyoqCi0gKiBAYXV0aG9yIEFkbWluaXN0cmF0b3IKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUKLSAqIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViSW1wb3J0T3BlcmF0aW9uVG9tY2F0VGVzdCBleHRlbmRzIE1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlIHsKLQotCXB1YmxpYyBXZWJJbXBvcnRPcGVyYXRpb25Ub21jYXRUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUZXN0U3VpdGUoV2ViSW1wb3J0T3BlcmF0aW9uVG9tY2F0VGVzdC5jbGFzcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdENhc2UjZ2V0RGlyZWN0b3J5KCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpcmVjdG9yeSgpIHsKLQkJcmV0dXJuICJXQVJJbXBvcnRUZXN0cyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnd0cC5qMmVlLmhlYWRsZXNzLnRlc3RzLmoyZWUub3BlcmF0aW9ucy5Nb2R1bGVJbXBvcnRPcGVyYXRpb25UZXN0Q2FzZSNnZXRNb2RlbEluc3RhbmNlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBnZXRNb2RlbEluc3RhbmNlKCkgewotCQlyZXR1cm4gbnVsbDsgLy8gbmV3IFdlYk1vZHVsZUltcG9ydERhdGFNb2RlbCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZUltcG9ydE9wZXJhdGlvblRlc3RDYXNlI2dldEltcG9ydGFibGVBcmNoaXZlRmlsZU5hbWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRJbXBvcnRhYmxlQXJjaGl2ZUZpbGVOYW1lcygpIHsKLQkJcmV0dXJuIFByb2plY3RVdGlsaXR5LmdldFdhcnNJbkRpcmVjdG9yeShIZWFkbGVzc1Rlc3RzUGx1Z2luLmdldERlZmF1bHQoKSwgVEVTVFNfUEFUSCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53dHAuajJlZS5oZWFkbGVzcy50ZXN0cy5qMmVlLm9wZXJhdGlvbnMuTW9kdWxlSW1wb3J0T3BlcmF0aW9uVGVzdENhc2Ujc2V0U2VydmVyVGFyZ2V0UHJvcGVydHkob3JnLmVjbGlwc2UuanN0LmoyZWUuYXBwbGljYXRpb24ub3BlcmF0aW9ucy5KMkVFTW9kdWxlSW1wb3J0RGF0YU1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcnZlclRhcmdldFByb3BlcnR5KElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCS8vIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShTZXJ2ZXJUYXJnZXREYXRhTW9kZWwuUlVOVElNRV9UQVJHRVRfSUQsQWxsVG9tY2F0VGVzdHMuVE9NQ0FUX1JVTlRJTUUuZ2V0SWQoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9XZWJQcm9qZWN0Q3JlYXRpb25Ub21jYXRUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3Quc2VydmxldC50ZXN0cy93ZWJtb2R1bGUtdG9tY2F0LXRlc3RzL29yZy9lY2xpcHNlL2pzdC9zZXJ2bGV0L3RvbWNhdC90ZXN0cy9XZWJQcm9qZWN0Q3JlYXRpb25Ub21jYXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNTRmNzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnNlcnZsZXQudGVzdHMvd2VibW9kdWxlLXRvbWNhdC10ZXN0cy9vcmcvZWNsaXBzZS9qc3Qvc2VydmxldC90b21jYXQvdGVzdHMvV2ViUHJvamVjdENyZWF0aW9uVG9tY2F0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEphbiA2LCAyMDA0Ci0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Quc2VydmxldC50b21jYXQudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5hcHBsaWNhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklBbm5vdGF0aW9uc0RhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFVmVyc2lvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5hcmNoaXZlLm9wZXJhdGlvbnMuV2ViRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53ZWIub3BlcmF0aW9ucy5BZGRTZXJ2bGV0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLklOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLndlYi5vcGVyYXRpb25zLk5ld1NlcnZsZXRDbGFzc0RhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZhY2V0RGF0YU1vZGVsTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5Mb2dVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udGVzdHMuUHJvamVjdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5TaW1wbGVUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi50ZXN0cy5UYXNrVmlld1V0aWxpdHk7Ci0KLS8qKiAKLSAqIEBhdXRob3IgYmxhbmNldHQKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvIFdpbmRvdyAtCi0gKiBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViUHJvamVjdENyZWF0aW9uVG9tY2F0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVTaW1wbGVQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1BST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotICAgICAgICBzZXRTZXJ2ZXJUYXJnZXRQcm9wZXJ0eShkYXRhTW9kZWwpOwotICAgICAgICBkYXRhTW9kZWwuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGRhdGFNb2RlbAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlcnZlclRhcmdldFByb3BlcnR5KElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0gICAgICAgIGRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUsIEFsbFRvbWNhdFRlc3RzLlRPTUNBVF9SVU5USU1FLmdldElkKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVTZXJ2bGV0KElEYXRhTW9kZWwgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgQWRkU2VydmxldE9wZXJhdGlvbiBvcCA9IG5ldyBBZGRTZXJ2bGV0T3BlcmF0aW9uKG1vZGVsKTsKLSAgICAgICAgIG9wLmV4ZWN1dGUobnVsbCxudWxsKTsKLSAgICAgICAgIFByb2plY3RVdGlsaXR5LnZlcmlmeVByb2plY3Qob3AuZ2V0VGFyZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgdHJ1ZSk7IAotICAgICAgICAgVGFza1ZpZXdVdGlsaXR5LnZlcmlmeU5vRXJyb3JzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIElEYXRhTW9kZWwgc2V0dXBTdGFuZGFsb25lV2ViUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGludCBqMmVlVmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGNyZWF0ZVNpbXBsZVByb2plY3QocHJvamVjdE5hbWUpOwotICAgICAgICBJRGF0YU1vZGVsIG1vZGVsID0gZ2V0V2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwocHJvamVjdE5hbWUsIGoyZWVWZXJzaW9uKTsKLSAgICAgICAgY3JlYXRlU3RhbmRhbG9uZVdlYlByb2plY3QobW9kZWwpOwotICAgICAgICBjcmVhdGVTZXJ2bGV0KHByb2plY3ROYW1lKTsKLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyBJRGF0YU1vZGVsIHNldHVwU3RhbmRhbG9uZUFubm90YXRlZFdlYlByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBpbnQgajJlZVZlcnNpb24pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBjcmVhdGVTaW1wbGVQcm9qZWN0KHByb2plY3ROYW1lKTsKLQotICAgICAgICBJRGF0YU1vZGVsIG1vZGVsID0gZ2V0V2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwocHJvamVjdE5hbWUsIGoyZWVWZXJzaW9uKTsKLSAgICAgICAgY3JlYXRlU3RhbmRhbG9uZVdlYlByb2plY3QobW9kZWwpOwotICAgICAgICBjcmVhdGVBbm5vdGF0ZWRTZXJ2bGV0KHByb2plY3ROYW1lKTsKLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlU3RhbmRhbG9uZVdlYlByb2plY3QoSURhdGFNb2RlbCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElEYXRhTW9kZWxPcGVyYXRpb24gd2ViT3AgPSBtb2RlbC5nZXREZWZhdWx0T3BlcmF0aW9uKCk7Ci0gICAgICAgIHdlYk9wLmV4ZWN1dGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSwgbnVsbCk7Ci0gICAgICAgIC8vIFByb2plY3RVdGlsaXR5LnZlcmlmeVByb2plY3QobW9kZWwuZ2V0VGFyZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwKLSAgICAgICAgLy8gdHJ1ZSk7Ci0gICAgICAgIFRhc2tWaWV3VXRpbGl0eS52ZXJpZnlOb0Vycm9ycygpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIElEYXRhTW9kZWwgZ2V0V2ViQ29tcG9uZW50Q3JlYXRpb25EYXRhTW9kZWwoU3RyaW5nIHByb2plY3ROYW1lLCBpbnQgajJlZVZlcnNpb24pIHsKLSAgICAgICAgSVByb2plY3QgamF2YVByb2plY3QgPSBQcm9qZWN0VXRpbGl0eS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLSAgICAgICAgU3RyaW5nIG1vZHVsZU5hbWUgPSBwcm9qZWN0TmFtZSArICJXZWJNb2R1bGUiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBtb2R1bGVEZXBsb3lOYW1lID0gbW9kdWxlTmFtZSArICIud2FyIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBJRGF0YU1vZGVsIG1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFdlYkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0gICAgICAgIG1vZGVsLnNldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfUFJPSkVDVF9OQU1FLCBqYXZhUHJvamVjdC5nZXROYW1lKCkpOwotICAgICAgICBGYWNldERhdGFNb2RlbE1hcCBtYXAgPSAoRmFjZXREYXRhTW9kZWxNYXApIG1vZGVsLmdldFByb3BlcnR5KElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfRE1fTUFQKTsKLSAgICAgICAgSURhdGFNb2RlbCB3ZWJNb2RlbCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChKMkVFUHJvamVjdFV0aWxpdGllcy5EWU5BTUlDX1dFQik7Ci0gICAgICAgIHdlYk1vZGVsLnNldEludFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTixqMmVlVmVyc2lvbik7Ci0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjcmVhdGVTZXJ2bGV0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIElEYXRhTW9kZWwgc2VydmxldE1vZGVsID0gc2V0dXBTZXJ2bGV0Q3JlYXRpb25EYXRhTW9kZWwocHJvamVjdE5hbWUsIGZhbHNlKTsKLSAgICAgICAgY3JlYXRlU2VydmxldChzZXJ2bGV0TW9kZWwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRlZFNlcnZsZXQoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgSURhdGFNb2RlbCBzZXJ2bGV0TW9kZWwgPSBzZXR1cFNlcnZsZXRDcmVhdGlvbkRhdGFNb2RlbChwcm9qZWN0TmFtZSwgdHJ1ZSk7Ci0gICAgICAgIGNyZWF0ZVNlcnZsZXQoc2VydmxldE1vZGVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSURhdGFNb2RlbCBzZXR1cFNlcnZsZXRDcmVhdGlvbkRhdGFNb2RlbChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gaXNBbm5vdGF0ZWQpIHsKLSAgICAJSURhdGFNb2RlbCBzZXJ2bGV0RGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwoTmV3U2VydmxldENsYXNzRGF0YU1vZGVsUHJvdmlkZXIuY2xhc3MpOwotICAgICAgICBzZXJ2bGV0RGF0YU1vZGVsLnNldFByb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSwgcHJvamVjdE5hbWUpOwotICAgICAgICBzZXJ2bGV0RGF0YU1vZGVsLnNldFByb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTVBPTkVOVF9OQU1FLCBwcm9qZWN0TmFtZSk7Ci0gICAgICAgIHNlcnZsZXREYXRhTW9kZWwuc2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ0xBU1NfTkFNRSwgIkZvb1NlcnZsZXQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXJ2bGV0RGF0YU1vZGVsLnNldFByb3BlcnR5KElOZXdTZXJ2bGV0Q2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkRJU1BMQVlfTkFNRSwgIkZvb1NlcnZsZXQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBzZXJ2bGV0RGF0YU1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJQW5ub3RhdGlvbnNEYXRhTW9kZWwuVVNFX0FOTk9UQVRJT05TLCBpc0Fubm90YXRlZCk7Ci0gICAgICAgIHJldHVybiBzZXJ2bGV0RGF0YU1vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZVZhaWxkUHJvamVjdEFuZFNlcnZsZXRDcmVhdGlvbihTdHJpbmcgcHJvamVjdE5hbWUsIGludCBqMmVlVmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExvZ1V0aWxpdHkuZ2V0SW5zdGFuY2UoKS5yZXNldExvZ2dpbmcoKTsKLSAgICAgICAgSURhdGFNb2RlbCBtb2RlbCA9IG51bGw7Ci0gICAgICAgIG1vZGVsID0gc2V0dXBTdGFuZGFsb25lV2ViUHJvamVjdChwcm9qZWN0TmFtZSwgajJlZVZlcnNpb24pOwotICAgICAgICBMb2dVdGlsaXR5LmdldEluc3RhbmNlKCkudmVyaWZ5Tm9XYXJuaW5ncygpOwotICAgICAgICBjaGVja1ZhbGlkRGF0YU1vZGVsKG1vZGVsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVWYWlsZEFubm90YXRlZFByb2plY3RBbmRTZXJ2bGV0Q3JlYXRpb24oU3RyaW5nIHByb2plY3ROYW1lLCBpbnQgajJlZVZlcnNpb24pIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBMb2dVdGlsaXR5LmdldEluc3RhbmNlKCkucmVzZXRMb2dnaW5nKCk7Ci0gICAgICAgIElEYXRhTW9kZWwgbW9kZWwgPSBudWxsOwotICAgICAgICBtb2RlbCA9IHNldHVwU3RhbmRhbG9uZUFubm90YXRlZFdlYlByb2plY3QocHJvamVjdE5hbWUsIGoyZWVWZXJzaW9uKTsKLSAgICAgICAgTG9nVXRpbGl0eS5nZXRJbnN0YW5jZSgpLnZlcmlmeU5vV2FybmluZ3MoKTsKLSAgICAgICAgY2hlY2tWYWxpZERhdGFNb2RlbChtb2RlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1vZGVsCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY2hlY2tWYWxpZERhdGFNb2RlbChJRGF0YU1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIC8vIERhdGFNb2RlbFZlcmlmaWVyIHZlcmlmaWVyID0KLSAgICAgICAgLy8gRGF0YU1vZGVsVmVyaWZpZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlVmVyaWZpZXIobW9kZWwpOwotICAgICAgICAvLyB0cnkgewotICAgICAgICAvLyB2ZXJpZmllci52ZXJpZnkobW9kZWwpOwotICAgICAgICAvLyB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAvLyAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0gICAgICAgIC8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIC8vIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWYWlsZDEyV2ViUHJvamVjdE5hbWVDcmVhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBQcm9qZWN0VXRpbGl0eS5kZWxldGVBbGxQcm9qZWN0cygpOwotICAgICAgICBjcmVhdGVWYWlsZFByb2plY3RBbmRTZXJ2bGV0Q3JlYXRpb24oIkZvb1RvbWNhdFdlYlByb2plY3QxMiIsIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUT0RPIFVuY29tbWVudCB0aGlzIG1ldGhvZCB3aGVuIEFubm90YXRpb24gc3VwcG9ydCBmb3Igc2VydmxldHMgaXMKLSAgICAgKiBlbmFibGVkIHB1YmxpYyB2b2lkIHRlc3RWYWlsZDEyQW5ub3RhdGVkV2ViUHJvamVjdE5hbWVDcmVhdGlvbigpIHRocm93cwotICAgICAqIEV4Y2VwdGlvbiB7IFByb2plY3RVdGlsaXR5LmRlbGV0ZUFsbFByb2plY3RzKCk7Ci0gICAgICogY3JlYXRlVmFpbGRBbm5vdGF0ZWRQcm9qZWN0QW5kU2VydmxldENyZWF0aW9uKCJGb29Bbm5vdGF0ZWRUb21jYXRXZWJQcm9qZWN0MTIiLAotICAgICAqIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzJfSUQpOyB9Ci0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFpbGQxM1dlYlByb2plY3ROYW1lQ3JlYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLSAgICAgICAgY3JlYXRlVmFpbGRQcm9qZWN0QW5kU2VydmxldENyZWF0aW9uKCJGb28xVG9tY2F0V2ViUHJvamVjdDEzIiwgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfM19JRCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRPRE8gVW5jb21tZW50IHRoaXMgbWV0aG9kIHdoZW4gQW5ub3RhdGlvbiBzdXBwb3J0IGZvciBzZXJ2bGV0cyBpcwotICAgICAqIGVuYWJsZWQgcHVibGljIHZvaWQgdGVzdFZhaWxkMTNBbm5vdGF0ZWRXZWJQcm9qZWN0TmFtZUNyZWF0aW9uKCkgdGhyb3dzCi0gICAgICogRXhjZXB0aW9uIHsgUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLSAgICAgKiBjcmVhdGVWYWlsZEFubm90YXRlZFByb2plY3RBbmRTZXJ2bGV0Q3JlYXRpb24oIkZvbzFUb21jYXRXZWJQcm9qZWN0MTMiLAotICAgICAqIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzNfSUQpOyB9Ci0gICAgICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmFpbGQxNFdlYlByb2plY3ROYW1lQ3JlYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLSAgICAgICAgY3JlYXRlVmFpbGRQcm9qZWN0QW5kU2VydmxldENyZWF0aW9uKCJGb28xVG9tY2F0V2ViUHJvamVjdDE0IiwgSjJFRVZlcnNpb25Db25zdGFudHMuV0VCXzJfNF9JRCk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRPRE8gVW5jb21tZW50IHRoaXMgbWV0aG9kIHdoZW4gQW5ub3RhdGlvbiBzdXBwb3J0IGZvciBzZXJ2bGV0cyBpcwotICAgICAqIGVuYWJsZWQgcHVibGljIHZvaWQgdGVzdFZhaWxkMTRBbm5vdGF0ZWRXZWJQcm9qZWN0TmFtZUNyZWF0aW9uKCkgdGhyb3dzCi0gICAgICogRXhjZXB0aW9uIHsgUHJvamVjdFV0aWxpdHkuZGVsZXRlQWxsUHJvamVjdHMoKTsKLSAgICAgKiBjcmVhdGVWYWlsZEFubm90YXRlZFByb2plY3RBbmRTZXJ2bGV0Q3JlYXRpb24oIkZvbzFUb21jYXRXZWJQcm9qZWN0MTQiLAotICAgICAqIEoyRUVWZXJzaW9uQ29uc3RhbnRzLldFQl8yXzRfSUQpOyB9Ci0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2ltcGxlVGVzdFN1aXRlKFdlYlByb2plY3RDcmVhdGlvblRvbWNhdFRlc3QuY2xhc3MpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2Uud3RwLmoyZWUuaGVhZGxlc3MudGVzdHMuajJlZS5vcGVyYXRpb25zLk1vZHVsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvblRlc3QjZ2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSURhdGFNb2RlbCBnZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWwoKSB7Ci0gICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvLmNsYXNzcGF0aCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTYyMTcyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydGllc1ZhbGlkYXRvci8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0aWVzVmFsRlMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydGllc1ZhbFdCLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZpbGVzeXN0ZW1GV0svIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS8uY3ZzaWdub3JlIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMmYwMjEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1ydW50aW1lCi10ZW1wLmZvbGRlcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLy5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmYyYjhmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5jb20uaWJtLmV0b29scy52YWxpZGF0aW9uPC9wcm9qZWN0PgotCQk8cHJvamVjdD5jb20uaWJtLnd0cC5jb21tb248L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdmODBlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotc291cmNlLnJ1bnRpbWUvcHJvcGVydGllc1ZhbGlkYXRvci5qYXIgPSBwcm9wZXJ0aWVzVmFsaWRhdG9yLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNWYWxGUy8sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzVmFsV0IvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXN5c3RlbUZXSy8KLWJpbi5pbmNsdWRlcyA9IHJ1bnRpbWUvcHJvcGVydGllc1ZhbGlkYXRvci5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBmaWxlc3lzdGVtLmJhdCxcCi0gICAgICAgICAgICAgICBwcm9wLmJhdCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1qYXJzLmNvbXBpbGUub3JkZXIgPSBydW50aW1lL3Byb3BlcnRpZXNWYWxpZGF0b3IuamFyCi1vdXRwdXQucnVudGltZS9wcm9wZXJ0aWVzVmFsaWRhdG9yLmphciA9IGJpbi8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtLmJhdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRjODVhOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbS5iYXQKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1AZWNobyBvZmYKLVJFTSBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLVJFTSAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi1SRU0gVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLVJFTSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi1SRU0gCi1SRU0gRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotUkVNIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi1SRU0gQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotUkVNIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotUkVNIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotUkVNICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLVJFTSBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotUkVNIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotUkVNIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotUkVNIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLVJFTSBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi1SRU0gCi1SRU0gVGhpcyBiYXRjaCBmaWxlIHJ1bnMgdGhlICJmaWxlc3lzdGVtIGZyYW1ld29yayIncyBhcHBsaWNhdGlvbgotUkVNCi1zZXRsb2NhbAotCi1pZiAiJUpBVkFfSE9NRSUiIEVRVSAiIiBnb3RvIHN5bnRheAotCi1zZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOy4uXGNvbS5pYm0uZXRvb2xzLmxvZ2dpbmcudXRpbF81LjEuMFxydW50aW1lXGxvZ3V0aWwuamFyCi1zZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOy4uXGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZV81LjEuMFxydW50aW1lXGNvbW1vbi5qYXIKLXNldCBDTEFTU1BBVEg9JUNMQVNTUEFUSCU7LlxydW50aW1lXHByb3BlcnRpZXNWYWxpZGF0b3IuamFyCi1zZXQgQ0xBU1NQQVRIPSVDTEFTU1BBVEglOy5ccnVudGltZVxmaWxlc3lzdGVtRldLLmphcgotc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTsuXHJ1bnRpbWVccHJvcGVydGllc1ZhbFdCLmphcgotc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTsuXHJ1bnRpbWVccHJvcGVydGllc1ZhbEZTLmphcgotCi0lSkFWQV9IT01FJVxiaW5camF2YSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmZpbGVzeXN0ZW0uRmlsZXN5c3RlbUFwcGxpY2F0aW9uICUxCi1nb3RvIDplbmQKLQotOnN5bnRheAotZWNoby4KLWVjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBtdXN0IGJlIHNldCB0byB0aGUgSlJFIGRpcmVjdG9yeS4KLWVjaG8gZS5nLiwgc2V0IEpBVkFfSE9NRT1DOlxKUkUKLWVjaG8gd2hlcmUgSlJFIGhhcyBhIHN1YmRpcmVjdG9yeSBuYW1lZCAiYmluIgotZWNoby4KLWVjaG8uCi1nb3RvIDplbmQKLQotOmVuZAotZW5kbG9jYWwKLUBlY2hvIG9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svZmlsZXN5c3RlbS5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svZmlsZXN5c3RlbS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzI4MzQ5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL2ZpbGVzeXN0ZW0ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMKLSMgTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0jIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSMgVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSMgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotIwotIyAgRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotIyAgVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSMgIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSMgIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotIyAgeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0jICAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0jICBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotIyAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0jICBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSMgIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSMgIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSMKLQotIyBWRkZTID0gVmFsaWRhdGlvbiBGcmFtZXdvcmsgRmlsZSBTeXN0ZW0gCi1WRkZTMDAwMCA9IFZGRlMwMDAwRTogSW50ZXJuYWwgZXJyb3IgY2F1c2VkIHByZW1hdHVyZSB0ZXJtaW5hdGlvbiBvZiB2YWxpZGF0b3IgezB9LiBTZWUgdGhlIHN0YWNrIHRyYWNlIGJlbG93LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1BcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vRmlsZXN5c3RlbUFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDA3MzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vRmlsZXN5c3RlbUFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5maWxlc3lzdGVtOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0b3JMYXVuY2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgZmlsZSBzeXN0ZW0gYmFzZWQgYXBwbGljYXRpb24KLSAqIHdoaWNoIG5lZWRzIHRvIHVzZSB0aGUgY29tbW9uIHZhbGlkYXRpb24gQVBJcy4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVzeXN0ZW1BcHBsaWNhdGlvbiB7Ci0JLyoqCi0JICogVGhlIGFyZ3ZbXSBwYXJhbWV0ZXIgbmVlZHMgdG8gYmUgYSBmdWxseS1xdWFsaWZpZWQgbGlzdCBvZiBmaWxlIG5hbWVzIAotCSAqIG9mIGZpbGVzIHRoYXQgc2hvdWxkIGJlIHZhbGlkYXRlZC4gCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotCQlJRmlsZURlbHRhW10gZmlsZXMgPSBGaWxlc3lzdGVtTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0RmlsZURlbHRhcyhhcmd2KTsKLQkJYm9vbGVhbiBmdWxsQnVpbGQgPSAoKGZpbGVzID09IG51bGwpIHx8IChmaWxlcy5sZW5ndGggPT0gMCkpOwotCi0JCUlSZXBvcnRlciByZXBvcnRlciA9IG51bGw7Ci0JCWlmIChmdWxsQnVpbGQpIHsKLQkJCXJlcG9ydGVyID0gbmV3IEZ1bGxSZXBvcnRlcigpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVwb3J0ZXIgPSBuZXcgSW5jcmVtZW50YWxSZXBvcnRlcigpOwotCQl9Ci0KLQkJRmlsZXN5c3RlbUxvYWRlciBsb2FkZXJzW10gPSBGaWxlc3lzdGVtTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0TG9hZGVycyhmaWxlcyk7Ci0JCWZvciAoaW50IGk9MDsgaTxsb2FkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlc3lzdGVtTG9hZGVyIGxvYWRlciA9IGxvYWRlcnNbaV07Ci0JCQl0cnkgewotCQkJCVZhbGlkYXRvckxhdW5jaGVyLmdldExhdW5jaGVyKCkuc3RhcnQobG9hZGVyLmdldEhlbHBlcigpLCBsb2FkZXIuZ2V0VmFsaWRhdG9yKCksIHJlcG9ydGVyKTsKLQkJCQlpZiAoIWZ1bGxCdWlsZCkgewotCQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpcmVwb3J0ZXIpLnJlcG9ydCgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCJmaWxlc3lzdGVtIiwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgIlZGRlMwMDAwIiwgbmV3IFN0cmluZ1tde2xvYWRlci5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKX0pOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sobG9hZGVyLmdldFZhbGlkYXRvcigpLCBtZXNzYWdlKTsKLQkJCQkKLQkJCQlpZihleGMuZ2V0QXNzb2NpYXRlZE1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihleGMuZ2V0QXNzb2NpYXRlZE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQkJCQotCQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlpZihleGMuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJZXhjLmdldEFzc29jaWF0ZWRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQkJLy8gY29udGludWUgd2l0aCB0aGUgbmV4dCB2YWxpZGF0aW9uCi0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKCJmaWxlc3lzdGVtIiwgSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgIlZGRlMwMDAwIiwgbmV3IFN0cmluZ1tde2xvYWRlci5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKX0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXBvcnRlci5kaXNwbGF5U3VidGFzayhsb2FkZXIuZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotCQkJCS8vIGNvbnRpbnVlIHdpdGggdGhlIG5leHQgdmFsaWRhdGlvbgotCQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1Mb2FkZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1Mb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0NGZjNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9GaWxlc3lzdGVtTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5maWxlc3lzdGVtOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGFzc29jaWF0ZXMgYSBWYWxpZGF0b3Igd2l0aCBhIEhlbHBlciBhbmQgdGhlIGZpbGUgZXh0ZW5zaW9ucyB0aGF0Ci0gKiB0aGUgdmFsaWRhdG9yIHJ1bnMgb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlc3lzdGVtTG9hZGVyIHsKLQlwcml2YXRlIElGaWxlc3lzdGVtSGVscGVyIF9oZWxwZXIgPSBudWxsOwotCXByaXZhdGUgSVZhbGlkYXRvciBfdmFsaWRhdG9yID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIF9maWxlRXh0ZW5zaW9ucyA9IG51bGw7Ci0JCi0JcHVibGljIEZpbGVzeXN0ZW1Mb2FkZXIoU3RyaW5nW10gZmlsZUV4dGVuc2lvbnMsIElGaWxlc3lzdGVtSGVscGVyIGhlbHBlciwgSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJc3VwZXIoKTsKLQotCQlfZmlsZUV4dGVuc2lvbnMgPSBmaWxlRXh0ZW5zaW9uczsKLQkJX2hlbHBlciA9IGhlbHBlcjsKLQkJX3ZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBoZWxwZXIgdGhhdCB0aGUgdmFsaWRhdG9yIG5lZWRzIHRvIGFjY2VzcyBpbmZvcm1hdGlvbiAKLQkgKiBpbiB0aGUgZmlsZXN5c3RlbSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLQkgKi8KLQlwdWJsaWMgSUZpbGVzeXN0ZW1IZWxwZXIgZ2V0SGVscGVyKCkgewotCQlyZXR1cm4gX2hlbHBlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbGlkYXRvciB0aGF0IGNoZWNrcyB0aGUgcnVsZXMuCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBmaWxlIG5hbWUgZXh0ZW5zaW9ucyB0aGF0IHRoaXMgdmFsaWRhdG9yIHZhbGlkYXRlcy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0RmlsZUV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiBfZmlsZUV4dGVuc2lvbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vRmlsZXN5c3RlbU1hbmFnZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0ZpbGVzeXN0ZW1NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZDM4M2EuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vRmlsZXN5c3RlbU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5maWxlc3lzdGVtOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLkZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIGhlYXJ0IG9mIHRoZSBmaWxlc3lzdGVtIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICogSXQgJnF1b3Q7bG9hZHMmcXVvdDsgZWFjaCB2YWxpZGF0b3IncyBtZXRhZGF0YQotICovCi1wdWJsaWMgY2xhc3MgRmlsZXN5c3RlbU1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIEZpbGVzeXN0ZW1NYW5hZ2VyIF9pbnN0ID0gbnVsbDsKLQlwcml2YXRlIFNldCBfbG9hZGVycyA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBGaWxlc3lzdGVtTWFuYWdlcigpIHsKLQkJX2xvYWRlcnMgPSBuZXcgSGFzaFNldCgpOwotCQkKLQkJLy8gUGxlYXNlIHByZXRlbmQgdGhhdCB0aGlzIG1ldGFkYXRhLCBpLmUuLCB0aGUgZmlsZSBleHRlbnNpb24sIGZ1bGx5LXF1YWxpZmllZAotCQkvLyBjbGFzcyBuYW1lIG9mIHRoZSBoZWxwZXIsIGFuZCBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdmFsaWRhdG9yLCAKLQkJLy8gd2FzIGxvYWRlZCBnZW5lcmljYWxseSBzb21laG93LiBJbiBwcmFjdGljZSwgdGhpcyBpbmZvcm1hdGlvbiBjb3VsZCBiZSBzdG9yZWQKLQkJLy8gaW4gLnhtbCBmaWxlcywgaW4gYSBjb25maWd1cmF0aW9uIGZpbGUsIGV0Yy4sIHRoYXQgdGhlIGZyYW1ld29yayB3b3VsZCByZWFkCi0JCS8vIHRvIGZpbmQgdGhlIGluc3RhbGxlZCB2YWxpZGF0b3JzLgotCQl0cnkgewotCQkJX2xvYWRlcnMuYWRkKG5ldyBGaWxlc3lzdGVtTG9hZGVyKG5ldyBTdHJpbmdbXXsiLnByb3BlcnRpZXMifSwgbG9hZEhlbHBlcigib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLmZpbGVzeXN0ZW1pbXBsLkZpbGVzeXN0ZW1Qcm9wZXJ0aWVzSGVscGVyIiksIGxvYWRWYWxpZGF0b3IoIm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5Qcm9wZXJ0aWVzVmFsaWRhdG9yIikpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWNhdGNoKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJY2F0Y2goSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQljYXRjaChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIGEgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYSBoZWxwZXIsIHJldHVybiBhbiBpbnN0YW5jZSBvZiBpdC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJRmlsZXN5c3RlbUhlbHBlciBsb2FkSGVscGVyKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24gIHsKLQkJcmV0dXJuIChJRmlsZXN5c3RlbUhlbHBlcilsb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gYSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhIHZhbGlkYXRvciwgcmV0dXJuIGFuIGluc3RhbmNlIG9mIGl0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIElWYWxpZGF0b3IgbG9hZFZhbGlkYXRvcihTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uICB7Ci0JCXJldHVybiAoSVZhbGlkYXRvcilsb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBpZGVudGlmaWVkIGJ5IHRoZSBjbGFzc05hbWUgcGFyYW1ldGVyLAotCSAqIHdoaWNoIGNvbnRhaW5zIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHsKLQkJaWYoY2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxvYWRDbGFzcyBhcmd1bWVudCBtdXN0IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCXJldHVybiBjbGF6ei5uZXdJbnN0YW5jZSgpOwkJCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgRmlsZXN5c3RlbU1hbmFnZXIgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZXN5c3RlbU1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYoX2luc3QgPT0gbnVsbCkgewotCQkJX2luc3QgPSBuZXcgRmlsZXN5c3RlbU1hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gX2luc3Q7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gYW4gYXJyYXkgb2YgZmlsZSBuYW1lcywgcmV0dXJuIGFuIGFycmF5IG9mIElGaWxlRGVsdGEKLQkgKiBpbnN0YW5jZXMgdG8gcGFzcyB0byB0aGUgdmFsaWRhdG9yIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJRmlsZURlbHRhW10gZ2V0RmlsZURlbHRhcyhTdHJpbmdbXSBmaWxlTmFtZXMpIHsKLQkJaWYoKGZpbGVOYW1lcyA9PSBudWxsKSB8fCAoZmlsZU5hbWVzLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUZpbGVEZWx0YVtdIGZpbGVzID0gbmV3IEZpbGVEZWx0YVtmaWxlTmFtZXMubGVuZ3RoXTsKLQkJZm9yKGludCBpPTA7IGk8ZmlsZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaWxlc1tpXSA9IG5ldyBGaWxlRGVsdGEoZmlsZU5hbWVzW2ldLCBJRmlsZURlbHRhLkNIQU5HRUQpOwotCQl9Ci0JCXJldHVybiBmaWxlczsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gYW4gYXJyYXkgb2YgSUZpbGVEZWx0YSBpbnN0YW5jZXMsIHJldHVybiBhbiBhcnJheQotCSAqIG9mIHRoZSBJVmFsaWRhdG9yIGluc3RhbmNlcywgd2l0aCB0aGVpciBhc3NvY2lhdGVkIElWYWxpZGF0aW9uQ29udGV4dCBpbnN0YW5jZXMsCi0JICogdGhhdCB2YWxpZGF0ZSB0aGVzZSBwYXJ0aWN1bGFyIGRlbHRhIGluc3RhbmNlcy4KLQkgKi8KLQlwdWJsaWMgRmlsZXN5c3RlbUxvYWRlcltdIGdldExvYWRlcnMoSUZpbGVEZWx0YVtdIGRlbHRhcykgewotCQlpZihkZWx0YXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldEFsbExvYWRlcnMoKTsKLQkJfQotCi0JCVNldCBsb2FkZXJzID0gbmV3IEhhc2hTZXQoKTsJCQotCQlmb3IoaW50IGk9MDsgaTxkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGVzeXN0ZW1Mb2FkZXJbXSBsb2FkZXJBcnJheSA9IGdldExvYWRlcnNGb3IoZGVsdGFzW2ldKTsKLQkJCWlmKGxvYWRlckFycmF5ICE9IG51bGwpIHsKLQkJCQlmb3IoaW50IGo9MDsgajxsb2FkZXJBcnJheS5sZW5ndGg7IGorKykgewotCQkJCQlsb2FkZXJzLmFkZChsb2FkZXJBcnJheVtqXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlGaWxlc3lzdGVtTG9hZGVyW10gcmVzdWx0ID0gbmV3IEZpbGVzeXN0ZW1Mb2FkZXJbbG9hZGVycy5zaXplKCldOwotCQlsb2FkZXJzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gYW4gSVZhbGlkYXRvciBpbnN0YW5jZSwgcmV0dXJuIHRoZSBJVmFsaWRhdGlvbkNvbnRleHQgaW5zdGFuY2UgdGhhdCB0aGUKLQkgKiBJVmFsaWRhdG9yIHVzZXMgdG8gbG9hZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBmaWxlc3lzdGVtIHZhbGlkYXRpb24KLQkgKiBmcmFtZXdvcmsgZW52aXJvbm1lbnQuCi0JICovCi0JcHVibGljIElGaWxlc3lzdGVtSGVscGVyIGdldEhlbHBlcihJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZih2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX2xvYWRlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlGaWxlc3lzdGVtTG9hZGVyIGxvYWRlciA9IChGaWxlc3lzdGVtTG9hZGVyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKHZhbGlkYXRvci5lcXVhbHMobG9hZGVyLmdldFZhbGlkYXRvcigpKSkgewotCQkJCXJldHVybiBsb2FkZXIuZ2V0SGVscGVyKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHZhbGlkYXRvciwgcmV0dXJuIHRoZSBJVmFsaWRhdG9yIGluc3RhbmNlLgotCSAqIG51bGwgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgSVZhbGlkYXRvciBjYW5ub3QgYmUgZm91bmQuCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpIHsKLQkJaWYodmFsaWRhdG9yQ2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9sb2FkZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRmlsZXN5c3RlbUxvYWRlciBsb2FkZXIgPSAoRmlsZXN5c3RlbUxvYWRlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZih2YWxpZGF0b3JDbGFzc05hbWUuZXF1YWxzKGxvYWRlci5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gbG9hZGVyLmdldFZhbGlkYXRvcigpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIGFsbCBGaWxlc3lzdGVtTG9hZGVyIGluc3RhbmNlcy4gRWFjaCBsb2FkZXIgaGFzCi0JICogb25lIElWYWxpZGF0b3IgYW5kIG9uZSBJVmFsaWRhdGlvbkNvbnRleHQuCi0JICovCi0JcHVibGljIEZpbGVzeXN0ZW1Mb2FkZXJbXSBnZXRBbGxMb2FkZXJzKCkgewotCQlGaWxlc3lzdGVtTG9hZGVyW10gcmVzdWx0ID0gbmV3IEZpbGVzeXN0ZW1Mb2FkZXJbX2xvYWRlcnMuc2l6ZSgpXTsKLQkJX2xvYWRlcnMudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgZmlsZSBuYW1lLCByZXR1cm4gdGhlIGxvYWRlciB3aGljaCBjb250YWlucyB0aGUgdmFsaWRhdG9yICYgaGVscGVyCi0JICogd2hpY2ggY2FuIHZhbGlkYXRlIHRoYXQgZmlsZSwgaWYgb25lIGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgRmlsZXN5c3RlbUxvYWRlcltdIGdldExvYWRlcnNGb3IoSUZpbGVEZWx0YSBkZWx0YSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9sb2FkZXJzLml0ZXJhdG9yKCk7Ci0JCUZpbGVzeXN0ZW1Mb2FkZXJbXSB0ZW1wTG9hZGVycyA9IG5ldyBGaWxlc3lzdGVtTG9hZGVyW19sb2FkZXJzLnNpemUoKV07Ci0JCWludCBjb3VudCA9IDA7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRmlsZXN5c3RlbUxvYWRlciBsb2FkZXIgPSAoRmlsZXN5c3RlbUxvYWRlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmdbXSBmaWxlRXh0ZW5zaW9ucyA9IGxvYWRlci5nZXRGaWxlRXh0ZW5zaW9ucygpOwotCQkJaWYoZmlsZUV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlmb3IoaW50IGk9MDsgaTxmaWxlRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmKGRlbHRhLmdldEZpbGVOYW1lKCkuZW5kc1dpdGgoZmlsZUV4dGVuc2lvbnNbaV0pICYmIChkZWx0YS5nZXREZWx0YVR5cGUoKSA9PSBJRmlsZURlbHRhLkFEREVEIHx8IGRlbHRhLmdldERlbHRhVHlwZSgpID09IElGaWxlRGVsdGEuQ0hBTkdFRCB8fCBkZWx0YS5nZXREZWx0YVR5cGUoKSA9PSBJRmlsZURlbHRhLkRFTEVURUQpKSB7Ci0JCQkJCXRlbXBMb2FkZXJzW2NvdW50KytdID0gbG9hZGVyOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJRmlsZXN5c3RlbUxvYWRlcltdIHJlc3VsdCA9IG5ldyBGaWxlc3lzdGVtTG9hZGVyW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wTG9hZGVycywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9GdWxsUmVwb3J0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0Z1bGxSZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTU5YjJhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0Z1bGxSZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgcmVwb3J0ZXIgaXMgdXNlZCB3aGVuIGZ1bGwgdmFsaWRhdGlvbiBpcyBuZWVkZWQuIEl0IGRvZXNuJ3QgY2FjaGUKLSAqIGFueXRoaW5nLCBzbyBpdCdzIGZhc3RlciB0aGFuIHRoZSBJbmNyZW1lbnRhbFJlcG9ydGVyLgotICovCi1wdWJsaWMgY2xhc3MgRnVsbFJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKLQlwdWJsaWMgRnVsbFJlcG9ydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI2FkZE1lc3NhZ2UoSVZhbGlkYXRvciwgSU1lc3NhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWVzc2FnZShJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZU1hbmFnZXIuZm9ybWF0TWVzc2FnZSh2YWxpZGF0b3IsIG1lc3NhZ2UpKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjZGlzcGxheVN1YnRhc2soSVZhbGlkYXRvciwgSU1lc3NhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGxheVN1YnRhc2soSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJLy8gRmx1c2ggdGhlIG1lc3NhZ2UgdG8gdGhlIHVzZXIgaW1tZWRpYXRlbHkuCi0JCVN5c3RlbS5lcnIucHJpbnRsbihtZXNzYWdlLmdldFRleHQoKSk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI2dldE1lc3NhZ2VzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcygpIHsKLQkJLy8gdGhpcyByZXBvcnRlciBkb2VzIG5vdCBzdXBwb3J0IG1lc3NhZ2UgYWNjZXNzIAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjaXNDYW5jZWxsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotCQkvLyB0byBtYWtlIHRoaW5ncyBlYXN5LCBkbyBub3QgYWxsb3cgdGhlIHVzZXIgdG8gY2FuY2VsIHZhbGlkYXRpb24uCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQkvLyBzaW5jZSBubyBtZXNzYWdlcyBhcmUgc3RvcmVkLCB0aGVyZSdzIG5vdGhpbmcgdG8gcmVtb3ZlCi0JfQotCQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI3JlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iamVjdCkgewotCQkvLyBzaW5jZSBubyBtZXNzYWdlcyBhcmUgc3RvcmVkLCB0aGVyZSdzIG5vdGhpbmcgdG8gcmVtb3ZlCi0JfQotCQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI3JlbW92ZU1lc3NhZ2VTdWJzZXQoSVZhbGlkYXRvciwgT2JqZWN0LCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iaiwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQkvLyBTaW5jZSB0aGlzIHJlcG9ydGVyIGRvZXNuJ3Qgc3RvcmUgbWVzc2FnZXMsIHRoZXJlIGlzIG5vIHJlbW92YWwgb2YgYW55IG1lc3NhZ2VzCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vSUZpbGVzeXN0ZW1IZWxwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0lGaWxlc3lzdGVtSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Mzg1MTMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL2ZpbGVzeXN0ZW1GV0svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL2ZpbGVzeXN0ZW0vSUZpbGVzeXN0ZW1IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLmZpbGVzeXN0ZW07Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiBUbyBpbnRlZ3JhdGUgYSB2YWxpZGF0b3IgaW50byB0aGlzIGZyYW1ld29yaywgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcwotICogSVZhbGlkYXRpb25Db250ZXh0IG11c3QgYmUgcHJvdmlkZWQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZpbGVzeXN0ZW1IZWxwZXIgZXh0ZW5kcyBJVmFsaWRhdGlvbkNvbnRleHQgewotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGZpbGUgd2hpY2ggdGhlIElNZXNzYWdlIGlzIHJlcG9ydGVkIGFnYWluc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShJTWVzc2FnZSBtZXNzYWdlKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0luY3JlbWVudGFsUmVwb3J0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL0luY3JlbWVudGFsUmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThlM2RiYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9JbmNyZW1lbnRhbFJlcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHRoZSBmaWxlIHN5c3RlbSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhbiBpbmNyZW1lbnRhbCBJUmVwb3J0ZXIuCi0gKiBJdCBjYWNoZXMgdmFsaWRhdGlvbiBtZXNzYWdlcywgc28gdGhhdCBtZXNzYWdlcyBjYW4gYm90aCBiZSBhZGRlZCBhbmQgZGVsZXRlZC4KLSAqLwotcHVibGljIGNsYXNzIEluY3JlbWVudGFsUmVwb3J0ZXIgaW1wbGVtZW50cyBJUmVwb3J0ZXIgewotCQotCXB1YmxpYyBJbmNyZW1lbnRhbFJlcG9ydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElSZXBvcnRlciNhZGRNZXNzYWdlKElWYWxpZGF0b3IsIElNZXNzYWdlKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlWYWxpZGF0b3JNZXNzYWdlcyB2bSA9IE1lc3NhZ2VNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRNZXNzYWdlcyh2YWxpZGF0b3IpOwotCQlpZiAodm0gIT0gbnVsbCkgewotCQkJdm0uYWRkVmFsaWRhdGlvbk1lc3NhZ2UobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSZXBvcnRlciNkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yLCBJTWVzc2FnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQkvLyBGbHVzaCB0aGUgbWVzc2FnZSB0byB0aGUgdXNlciBpbW1lZGlhdGVseS4KLQkJU3lzdGVtLmVyci5wcmludGxuKG1lc3NhZ2UuZ2V0VGV4dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElSZXBvcnRlciNnZXRNZXNzYWdlcygpCi0JICovCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIE1hcCBvZiBTdHJpbmcgZnVsbHktcXVhbGlmaWVkIHZhbGlkYXRvciBjbGFzcyBuYW1lcywKLQkgKiB3aXRoIGEgdmFsdWUgb2YgQ29sbGVjdGlvbiwgYW5kIHRoZSBDb2xsZWN0aW9uIGNvbnRhaW5zIHRoZQotCSAqIE1lc3NhZ2VNZXRhRGF0YSByZXBvcnRlZCBieSB0aGUgdmFsaWRhdG9yLCBvZiB0aGUgZ2l2ZW4gc2V2ZXJpdHkuCi0JICovCi0JcHVibGljIE1hcCBnZXRNZXNzYWdlcyhpbnQgbWVzc2FnZVR5cGUpIHsKLQkJcmV0dXJuIE1lc3NhZ2VNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRNZXNzYWdlcyhtZXNzYWdlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjaXNDYW5jZWxsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotCQkvLyBGb3Igc2ltcGxpY2l0eSwgbmV2ZXIgYWxsb3cgY2FuY2VsbGF0aW9uLgotCQkvLyBJbiBhIHByb2R1Y3Rpb24gc3lzdGVtLCB0aGlzIG1ldGhvZCBtaWdodCBxdWVyeSBhbm90aGVyIG9iamVjdCB0byBmaW5kIG91dCBpdHMgY2FuY2VsbGF0aW9uIHN0YXR1cy4KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVJlcG9ydGVyI3JlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJTWVzc2FnZU1hbmFnZXIuZ2V0TWFuYWdlcigpLnJlbW92ZUFsbE1lc3NhZ2VzKHZhbGlkYXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCi0JCU1lc3NhZ2VNYW5hZ2VyLmdldE1hbmFnZXIoKS5yZW1vdmVBbGxNZXNzYWdlcyh2YWxpZGF0b3IsIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yLCBPYmplY3QsIFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVNZXNzYWdlU3Vic2V0KElWYWxpZGF0b3IgdmFsaWRhdG9yLCBPYmplY3Qgb2JqLCBTdHJpbmcgZ3JvdXBOYW1lKSB7Ci0JCS8vIGltcGxlbWVudCBsYXRlcgotCX0KLQotCS8qKgotCSAqIERpc3BsYXkgYSBmb3JtYXR0ZWQgbGlzdCBvZiBhbGwgb2YgdGhlIHByb2JsZW1zIGZvdW5kIHdoaWxlCi0JICogdmFsaWRhdGluZyB0aGUgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG1lc3NhZ2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJTWFwIG1lc3NhZ2VzID0gZ2V0TWVzc2FnZXMoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSk7Ci0JCXJlcG9ydChtZXNzYWdlcyk7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZyBtZXNzYWdlcyIpOyAvLyROT04tTkxTLTEkCi0JCW1lc3NhZ2VzID0gZ2V0TWVzc2FnZXMoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZKTsKLQkJcmVwb3J0KG1lc3NhZ2VzKTsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJJbmZvcm1hdGlvbiBtZXNzYWdlcyIpOyAvLyROT04tTkxTLTEkCi0JCW1lc3NhZ2VzID0gZ2V0TWVzc2FnZXMoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZKTsKLQkJcmVwb3J0KG1lc3NhZ2VzKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBJUmVwb3J0ZXIjcmVwb3J0KE1hcCkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVwb3J0KE1hcCBtZXNzYWdlcykgewotCQlpZihtZXNzYWdlcy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG1lc3NhZ2VzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHZhbGlkYXRvckNsYXNzTmFtZSA9IChTdHJpbmcpaXRlcmF0b3IubmV4dCgpOwotCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSBGaWxlc3lzdGVtTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0VmFsaWRhdG9yKHZhbGlkYXRvckNsYXNzTmFtZSk7Ci0JCQlJRmlsZXN5c3RlbUhlbHBlciBoZWxwZXIgPSBGaWxlc3lzdGVtTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0SGVscGVyKHZhbGlkYXRvcik7Ci0JCQlMaXN0IG1zc2dMaXN0ID0gKExpc3QpbWVzc2FnZXMuZ2V0KHZhbGlkYXRvcik7Ci0JCQlpZihtc3NnTGlzdCA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCUNvbGxlY3Rpb25zLnNvcnQobXNzZ0xpc3QsIE1lc3NhZ2VNYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRNZXNzYWdlQ29tcGFyYXRvcihoZWxwZXIpKTsKLQkJCQotCQkJZm9yKGludCBpPTA7IGk8bXNzZ0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCQlJTWVzc2FnZSBtc3NnID0gKElNZXNzYWdlKW1zc2dMaXN0LmdldChpKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZU1hbmFnZXIuZm9ybWF0TWVzc2FnZSh2YWxpZGF0b3IsIG1zc2cpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL01lc3NhZ2VNYW5hZ2VyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9NZXNzYWdlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGIxYzllLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL01lc3NhZ2VNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlcyBmb3IgZWFjaCB2YWxpZGF0b3IuIEVhY2ggdmFsaWRhdG9yJ3MKLSAqIG1lc3NhZ2VzIGNhbiBiZSByZXRyaWV2ZWQgYnkgdXNpbmcgdGhlIHZhbGlkYXRvcidzIHVuaXF1ZSBuYW1lIGFzIGEga2V5IGludG8gdGhlCi0gKiB0YWJsZS4gKGkuZS4sIGNhbGwgZ2V0TWVzc2FnZXMgd2l0aCB0aGUgdmFsaWRhdG9yJ3MgdW5pcXVlIG5hbWUgYXMgdGhlIHBhcmFtZXRlci4pCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXNzYWdlTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZU1hbmFnZXIgX3NpbmdsZXRvbiA9IG51bGw7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yIF9jb21wYXJhdG9yID0gbnVsbDsKLQotCXByaXZhdGUgTWFwIF92YWxpZGF0aW9uTWVzc2FnZXMgPSBudWxsOwotCi0JcHJpdmF0ZSBNZXNzYWdlTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQotCQlfdmFsaWRhdGlvbk1lc3NhZ2VzID0gbmV3IEhhc2hNYXAoMTApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgTWVzc2FnZU1hbmFnZXIgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWVzc2FnZU1hbmFnZXIgZ2V0TWFuYWdlcigpIHsKLQkJaWYgKF9zaW5nbGV0b24gPT0gbnVsbCkgewotCQkJX3NpbmdsZXRvbiA9IG5ldyBNZXNzYWdlTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBfc2luZ2xldG9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBtYXAgb2YgYWxsIG1lc3NhZ2VzIG9mIHRoZSBnaXZlbiBzZXZlcml0eS4gVGhlIGtleSBvZiB0aGUgbWFwCi0JICogaXMgdGhlIElWYWxpZGF0b3IsIHRoZSB2YWx1ZSBvZiB0aGUgSVZhbGlkYXRvciBpcyB0aGUgTGlzdCBvZiBJTWVzc2FnZQotCSAqIGluc3RhbmNlcyBvZiB0aGUgZ2l2ZW4gc2V2ZXJpdHkuCi0JICovCi0JcHVibGljIE1hcCBnZXRNZXNzYWdlcyhpbnQgbWVzc2FnZVR5cGVzKSB7Ci0JCU1hcCBtZXNzYWdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfdmFsaWRhdGlvbk1lc3NhZ2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVmFsaWRhdG9yTWVzc2FnZXMgbXNzZyA9IChWYWxpZGF0b3JNZXNzYWdlcykgaXRlcmF0b3IubmV4dCgpOwotCi0JCQltZXNzYWdlcy5wdXQobXNzZy5nZXRWYWxpZGF0b3IoKS5nZXRDbGFzcygpLmdldE5hbWUoKSwgbXNzZy5nZXRNZXNzYWdlcyhtZXNzYWdlVHlwZXMpKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZXM7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIFZhbGlkYXRpb25NZXNzYWdlIG93bmVkIGJ5IHRoZSBpZGVudGlmaWVkIHZhbGlkYXRvciwKLQkgKiBpZiBvbmUgZXhpc3RzLiBJZiBvbmUgZG9lc24ndCBleGlzdCwgaXQgaXMgY3JlYXRlZCAmIHJlZ2lzdGVyZWQsIGFuZCB0aGVuIAotCSAqIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JNZXNzYWdlcyBnZXRNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJVmFsaWRhdG9yTWVzc2FnZXMgbWVzc2FnZSA9IChWYWxpZGF0b3JNZXNzYWdlcykgX3ZhbGlkYXRpb25NZXNzYWdlcy5nZXQodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJLy8gaWYgaXQgZG9lc24ndCBleGlzdCwgY3JlYXRlIGl0LgotCQkJbWVzc2FnZSA9IG5ldyBWYWxpZGF0b3JNZXNzYWdlcyh2YWxpZGF0b3IpOwotCQkJX3ZhbGlkYXRpb25NZXNzYWdlcy5wdXQodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBtZXNzYWdlKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBtZXNzYWdlcyBvd25lZCBieSB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJaWYgKHZhbGlkYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlfdmFsaWRhdGlvbk1lc3NhZ2VzLnJlbW92ZSh2YWxpZGF0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgYWxsIG1lc3NhZ2VzLCBvd25lZCBieSB0aGUgaWRlbnRpZmllZCB2YWxpZGF0b3IsIHJlcG9ydGVkCi0JICogYWdhaW5zdCB0aGUgZ2l2ZW4gdGFyZ2V0IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVZhbGlkYXRvck1lc3NhZ2VzIG1lc3NhZ2UgPSBnZXRNZXNzYWdlcyh2YWxpZGF0b3IpOwotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlLnJlbW92ZUFsbE1lc3NhZ2VzKG9iamVjdCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVG8gc3VwcG9ydCByZW1vdmFsIG9mIGEgc3Vic2V0IG9mIHZhbGlkYXRpb24gbWVzc2FnZXMsIGFuIElWYWxpZGF0b3IKLQkgKiBtYXkgYXNzaWduIGdyb3VwIG5hbWVzIHRvIElNZXNzYWdlcy4gQW4gSU1lc3NhZ2Ugc3Vic2V0IHdpbGwgYmUgaWRlbnRpZmllZAotCSAqIGJ5IHRoZSBuYW1lIG9mIGl0cyBncm91cC4gRGVmYXVsdCAobnVsbCkgbWVhbnMgbm8gZ3JvdXAuIFRoaXMgbWV0aG9kIHdpbGwKLQkgKiByZW1vdmUgb25seSB0aGUgSU1lc3NhZ2UncyB0aGF0IGFyZSBpbiB0aGUgZ3JvdXAgaWRlbnRpZmllZCBieSBncm91cE5hbWUuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iamVjdCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQlpZiAodmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVZhbGlkYXRvck1lc3NhZ2VzIG1lc3NhZ2UgPSBnZXRNZXNzYWdlcyh2YWxpZGF0b3IpOwotCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlLnJlbW92ZUFsbE1lc3NhZ2VzKG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElNZXNzYWdlIGFzIGEgU3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5aW5nIHRvIHRoZSB1c2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1hdE1lc3NhZ2UoSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBtZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0JCU9iamVjdCBvYmplY3QgPSBtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpOwotCQlTdHJpbmdCdWZmZXIgZm9ybWF0dGVkTWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3dpdGNoIChzZXZlcml0eSkgewotCQkJY2FzZSAoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSkgOgotCQkJCXsKLQkJCQkJZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQoIkVycm9yOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCWNhc2UgKElNZXNzYWdlLkxPV19TRVZFUklUWSkgOgotCQkJCXsKLQkJCQkJZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQoIkluZm9ybWF0aW9uOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCWNhc2UgKElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSkgOgotCQkJZGVmYXVsdCA6Ci0JCQkJewotCQkJCQlmb3JtYXR0ZWRNZXNzYWdlLmFwcGVuZCgiV2FybmluZzogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQl9Ci0KLQkJZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQobWVzc2FnZS5nZXRUZXh0KCkpOwotCi0JCWlmIChvYmplY3QgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZXN5c3RlbU1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEhlbHBlcih2YWxpZGF0b3IpLmdldEZpbGVOYW1lKG1lc3NhZ2UpOwotCQkJaW50IGxpbmVOdW1iZXIgPSBtZXNzYWdlLmdldExpbmVOdW1iZXIoKTsKLQotCQkJaWYoKGZpbGVOYW1lICE9IG51bGwpIHx8IChsaW5lTnVtYmVyICE9IElNZXNzYWdlLkxJTkVOT19VTlNFVCkpIHsKLQkJCQlmb3JtYXR0ZWRNZXNzYWdlLmFwcGVuZCgiWyIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYoZmlsZU5hbWUgIT0gbnVsbCkgewotCQkJCQlmb3JtYXR0ZWRNZXNzYWdlLmFwcGVuZChmaWxlTmFtZSk7Ci0JCQkJfQotCQkJCWlmKGxpbmVOdW1iZXIgIT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSB7Ci0JCQkJCWZvcm1hdHRlZE1lc3NhZ2UuYXBwZW5kKCIgbGluZSBudW1iZXI6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZvcm1hdHRlZE1lc3NhZ2UuYXBwZW5kKFN0cmluZy52YWx1ZU9mKGxpbmVOdW1iZXIpKTsKLQkJCQl9Ci0JCQkJZm9ybWF0dGVkTWVzc2FnZS5hcHBlbmQoIl0gIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmb3JtYXR0ZWRNZXNzYWdlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBDb21wYXJhdG9yIGlzIHVzZWQgdG8gc29ydCBtZXNzYWdlcyBmaXJzdCBieSBmaWxlIG5hbWUsIHRoZW4gYnkgbGluZSBudW1iZXIuCi0JICovCi0JcHVibGljIENvbXBhcmF0b3IgZ2V0TWVzc2FnZUNvbXBhcmF0b3IoZmluYWwgSUZpbGVzeXN0ZW1IZWxwZXIgaGVscGVyKSB7Ci0JCWlmKF9jb21wYXJhdG9yID09IG51bGwpIHsKLQkJCV9jb21wYXJhdG9yID0gCW5ldyBDb21wYXJhdG9yKCkgewotCQkJCXByb3RlY3RlZCBpbnQgY29tcGFyZShTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLQkJCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQkJCXJldHVybiAwOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihiID09IG51bGwpIHsKLQkJCQkJCXJldHVybiAxOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlyZXR1cm4gYS5jb21wYXJlVG8oYik7Ci0JCQkJfQotCQkJCQotCQkJCXByb3RlY3RlZCBpbnQgY29tcGFyZShpbnQgYSwgaW50IGIpIHsKLQkJCQkJaWYoKGEgPT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSAmJiAoYiA9PSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQpKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQkJCQllbHNlIGlmKGEgPT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSB7Ci0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihiID09IElNZXNzYWdlLkxJTkVOT19VTlNFVCkgewotCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCXJldHVybiAoYSAtIGIpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQkJCWlmKChhID09IG51bGwpICYmIChiID09IG51bGwpKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQkJCQllbHNlIGlmKGEgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJSU1lc3NhZ2UgYU1zc2cgPSAoSU1lc3NhZ2UpYTsKLQkJCQkJSU1lc3NhZ2UgYk1zc2cgPSAoSU1lc3NhZ2UpYjsKLQkJCQkJCi0JCQkJCS8vIFNvcnQgYnkgZmlsZSBuYW1lLCB0aGVuIGxpbmUgbnVtYmVyLiBVbnNldCBsaW5lIG51bWJlcnMgZ28gdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaXN0LgotCQkJCQlTdHJpbmcgYUZpbGVOYW1lID0gaGVscGVyLmdldEZpbGVOYW1lKGFNc3NnKTsKLQkJCQkJU3RyaW5nIGJGaWxlTmFtZSA9IGhlbHBlci5nZXRGaWxlTmFtZShiTXNzZyk7Ci0JCQkJCWludCByZXN1bHQgPSBjb21wYXJlKGFGaWxlTmFtZSwgYkZpbGVOYW1lKTsKLQkJCQkJaWYocmVzdWx0ICE9IDApIHsKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWludCBhTGluZU51bWJlciA9IGFNc3NnLmdldExpbmVOdW1iZXIoKTsKLQkJCQkJaW50IGJMaW5lTnVtYmVyID0gYk1zc2cuZ2V0TGluZU51bWJlcigpOwotCQkJCQlyZXR1cm4gY29tcGFyZShhTGluZU51bWJlciwgYkxpbmVOdW1iZXIpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIF9jb21wYXJhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL1ZhbGlkYXRvck1lc3NhZ2VzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvZmlsZXN5c3RlbUZXSy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbS9WYWxpZGF0b3JNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzE2ZGYwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9maWxlc3lzdGVtRldLL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtL1ZhbGlkYXRvck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIG1lc3NhZ2VzIGZvciBvbmUgdmFsaWRhdG9yLiBFYWNoIHZhbGlkYXRvciAKLSAqIGNhbiBzdG9yZSB0aHJlZSB0eXBlcyBvZiBtZXNzYWdlczogZXJyb3IgKFNldmVyaXR5RW51bS5ISUdIX1NFVkVSSVRZKSwgCi0gKiB3YXJuaW5nIChTZXZlcml0eUVudW0uTk9STUFMX1NFVkVSSVRZKSwgYW5kIGluZm8gKFNldmVyaXR5RW51bS5MT1dfU0VWRVJJVFkpLgotICogRWFjaCBtZXNzYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBPYmplY3QgKGZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uKS4KLSAqIElmIGEgbWVzc2FnZSBkb2VzIG5vdCBhcHBseSB0byBhIHBhcnRpY3VsYXIgT2JqZWN0LCB0aGUgZGVmYXVsdCBPYmplY3QKLSAqIGlzIHVzZWQuCi0gKgotICogRWFjaCBPYmplY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGVpdGhlciAwLCAxLCBvciA+MSBtZXNzYWdlcy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JNZXNzYWdlcyB7Ci0JcHJpdmF0ZSBNYXAgX21lc3NhZ2VzID0gbnVsbDsKLQlwcml2YXRlIElWYWxpZGF0b3IgX3ZhbGlkYXRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3QgREVGQVVMVF9PQkpFQ1QgPSBuZXcgT2JqZWN0KCk7Ci0KLQlwdWJsaWMgVmFsaWRhdG9yTWVzc2FnZXMoSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJX21lc3NhZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJX3ZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWxpZGF0b3IgdGhhdCBvd25zIHRoZXNlIG1lc3NhZ2VzLgotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIF92YWxpZGF0b3I7Ci0JfQotCQotCS8qKgotCSAqIEFkZCBhbiBJTWVzc2FnZSB0byB0aGUgZGVmYXVsdCBncm91cC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRWYWxpZGF0aW9uTWVzc2FnZShJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWFkZFZhbGlkYXRpb25NZXNzYWdlKG1lc3NhZ2UsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYW4gSU1lc3NhZ2UgdG8gdGhlIG5hbWVkIGdyb3VwLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKElNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyBncm91cE5hbWUpIHsKLQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG1lc3NhZ2UuZ2V0VGFyZ2V0T2JqZWN0KCkgPT0gbnVsbCkgewotCQkJLy8gSWYgb2JqZWN0IGlzIG51bGwsIHRoZSBlcnJvciBtZXNzYWdlIGRvZXMgbm90IGFwcGx5IHRvIGEgcGFydGljdWxhciBvYmplY3QuCi0JCQkvLwotCQkJLy8gVGhpcyB2YWx1ZSBtaWdodCBiZSB1c2VkIGlmLCBmb3IgZXhhbXBsZSwgdGhlIHZhbGlkYXRvciBleHBlcmllbmNlcyBhbiBpbnRlcm5hbCwgdW5yZWNvdmVyYWJsZSBlcnJvci4KLQkJCS8vIFlvdSBuZWVkIHRvIGxldCB0aGUgdXNlciBrbm93IHRoYXQgdmFsaWRhdGlvbiB0ZXJtaW5hdGVkIGFibm9ybWFsbHksIGJ1dCBhIGxpc3QKLQkJCS8vIG9mIHRoZSB2YWxpZGF0aW9uIHdoaWNoIHByb2NlZWRlZCBub3JtYWxseSBjYW4gaGVscCB0byBuYXJyb3cgZG93biB3aGF0IHBhcnQgb2YgdGhlCi0JCQkvLyBjb2RlIGNhdXNlZCBhIHByb2JsZW0uCi0JCQkvLwotCQkJLy8gT3IgaXQgY291bGQgYmUgc29tZXRoaW5nIGdlbmVyaWMsIGUuZy4gaXQgYXBwbGllcyB0byBhIC5qYXIgZmlsZSwgaW5zdGVhZCBvZiBhIGZpbGUgaW4gdGhlIC5qYXIuCi0JCQltZXNzYWdlLnNldFRhcmdldE9iamVjdChnZXREZWZhdWx0T2JqZWN0KCkpOwotCQl9Ci0JCQotCQlpZihncm91cE5hbWUgIT0gbnVsbCkgewotCQkJbWVzc2FnZS5zZXRHcm91cE5hbWUoZ3JvdXBOYW1lKTsKLQkJfQotCi0JCUxpc3QgbGlzdCA9IChMaXN0KSBfbWVzc2FnZXMuZ2V0KG1lc3NhZ2UuZ2V0VGFyZ2V0T2JqZWN0KCkpOwotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWxpc3QuYWRkKG1lc3NhZ2UpOwotCQlfbWVzc2FnZXMucHV0KG1lc3NhZ2UuZ2V0VGFyZ2V0T2JqZWN0KCksIGxpc3QpOwotCX0KLQkKLQkvKioKLQkgKiBJZiB0aGUgSU1lc3NhZ2UgZG9lcyBub3QgaGF2ZSBhIHRhcmdldCBvYmplY3QsIHRoZSBvYmplY3QKLQkgKiByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIE1hcC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXREZWZhdWx0T2JqZWN0KCkgewotCQlyZXR1cm4gREVGQVVMVF9PQkpFQ1Q7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbGwgbWVzc2FnZXMgd2hvc2Ugc2V2ZXJpdHkgbWF0Y2hlcyB0aGUgbWVzc2FnZVR5cGVzIHNldmVyaXR5LgotCSAqLwotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VzKGludCBtZXNzYWdlVHlwZXMpIHsKLQkJTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9tZXNzYWdlcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgaXRlcmF0b3IubmV4dCgpOwotCi0JCQlPYmplY3RbXSBsaXN0Q29udGVudHMgPSBsaXN0LnRvQXJyYXkoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdENvbnRlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IChJTWVzc2FnZSkgbGlzdENvbnRlbnRzW2ldOwotCi0JCQkJaWYgKChtZXNzYWdlVHlwZXMgJiBtZXNzYWdlLmdldFNldmVyaXR5KCkpICE9IDApIHsKLQkJCQkJbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbWVzc2FnZXM7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhbGwgbWVzc2FnZXMgdGhhdCBhcHBseSB0byB0aGUgZ2l2ZW4gb2JqZWN0LiBJZiBvYmplY3QgaXMKLQkgKiBudWxsLCB0aGUgbWVzc2FnZXMgb3duZWQgYnkgdGhlIGRlZmF1bHQgb2JqZWN0IGFyZSByZW1vdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0JCQlvYmplY3QgPSBnZXREZWZhdWx0T2JqZWN0KCk7Ci0JCX0KLQotCQlfbWVzc2FnZXMucmVtb3ZlKG9iamVjdCk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSBhbGwgbWVzc2FnZXMgdGhhdCBhcHBseSB0byB0aGUgZ2l2ZW4gb2JqZWN0IHdoaWNoIGFyZSBpbgotCSAqIHRoZSBuYW1lZCBncm91cC4gSWYgT2JqZWN0IGlzIG51bGwsIHRoZSBkZWZhdWx0IG9iamVjdCBpcyB1c2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VTdWJzZXQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGdyb3VwTmFtZSkgewotCQlpZiAoZ3JvdXBOYW1lID09IG51bGwpIHsKLQkJCXJlbW92ZUFsbE1lc3NhZ2VzKG9iamVjdCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCW9iamVjdCA9IGdldERlZmF1bHRPYmplY3QoKTsKLQkJfQotCi0JCUxpc3QgbGlzdCA9IChMaXN0KSBfbWVzc2FnZXMuZ2V0KG9iamVjdCk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChsaXN0LnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSU1lc3NhZ2UgbXNnID0gKElNZXNzYWdlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlTdHJpbmcgbXNnR3JvdXBOYW1lID0gbXNnLmdldEdyb3VwTmFtZSgpOwotCQkJaWYgKGdyb3VwTmFtZS5lcXVhbHMobXNnR3JvdXBOYW1lKSkgewotCQkJCWxpc3QucmVtb3ZlKG1zZyk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzE3ODI3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUiCi0gICBuYW1lPSJQcm9wZXJ0aWVzIFZhbGlkYXRvciIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS53b3JrYmVuY2hpbXBsLlByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InJ1bnRpbWUvcHJvcGVydGllc1ZhbGlkYXRvci5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuaGVscCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbS51dGlsIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLTwhLS0gUHJvcGVydGllcyBWYWxpZGF0b3IgQ29udHJpYnV0aW9ucyAgICAtLT4KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJQcm9wZXJ0aWVzVmFsaWRhdG9yIgotICAgICAgICAgbmFtZT0iUHJvcGVydGllcyBWYWxpZGF0b3IiCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICAgIDx2YWxpZGF0b3I+Ci0gICAgICAgICA8cHJvamVjdE5hdHVyZQotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiPgotICAgICAgICAgPC9wcm9qZWN0TmF0dXJlPgotICAgICAgICAgPGZpbHRlcgotICAgICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotICAgICAgICAgICAgICAgbmFtZUZpbHRlcj0iKi5wcm9wZXJ0aWVzIgotICAgICAgICAgICAgICAgYWN0aW9uPSJhZGQsIGNoYW5nZSI+Ci0gICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGVuYWJsZWQ9ImZhbHNlIgotICAgICAgICAgICAgICAgYXN5bmM9ImZhbHNlIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5Qcm9wZXJ0aWVzVmFsaWRhdG9yIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgICAgPGhlbHBlcgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS53b3JrYmVuY2hpbXBsLlByb3BlcnRpZXNIZWxwZXIiPgotICAgICAgICAgPC9oZWxwZXI+Ci0gICAgICA8L3ZhbGlkYXRvcj4KLSAgIDwvZXh0ZW5zaW9uPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSBWYWxpZGF0aW9uIERvY3VtZW50YXRpb24gICAgICAgICAgICAgIC0tPgotPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBWYWxpZGF0b3IgRGV2ZWxvcGVyJ3MgR3VpZGUgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIDx0b2MKLSAgICAgICAgICAgIGZpbGU9ImRvYy9kZXZlbG9wZXJHdWlkZS90b2MueG1sIgotICAgICAgICAgICAgcHJpbWFyeT0idHJ1ZSI+Ci0gICAgICA8L3RvYz4KLSAgIDwvZXh0ZW5zaW9uPgotLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIFZhbGlkYXRpb24gR3VpZGUgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgICAgPHRvYwotICAgICAgICAgICAgZmlsZT0iZG9jL2d1aWRlL3RvYy54bWwiCi0gICAgICAgICAgICBwcmltYXJ5PSJ0cnVlIj4KLSAgICAgIDwvdG9jPgotICAgPC9leHRlbnNpb24+Ci0tLT4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcC5iYXQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcC5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYmY5NDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3AuYmF0CisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotQGVjaG8gb2ZmCi1SRU0gTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi1SRU0gKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotUkVNIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi1SRU0gcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotUkVNIAotUkVNIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLVJFTSBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotUkVNIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLVJFTSBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLVJFTSB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLVJFTSAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi1SRU0gTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLVJFTSBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLVJFTSBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLVJFTSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi1SRU0gaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotUkVNIAotUkVNIFRoaXMgYmF0Y2ggZmlsZSBmaXJlcyBvZmYgdGhlIHByb3BlcnR5IGZpbGUgcGFyc2Ugb3IgY29tcGFyaXNvbi4KLVJFTQotc2V0bG9jYWwKLQotaWYgIiVKQVZBX0hPTUUlIiBFUVUgIiIgZ290byBOT19KQVZBCi0KLXNldCBDTEFTU1BBVEg9JUNMQVNTUEFUSCU7Li5cY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5jb3JlXzUuMS4wXHJ1bnRpbWVcY29tbW9uLmphcgotc2V0IENMQVNTUEFUSD0lQ0xBU1NQQVRIJTsuXHJ1bnRpbWVccHJvcGVydGllc1ZhbGlkYXRvci5qYXIKLWlmICIlMSIgPT0gIiIgZ290byBzeW50YXgKLQotJUpBVkFfSE9NRSVcYmluXGphdmEgY29tLmlibS5ldG9vbHMucGFyc2VyLk1haW4gJTEgJTIgJTMKLWdvdG8gOmVuZAotCi06Tk9fSkFWQQotZWNoby4KLWVjaG8gVGhlIEpBVkFfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBtdXN0IGJlIHNldCB0byB0aGUgSlJFIGRpcmVjdG9yeS4KLWVjaG8gZS5nLiwgc2V0IEpBVkFfSE9NRT1DOlxKUkUKLWVjaG8gd2hlcmUgSlJFIGhhcyBhIHN1YmRpcmVjdG9yeSBuYW1lZCAiYmluIgotZWNoby4KLWdvdG8gOmVuZAotCi06c3ludGF4Ci0lSkFWQV9IT01FJVxiaW5camF2YSBjb20uaWJtLmV0b29scy5wYXJzZXIuTWFpbgotCi06ZW5kCi1lbmRsb2NhbAotQGVjaG8gb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbEZTL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtaW1wbC9GaWxlc3lzdGVtUHJvcGVydGllc0hlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxGUy9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvZmlsZXN5c3RlbWltcGwvRmlsZXN5c3RlbVByb3BlcnRpZXNIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiYmZiMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbEZTL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9maWxlc3lzdGVtaW1wbC9GaWxlc3lzdGVtUHJvcGVydGllc0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLmZpbGVzeXN0ZW1pbXBsOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuUE1vZGVsRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUuZmlsZXN5c3RlbS5JRmlsZXN5c3RlbUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLkFQcm9wZXJ0eUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlci5Qcm9wZXJ0eUxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5GaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgSVZhbGlkYXRpb25Db250ZXh0IGltcGxlbWVudGF0aW9uLCB1c2VkIGJ5IHRoZSBQcm9wZXJ0aWVzVmFsaWRhdG9yLAotICogd2hlbiB0aGUgdmFsaWRhdG9yIGlzIHJ1biBpbiB0aGUgZmlsZXN5c3RlbSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIEZpbGVzeXN0ZW1Qcm9wZXJ0aWVzSGVscGVyIGltcGxlbWVudHMgSUZpbGVzeXN0ZW1IZWxwZXIgewotCXB1YmxpYyBGaWxlc3lzdGVtUHJvcGVydGllc0hlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5JVmFsaWRhdGlvbkNvbnRleHQjbG9hZE1vZGVsKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGxvYWRNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0JCXJldHVybiBsb2FkTW9kZWwoc3ltYm9saWNOYW1lLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5JVmFsaWRhdGlvbkNvbnRleHQjbG9hZE1vZGVsKFN0cmluZywgT2JqZWN0W10pCi0JICovCi0JcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSwgT2JqZWN0W10gcGFybSkgewotCQlpZiAoKHN5bWJvbGljTmFtZSA9PSBudWxsKSB8fCAoc3ltYm9saWNOYW1lLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHN5bWJvbGljTmFtZS5lcXVhbHMoUE1vZGVsRW51bS5MSU5FSU5QVVRSRUFERVIpICYmIChwYXJtICE9IG51bGwpICYmIChwYXJtLmxlbmd0aCA9PSAxKSAmJiAocGFybVswXSBpbnN0YW5jZW9mIFN0cmluZykpIHsKLQkJCXJldHVybiBsb2FkTGluZU51bWJlclJlYWRlcigoU3RyaW5nKSBwYXJtWzBdKTsKLQkJfQotCQllbHNlIGlmIChzeW1ib2xpY05hbWUuZXF1YWxzKFBNb2RlbEVudW0uUkVMRUFTRV9MSU5FSU5QVVRSRUFERVIpICYmIChwYXJtICE9IG51bGwpICYmIChwYXJtLmxlbmd0aCA9PSAxKSAmJiAocGFybVswXSBpbnN0YW5jZW9mIExpbmVOdW1iZXJSZWFkZXIpKSB7Ci0JCQlyZXR1cm4gcmVsZWFzZUxpbmVOdW1iZXJSZWFkZXIoKExpbmVOdW1iZXJSZWFkZXIpIHBhcm1bMF0pOwotCQl9Ci0JCWVsc2UgaWYgKHN5bWJvbGljTmFtZS5lcXVhbHMoUE1vZGVsRW51bS5BTExfUFJPUEVSVElFU19GSUxFUykpIHsKLQkJCXJldHVybiBsb2FkQWxsUHJvcGVydGllc0ZpbGVzKCk7Ci0JCX0KLQkJZWxzZSBpZihzeW1ib2xpY05hbWUuZXF1YWxzKFBNb2RlbEVudW0uRklMVEVSKSkgewotCQkJLy8gQmVjYXVzZSB0aGlzIGVudmlyb25tZW50IGRvZXMgbm90IGNvcHkgcmVzb3VyY2VzIGludG8gYSAiYmluIiBkaXJlY3RvcnksCi0JCQkvLyB0aGUgaW5wdXQgaXMgYWxyZWFkeSBmaWx0ZXJlZC4KLQkJCXJldHVybiBwYXJtOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgZmlsZSBuYW1lIG9mIGFuIGV4aXN0aW5nIC5wcm9wZXJ0aWVzIGZpbGUsIHJldHVybgotCSAqIHRoZSBMaW5lTnVtYmVyUmVhZGVyIHRoYXQgd2lsbCByZWFkIHRoZSBmaWxlLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbG9hZExpbmVOdW1iZXJSZWFkZXIoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCUZpbGUgcHJvcGVydHlGaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlpZiAoIXByb3BlcnR5RmlsZS5leGlzdHMoKSB8fCAhcHJvcGVydHlGaWxlLmlzRmlsZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUZpbGVSZWFkZXIgaW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBuZXcgRmlsZVJlYWRlcihwcm9wZXJ0eUZpbGUpOwotCQl9Ci0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBCZWNhdXNlIHdlIHdhbnQgdG8gcmVhZCBpbiBhIGxpbmUgYXQgYSB0aW1lIGZyb20gdGhlIGZpbGUsIGNvbnZlcnQgdGhlIEZpbGVSZWFkZXIgdG8gYSBMaW5lUmVhZGVyCi0JCUxpbmVOdW1iZXJSZWFkZXIgbGluZUlucHV0ID0gbmV3IExpbmVOdW1iZXJSZWFkZXIoaW5wdXQpOwotCQlyZXR1cm4gbGluZUlucHV0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRvZXNuJ3QgbG9hZCBhbnl0aGluZzsgaXQgcmVsZWFzZXMgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQKLQkgKiBieSB0aGUgbG9hZExpbmVOdW1iZXJSZWFkZXIgbWV0aG9kLiBJdHMgcmVzdWx0IHdpbGwgbmV2ZXIgYmUgdXNlZCwgc28gYWx3YXlzCi0JICogcmV0dXJuIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCByZWxlYXNlTGluZU51bWJlclJlYWRlcihMaW5lTnVtYmVyUmVhZGVyIHJlYWRlcikgewotCQlpZiAocmVhZGVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJlYWRlci5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBXaGVuIHRoZSB2YWxpZGF0b3IgaXMgdG9sZCB0byBwZXJmb3JtIGEgZnVsbCB2YWxpZGF0aW9uLCB0aGlzCi0JICogbWV0aG9kIHJldHVybnMgYW4gSUZpbGVEZWx0YVtdLCB3aXRoIG9uZSBJRmlsZURlbHRhIGZvciBldmVyeQotCSAqIC5wcm9wZXJ0aWVzIGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBpdHMgc3ViZGlyZWN0b3JpZXMuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBsb2FkQWxsUHJvcGVydGllc0ZpbGVzKCkgewotCQlTdHJpbmcgcHdkID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmRpciIpOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgcHdkRGlyID0gbmV3IEZpbGUocHdkKTsKLQkJaWYgKCFwd2REaXIuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKCFwd2REaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTZXQgdGVtcFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXRyYXZlcnNlRGlyZWN0b3JpZXMocHdkRGlyLCB0ZW1wU2V0KTsKLQkJCi0JCUlGaWxlRGVsdGFbXSByZXN1bHQgPSBuZXcgSUZpbGVEZWx0YVt0ZW1wU2V0LnNpemUoKV07Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gdGVtcFNldC5pdGVyYXRvcigpOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUZpbGUgZmlsZSA9IChGaWxlKWl0ZXJhdG9yLm5leHQoKTsKLQkJCXJlc3VsdFtjb3VudCsrXSA9IG5ldyBGaWxlRGVsdGEoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgSUZpbGVEZWx0YS5DSEFOR0VEKTsKLQkJfQotCQl0ZW1wU2V0LmNsZWFyKCk7Ci0JCXRlbXBTZXQgPSBudWxsOwotCQlpdGVyYXRvciA9IG51bGw7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVHJhdmVyc2UgdGhlIGRpcmVjdG9yeSwgbG9va2luZyBmb3IgLnByb3BlcnRpZXMgZmlsZXMsIGFuZCBpZiBhCi0JICogLnByb3BlcnRpZXMgZmlsZSBpcyBmb3VuZCB0aGVuIGFkZCBpdCB0byB0aGUgU2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYXZlcnNlRGlyZWN0b3JpZXMoRmlsZSBkaXJlY3RvcnlUb1NlYXJjaCwgU2V0IHJlc3VsdCkgewotCQlpZiAoZGlyZWN0b3J5VG9TZWFyY2ggPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGRpcmVjdG9yeVRvU2VhcmNoLmlzRGlyZWN0b3J5KCkpIHsKLQkJCS8vIFRyYXZlcnNlIGludG8gdGhpcyBkaXJlY3RvcnkncyBjaGlsZHJlbi4KLQkJCVN0cmluZ1tdIGNoaWxkcmVuID0gZGlyZWN0b3J5VG9TZWFyY2gubGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCUZpbGUgY2hpbGQgPSBuZXcgRmlsZShkaXJlY3RvcnlUb1NlYXJjaCwgY2hpbGRyZW5baV0pOwotCQkJCXRyYXZlcnNlRGlyZWN0b3JpZXMoY2hpbGQsIHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihkaXJlY3RvcnlUb1NlYXJjaC5pc0ZpbGUoKSkgewotCQkJU3RyaW5nIGZpbGVOYW1lID0gZGlyZWN0b3J5VG9TZWFyY2guZ2V0TmFtZSgpOwotCQkJaWYoKGZpbGVOYW1lICE9IG51bGwpICYmIGZpbGVOYW1lLmVuZHNXaXRoKCJwcm9wZXJ0aWVzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hZGQoZGlyZWN0b3J5VG9TZWFyY2gpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIGFuIElNZXNzYWdlLCByZXR1cm4gdGhlIGZpbGUgbmFtZSBvZiB0aGUgLnByb3BlcnRpZXMgZmlsZSB0aGF0Ci0JICogdGhlIG1lc3NhZ2Ugd2FzIHJlcG9ydGVkIGFnYWluc3QuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZShJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCU9iamVjdCBvYmplY3QgPSBtZXNzYWdlLmdldFRhcmdldE9iamVjdCgpOwotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpIHsKLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSlvYmplY3Q7Ci0JCQlBUHJvcGVydHlGaWxlIHBGaWxlID0gbGluZS5nZXRGaWxlKCk7Ci0JCQlyZXR1cm4gcEZpbGUuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKTsgLy8gYSBWYWxpZGF0aW9uUHJvcGVydHlGaWxlIHJldHVybnMgdGhlIGZpbGUgbmFtZSBhcyBpdHMgcXVhbGlmaWVkIG5hbWUKLQkJfQotCQllbHNlIGlmKG9iamVjdCBpbnN0YW5jZW9mIEFQcm9wZXJ0eUZpbGUpIHsKLQkJCUFQcm9wZXJ0eUZpbGUgcEZpbGUgPSAoQVByb3BlcnR5RmlsZSlvYmplY3Q7Ci0JCQlyZXR1cm4gcEZpbGUuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKTsgLy8gYSBWYWxpZGF0aW9uUHJvcGVydHlGaWxlIHJldHVybnMgdGhlIGZpbGUgbmFtZSBhcyBpdHMgcXVhbGlmaWVkIG5hbWUKLQkJfQotCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VVJJcygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbFdCL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS93b3JrYmVuY2hpbXBsL1BsdWdpblByb3BlcnR5RmlsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9QbHVnaW5Qcm9wZXJ0eUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkYzcwNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbFdCL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS93b3JrYmVuY2hpbXBsL1BsdWdpblByb3BlcnR5RmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qCi0gKiAoYykgQ29weXJpZ2h0IDIwMDEgTXlDb3Jwb3JhdGlvbi4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLndvcmtiZW5jaGltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIuQVByb3BlcnR5RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLk1lc3NhZ2VNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIEEgUGx1Z2luUHJvcGVydHlGaWxlIHJlcHJlc2VudHMgYSByZXNvdXJjZSBidW5kbGUgdGhhdCBpcyBleHBvcnRlZCBieSBhIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIFBsdWdpblByb3BlcnR5RmlsZSBleHRlbmRzIEFQcm9wZXJ0eUZpbGUgewotCXByaXZhdGUgU3RyaW5nIF9idW5kbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfcGx1Z2luSWQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9sYW5nVmFyaWFudCA9IG51bGw7IC8vIGUuZy4sIGVuX1VTIHZzIGVuCi0JcHJpdmF0ZSBDbGFzc0xvYWRlciBfY2xhc3NMb2FkZXIgPSBudWxsOyAvLyB0aGUgQ2xhc3NMb2FkZXIgdXNlZCB0byBsb2FkIHRoZSBidW5kbGUKLQkKLQkKLQkvKioKLQkgKiBCb3RoIHRoZSBwbHVnaW5JZCBhbmQgdGhlIGJ1bmRsZU5hbWUgbXVzdCBub3QgYmUgbnVsbCwgbXVzdAotCSAqIHJlZmVyIHRvIGFuIGV4aXN0aW5nIHBsdWdpbiwgYW5kIG11c3QgcmVmZXIgdG8gYW4gZXhpc3RpbmcgYnVuZGxlIAotCSAqIGV4cG9ydGVkIGJ5IHRoYXQgcGx1Z2luLgotCSAqLwotCXB1YmxpYyBQbHVnaW5Qcm9wZXJ0eUZpbGUoU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgYnVuZGxlTmFtZSkgewotCQlfcGx1Z2luSWQgPSBwbHVnaW5JZDsKLQkJX2J1bmRsZU5hbWUgPSBidW5kbGVOYW1lOwotCQkKLQkJQ2xhc3NMb2FkZXIgY2wgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpblMgPSBudWxsOwotCQlQbHVnaW4gcGx1Z2luID0gZ2V0UGx1Z2luKHBsdWdpbklkKTsJCQkKLQkJaWYoYnVuZGxlTmFtZS5lcXVhbHMoInBsdWdpbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFRyeSBsb2FkaW5nIGl0IGZyb20gdGhlIFBsdWdpbiBwYXJlbnQgKGEgInBsdWdpbi5wcm9wZXJ0aWVzIikKLQkJCWNsID0gZ2V0UGx1Z2luUHJvcGVydGllc0NsYXNzTG9hZGVyKHBsdWdpbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljbCA9IHBsdWdpbi5nZXREZXNjcmlwdG9yKCkuZ2V0UGx1Z2luQ2xhc3NMb2FkZXIoKTsKLQkJfQotCQlpblMgPSBnZXRJbnB1dFN0cmVhbShjbCwgYnVuZGxlTmFtZSk7Ci0JCQotCQlJbnB1dFN0cmVhbVJlYWRlciBpblIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5TKTsKLQkJTGluZU51bWJlclJlYWRlciBsaW5lUiA9IG5ldyBMaW5lTnVtYmVyUmVhZGVyKGluUik7Ci0JCXBhcnNlRmlsZShsaW5lUik7IC8vIHBvcHVsYXRlIHRoaXMgcHJvcGVydHkgZmlsZQotCQl0cnkgewotCQkJbGluZVIuY2xvc2UoKTsKLQkJCWluUi5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoKElPRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IFByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7OwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JCQotCQl0cnkgewotCQkJaWYoaW5TICE9IG51bGwpIHsKLQkJCQlpblMuY2xvc2UoKTsKLQkJCX0KLQkJfQotCQljYXRjaChJT0V4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JCQotCQlfY2xhc3NMb2FkZXIgPSBjbDsgLy8gc3RvcmUgdGhlIENsYXNzTG9hZGVyIHdoaWNoIHdhcyB1c2VkIHRvIGxvYWQgdGhlIGJ1bmRsZQotCX0KLQkKLQlwcml2YXRlIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKENsYXNzTG9hZGVyIGNsLCBTdHJpbmcgYnVuZGxlTmFtZSkgewotCQlMb2NhbGUgbCA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCVN0cmluZyBsYW5ndWFnZSA9IGwuZ2V0TGFuZ3VhZ2UoKTsKLQkJU3RyaW5nIGNvdW50cnkgPSBsLmdldENvdW50cnkoKTsKLQkJU3RyaW5nIHZhcmlhbnQgPSBsLmdldFZhcmlhbnQoKTsKLQkJCi0JCVN0cmluZyBsYW5nID0gbnVsbDsKLQkJU3RyaW5nIGxhbmdfY291bnRyeSA9IG51bGw7Ci0JCVN0cmluZyBsYW5nX2NvdW50cnlfdmFyaWFudCA9IG51bGw7Ci0JCWlmKChsYW5ndWFnZSAhPSBudWxsKSAmJiAhKGxhbmd1YWdlLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWxhbmcgPSAiXyIgKyBsYW5ndWFnZTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYoKGNvdW50cnkgIT0gbnVsbCkgJiYgIShjb3VudHJ5LmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWxhbmdfY291bnRyeSA9IGxhbmcgKyAiXyIgKyBjb3VudHJ5OyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZigodmFyaWFudCAhPSBudWxsKSAmJiAhKHZhcmlhbnQuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJbGFuZ19jb3VudHJ5X3ZhcmlhbnQgPSBsYW5nX2NvdW50cnkgKyAiXyIgKyB2YXJpYW50OyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCUlucHV0U3RyZWFtIGluUyA9IG51bGw7Ci0JCWlmKGxhbmdfY291bnRyeV92YXJpYW50ICE9IG51bGwpIHsKLQkJCWluUyA9IGdldFJlc291cmNlQXNTdHJlYW0oY2wsIGJ1bmRsZU5hbWUsIGxhbmdfY291bnRyeV92YXJpYW50KTsKLQkJCWlmKGluUyAhPSBudWxsKSB7Ci0JCQkJX2xhbmdWYXJpYW50ID0gbGFuZ19jb3VudHJ5X3ZhcmlhbnQ7Ci0JCQkJcmV0dXJuIGluUzsKLQkJCX0KLQkJfQotCQkKLQkJaWYobGFuZ19jb3VudHJ5ICE9IG51bGwpIHsKLQkJCWluUyA9IGdldFJlc291cmNlQXNTdHJlYW0oY2wsIGJ1bmRsZU5hbWUsIGxhbmdfY291bnRyeSk7Ci0JCQlpZihpblMgIT0gbnVsbCkgewotCQkJCV9sYW5nVmFyaWFudCA9IGxhbmdfY291bnRyeTsKLQkJCQlyZXR1cm4gaW5TOwotCQkJfQotCQl9Ci0JCQotCQlpZihsYW5nICE9IG51bGwpIHsKLQkJCWluUyA9IGdldFJlc291cmNlQXNTdHJlYW0oY2wsIGJ1bmRsZU5hbWUsIGxhbmcpOwotCQkJaWYoaW5TICE9IG51bGwpIHsKLQkJCQlfbGFuZ1ZhcmlhbnQgPSBsYW5nOwotCQkJCXJldHVybiBpblM7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmKExvY2FsZS5nZXREZWZhdWx0KCkuZXF1YWxzKExvY2FsZS5VUykpIHsKLQkJCS8vIFJ1bm5pbmcgdGhlIFRWVCBwbHVnaW4gaW4gZW5fVVMgbW9kZSwgc28gcmV0dXJuIHRoZSBkZWZhdWx0IC5wcm9wZXJ0aWVzIGZpbGUuCi0JCQlpblMgPSBnZXRSZXNvdXJjZUFzU3RyZWFtKGNsLCBidW5kbGVOYW1lLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKGluUyAhPSBudWxsKSB7Ci0JCQkJX2xhbmdWYXJpYW50ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gaW5TOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShmaW5hbCBDbGFzc0xvYWRlciBjbCwgZmluYWwgU3RyaW5nIGJ1bmRsZU5hbWUsIGZpbmFsIFN0cmluZyBsYW5ndWFnZSkgewotCQlTdHJpbmcgcmVzTmFtZSA9IGJ1bmRsZU5hbWUucmVwbGFjZSgnLicsICcvJykgKyBsYW5ndWFnZSArICIucHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNsLmdldFJlc291cmNlQXNTdHJlYW0ocmVzTmFtZSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGdldFBsdWdpblByb3BlcnRpZXNDbGFzc0xvYWRlcihQbHVnaW4gcCkgewotCQkvLyBDb3BpZWQgZnJvbSBQbHVnaW5EZXNjcmlwdG9yLmphdmEncyBnZXRSZXNvdXJjZUJ1bmRsZSBtZXRob2QuCi0JCVVSTFtdIGNwID0gKChVUkxDbGFzc0xvYWRlcilwLmdldERlc2NyaXB0b3IoKS5nZXRQbHVnaW5DbGFzc0xvYWRlcigpKS5nZXRVUkxzKCk7Ci0JCVVSTFtdIG5ld2NwID0gbmV3IFVSTFtjcC5sZW5ndGgrMV07Ci0JCWZvciAoaW50IGk9MDsgaTxjcC5sZW5ndGg7IGkrKykgbmV3Y3BbaSsxXSA9IGNwW2ldOwotCQl0cnkgewotCQkJbmV3Y3BbMF0gPSBQbGF0Zm9ybS5yZXNvbHZlKHAuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi8iKSk7IC8vJE5PTi1OTFMtMSQgLy8gYWx3YXlzIHRyeSB0byByZXNvbHZlIFVSTHMgdXNlZCBpbiBsb2FkZXJzCi0JCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgewotCQkJbmV3Y3BbMF0gPSBwLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlDbGFzc0xvYWRlciByZXNvdXJjZUxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcihuZXdjcCwgbnVsbCk7Ci0JCXJldHVybiByZXNvdXJjZUxvYWRlcjsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgUGx1Z2luIGdldFBsdWdpbihTdHJpbmcgcGx1Z2luSWQpIHsKLQkJaWYgKHBsdWdpbklkID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLQkJSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzYyA9IHJlZ2lzdHJ5LmdldFBsdWdpbkRlc2NyaXB0b3IocGx1Z2luSWQpOwotCQlpZihwbHVnaW5EZXNjID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQl0cnkgewotCQkJcmV0dXJuIHBsdWdpbkRlc2MuZ2V0UGx1Z2luKCk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOzsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCX0KLQotCQotCS8qCi0JICogQHNlZSBBUHJvcGVydHlGaWxlI3JlcG9ydChTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwb3J0KFN0cmluZyBzdHIpIHsKLQkJYWRkUGFyc2VXYXJuaW5nKG5ldyBNZXNzYWdlTWV0YURhdGEoc3RyKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlcG9ydChJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKG1lc3NhZ2UuZ2V0QnVuZGxlTmFtZSgpLCBtZXNzYWdlLmdldFNldmVyaXR5KCksIG1lc3NhZ2UuZ2V0SWQoKSwgbWVzc2FnZS5nZXRQYXJhbXMoKSwgbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKSwgbWVzc2FnZS5nZXRMaW5lTnVtYmVyKCksIG1lc3NhZ2UuZ2V0T2Zmc2V0KCksIG1lc3NhZ2UuZ2V0TGVuZ3RoKCkpOwotCQlhZGRQYXJzZVdhcm5pbmcobW1kKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVwb3J0KE1lc3NhZ2VNZXRhRGF0YSBtbWQpIHsKLQkJYWRkUGFyc2VXYXJuaW5nKG1tZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBhcnNlV2FybmluZyhJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKG1lc3NhZ2UuZ2V0QnVuZGxlTmFtZSgpLCBtZXNzYWdlLmdldFNldmVyaXR5KCksIG1lc3NhZ2UuZ2V0SWQoKSwgbWVzc2FnZS5nZXRQYXJhbXMoKSwgbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKSwgbWVzc2FnZS5nZXRMaW5lTnVtYmVyKCksIG1lc3NhZ2UuZ2V0T2Zmc2V0KCksIG1lc3NhZ2UuZ2V0TGVuZ3RoKCkpOwotCQlhZGRQYXJzZVdhcm5pbmcobW1kKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIF9wbHVnaW5JZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJ1bmRsZU5hbWUoKSB7Ci0JCXJldHVybiBfYnVuZGxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRGaWxlTmFtZSgpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoZ2V0UGx1Z2luSWQoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIjo6Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChnZXRCdW5kbGVOYW1lKCkpOwotCQlidWZmZXIuYXBwZW5kKF9sYW5nVmFyaWFudCk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhbmdWYXJpYW50KCkgewotCQlyZXR1cm4gX2xhbmdWYXJpYW50OwotCX0KLQkKLQlwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0Q2xhc3NMb2FkZXIoKSB7Ci0JCXJldHVybiBfY2xhc3NMb2FkZXI7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsV0Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3dvcmtiZW5jaGltcGwvUHJvcGVydGllc0hlbHBlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9Qcm9wZXJ0aWVzSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZmE4YWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9Qcm9wZXJ0aWVzSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUud29ya2JlbmNoaW1wbDsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5QTW9kZWxFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIuQVByb3BlcnR5RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLlByb3BlcnR5TGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoRmlsZURlbHRhOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgV2ViU3BoZXJlIFN0dWRpbyBJVmFsaWRhdGlvbkNvbnRleHQgZm9yIHRoZSAKLSAqIFByb3BlcnRpZXMgVmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydGllc0hlbHBlciBleHRlbmRzIFdvcmtiZW5jaENvbnRleHQgewotCXB1YmxpYyBQcm9wZXJ0aWVzSGVscGVyKCkgewotCQlzdXBlcigpOwotCQkgCi0JCXJlZ2lzdGVyTW9kZWwoUE1vZGVsRW51bS5MSU5FSU5QVVRSRUFERVIsICJsb2FkTGluZU51bWJlclJlYWRlciIsIG5ldyBDbGFzc1tde2phdmEubGFuZy5TdHJpbmcuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3Rlck1vZGVsKFBNb2RlbEVudW0uUkVMRUFTRV9MSU5FSU5QVVRSRUFERVIsICJyZWxlYXNlTGluZU51bWJlclJlYWRlciIsIG5ldyBDbGFzc1tde2phdmEuaW8uTGluZU51bWJlclJlYWRlci5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JCXJlZ2lzdGVyTW9kZWwoUE1vZGVsRW51bS5BTExfUFJPUEVSVElFU19GSUxFUywgImxvYWRBbGxQcm9wZXJ0aWVzRmlsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3Rlck1vZGVsKFBNb2RlbEVudW0uTVNHTE9HR0VSLCAiZ2V0TXNnTG9nZ2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJNb2RlbChQTW9kZWxFbnVtLkZJTFRFUiwgImZpbHRlciIsIG5ldyBDbGFzc1tde0lGaWxlRGVsdGFbXS5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5JV29ya2JlbmNoQ29udGV4dCNnZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE9iamVjdE5hbWUoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5JV29ya2JlbmNoQ29udGV4dCNnZXRSZXNvdXJjZShPYmplY3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQlpZihvYmplY3QgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpIHsKLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSlvYmplY3Q7Ci0JCQlBUHJvcGVydHlGaWxlIHBGaWxlID0gbGluZS5nZXRGaWxlKCk7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBwRmlsZS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpOyAvLyBhIFZhbGlkYXRpb25Qcm9wZXJ0eUZpbGUgcmV0dXJucyB0aGUgZmlsZSBuYW1lIGFzIGl0cyBxdWFsaWZpZWQgbmFtZQotCQkJZmlsZSA9IGdldEZpbGUoZmlsZU5hbWUpOwotCQl9Ci0JCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgQVByb3BlcnR5RmlsZSkgewotCQkJQVByb3BlcnR5RmlsZSBwRmlsZSA9IChBUHJvcGVydHlGaWxlKW9iamVjdDsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IHBGaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCk7IC8vIGEgVmFsaWRhdGlvblByb3BlcnR5RmlsZSByZXR1cm5zIHRoZSBmaWxlIG5hbWUgYXMgaXRzIHF1YWxpZmllZCBuYW1lCi0JCQlmaWxlID0gZ2V0RmlsZShmaWxlTmFtZSk7Ci0JCX0KLQkJCi0JCWlmKChmaWxlID09IG51bGwpIHx8ICghZmlsZS5leGlzdHMoKSkpIHsKLQkJCXJldHVybiBzdXBlci5nZXRSZXNvdXJjZShvYmplY3QpOwotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQkvKioKLQkgKiBXaGVuIGEgZnVsbCB2YWxpZGF0aW9uIGlzIHBlcmZvcm1lZCwgdGhpcyBtZXRob2QgcmV0dXJucyBhbgotCSAqIElGaWxlRGVsdGFbXSBjb250YWluaW5nIG9uZSBJRmlsZURlbHRhIGZvciBlYWNoIC5wcm9wZXJ0aWVzIAotCSAqIGZpbGUgaW4gdGhlIElQcm9qZWN0LgotCSAqLwotCXB1YmxpYyBJRmlsZURlbHRhW10gbG9hZEFsbFByb3BlcnRpZXNGaWxlcygpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJCi0JCWZpbmFsIFNldCBmaWxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlSZXNvdXJjZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCWlmKCFyZXMuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBpZiB0aGUgcmVzb3VyY2UgaXNuJ3QgYWNjZXNzaWJsZSB0aGVuIG5laXRoZXIgYXJlIGl0cyBjaGlsZHJlbgotCQkJCX0KLQkJCQkKLQkJCQlpZihpc1NyY0ZpbGUocmVzKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVdvcmtiZW5jaEZpbGVEZWx0YSBuZXdGaWxlRGVsdGEgPSBuZXcgV29ya2JlbmNoRmlsZURlbHRhKHJlcy5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIElGaWxlRGVsdGEuQ0hBTkdFRCwgcmVzKTsKLQkJCQkJZmlsZXMuYWRkKG5ld0ZpbGVEZWx0YSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRydWU7IC8vIHZpc2l0IHRoZSByZXNvdXJjZSdzIGNoaWxkcmVuIGFzIHdlbGwKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCB0cnVlKTsgLy8gdHJ1ZSBtZWFucyBpbmNsdWRlIHBoYW50b20gcmVzb3VyY2VzCi0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShlKTsKLQkJCX0KLQkJfQotCQkKLQkJSUZpbGVEZWx0YVtdIHJlc3VsdCA9IG5ldyBJRmlsZURlbHRhW2ZpbGVzLnNpemUoKV07Ci0JCWZpbGVzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJRmlsZSBoYW5kbGUgZm9yIHRoZSBmaWxlIGlkZW50aWZpZWQgYnkgZmlsZU5hbWUuCi0JICogbnVsbCB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlTmFtZSkgewotCQlJRmlsZSBmaWxlID0gKElGaWxlKVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihmaWxlTmFtZSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiB0aGUgZmlsZSBuYW1lIG9mIGFuIGV4aXN0aW5nIC5wcm9wZXJ0aWVzIGZpbGUsIHJldHVybgotCSAqIHRoZSBMaW5lTnVtYmVyUmVhZGVyIHRoYXQgd2lsbCByZWFkIHRoZSBmaWxlLgotCSAqLwotCXB1YmxpYyBMaW5lTnVtYmVyUmVhZGVyIGxvYWRMaW5lTnVtYmVyUmVhZGVyKFN0cmluZyBmaWxlTmFtZSkgewotCQl0cnkgewotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoZmlsZU5hbWUpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBmaWxlLmdldENvbnRlbnRzKCk7Ci0JCQlJbnB1dFN0cmVhbVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pOwotCQotCQkJLy8gQmVjYXVzZSB3ZSB3YW50IHRvIHJlYWQgaW4gYSBsaW5lIGF0IGEgdGltZSBmcm9tIHRoZSBmaWxlLCBjb252ZXJ0IHRoZSBJbnB1dFN0cmVhbVJlYWRlciB0byBhIExpbmVSZWFkZXIKLQkJCUxpbmVOdW1iZXJSZWFkZXIgbGluZUlucHV0ID0gbmV3IExpbmVOdW1iZXJSZWFkZXIocmVhZGVyKTsKLQkJCXJldHVybiBsaW5lSW5wdXQ7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKGV4Yyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2Vzbid0IGxvYWQgYW55dGhpbmc7IGl0IHJlbGVhc2VzIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVkCi0JICogYnkgdGhlIGxvYWRMaW5lTnVtYmVyUmVhZGVyIG1ldGhvZC4gSXRzIHJlc3VsdCB3aWxsIG5ldmVyIGJlIHVzZWQsIHNvIGFsd2F5cwotCSAqIHJldHVybiBudWxsLgotCSAqLwotCXB1YmxpYyBMaW5lTnVtYmVyUmVhZGVyIHJlbGVhc2VMaW5lTnVtYmVyUmVhZGVyKExpbmVOdW1iZXJSZWFkZXIgcmVhZGVyKSB7Ci0JCWlmKHJlYWRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXJlYWRlci5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBnZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKGV4Yyk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIE1zZ0xvZ2dlciBmcm9tIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGxvZyBleGNlcHRpb25zLgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbmV2ZXIgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIExvZ2dlciBnZXRNc2dMb2dnZXIoKSB7Ci0JCXJldHVybiBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCX0KLQkKLQkvLyBwYWNrYWdlIHZpc2liaWxpdHkgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgKHN5bnRoZXRpYyBhY2Nlc3NvciBtZXRob2QpCi0JYm9vbGVhbiBpc1NyY0ZpbGUoSVJlc291cmNlIHJlcykgewotCQkvLyBXYW50IHRvIGZpbHRlciBvdXQgdGhlIGNvcGllcyBpbiB0aGUgImJpbiIgZGlyZWN0b3J5LgotCQlpZihyZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZighKHJlcyBpbnN0YW5jZW9mIElGaWxlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZighInByb3BlcnRpZXMiLmVxdWFscyhyZXMuZ2V0RmlsZUV4dGVuc2lvbigpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7IAkJCi0JCX0KLQkJCi0JCWlmKHJlcy5pc0Rlcml2ZWQoKSkgewotCQkJLy8gQ3JlYXRlZCBieSBlY2xpcHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgSUZpbGVEZWx0YVtdIGZpbHRlcihJRmlsZURlbHRhW10gY2hhbmdlZEZpbGVzKSB7Ci0JCUlGaWxlRGVsdGFbXSB0ZW1wID0gbmV3IElGaWxlRGVsdGFbY2hhbmdlZEZpbGVzLmxlbmd0aF07Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvcihpbnQgaT0wOyBpPGNoYW5nZWRGaWxlcy5sZW5ndGg7IGkrKykgewotCQkJSUZpbGVEZWx0YSBmZCA9IGNoYW5nZWRGaWxlc1tpXTsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9ICgoV29ya2JlbmNoRmlsZURlbHRhKWZkKS5nZXRSZXNvdXJjZSgpOwotCQkJaWYoaXNTcmNGaWxlKHJlc291cmNlKSkgewotCQkJCXRlbXBbY291bnQrK10gPSBmZDsKLQkJCX0KLQkJfQotCQkKLQkJaWYoY291bnQgPT0gY2hhbmdlZEZpbGVzLmxlbmd0aCkgewotCQkJcmV0dXJuIGNoYW5nZWRGaWxlczsKLQkJfQotCQkKLQkJSUZpbGVEZWx0YVtdIHJlc3VsdCA9IG5ldyBJRmlsZURlbHRhW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsV0Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3dvcmtiZW5jaGltcGwvUHJvcGVydGllc1ZhbGlkYXRvclBsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9Qcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMzI2ZDIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxXQi9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvd29ya2JlbmNoaW1wbC9Qcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS53b3JrYmVuY2hpbXBsOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiBVUwotICogR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAKLSAqIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuCi0gKiAKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4gVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0gcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91Ci0gKiBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZyB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiBUaGUgY29kZSBpcwotICogcHJvdmlkZWQgIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUKLSAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFCi0gKiBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIENPREUuIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlIGZvcgotICogYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlCi0gKiBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAgCi0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLldUUFBsdWdpbjsKLS8qKgotICogVGhpcyBjbGFzcyBpcyB0aGUgUGx1Z2luIGNsYXNzIGlkZW50aWZpZWQgYnkgdGhlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5wcm9wJ3MgcGx1Z2luLnhtbAotICogZmlsZSAoaS5lLiwgdGhlICZsdDtwbHVnaW4gPGJyPjxicj4KLSAqIGNsYXNzPSZxdW90O2NsYXNzPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmNvcmUucHJvcGVydGllcy53b3JrYmVuY2hpbXBsLlByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4iJnF1b3QmZ3Q7Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luIGV4dGVuZHMgV1RQUGx1Z2luIHsKLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luIF9pbnN0ID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIExvZ2dlciBfbG9nZ2VyOwotCXB1YmxpYyBQcm9wZXJ0aWVzVmFsaWRhdG9yUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoX2luc3QgPT0gbnVsbCkgewotCQkJX2luc3QgPSB0aGlzOwotCQl9Ci0JfQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllc1ZhbGlkYXRvclBsdWdpbiBnZXRQbHVnaW4oKSB7Ci0JCXJldHVybiBfaW5zdDsKLQl9Ci0JcHVibGljIExvZ2dlciBnZXRNc2dMb2dnZXIoKSB7Ci0JCWlmIChfbG9nZ2VyID09IG51bGwpCi0JCQlfbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcigpOwotCQlyZXR1cm4gX2xvZ2dlcjsKLQl9Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBjb20uaWJtLnd0cC5jb21tb24uV1RQUGx1Z2luI2dldFBsdWdpbklEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCQlyZXR1cm4gUExVR0lOX0lEOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9QTW9kZWxFbnVtLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvUE1vZGVsRW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjE2ZWVkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9QTW9kZWxFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZTsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLS8qKgotICogVGhpcyBjbGFzcyBjb250YWlucyB0aGUgY29uc3RhbnRzIHRoYXQgdW5pcXVlbHkgaWRlbnRpZnkgZWFjaAotICogbW9kZWwgdGhhdCB0aGUgUHJvcGVydGllcyBWYWxpZGF0b3IncyBoZWxwZXIgbXVzdCBsb2FkLiBBbGwgb2YKLSAqIHRoZXNlIG1vZGVscyBtdXN0IGJlIHN1cHBvcnRlZCBieSB0aGUgSVZhbGlkYXRpb25Db250ZXh0IGltcGxlbWVudGF0aW9uCi0gKiBvciB0aGUgaGVscGVyIGNhbm5vdCBiZSB1c2VkIHRvIHN1cHBvcnQgdGhlIFByb3BlcnRpZXMgVmFsaWRhdG9yLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBNb2RlbEVudW0gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVJTlBVVFJFQURFUiA9ICJnZXQgYSBMaW5lSW5wdXRSZWFkZXIgZm9yIGEgLnByb3BlcnRpZXMgZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUxFQVNFX0xJTkVJTlBVVFJFQURFUiA9ICJyZWxhc2UgKGNsb3NlKSB0aGUgTGluZUlucHV0UmVhZGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9QUk9QRVJUSUVTX0ZJTEVTID0gInJldHVybiBhbiBJRmlsZURlbHRhW10gb2YgYWxsIG9mIHRoZSAucHJvcGVydGllcyBmaWxlcyBpbiB0aGUgcHJvamVjdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dMT0dHRVIgPSAiZ2V0IHRoZSBNc2dMb2dnZXIgbmVlZGVkIHRvIGxvZyBtZXNzYWdlcy4gVGhpcyBNc2dMb2dnZXIgbXVzdCBuZXZlciBiZSBudWxsLiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVIgPSAiZ2V0IG9ubHkgdGhlIC5wcm9wZXJ0aWVzIGZpbGVzIHRoYXQgYXJlIGluIHNyYyBkaXI7IGZpbHRlciBvdXQgdGhlIC5wcm9wZXJ0aWVzIGZpbGVzIHRoYXQgYXJlIGluIGJpbiBkaXIgKGkuZS4sIGRvbid0IHZhbGlkYXRlIHRoZSBzYW1lIGZpbGUgdHdpY2UiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9Qcm9wZXJ0aWVzVmFsaWRhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvUHJvcGVydGllc1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWJmYjI4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9Qcm9wZXJ0aWVzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGU7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLklWYWxpZGF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2hlY2tzIHRoYXQgdGhlIC5wcm9wZXJ0aWVzIGZpbGVzIGhhcyBubyBzeW50YXggb3IKLSAqIG9yIHByb2JsZW1zLiBUaGlzIHZhbGlkYXRvciBjYW4gcnVuIGluIGFueSB2YWxpZGF0aW9uIGZyYW1ld29yawotICogaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0aWVzVmFsaWRhdG9yIGltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRvciNjbGVhbnVwKElSZXBvcnRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBUaGlzIHZhbGlkYXRvciBkb2Vzbid0IGNhY2hlIGFueXRoaW5nIHNvIGl0IGRvZXNuJ3QgbmVlZCB0byBjbGVhbiBhbnl0aGluZyB1cC4KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZhbGlkYXRvciN2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQsIElSZXBvcnRlciwgSUZpbGVEZWx0YVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlJRmlsZURlbHRhW10gZmlsZVVSSXMgPSBudWxsOwotCQlpZigoZmlsZVVSSXMgPT0gbnVsbCkgfHwgKGZpbGVVUklzLmxlbmd0aCA9PSAwKSkgewotCQkJZmlsZVVSSXMgPSAoSUZpbGVEZWx0YVtdKWhlbHBlci5sb2FkTW9kZWwoUE1vZGVsRW51bS5BTExfUFJPUEVSVElFU19GSUxFUyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBGaWx0ZXIgb3V0IHRoZSBmaWxlcyB0aGF0IGFyZSBpbiB0aGUgImJpbiIgZGlyZWN0b3J5LgotCQkJZmlsZVVSSXMgPSAoSUZpbGVEZWx0YVtdKWhlbHBlci5sb2FkTW9kZWwoUE1vZGVsRW51bS5GSUxURVIsIG5ldyBPYmplY3RbXXtoZWxwZXIuZ2V0VVJJcygpfSk7Ci0JCX0KLQkJaWYoZmlsZVVSSXMgPT0gbnVsbCkgewotCQkJLy8gUHJvYmxlbSBsb2FkaW5nIHRoZSBmaWxlcy4gCi0JCQlMb2dnZXIgbG9nZ2VyID0gKExvZ2dlciloZWxwZXIubG9hZE1vZGVsKFBNb2RlbEVudW0uTVNHTE9HR0VSKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwiY2hhbmdlZEZpbGVzID09IG51bGw7IHRlcm1pbmF0aW5nIHZhbGlkYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlTdHJpbmdbXSB1cmlzID0gaGVscGVyLmdldFVSSXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBMb2FkIHRoZSByZWFkZXIgZm9yIHRoZSBmaWxlCi0JCQlMaW5lTnVtYmVyUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlYWRlciA9IChMaW5lTnVtYmVyUmVhZGVyKWhlbHBlci5sb2FkTW9kZWwoUE1vZGVsRW51bS5MSU5FSU5QVVRSRUFERVIsIG5ldyBPYmplY3RbXXt1cmlzW2ldfSk7Ci0JCQkJaWYocmVhZGVyID09IG51bGwpIHsKLQkJCQkJLy8gRWl0aGVyOiAKLQkJCQkJLy8gMS4gVGhlIGZpbGUgZG9lc24ndCBleGlzdCBvcgotCQkJCQkvLyAyLiBUaGUgZmlsZSBpc24ndCBhIC5wcm9wZXJ0aWVzIGZpbGUgb3IKLQkJCQkJLy8gMy4gVGhlIGZpbGUgY2FuJ3QgYmUgcmVhZAotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDA5MCwgbmV3IFN0cmluZ1tde3VyaXNbaV19KTsKLQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQotCQkJCS8vIElmIHdlIGNhbiBnZXQgYSByZWFkZXIgdGhlbiB3ZSBjYW4gZ2V0IGEgUHJvcGVydHlGaWxlCi0JCQkJVmFsaWRhdG9yUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFZhbGlkYXRvclByb3BlcnR5RmlsZShyZWFkZXIsIHVyaXNbaV0sIHJlcG9ydGVyLCB0aGlzKTsKLQkJCQlwcm9wRmlsZS5wcmludFN5bnRheFdhcm5pbmdzKCk7Ci0JCQkJcHJvcEZpbGUucHJpbnREdXBsaWNhdGVNZXNzYWdlSWQoKTsKLQkJCQlwcm9wRmlsZS5wcmludER1cGxpY2F0ZU1lc3NhZ2VQcmVmaXgoKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIERvbid0IGNhdGNoIFRocm93YWJsZSwgTWVzc2FnZUxpbWl0RXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiwgb3IgVmFsaWRhdGlvbkV4Y2VwdGlvbi4KLQkJCQkvLyBMZXQgdGhlbSB0cmF2ZWwgdXAgdG8gdGhlIGZyYW1ld29yayBhbmQgdGhlIGZyYW1ld29yayB3aWxsIGxvZyBvciBjbGVhbnVwIGFzIGFwcHJvcHJpYXRlLgotCQkJCWlmKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJCS8vIFJlbGVhc2UgdGhlIHJlYWRlciBmb3IgdGhlIGZpbGUuCi0JCQkJCS8vIEJlY2F1c2UgZGlmZmVyZW50IHZhbGlkYXRpb24gZnJhbWV3b3JrcyBtYXkgYWxsb2NhdGUgTGluZU51bWJlclJlYWRlcnMKLQkJCQkJLy8gZGlmZmVyZW50bHksIGRvbid0IGNsb3NlIHRoZSByZWFkZXIgaW4gdGhlIHZhbGlkYXRvci4gSW5zdGVhZCwgcGFzcyB0aGUKLQkJCQkJLy8gcmVhZGVyIGJhY2sgdG8gdGhlIGhlbHBlciwgYW5kIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcmVhZGVyIHNob3VsZCAKLQkJCQkJLy8gYmUgY2xvc2VkIG9yIHJldXNlZCwgdGhlIGhlbHBlciBrbm93cyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gZm9yIGl0cwotCQkJCQkvLyBmcmFtZXdvcmsgZW52aXJvbm1lbnQuCi0JCQkJCWhlbHBlci5sb2FkTW9kZWwoUE1vZGVsRW51bS5SRUxFQVNFX0xJTkVJTlBVVFJFQURFUiwgbmV3IE9iamVjdFtde3JlYWRlcn0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9WYWxpZGF0b3JQcm9wZXJ0eUZpbGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9WYWxpZGF0b3JQcm9wZXJ0eUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFkZDM2ZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvVmFsaWRhdG9yUHJvcGVydHlGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGU7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS5pby5MaW5lTnVtYmVyUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlci5BUHJvcGVydHlGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIuTWVzc2FnZU1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gQVByb3BlcnR5RmlsZSB0aGF0IGlzIGluc3RhbnRpYXRlZCBieSBhIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclByb3BlcnR5RmlsZSBleHRlbmRzIEFQcm9wZXJ0eUZpbGUgewotCXByaXZhdGUgSVJlcG9ydGVyIF9yZXBvcnRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJVmFsaWRhdG9yIF92YWxpZGF0b3IgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9maWxlTmFtZSA9IG51bGw7IC8vIGlmIHRoaXMgaXMgY3JlYXRlZCBmcm9tIGEgcmVhZGVyIGluc3RlYWQgb2YgYSBmaWxlIG5hbWUsIHdlIG9ubHkgaGF2ZSB0aGUgYnVuZGxlIG5hbWUKLQkKLQlwdWJsaWMgVmFsaWRhdG9yUHJvcGVydHlGaWxlKExpbmVOdW1iZXJSZWFkZXIgcmVhZGVyLCBTdHJpbmcgZmlsZU5hbWUsIElSZXBvcnRlciByZXBvcnRlciwgSVZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotCQlfcmVwb3J0ZXIgPSByZXBvcnRlcjsKLQkJX3ZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQkJcGFyc2VGaWxlKHJlYWRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBidW5kbGVOYW1lKSB7Ci0JCV9maWxlTmFtZSA9IGJ1bmRsZU5hbWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgLnByb3BlcnRpZXMgZmlsZSAob3IgYnVuZGxlKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotCQlyZXR1cm4gX2ZpbGVOYW1lOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgQVByb3BlcnR5RmlsZSNyZXBvcnQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydChTdHJpbmcgc3RyKSB7Ci0JCS8vIE5ldmVyIHByaW50IHRpdGxlcyBsaWtlICJEVVBMSUNBVEUgTUVTU0FHRSBJRFMiLiBQcmludCBvbmx5IHRoZSBJTWVzc2FnZS4KLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIEFQcm9wZXJ0eUZpbGUjcmVwb3J0KE1lc3NhZ2VNZXRhRGF0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoTWVzc2FnZU1ldGFEYXRhIG1tZCkgewotCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoKTsKLQkJbWVzc2FnZS5zZXRCdW5kbGVOYW1lKG1tZC5nZXRCdW5kbGVOYW1lKCkpOwotCQltZXNzYWdlLnNldFNldmVyaXR5KGdldFNldmVyaXR5KG1tZC5nZXRTZXZlcml0eSgpKSk7Ci0JCW1lc3NhZ2Uuc2V0SWQobW1kLmdldElkKCkpOwotCQltZXNzYWdlLnNldFBhcmFtcyhtbWQuZ2V0UGFyYW1zKCkpOwotCQltZXNzYWdlLnNldFRhcmdldE9iamVjdChtbWQuZ2V0VGFyZ2V0T2JqZWN0KCkpOwotCQltZXNzYWdlLnNldExpbmVObyhtbWQuZ2V0TGluZU51bWJlcigpKTsKLQkJbWVzc2FnZS5zZXRMZW5ndGgobW1kLmdldExlbmd0aCgpKTsKLQkJbWVzc2FnZS5zZXRPZmZzZXQobW1kLmdldE9mZnNldCgpKTsKLQkJbWVzc2FnZS5zZXRMZW5ndGgobW1kLmdldExlbmd0aCgpKTsKLQkJX3JlcG9ydGVyLmFkZE1lc3NhZ2UoZ2V0VmFsaWRhdG9yKCksIG1lc3NhZ2UpOwotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiB0aGUgc2V2ZXJpdHkgb2YgdGhlIE1lc3NhZ2VNZXRhRGF0YSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nCi0JICogc2V2ZXJpdHkgb2YgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRTZXZlcml0eShpbnQgbW1kU2V2ZXJpdHkpIHsKLQkJc3dpdGNoKG1tZFNldmVyaXR5KSB7Ci0JCQljYXNlKE1lc3NhZ2VNZXRhRGF0YS5FUlJPUik6IHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJCX0KLQkJCQotCQkJY2FzZShNZXNzYWdlTWV0YURhdGEuSU5GTyk6IHsKLQkJCQlyZXR1cm4gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCQkJfQotCQkJCi0JCQlkZWZhdWx0OiB7Ci0JCQkJcmV0dXJuIElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIElWYWxpZGF0b3IgaW5zdGFuY2UgdGhhdCBpcyBjaGVja2luZyB0aGlzIGZpbGUuCi0JICovCi0JcHVibGljIElWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gX3ZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBmaWxlIHRoYXQgaWRlbnRpZmllcyB0aGlzIGZpbGUgdW5pcXVlbHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIGdldEZpbGVOYW1lKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvQVByb3BlcnR5RmlsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9BUHJvcGVydHlGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYzhiOWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9BUHJvcGVydHlGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkxpbmVOdW1iZXJSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgLnByb3BlcnRpZXMgZmlsZTsgZXh0ZW5zaW9ucyBvZiB0aGlzIGNsYXNzIGltcGxlbWVudAotICogZW52aXJvbm1lbnQtc3BlY2lmaWMgbWVzc2FnZXMsIHN1Y2ggYXMgaG93IHRvIHJlcG9ydCB0aGUga25vd24gcHJvYmxlbXMuIFRoaXMKLSAqIGNsYXNzLCBhbmQgZXZlcnkgY2xhc3MgaW4gdGhlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXIgcGFja2FnZSwgaXMgaW5kZXBlbmRlbnQKLSAqIG9mIHRoZSBmcmFtZXdvcmsgZW52aXJvbm1lbnQuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBUHJvcGVydHlGaWxlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVQUxTID0gIj0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIExpc3QgX3Byb3BlcnR5TGluZXMgPSBudWxsOyAvLyBUaGUgTGlzdCBvZiBQcm9wZXJ0eUxpbmUgaW5zdGFuY2VzLgotCXByaXZhdGUgTGlzdCBfcGFyc2VXYXJuaW5ncyA9IG51bGw7IC8vIFRoZSBMaXN0IG9mIE1lc3NhZ2VNZXRhRGF0YSB3YXJuaW5ncyBmb3VuZCB3aGVuIHBhcnNpbmcgdGhlIC5wcm9wZXJ0aWVzIGZpbGUuCi0JcHJpdmF0ZSBib29sZWFuIF9kZWJ1ZyA9IGZhbHNlOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbmFtZSB0aGF0IGlkZW50aWZpZXMgdGhpcyBmaWxlIHVuaXF1ZWx5LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKTsKLQkKLQkvKioKLQkgKiBUZWxsIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgYSBwcm9ibGVtIC0gaW4gV2ViU3BoZXJlIFN0dWRpbywgdGhpcwotCSAqIHNob3dzIHVwIGFzIGEgcm93IGluIHRoZSBUYXNrIFZpZXc7IGluIHRoZSBzYW1wbGUgZmlsZXN5c3RlbSBmcmFtZXdvcmssCi0JICogdGhpcyBhcHBlYXJzIGFzIGEgbWVzc2FnZSB0byBTeXN0ZW0ub3V0LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcG9ydChTdHJpbmcgc3RyKTsKLQkKLQkvKioKLQkgKiBUZWxsIHRoZSB1c2VyIHRoYXQgdGhlcmUgaXMgYSBwcm9ibGVtIC0gaW4gV2ViU3BoZXJlIFN0dWRpbywgdGhpcwotCSAqIHNob3dzIHVwIGFzIGEgcm93IGluIHRoZSBUYXNrIFZpZXc7IGluIHRoZSBzYW1wbGUgZmlsZXN5c3RlbSBmcmFtZXdvcmssCi0JICogdGhpcyBhcHBlYXJzIGFzIGEgbWVzc2FnZSB0byBTeXN0ZW0ub3V0LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlcG9ydChNZXNzYWdlTWV0YURhdGEgbW1kKTsKLQkKLQlwcm90ZWN0ZWQgQVByb3BlcnR5RmlsZSgpIHsKLQkJX3Byb3BlcnR5TGluZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCV9wYXJzZVdhcm5pbmdzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgdGhlIExpc3Qgb2YgTWVzc2FnZU1ldGFEYXRhIHRvIHRoZSBsaXN0IG9mIHdhcm5pbmcgbWVzc2FnZXMuCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFyc2VXYXJuaW5ncyhMaXN0IGxpc3QpIHsKLQkJX3BhcnNlV2FybmluZ3MuYWRkQWxsKGxpc3QpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhIHNpbmdsZSB3YXJuaW5nIG1lc3NhZ2UgdG8gdGhlIGxpc3Qgb2YgcGFyc2Ugd2FybmluZ3MuCi0JICovCi0JcHVibGljIHZvaWQgYWRkUGFyc2VXYXJuaW5nKE1lc3NhZ2VNZXRhRGF0YSBtbWQpIHsKLQkJX3BhcnNlV2FybmluZ3MuYWRkKG1tZCk7Ci0JfQotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIExpc3Qgb2Ygd2FybmluZyBtZXNzYWdlcyB0aGF0IHJlcG9ydCBwcm9ibGVtcyBmb3VuZAotCSAqIHdoaWxlIHBhcnNpbmcgdGhlIC5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHVibGljIExpc3QgZ2V0UGFyc2VXYXJuaW5ncygpIHsKLQkJcmV0dXJuIF9wYXJzZVdhcm5pbmdzOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgZGVidWcgaW5mb3JtYXRpb24gYmUgcHJpbnRlZCB3aGVuIHBhcnNpbmc/Ci0JICovCQotCXB1YmxpYyBib29sZWFuIGRlYnVnKCkgewotCQlyZXR1cm4gX2RlYnVnOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWJ1Zyhib29sZWFuIGQpIHsKLQkJX2RlYnVnID0gZDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmKG8gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZighKG8gaW5zdGFuY2VvZiBQcm9wZXJ0eUZpbGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCVByb3BlcnR5RmlsZSBmaWxlID0gKFByb3BlcnR5RmlsZSlvOwotCQlyZXR1cm4gZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKS5lcXVhbHMoZmlsZS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldFF1YWxpZmllZEZpbGVOYW1lKCkuaGFzaENvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBtZXNzYWdlcyBpbiB0aGUgZmlsZSwgaW5jbHVkaW5nIGR1cGxpY2F0ZXMgJiBibGFua3MuCi0JICovCi0JcHVibGljIGludCBnZXROdW1Qcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gX3Byb3BlcnR5TGluZXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1ZGluZyBtZXNzYWdlIGlkcyBhbmQgZXJyb3IgaWRzLCBvdXRwdXQgdGhlIG51bWJlciBvZiB3b3JkcyBpbiB0aGUKLQkgKiAucHJvcGVydGllcyBmaWxlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtV29yZHMoKSB7Ci0JCS8vIE5PVCBhIGZhc3QgbWV0aG9kLi4uLmhvdyB0byBvcHRpbWl6ZT8KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWNvdW50ICs9IGxpbmUuZ2V0TnVtV29yZHMoKTsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgdW5pcXVlIG1lc3NhZ2UgcHJlZml4ZXMgaW4gdGhlIGZpbGUuCi0JICogKEEgbWVzc2FnZSBwcmVmaXggc3RhcnRzIHRoZSBtZXNzYWdlIHRleHQsIGUuZy4sIEFCQ0QwMDAwRS4pCi0JICovCi0JcHVibGljIGludCBnZXROdW1VbmlxdWVQcmVmaXhlcygpIHsKLQkJU2V0IHVuaXF1ZUlkcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0UHJvcGVydHlMaW5lcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGxpbmUuaGFzTWVzc2FnZVByZWZpeCgpKSB7Ci0JCQkJdW5pcXVlSWRzLmFkZChsaW5lLmdldE1lc3NhZ2VQcmVmaXgoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVuaXF1ZUlkcy5zaXplKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgbWVzc2FnZSBwcmVmaXhlcyB1c2VkIGluIHRoZSBmaWxlLgotCSAqIFVzdWFsbHkgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBwcmVmaXhlcywgYnV0IGlmIAotCSAqIGEgLnByb3BlcnRpZXMgZmlsZSBoYXMgdmFyaWF0aW9ucyBvZiBhIG1lc3NhZ2UgKHNsaWdodGx5IGRpZmZlcmVudCAKLQkgKiB3b3JkaW5nIGZvciBhIGRpZmZlcmVudCBjb250ZXh0KSwgdGhlbiB0aGUgbnVtYmVyIG9mIHByZWZpeGVzIHdpbGwgCi0JICogYmUgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiB1bmlxdWUgcHJlZml4ZXNzLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtUHJlZml4ZXMoKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0UHJvcGVydHlMaW5lcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGxpbmUuaGFzTWVzc2FnZVByZWZpeCgpKSB7Ci0JCQkJY291bnQrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBtZXNzYWdlcyB0aGF0IGRvIG5vdCB1c2UgcHJlZml4ZXMgaW4gdGhlIGZpbGUuCi0JICovCi0JcHVibGljIGludCBnZXROdW1XaXRob3V0UHJlZml4ZXMoKSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZ2V0UHJvcGVydHlMaW5lcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKCFsaW5lLmhhc01lc3NhZ2VQcmVmaXgoKSkgewotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIExpc3Qgb2YgdGhlIFByb3BlcnR5TGluZSBpbnN0YW5jZXMgY29udGFpbmVkIGluIHRoaXMgZmlsZS4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRQcm9wZXJ0eUxpbmVzKCkgewotCQlyZXR1cm4gX3Byb3BlcnR5TGluZXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgUHJvcGVydHlMaW5lIGluc3RhbmNlIHRoYXQgaXMgaWRlbnRpZmllZCBieSB0aGUgCi0JICogZ2l2ZW4gbWVzc2FnZUlkLgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eUxpbmUgZ2V0UHJvcGVydHlMaW5lKFN0cmluZyBtZXNzYWdlSWQpIHsKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlSWRDb21wYXJhdG9yKCkpOwotCQlpbnQgaW5kZXggPSBDb2xsZWN0aW9ucy5iaW5hcnlTZWFyY2goX3Byb3BlcnR5TGluZXMsIG1lc3NhZ2VJZCwgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlSWRDb21wYXJhdG9yKCkpOwotCQlpZihpbmRleCA8IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlQcm9wZXJ0eUxpbmUgcmVzdWx0ID0gKFByb3BlcnR5TGluZSlfcHJvcGVydHlMaW5lcy5nZXQoaW5kZXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSBmaWxlIHRvIGNyZWF0ZSBhIGNvbGxlY3Rpb24gb2YgdW5pcXVlbHkgaWRlbnRpZmllZCAKLQkgKiBrZXlzIHdpdGggdGhlaXIgYXNzb2NpYXRlZCB2YWx1ZXMuIElmIHRoZXJlIGFyZSBhbnkgZHVwbGljYXRlIAotCSAqIGtleXMsIHRoZSBsYXN0IHZhbHVlIGlzIHRoZSBvbmUgdGhhdCBpcyBzdG9yZWQuIFN0b3JlIHRoZSAKLQkgKiB2YWx1ZSBvZiB0aGUgZHVwbGljYXRlIGtleXMsIGFuZCB0aGUgbGluZSBudW1iZXIgb24gd2hpY2ggCi0JICogZWFjaCBpbnN0YW5jZSBvZiB0aGUga2V5IChhbmQgaXRzIHZhbHVlKSBhcmUgbG9jYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZUZpbGUoRmlsZSBwcm9wZXJ0eUZpbGUpIHsKLQkJRmlsZVJlYWRlciBpbnB1dCA9IG51bGw7Ci0JCUxpbmVOdW1iZXJSZWFkZXIgbGluZUlucHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlucHV0ID0gbmV3IEZpbGVSZWFkZXIocHJvcGVydHlGaWxlKTsKLQkJfQotCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFdlIGNhbiBpZ25vcmUgdGhpcyBleGNlcHRpb24gYmVjYXVzZSB3ZSBoYXZlIGFscmVhZHkgY2hlY2tlZCBpbiB0aGUgY29uc3RydWN0b3IgdGhhdCB0aGUKLQkJCS8vIGZpbGUgZXhpc3RzLgotCQl9Ci0KLQkJLy8gQmVjYXVzZSB3ZSB3YW50IHRvIHJlYWQgaW4gYSBsaW5lIGF0IGEgdGltZSBmcm9tIHRoZSBmaWxlLCBjb252ZXJ0IHRoZSBGaWxlUmVhZGVyIHRvIGEgTGluZVJlYWRlcgotCQlsaW5lSW5wdXQgPSBuZXcgTGluZU51bWJlclJlYWRlcihpbnB1dCk7Ci0JCQotCQlwYXJzZUZpbGUobGluZUlucHV0KTsKLQkJCi0JCXRyeSB7Ci0JCQlsaW5lSW5wdXQuY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCWlucHV0ID0gbnVsbDsKLQkJbGluZUlucHV0ID0gbnVsbDsKLQl9Ci0JCQotCS8qKgotCSAqIEdpdmVuIGEgTGluZU51bWJlclJlYWRlciBvbiBhIC5wcm9wZXJ0aWVzIGZpbGUsIHJlYWQgdGhlCi0JICogZmlsZSBhbmQgbm90ZSBhbnkgcHJvYmxlbXMgdGhhdCBtYXkgbmVlZCB0byBiZSByZXBvcnRlZCB0bwotCSAqIHRoZSB1c2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBhcnNlRmlsZShMaW5lTnVtYmVyUmVhZGVyIGxpbmVJbnB1dCkgewotCQlfcHJvcGVydHlMaW5lcy5jbGVhcigpOwotCQlfcGFyc2VXYXJuaW5ncy5jbGVhcigpOwotCi0JCWJvb2xlYW4gaXNOZXdLZXkgPSB0cnVlOwotCQlTdHJpbmcga2V5ID0gbnVsbDsKLQkJaW50IGxpbmVOdW1iZXIgPSAwOwotCQlTdHJpbmcgdmFsdWUgPSBudWxsOwotCQlpbnQgb2Zmc2V0ID0gMDsgLy8gZWFjaCAucHJvcGVydGllcyBsaW5lIG5lZWRzIHRvIGtub3cgaXRzIG9mZnNldCBzbyB0aGF0IGNvbHVtbnMgaW4gdGhlIGxpbmUgY2FuIGJlIGNhbGN1bGF0ZWQuCi0JCWludCBtZXNzYWdlT2Zmc2V0ID0gMDsgLy8gdGhlIG9mZnNldCwgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLCB3aGVyZSB0aGUgbWVzc2FnZSBwcmVmaXggc3RhcnRzCi0JCVN0cmluZyBsaW5lID0gbnVsbDsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCXRyeSB7Ci0JCQkJbGluZSA9IGxpbmVJbnB1dC5yZWFkTGluZSgpOyAvLyBjYWxjdWxhdGUgdGhlIG9mZnNldCBpbiB0aGUgZmluYWxseSBibG9jawotCQkJCWlmIChsaW5lID09IG51bGwpCi0JCQkJCWJyZWFrOwotCQkJCWxpbmUgPSBsaW5lLnRyaW0oKTsKLQotCQkJCS8vIGlnbm9yZSBibGFuayBsaW5lcwotCQkJCWlmIChsaW5lLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGludWU7Ci0KLQkJCQkvLyBzdHJpcCBvZmYgbGluZXMgdGhhdCBiZWdpbiB3aXRoICcjJwotCQkJCWlmIChsaW5lLnN0YXJ0c1dpdGgoIiMiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQljb250aW51ZTsKLQotCQkJCS8vIHN0cmlwIG9mZiBsaW5lcyB0aGF0IGJlZ2luIHdpdGggJy8nCi0JCQkJaWYgKGxpbmUuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKGlzTmV3S2V5KSB7Ci0JCQkJCS8vIFdlIGtub3cgdGhhdCB0aGUgbGluZSBpcyBvZiB0aGUgZm9ybQotCQkJCQkvLwotCQkJCQkvLyBLRVlOQU1FID0gVkFMVUUKLQkJCQkJLy8KLQkJCQkJaWYgKGxpbmUuaW5kZXhPZihFUVVBTFMpICE9IC0xKSB7Ci0JCQkJCQkvLyBNYWtlIHN1cmUgdGhlIGxpbmUgaXMgbm90IG9mIHRoZSBmb3JtICIgPSBNZXNzYWdlIiAoaS5lLiwgbWlzc2luZyB0aGUgbWVzc2FnZSBpZCkuCi0JCQkJCQlpZihsaW5lLmluZGV4T2YoRVFVQUxTKSA9PSAwKSB7Ci0JCQkJCQkJdGhyb3cgbmV3IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCS8vIFRoZSB1c2VyIG1heSBvciBtYXkgbm90IHB1dCBzcGFjZXMgYmV0d2VlbiB0aGUga2V5Ci0JCQkJCQkvLyBuYW1lLCB0aGUgZXF1YWxzIHNpZ24sIGFuZCB0aGUgdmFsdWUuIFRoaXMgZ2l2ZXMgdXMgZm91ciBjYXNlczoKLQkJCQkJCS8vICAgIDEuIGtleW5hbWU9dmFsdWUKLQkJCQkJCS8vICAgIDIuIGtleW5hbWU9IHZhbHVlCi0JCQkJCQkvLyAgICAzLiBrZXluYW1lID12YWx1ZQotCQkJCQkJLy8gICAgNC4ga2V5bmFtZSA9IHZhbHVlCi0JCQkJCQkvLyBUaGUgd2F5IHRvIGRlYWwgd2l0aCBhbGwgZm91ciBjYXNlcyBpcyB0byBmaW5kIHRoZSBpbmRleCBvZiB0aGUKLQkJCQkJCS8vICc9JyBzaWduLCBhbmQgdGhlIHZhbHVlIGlzIHRoZSByZW1haW5kZXIgb2YgdGhlIGxpbmUgYWZ0ZXIgdGhlCi0JCQkJCQkvLyBzaWduLgotCQkJCQkJLy8KLQkJCQkJCWtleSA9IGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUuaW5kZXhPZihFUVVBTFMpKTsKLQkJCQkJCWtleSA9IGtleS50cmltKCk7Ci0KLQkJCQkJCS8vIGFkZCAxIHRvIHRoZSBFUVVBTFMgaW5kZXggYmVjYXVzZSAnPScgaXMgb25lIGNoYXJhY3RlciBsb25nCi0JCQkJCQl2YWx1ZSA9IGxpbmUuc3Vic3RyaW5nKGxpbmUuaW5kZXhPZihFUVVBTFMpICsgMSk7Ci0JCQkJCQl2YWx1ZSA9IHZhbHVlLnRyaW0oKTsKLQotCQkJCQkJbWVzc2FnZU9mZnNldCA9IGxpbmUuaW5kZXhPZih2YWx1ZSk7Ci0KLQkJCQkJCWxpbmVOdW1iZXIgPSBsaW5lSW5wdXQuZ2V0TGluZU51bWJlcigpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gZXJyb3IgaW4gbGluZSBzeW50YXgKLQkJCQkJCXRocm93IG5ldyBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBuZWVkIHRvIHJlYWQgaW4gdGhlIG11bHRpcGxlIGxpbmVzIHRvIGdldCB0aGUgbXVsdGktbGluZSB2YWx1ZQotCQkJCQl2YWx1ZSArPSBsaW5lOwotCQkJCX0KLQotCQkJCWlmICh2YWx1ZS5lbmRzV2l0aCgiXFwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIG11bHRpLWxpbmUgdmFsdWUKLQkJCQkJLy8gcmVhZCBpbiBldmVyeSBsaW5lIGZyb20gdGhlIGZpbGUgdW50aWwgeW91IHJlYWNoIGFuIGVuZC1vZi1saW5lCi0JCQkJCWlzTmV3S2V5ID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBlbmQgb2YgbXVsdGktbGluZSB2YWx1ZSwgb3IgZW5kIG9mIHNpbmdsZS1saW5lIHZhbHVlCi0JCQkJCWlzTmV3S2V5ID0gdHJ1ZTsKLQkJCQkJUHJvcGVydHlMaW5lIHBsaW5lID0gbmV3IFByb3BlcnR5TGluZSh0aGlzLCBvZmZzZXQsIG1lc3NhZ2VPZmZzZXQsIGtleSwgdmFsdWUsIGxpbmVOdW1iZXIpOwotCQkJCQlfcHJvcGVydHlMaW5lcy5hZGQocGxpbmUpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gV2hlbiB0aGVyZSBpcyBhbiBJT0V4Y2VwdGlvbiwgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJCS8vIElmIGEgbGluZSBpcyBub3Qgb2YgdGhlIGZvcm0gS0VZTkFNRSA9IFZBTFVFLCB0aGVyZSBtaWdodCBiZSBhIG51bGwgZXhjZXB0aW9uLgotCQkJCS8vIEp1c3QgY29udGludWUgb250byB0aGUgbmV4dCBsaW5lIGluIHRoZSBmaWxlCi0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLkVSUk9SLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDA4MCwgbnVsbCwgdGhpcywgbGluZUlucHV0LmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJcmVwb3J0KG1tZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vIElmIGEgbGluZSBpcyBub3Qgb2YgdGhlIGZvcm0gS0VZTkFNRSA9IFZBTFVFLCB0aGVyZSBtaWdodCBiZSBhIE5vU3VjaEVsZW1lbnQgZXhjZXB0aW9uLgotCQkJCS8vIEp1c3QgY29udGludWUgb250byB0aGUgbmV4dCBsaW5lIGluIHRoZSBmaWxlCi0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLkVSUk9SLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDA4MCwgbnVsbCwgdGhpcywgbGluZUlucHV0LmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJcmVwb3J0KG1tZCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZihsaW5lICE9IG51bGwpIHsKLQkJCQkJb2Zmc2V0ICs9IGxpbmUubGVuZ3RoKCkgKyAyOyAvLyBoYWNrLiAKLQkJCQkJLy8gQ2FuJ3QgZ2V0IG9mZnNldCBmcm9tIEJ1ZmZlcmVkUmVhZGVyLCBhbmQgc2luY2UgdGhlIHJlYWRlciBzdHJpcHMgCi0JCQkJCS8vIHRoZSAnXG4nIGFuZCAnXHInIGZyb20gdGhlIGxpbmUgYmVmb3JlIHRoZSBsaW5lIGlzIHJldHVybmVkLCB0aGUgCi0JCQkJCS8vIHRydWUgbGVuZ3RoIG9mIHRoZSBsaW5lIGNhbid0IGJlIGFzY2VydGFpbmVkLiBUaGlzIGhhY2sgd2lsbCBub3QgCi0JCQkJCS8vIHdvcmsgb24gVW5peCBiZWNhdXNlIHVuaXgncyBFT0wgY2hhciBpcyBkaWZmZXJlbnQgdGhhbiBXaW5kb3dzLgotCQkJCQkvLwotCQkJCQkvLyBXaGVuIHRoZXJlJ3MgdGltZSwgbmVlZCB0byBmaW5kIGFuIGFsdGVybmF0aXZlIHRvIExpbmVOdW1iZXJSZWFkZXIuCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFByaW50IGEgbGlzdCBvZiBhbGwgbWVzc2FnZSBwcmVmaXhlcywgZS5nLiwgQUJDRDAwMDBFLCB0aGF0IGFyZSB1c2VkCi0JICogaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRBbGxNZXNzYWdlUHJlZml4ZXMoKSB7Ci0JCXJlcG9ydCgiTGluZSBOdW1iZXJcdE1lc3NhZ2UgcHJlZml4XHRNZXNzYWdlIGlkIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVByb3BlcnR5TGluZSBsaW5lID0gKFByb3BlcnR5TGluZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZigobGluZS5nZXRNZXNzYWdlUHJlZml4KCkgIT0gbnVsbCkgJiYgKCFsaW5lLmdldE1lc3NhZ2VQcmVmaXgoKS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoU3RyaW5nLnZhbHVlT2YobGluZS5nZXRMaW5lTnVtYmVyKCkpKTsKLQkJCQlidWZmZXIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChsaW5lLmdldE1lc3NhZ2VQcmVmaXgoKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQobGluZS5nZXRNZXNzYWdlSWQoKSk7Ci0JCQkJcmVwb3J0KGJ1ZmZlci50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50IGEgbGlzdCBvZiBhbGwgb2YgdGhlIG1lc3NhZ2UgcHJlZml4ZXMsIGUuZy4sIEFCQ0QxMTExRSwgCi0JICogdGhhdCBhcmUgbm90IHVzZWQgaW4gdGhlIGZpbGUuIEEgbWVzc2FnZSBwcmVmaXggaXMgY29uc2lkZXJlZAotCSAqICZxdW90O21pc3NpbmcmcXVvdDsgaWYgYSBtZXNzYWdlIHByZWZpeCB0aGF0IHByZWNlZGVzIGl0LCAKLQkgKiBlLmcuIEFCQ0QwMDAwRSwgYW5kIGEgbWVzc2FnZSBwcmVmaXggdGhhdCBmb2xsb3dzIGl0LCAKLQkgKiBlLmcuIEFCQ0QyMjIyRSwgYXJlIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSwgYnV0IHRoZSBwcmVmaXggaXMgbm90LgotCSAqIFRoaXMgbGlzdCBpcyB1c2VmdWwgd2hlbiBhZGRpbmcgYSBuZXcgbWVzc2FnZSB0byB0aGUgZmlsZTsKLQkgKiB0aGUgcHJlZml4ZXMgcHJpbnRlZCBieSB0aGlzIG1ldGhvZCBhcmUgdW51c2VkIGFuZCBvbmUgY2FuIGJlCi0JICogc2VsZWN0ZWQgZm9yIHRoZSBuZXcgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50QWxsTWlzc2luZ01lc3NhZ2VQcmVmaXhlcygpIHsKLQkJaW50IGxhc3ROdW1iZXIgPSAtMTsKLQkJCi0JCUNvbGxlY3Rpb25zLnNvcnQoX3Byb3BlcnR5TGluZXMsIFByb3BlcnR5TGluZUNvbXBhcmF0b3IuZ2V0TWVzc2FnZVByZWZpeENvbXBhcmF0b3IoKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJU3RyaW5nIHByZWZpeCA9IGxpbmUuZ2V0TWVzc2FnZVByZWZpeCgpOwotCQkJaW50IHByZWZpeE51bWJlciA9IDA7Ci0JCQlpZihwcmVmaXggPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpZihwcmVmaXguZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyBwcmVmaXhMZXR0ZXJzID0gcHJlZml4LnN1YnN0cmluZygwLCA0KTsgLy8gIkFCQ0QiIG9mICJBQkNEMDAwMFciCi0JCQl0cnkgewotCQkJCS8vIFJlOiBtYWdpYyBudW1iZXJzICI0IiBhbmQgIjgiIGJlbG93LgotCQkJCS8vIFNpbmNlIHRoZSBtZXNzYWdlIHByZWZpeCBpcyBvZiB0aGUgZm9ybSBBQkNEMDAwMEUsCi0JCQkJLy8gc3RyaXAgb2ZmIHRoZSBmaXJzdCBmb3VyIGNoYXJhY3RlcnMgdXAgdG8gKGFuZCBleGNsdWRpbmcpIHRoZSAKLQkJCQkvLyBlaWdodGggY2hhcmFjdGVyLCAiRSIuCi0JCQkJcHJlZml4TnVtYmVyID0gSW50ZWdlci5wYXJzZUludChwcmVmaXguc3Vic3RyaW5nKDQsIDgpKTsKLQkJCX0KLQkJCWNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8ganVzdCBjb250aW51ZQotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYobGFzdE51bWJlciAhPSAtMSkgewotCQkJCWlmKHByZWZpeE51bWJlciAhPSAobGFzdE51bWJlciArIDEpKSB7Ci0JCQkJCS8vIFN0YXJ0IGF0IGxhc3ROdW1iZXIgKyAxIGJlY2F1c2UgbGFzdE51bWJlciBleGlzdHMuCi0JCQkJCS8vIEV4Y2x1ZGUgcHJlZml4TnVtYmVyIGJlY2F1c2UgcHJlZml4TnVtYmVyIGV4aXN0cy4KLQkJCQkJZm9yKGludCBpPWxhc3ROdW1iZXIrMTsgaTxwcmVmaXhOdW1iZXI7IGkrKykgewotCQkJCQkJcmVwb3J0KHByZWZpeExldHRlcnMgKyBpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWxhc3ROdW1iZXIgPSBwcmVmaXhOdW1iZXI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCBhbGwgb2YgdGhlIG1lc3NhZ2VzIGluIHRoZSAucHJvcGVydGllcyBmaWxlIHRoYXQgdXNlCi0JICogYSBtZXNzYWdlIHByZWZpeCwgZS5nLiBBQkNEMDAwMEUuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRBbGxNZXNzYWdlc1dpdGhBTWVzc2FnZVByZWZpeCgpIHsKLQkJcmVwb3J0KCJNRVNTQUdFUyBXSVRIIFBSRUZJWEVTIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRMaW5lTm9Db21wYXJhdG9yKCkpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IF9wcm9wZXJ0eUxpbmVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKGxpbmUuaGFzTWVzc2FnZVByZWZpeCgpKSB7Ci0JCQkJcmVwb3J0KGxpbmUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCBhbGwgb2YgdGhlIG1lc3NhZ2VzIGluIHRoZSAucHJvcGVydGllcyBmaWxlIHdob3NlIG1lc3NhZ2UKLQkgKiB0ZXh0IGRvZXMgbm90IGJlZ2luIHdpdGggYSBtZXNzYWdlIHByZWZpeCwgZS5nLiwgQUJDRDAwMDBFLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50QWxsTWVzc2FnZXNXaXRob3V0QU1lc3NhZ2VQcmVmaXgoKSB7Ci0JCXJlcG9ydCgiQkxBTksgTUVTU0FHRSBQUkVGSVgiKTsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldExpbmVOb0NvbXBhcmF0b3IoKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYoIWxpbmUuaGFzTWVzc2FnZVByZWZpeCgpKSB7Ci0JCQkJcmVwb3J0KGxpbmUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgYSBsaXN0IG9mIGFsbCBtZXNzYWdlcyB3aG9zZSB0ZXh0IGlzIHRoZSBlbXB0eSBzdHJpbmcgKCZxdW90OyZxdW90OykuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRBbGxNZXNzYWdlc1doaWNoQXJlQmxhbmsoKSB7Ci0JCXJlcG9ydCgiQkxBTksgTUVTU0FHRVMiKTsgLy8kTk9OLU5MUy0xJAotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldExpbmVOb0NvbXBhcmF0b3IoKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYobGluZS5nZXRNZXNzYWdlKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoImxpbmUgbnVtYmVyICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChsaW5lLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiLCBtZXNzYWdlIGlkICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLmFwcGVuZChsaW5lLmdldE1lc3NhZ2VJZCgpKTsKLQkJCQlyZXBvcnQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFByaW50IGEgbGlzdCBvZiB0aGUgbGluZXMgdGhhdCBoYXZlIHN5bnRheCBlcnJvcnMsIGZvciBleGFtcGxlLAotCSAqIG1pc3NpbmcgdGhlIGVxdWFscyBzaWduIGJldHdlZW4gdGhlIG1lc3NhZ2UgaWQgYW5kIHRoZSBtZXNzYWdlIAotCSAqIHRleHQuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTeW50YXhXYXJuaW5ncygpIHsKLQkJTGlzdCBwYXJzZVdhcm5pbmdzID0gZ2V0UGFyc2VXYXJuaW5ncygpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHBhcnNlV2FybmluZ3MuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmVwb3J0KChNZXNzYWdlTWV0YURhdGEpaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50IGEgbGlzdCBvZiBhbGwgb2YgdGhlIG1lc3NhZ2VzIGluIHRoZSAucHJvcGVydGllcyBmaWxlIHRoYXQKLQkgKiB1c2UgdGhlIHNhbWUgbWVzc2FnZSBpZC4gSWYgbW9yZSB0aGFuIG9uZSBtZXNzYWdlIHVzZXMgdGhlIHNhbWUKLQkgKiBpZCwgd2hlbiB0aGUgUmVzb3VyY2VCdW5kbGUgaXMgYXNrZWQgZm9yIHRoYXQgbWVzc2FnZSBpZCwgaXQgd2lsbAotCSAqIHJldHVybiB0aGUgbGFzdCBtZXNzYWdlIChpLmUuLCB0aGUgbGFyZ2VzdCBsaW5lIG51bWJlcikgd2l0aCB0aGF0Ci0JICogaWQgaW4gdGhlIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnREdXBsaWNhdGVNZXNzYWdlSWQoKSB7Ci0JCXByaW50RHVwbGljYXRlTWVzc2FnZUlkKHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiBQcmludCBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBtZXNzYWdlcyBpbiB0aGUgLnByb3BlcnRpZXMgZmlsZSB0aGF0Ci0JICogdXNlIHRoZSBzYW1lIG1lc3NhZ2UgaWQuIElmIG1vcmUgdGhhbiBvbmUgbWVzc2FnZSB1c2VzIHRoZSBzYW1lCi0JICogaWQsIHdoZW4gdGhlIFJlc291cmNlQnVuZGxlIGlzIGFza2VkIGZvciB0aGF0IG1lc3NhZ2UgaWQsIGl0IHdpbGwKLQkgKiByZXR1cm4gdGhlIGxhc3QgbWVzc2FnZSAoaS5lLiwgdGhlIGxhcmdlc3QgbGluZSBudW1iZXIpIHdpdGggdGhhdAotCSAqIGlkIGluIHRoZSBmaWxlLgotCSAqIAotCSAqIFRoZSBib29sZWFuIHBhcmFtZXRlciBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCAKLQkgKiB0aGUgJnF1b3Q7RFVQTElDQVRFIE1FU1NBR0UgSURTJnF1b3Q7IHRpdGxlIGlzIGVtaXR0ZWQgYmVmb3JlIAotCSAqIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnREdXBsaWNhdGVNZXNzYWdlSWQoYm9vbGVhbiBwcmludFRpdGxlKSB7Ci0JCWlmKHByaW50VGl0bGUpIHsKLQkJCXJlcG9ydCgiRFVQTElDQVRFIE1FU1NBR0UgSURTIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlDb21wYXJhdG9yIGMgPSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VJZENvbXBhcmF0b3IoKTsKLQkJU3RyaW5nIG1lc3NhZ2VJZCA9IElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMDYwOwotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBjKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQlQcm9wZXJ0eUxpbmUgbGFzdExpbmUgPSBudWxsOwotCQlQcm9wZXJ0eUxpbmUgbGluZSA9IG51bGw7Ci0JCWJvb2xlYW4gbmVlZFRvUHJpbnRMYXN0ID0gZmFsc2U7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbGFzdExpbmUgPSBsaW5lOwotCQkJbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJCi0JCQlpZihjLmNvbXBhcmUobGFzdExpbmUsIGxpbmUpID09IDApIHsKLQkJCQluZWVkVG9QcmludExhc3QgPSB0cnVlOwotCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5XQVJOSU5HLCBtZXNzYWdlSWQsIG5ldyBTdHJpbmdbXXtsYXN0TGluZS5nZXRNZXNzYWdlSWQoKX0sIGxhc3RMaW5lLCBsYXN0TGluZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCXJlcG9ydChtbWQpOwotCQkJfQotCQkJZWxzZSBpZihuZWVkVG9QcmludExhc3QpIHsKLQkJCQkvLyBUaGUgbGFzdCBkdXBsaWNhdGUgbGluZSBuZWVkcyB0byBiZSBwcmludGVkLCBiZWNhdXNlIGxhc3RMaW5lIGlzIGFsd2F5cyBwcmludGVkIGJ1dCBsaW5lIG5lZWRzIHRvIGJlIHByaW50ZWQgdG9vLgotCQkJCW5lZWRUb1ByaW50TGFzdCA9IGZhbHNlOwotCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5XQVJOSU5HLCBtZXNzYWdlSWQsIG5ldyBTdHJpbmdbXXtsYXN0TGluZS5nZXRNZXNzYWdlSWQoKX0sIGxhc3RMaW5lLCBsYXN0TGluZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCXJlcG9ydChtbWQpOwotCQkJfQotCQl9Ci0KLQkJaWYobmVlZFRvUHJpbnRMYXN0KSB7Ci0JCQkvLyBUaGUgbGFzdCBkdXBsaWNhdGUgbGluZSBuZWVkcyB0byBiZSBwcmludGVkLCBiZWNhdXNlIGxhc3RMaW5lIGlzIGFsd2F5cyBwcmludGVkIGJ1dCBsaW5lIG5lZWRzIHRvIGJlIHByaW50ZWQgdG9vLgotCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLldBUk5JTkcsIG1lc3NhZ2VJZCwgbmV3IFN0cmluZ1tde2xpbmUuZ2V0TWVzc2FnZUlkKCl9LCBsaW5lLCBsaW5lLmdldExpbmVOdW1iZXIoKSk7Ci0JCQlyZXBvcnQobW1kKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBQcmludCBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBtZXNzYWdlcyBpbiB0aGUgLnByb3BlcnRpZXMgZmlsZSB0aGF0Ci0JICogZG8gbm90IHVzZSBhIHVuaXF1ZSBtZXNzYWdlIHByZWZpeCAoZS5nLiwgQUJDRDAwMDBFKSwgd2l0aCB0aGUgCi0JICogZXhjZXB0aW9uIG9mIGFsbCBtZXNzYWdlcyB3aGljaCBhcmUgaW50ZW5kZWQgdG8gYmUgZHVwbGljYXRlcy4KLQkgKiBHZW5lcmFsbHksIHVzZXJzIGV4cGVjdCBvbmUgbWVzc2FnZSBwcmVmaXggcGVyIHByb2JsZW0sIHNvIAotCSAqIHJldXNlZCBtZXNzYWdlIHByZWZpeGVzIGNhbiBiZSBjb25mdXNpbmcuIEFueSBtZXNzYWdlIHdoaWNoIAotCSAqIGRlbGliZXJhdGVseSByZXVzZXMgYSBtZXNzYWdlIHByZWZpeCBtdXN0IHVzZSBhIG1lc3NhZ2UgaWQgCi0JICogdGhhdCBzdGFydHMgd2l0aCB0aGF0IHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludER1cGxpY2F0ZU1lc3NhZ2VQcmVmaXgoKSB7Ci0JCXByaW50RHVwbGljYXRlTWVzc2FnZVByZWZpeCh0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgYSBsaXN0IG9mIGFsbCBvZiB0aGUgbWVzc2FnZXMgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUgdGhhdAotCSAqIGRvIG5vdCB1c2UgYSB1bmlxdWUgbWVzc2FnZSBwcmVmaXggKGUuZy4sIEFCQ0QwMDAwRSksIHdpdGggdGhlIAotCSAqIGV4Y2VwdGlvbiBvZiBhbGwgbWVzc2FnZXMgd2hpY2ggYXJlIGludGVuZGVkIHRvIGJlIGR1cGxpY2F0ZXMuCi0JICogR2VuZXJhbGx5LCB1c2VycyBleHBlY3Qgb25lIG1lc3NhZ2UgcHJlZml4IHBlciBwcm9ibGVtLCBzbyAKLQkgKiByZXVzZWQgbWVzc2FnZSBwcmVmaXhlcyBjYW4gYmUgY29uZnVzaW5nLiBBbnkgbWVzc2FnZSB3aGljaCAKLQkgKiBkZWxpYmVyYXRlbHkgcmV1c2VzIGEgbWVzc2FnZSBwcmVmaXggbXVzdCB1c2UgYSBtZXNzYWdlIGlkIAotCSAqIHRoYXQgc3RhcnRzIHdpdGggdGhhdCBwcmVmaXguCi0JICogCi0JICogVGhlIGJvb2xlYW4gcGFyYW1ldGVyIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IAotCSAqIHRoZSAmcXVvdDtEVVBMSUNBVEUgTUVTU0FHRSBQUkVGSVhFU1MmcXVvdDsgdGl0bGUgaXMgZW1pdHRlZCAKLQkgKiBiZWZvcmUgdGhlIGxpc3Qgb2YgZHVwbGljYXRlcy4KLQkgKi8JCi0JcHVibGljIHZvaWQgcHJpbnREdXBsaWNhdGVNZXNzYWdlUHJlZml4KGJvb2xlYW4gcHJpbnRUaXRsZSkgewotCQlpZihwcmludFRpdGxlKSB7Ci0JCQlyZXBvcnQoIkRVUExJQ0FURSBNRVNTQUdFIFBSRUZJWEVTIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlDb21wYXJhdG9yIGMgPSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yKCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQoX3Byb3BlcnR5TGluZXMsIGMpOwotCQlTdHJpbmcgbWVzc2FnZUlkID0gSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAwNzA7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJUHJvcGVydHlMaW5lIGxhc3RMaW5lID0gbnVsbDsKLQkJUHJvcGVydHlMaW5lIGxpbmUgPSBudWxsOwotCQlib29sZWFuIG5lZWRUb1ByaW50TGFzdCA9IGZhbHNlOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWxhc3RMaW5lID0gbGluZTsKLQkJCWxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQotCQkJaWYobGFzdExpbmUgIT0gbnVsbCkgewotCQkJCWlmKCFsYXN0TGluZS5nZXRNZXNzYWdlSWQoKS5zdGFydHNXaXRoKGxhc3RMaW5lLmdldFNob3J0TWVzc2FnZVByZWZpeCgpKSkgewotCQkJCQlpZihjLmNvbXBhcmUobGFzdExpbmUsIGxpbmUpID09IDApIHsKLQkJCQkJCW5lZWRUb1ByaW50TGFzdCA9IHRydWU7Ci0JCQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuV0FSTklORywgbWVzc2FnZUlkLCBuZXcgU3RyaW5nW117bGFzdExpbmUuZ2V0TWVzc2FnZVByZWZpeCgpfSwgbGFzdExpbmUsIGxhc3RMaW5lLmdldExpbmVOdW1iZXIoKSk7Ci0JCQkJCQlyZXBvcnQobW1kKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmKG5lZWRUb1ByaW50TGFzdCkgewotCQkJCQkJLy8gVGhlIGxhc3QgZHVwbGljYXRlIGxpbmUgbmVlZHMgdG8gYmUgcHJpbnRlZCwgYmVjYXVzZSBsYXN0TGluZSBpcyBhbHdheXMgcHJpbnRlZCBidXQgbGluZSBuZWVkcyB0byBiZSBwcmludGVkIHRvby4KLQkJCQkJCW5lZWRUb1ByaW50TGFzdCA9IGZhbHNlOwotCQkJCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLldBUk5JTkcsIG1lc3NhZ2VJZCwgbmV3IFN0cmluZ1tde2xhc3RMaW5lLmdldE1lc3NhZ2VQcmVmaXgoKX0sIGxhc3RMaW5lLCBsYXN0TGluZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCQkJcmVwb3J0KG1tZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZihsYXN0TGluZSAhPSBudWxsKSB7Ci0JCQlpZighbGFzdExpbmUuZ2V0TWVzc2FnZUlkKCkuc3RhcnRzV2l0aChsYXN0TGluZS5nZXRTaG9ydE1lc3NhZ2VQcmVmaXgoKSkpIHsKLQkJCQlpZihuZWVkVG9QcmludExhc3QpIHsKLQkJCQkJLy8gVGhlIGxhc3QgZHVwbGljYXRlIGxpbmUgbmVlZHMgdG8gYmUgcHJpbnRlZCwgYmVjYXVzZSBsYXN0TGluZSBpcyBhbHdheXMgcHJpbnRlZCBidXQgbGluZSBuZWVkcyB0byBiZSBwcmludGVkIHRvby4KLQkJCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLldBUk5JTkcsIG1lc3NhZ2VJZCwgbmV3IFN0cmluZ1tde2xpbmUuZ2V0TWVzc2FnZVByZWZpeCgpfSwgbGluZSwgbGluZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJCQlyZXBvcnQobW1kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludCBhIGxpc3Qgb2YgbWVzc2FnZSBwcmVmaXhlcyB3aG9zZSBmaXJzdCBjaGFyYWN0ZXJzIG1hdGNoCi0JICogdGhlIHByZWZpeCBwYXJhbWV0ZXIuIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlZQotCSAqIGlmIGEgcmFuZ2Ugb2YgcHJlZml4ZXMgaXMgaW4gdXNlIG9yIG5vdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludE1lc3NhZ2VQcmVmaXhTdGFydGluZ1dpdGgoZmluYWwgU3RyaW5nIHByZWZpeCkgewotCQlyZXBvcnQoIkZpbmQgYWxsIGVycm9yIHByZWZpeGVzIHN0YXJ0aW5nIHdpdGggIiArIHByZWZpeCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGFyYXRvciBjID0gUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpOwotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBjKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfcHJvcGVydHlMaW5lcy5pdGVyYXRvcigpOwotCQlQcm9wZXJ0eUxpbmUgbGluZSA9IG51bGw7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGxpbmUuZ2V0TWVzc2FnZVByZWZpeCgpLnN0YXJ0c1dpdGgocHJlZml4KSkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKFN0cmluZy52YWx1ZU9mKGxpbmUuZ2V0TGluZU51bWJlcigpKSk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQobGluZS5nZXRNZXNzYWdlUHJlZml4KCkpOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKGxpbmUuZ2V0TWVzc2FnZUlkKCkpOwotCQkJCXJlcG9ydChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgdGhlIGxhc3QgcHJlZml4IChpLmUuLCB0aGUgb25lIHdpdGggdGhlIGxhcmdlc3QgbnVtYmVyLCAKLQkgKiBlLmcuIEFCQ0QyMjIyIGlzIGxhcmdlciB0aGFuIEFCQ0QxMTExIG9yIEFCQ0QwMDAwKSBpbiB0aGUgZmlsZSAKLQkgKiB3aG9zZSBmaXJzdCBjaGFyYWN0ZXJzIG1hdGNoIHRoZSBwcmVmaXggcGFyYW1ldGVyLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludExhc3RNZXNzYWdlUHJlZml4U3RhcnRpbmdXaXRoKGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKLQkJcmVwb3J0KCJGaW5kIGxhc3QgZXJyb3IgcHJlZml4IHN0YXJ0aW5nIHdpdGggIiArIHByZWZpeCk7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcGFyYXRvciBjID0gUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpOwotCQlDb2xsZWN0aW9ucy5zb3J0KF9wcm9wZXJ0eUxpbmVzLCBjKTsKLQkJUHJvcGVydHlMaW5lW10gbGluZXMgPSBuZXcgUHJvcGVydHlMaW5lW19wcm9wZXJ0eUxpbmVzLnNpemUoKV07Ci0JCV9wcm9wZXJ0eUxpbmVzLnRvQXJyYXkobGluZXMpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvcihpbnQgaT1saW5lcy5sZW5ndGg7IGk+LTE7IGktLSkgewotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSBsaW5lc1tpXTsKLQkJCWlmIChsaW5lLmdldE1lc3NhZ2VQcmVmaXgoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKLQkJCQlyZXBvcnQobGluZS50b1N0cmluZygpKTsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYoIWZvdW5kKSB7Ci0JCQlyZXBvcnQoIk5vIGVycm9yIGlkcyB3ZXJlIGZvdW5kIHRoYXQgc3RhcnRlZCB3aXRoICIgKyBwcmVmaXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYSBzdWJzdGl0dXRpb24gcGFyYW1ldGVyLAotCSAqIHByaW50IGEgbGlzdCBvZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYSBnaXZlbiBtZXNzYWdlLCBpZiBlYWNoIAotCSAqIHBhcmFtZXRlciBpcyByZXBsYWNlZCB3aXRoICZxdW90O2xlbmd0aCZxdW90OyBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50RXhwZWN0ZWRTdHJpbmdMZW5ndGgoZmluYWwgaW50IGxlbmd0aCkgewotCQlyZXBvcnQoIkVYUEVDVEVEIExFTkdUSCBPRiBNRVNTQUdFIFdJVEggUEFSQU1FVEVSUyAiICsgbGVuZ3RoICsgIiBMT05HIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlDb21wYXJhdG9yIGMgPSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldFN0cmluZ0xlbmd0aENvbXBhcmF0b3IobGVuZ3RoKTsKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgYyk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigiTGVuZ3RoOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChsaW5lLmdldEV4cGVjdGVkTGVuZ3RoKGxlbmd0aCkpOwotCQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChsaW5lLnRvU3RyaW5nV2l0aEV4cGVjdGVkTGVuZ3RoKGxlbmd0aCkpOwotCQkJcmVwb3J0KGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBlYWNoIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTdHJpbmdMZW5ndGgoKSB7Ci0JCS8vICIwIiBtZWFucyBubyBzdWJzdGl0dXRpb24KLQkJcHJpbnRFeHBlY3RlZFN0cmluZ0xlbmd0aCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgY29udGVudHMgb2YgdGhlIC5wcm9wZXJ0aWVzIGZpbGUsIHNvcnRlZCBieSBtZXNzYWdlIGlkLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50Q29udGVudHMoKSB7Ci0JCXJlcG9ydCgiQ09OVEVOVFMgT0YgLnByb3BlcnRpZXMgRklMRSwgU09SVEVEIEJZIE1FU1NBR0UgSUQiKTsgLy8kTk9OLU5MUy0xJAotCQlDb21wYXJhdG9yIGMgPSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VJZENvbXBhcmF0b3IoKTsKLQkJQ29sbGVjdGlvbnMuc29ydChfcHJvcGVydHlMaW5lcywgYyk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Byb3BlcnR5TGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlQcm9wZXJ0eUxpbmUgbGluZSA9IChQcm9wZXJ0eUxpbmUpaXRlcmF0b3IubmV4dCgpOwotCQkJcmVwb3J0KGxpbmUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL0NvbXBhcmVQcm9wZXJ0aWVzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL0NvbXBhcmVQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYWI0MTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Db21wYXJlUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlcjsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29tcGFyZXMgdHdvIC5wcm9wZXJ0aWVzIGZpbGUgYW5kIG91dHB1dHMgYSBsaXN0Ci0gKiBvZiB0aGUgZGlmZmVyZW5jZXMuIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb3VudCB0aGUgbnVtYmVyCi0gKiBvZiB3b3JkcyB0aGF0IGhhdmUgY2hhbmdlZC4KLSAqLwotcHVibGljIGNsYXNzIENvbXBhcmVQcm9wZXJ0aWVzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBsaW5lU2VwYXJhdG9yID0gamF2YS5sYW5nLlN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgVHJlZVNldCBfZGVsZXRlZCA9IG51bGw7Ci0JcHJpdmF0ZSBUcmVlTWFwIF9jaGFuZ2VkID0gbnVsbDsKLQlwcml2YXRlIFRyZWVTZXQgX2FkZGVkID0gbnVsbDsKLS8vCXByaXZhdGUgUHJvcGVydHlGaWxlIF9vbGRGaWxlID0gbnVsbDsKLQlwcml2YXRlIFByb3BlcnR5RmlsZSBfbmV3RmlsZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc3RvcmUgUHJvcGVydHlMaW5lIGluc3RhbmNlcyB3aGljaCBoYXZlIHRoZSBzYW1lCi0JICogbWVzc2FnZSBpZCwgYnV0IGRpZmZlcmVudCB2YWx1ZXMuIFdoZW4gdGhlIGxpc3Qgb2YgZGlmZmVyZW5jZXMgaXMgb3V0cHV0LAotCSAqIGFsbCB2YWx1ZXMgYXJlIG91dHB1dCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBjb21wYXJlIHRoZSBsaW5lcyBtYW51YWxseSwgdG8KLQkgKiBzZWUgd2hhdCdzIGRpZmZlcmVudC4KLQkgKi8KLQljbGFzcyBDb21wYXJlTGluZSBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCQlwcml2YXRlIEFycmF5TGlzdCBfbGluZXM7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIF9tZXNzYWdlSWQ7Ci0KLQkJcHVibGljIENvbXBhcmVMaW5lKFN0cmluZyBtZXNzYWdlSWQpIHsKLQkJCV9tZXNzYWdlSWQgPSBtZXNzYWdlSWQ7Ci0JCQlfbGluZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGQoUHJvcGVydHlMaW5lIG9sZExpbmUsIFByb3BlcnR5TGluZSBuZXdMaW5lKSB7Ci0JCQlfbGluZXMuYWRkKG5ldyBQcm9wZXJ0eUxpbmVbXXtvbGRMaW5lLCBuZXdMaW5lfSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX2xpbmVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChsaW5lU2VwYXJhdG9yKTsKLQkJCQlidWZmZXIuYXBwZW5kKCJcdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlMaW5lW10gbGluZXMgPSAoUHJvcGVydHlMaW5lW10paXRlcmF0b3IubmV4dCgpOwotCQkJCQotCQkJCWJ1ZmZlci5hcHBlbmQobGluZXNbMF0pOwotCQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKGxpbmVzWzFdKTsKLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB0aGlzIGlzIGEgY2hhbmdlZCBzdHJpbmcsIHJldHVybiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBvZiB3b3JkcyBiZXR3ZWVuIHRoZSBzdHJpbmdzLgotCQkgKi8JCQotCQlwdWJsaWMgaW50IGdldE51bVdvcmRzKCkgewotCQkJaW50IG51bVdvcmRzID0gMDsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX2xpbmVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJUHJvcGVydHlMaW5lW10gbGluZXMgPSAoUHJvcGVydHlMaW5lW10paXRlcmF0b3IubmV4dCgpOwotCQkJCW51bVdvcmRzID0gbnVtV29yZHMgKyBjb21wYXJlKGxpbmVzWzBdLCBsaW5lc1sxXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtV29yZHM7Ci0JCX0KLQkJCi0JCXByaXZhdGUgaW50IGNvbXBhcmUoUHJvcGVydHlMaW5lIG9sZExpbmUsIFByb3BlcnR5TGluZSBuZXdMaW5lKSB7Ci0JCQkvLyBGb3IgZXZlcnkgd29yZCBpbiB0aGUgb2xkIHN0cmluZywgc2VlIGlmIGl0IGV4aXN0cyBpbiB0aGUgbmV3Ci0JCQkvLyBzdHJpbmcuIFRoZSBwb3NpdGlvbiBvZiB0aGUgd29yZCBkb2Vzbid0IG1hdHRlciAtIGlmIHRoZSB3b3JkCi0JCQkvLyBleGlzdHMgaW4gdGhlIG5ldywgdGhlbiB0aGUgd29yZCBpcyBub3QgY291bnRlZCBhcyBhICJjaGFuZ2VkIgotCQkJLy8gd29yZC4gCi0JCQkvLyAgICAxLiBJZiB0aGUgd29yZCBleGlzdHMsIHJlbW92ZSB0aGUgd29yZCBmcm9tIHRoZSBuZXdMaW5lIGFuZAotCQkJLy8gICAgICAgYWR2YW5jZSB0byB0aGUgbmV4dCBvbGQgdG9rZW4uIChSZW1vdmUgd29yZCBmcm9tIG5ld0xpbmUKLQkJCS8vICAgICAgIGluIGNhc2UgdGhlIHdvcmQgZXhpc3RlZCB0d2ljZSBpbiB0aGUgb2xkIHN0cmluZyBidXQgb25seQotCQkJLy8gICAgICAgb25jZSBpbiB0aGUgbmV3LiBUaGUgc2Vjb25kIG9sZFdvcmQgc2hvdWxkIGJlIGNvdW50ZWQgYXMKLQkJCS8vICAgICAgIGEgY2hhbmdlZCB3b3JkLikKLQkJCS8vICAgIDIuIElmIHRoZSB3b3JkIGRvZXNuJ3QgZXhpc3QsIG51bUNoYW5nZWQrKyBhbmQgYWR2YW5jZSB0byB0aGUKLQkJCS8vICAgICAgIG5leHQgb2xkIHRva2VuLgotCQkJLy8gICAgMy4gT25jZSBhbGwgb2YgdGhlIG9sZFdvcmRzIGhhdmUgYmVlbiBjaGVja2VkLCB0b2tlbml6ZSB0aGUKLQkJCS8vICAgICAgIHJlbWFpbmluZyBuZXdXb3JkIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mIHdvcmRzIGluIHRoZSBzdHJpbmcuCi0JCQkvLyAgICAgICBUaGVzZSB3b3JkcyBoYXZlIGJlZW4gYWRkZWQgYW5kIGVhY2ggb25lIGNvdW50cyBhcyBhIAotCQkJLy8gICAgICAgY2hhbmdlZCB3b3JkLgotCQkJaW50IG51bUNoYW5nZWRXb3JkcyA9IDA7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgb2xkVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihvbGRMaW5lLmdldE1lc3NhZ2UoKSk7Ci0KLQkJCS8vIE5lZWQgdG8gYmUgY2FyZWZ1bC4uLndhbnQgdGhlIGVudGlyZSB3b3JkLCBub3Qgb2xkV29yZD0ib24iIG1pc3Rha2VuIGZvciBuZXdXb3JkPSJvbmUiIG9yIG5ld1dvcmQ9ImJvbmQiCi0JCQkvLyBFYXNpZXIgdG8gY3JlYXRlIGEgbGlzdCBvZiBuZXcgd29yZHMgdG8gY29tcGFyZSBhZ2FpbnN0LgotCQkJU3RyaW5nVG9rZW5pemVyIG5ld1Rva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobmV3TGluZS5nZXRNZXNzYWdlKCkpOwotCQkJTGlzdCBuZXdXb3JkcyA9IG5ldyBBcnJheUxpc3QoKTsgLy8gQ2FuJ3QgdXNlIGEgc2V0IGluIGNhc2UgdGhlIG5ld0xpbmUgdXNlcyBhIHdvcmQsIGUuZy4gInRoZSIsIG1vcmUgdGhhbiBvbmNlLgotCQkJd2hpbGUobmV3VG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCW5ld1dvcmRzLmFkZChuZXdUb2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJfQotCQkJCi0JCQl3aGlsZShvbGRUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIG9sZFdvcmQgPSBvbGRUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQkJaWYobmV3V29yZHMuY29udGFpbnMob2xkV29yZCkpIHsKLQkJCQkJbmV3V29yZHMucmVtb3ZlKG9sZFdvcmQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbnVtQ2hhbmdlZFdvcmRzKys7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBDYW4gY291bnQgdGhlIHRva2VucyBidXQgbm90IHRoZSBlbG1lbnRzLgotCQkJbnVtQ2hhbmdlZFdvcmRzICs9IG5ld1dvcmRzLnNpemUoKTsKLQkJCXJldHVybiBudW1DaGFuZ2VkV29yZHM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2VJZCgpIHsKLQkJCXJldHVybiBfbWVzc2FnZUlkOwotCQl9Ci0KLQkJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQkJCS8vIGJ5IGRlZmF1bHQsIHNvcnQgYnkgbWVzc2FnZSBpZAotCQkJaWYgKCEobyBpbnN0YW5jZW9mIENvbXBhcmVMaW5lKSkgewotCQkJCS8vIHRoZW4gaG93IG9uIGVhcnRoIGRpZCB0aGlzIG1ldGhvZCBnZXQgY2FsbGVkPz8KLQkJCQkvLyBwdXQgaXQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQlyZXR1cm4gZ2V0TWVzc2FnZUlkKCkuY29tcGFyZVRvKCgoQ29tcGFyZUxpbmUpIG8pLmdldE1lc3NhZ2VJZCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXBhcmUgdGhlIHR3byBQcm9wZXJ0eUZpbGUgYW5kIHByaW50IG91dCBhIGxpc3Qgb2YgdGhlIGRpZmZlcmVuY2VzOyAKLQkgKiB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBvbGRlciAucHJvcGVydGllcyBmaWxlLCBhbmQgdGhlIHNlY29uZCAKLQkgKiBwYXJhbWV0ZXIgaXMgdGhlIG5ld2VyIC5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHVibGljIENvbXBhcmVQcm9wZXJ0aWVzKFByb3BlcnR5RmlsZSBvbGRGaWxlLCBQcm9wZXJ0eUZpbGUgbmV3RmlsZSkgewotCQlfZGVsZXRlZCA9IG5ldyBUcmVlU2V0KCk7Ci0JCV9jaGFuZ2VkID0gbmV3IFRyZWVNYXAoKTsKLQkJX2FkZGVkID0gbmV3IFRyZWVTZXQoKTsKLQkJCi0vLwkJX29sZEZpbGUgPSBvbGRGaWxlOwotCQlfbmV3RmlsZSA9IG5ld0ZpbGU7Ci0KLQkJY29tcGFyZShvbGRGaWxlLCBuZXdGaWxlKTsKLQl9Ci0JCi0JLyoqCi0JICogSW4gdGhlIG9sZGVyIFByb3BlcnR5RmlsZSwgdGhlIG1lc3NhZ2UgdGV4dCB3YXMgZGlmZmVyZW50OyBjYWNoZSB0aGUKLQkgKiBvbGRlciB2ZXJzaW9uIG9mIHRoZSBQcm9wZXJ0eUxpbmUgYW5kIHRoZSBuZXdlciB2ZXJzaW9uIG9mIHRoZSBQcm9wZXJ0eUxpbmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZENoYW5nZWQoUHJvcGVydHlMaW5lIG9sZExpbmUsIFByb3BlcnR5TGluZSBuZXdMaW5lKSB7Ci0JCUNvbXBhcmVMaW5lIGNsID0gKENvbXBhcmVMaW5lKSBfY2hhbmdlZC5nZXQob2xkTGluZS5nZXRNZXNzYWdlSWQoKSk7Ci0JCWlmIChjbCA9PSBudWxsKSB7Ci0JCQljbCA9IG5ldyBDb21wYXJlTGluZShvbGRMaW5lLmdldE1lc3NhZ2VJZCgpKTsKLQkJfQotCQljbC5hZGQob2xkTGluZSwgbmV3TGluZSk7Ci0JCV9jaGFuZ2VkLnB1dChvbGRMaW5lLmdldE1lc3NhZ2VJZCgpLCBjbCk7Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmUgdGhlIHR3byBwcm9wZXJ0eSBmaWxlcyBhbmQgYnVpbGQgdGhlIGNvbGxlY3Rpb25zIG9mIHZhcmlhYmxlIG5hbWVzIHdpdGgKLQkgKiB0aGVpciBhc3NvY2lhdGVkIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wYXJlKFByb3BlcnR5RmlsZSBvbGRGaWxlLCBQcm9wZXJ0eUZpbGUgbmV3RmlsZSkgewotCQlfYWRkZWQuY2xlYXIoKTsKLQkJX2RlbGV0ZWQuY2xlYXIoKTsKLQkJX2NoYW5nZWQuY2xlYXIoKTsKLQotCQkvLyBGb3IgZWFjaCBlbGVtZW50IGluIGZpbGUgMSwgc2VlIGlmIGl0IGV4aXN0cyBpbiBmaWxlIDIKLQkJLy8gICBhKSBpZiBpdCBkb2Vzbid0IGV4aXN0LCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgImRlbGV0ZWQiIHN0cmluZ3MKLQkJLy8gICBiKSBpZiBpdCBleGlzdHMsIGFuZCBpZiB0aGUgdmFsdWUgaXMgZGlmZmVyZW50LCBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgImNoYW5nZWQiIHN0cmluZ3MKLQkJLy8gICBjKSBpZiBpdCBleGlzdHMsIGFuZCBpZiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUsIGFkZCBpdCB0byB0aGUgbGlzdCBvZiAibm90IGNoYW5nZWQiIHN0cmluZ3MKLQkJLy8gICBkKSBkZWxldGUgdGhlIGVudHJ5LCBpZiBpdCBleGlzdHMsIGZyb20gZmlsZSAyJ3MgaGFzaHRhYmxlIHNvIHdlIGRvbid0IGNoZWNrIGl0IHR3aWNlLgotCQkvLyBGb3IgZWFjaCBlbGVtZW50IGluIGZpbGUgMiBub3QgY2hlY2tlZCBhbHJlYWR5LCBpdCBjYW5ub3QgZXhpc3QgaW4gZmlsZSAxLCBzbyBhZGQgaXQgdG8gdGhlIGxpc3Qgb2YgIm5ldyIgc3RyaW5ncwotCQkvLwotCQkvLyBOZWVkIHNvbWUgd2F5IHRvIGFib3J0IGNvbXBhcmlzb24gaWYgZWl0aGVyIG9mIHRoZSBmaWxlcyBjb250YWlucyBkdXBsaWNhdGUKLQkJLy8gbWVzc2FnZSBpZHMuCi0JCS8vCi0JCUxpc3Qgb2xkS2V5cyA9IG5ldyBBcnJheUxpc3Qob2xkRmlsZS5nZXRQcm9wZXJ0eUxpbmVzKCkpOwotCQlMaXN0IG5ld0tleXMgPSBuZXcgQXJyYXlMaXN0KG5ld0ZpbGUuZ2V0UHJvcGVydHlMaW5lcygpKTsKLQkJQ29sbGVjdGlvbnMuc29ydChvbGRLZXlzLCBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmdldE1lc3NhZ2VJZENvbXBhcmF0b3IoKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobmV3S2V5cywgUHJvcGVydHlMaW5lQ29tcGFyYXRvci5nZXRNZXNzYWdlSWRDb21wYXJhdG9yKCkpOwotCQlJdGVyYXRvciBvbGRJdGVyYXRvciA9IG9sZEtleXMuaXRlcmF0b3IoKTsKLQkJSXRlcmF0b3IgbmV3SXRlcmF0b3IgPSBuZXdLZXlzLml0ZXJhdG9yKCk7Ci0JCVByb3BlcnR5TGluZSBvbGRMaW5lID0gKG9sZEl0ZXJhdG9yLmhhc05leHQoKSkgPyAoUHJvcGVydHlMaW5lKSBvbGRJdGVyYXRvci5uZXh0KCkgOiBudWxsOwotCQlQcm9wZXJ0eUxpbmUgbmV3TGluZSA9IChuZXdJdGVyYXRvci5oYXNOZXh0KCkpID8gKFByb3BlcnR5TGluZSkgbmV3SXRlcmF0b3IubmV4dCgpIDogbnVsbDsKLQkJd2hpbGUgKChvbGRMaW5lICE9IG51bGwpICYmIChuZXdMaW5lICE9IG51bGwpKSB7Ci0JCQkvLyBvbGRMaW5lIG1lc3NhZ2UgaWQgaXMgZWl0aGVyIDwsID0sIG9yID4gbmV3TGluZSBtZXNzYWdlIGlkLgotCQkJLy8gaWYgPCwgbWVzc2FnZSBpZCBoYXMgYmVlbiBkZWxldGVkLgotCQkJLy8gaWYgPSwgc2VlIGlmIGNoYW5nZWQgKG9yIGp1c3QgY29tcGFyZSBtZXNzYWdlIGlkcy4pCi0JCQkvLyBpZiA+LCBuZXcgbGluZSBpcyBhIG5ldyBtZXNzYWdlIGlkLgotCQkJLy8gdG8gaW5jcmVtZW50LCBpbmNyZW1lbnQgb25seSB0aGUgPCAod2hldGhlciBpdCdzIG9sZExpbmUgb3IgbmV3TGluZSkuCi0JCQlpbnQgY29tcGFyZSA9IG9sZExpbmUuZ2V0TWVzc2FnZUlkKCkuY29tcGFyZVRvKG5ld0xpbmUuZ2V0TWVzc2FnZUlkKCkpOwotCQkJaWYgKGNvbXBhcmUgPCAwKSB7Ci0JCQkJLy8gZGVsZXRlZAotCQkJCV9kZWxldGVkLmFkZChvbGRMaW5lKTsKLQkJCQlpZiAob2xkSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCW9sZExpbmUgPSAoUHJvcGVydHlMaW5lKSBvbGRJdGVyYXRvci5uZXh0KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlvbGRMaW5lID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChjb21wYXJlID09IDApIHsKLQkJCQkvLyBleGlzdGVkIGJlZm9yZS4gQ2hlY2sgaWYgY2hhbmdlZC4KLQkJCQlpZiAoIW9sZExpbmUuZ2V0TWVzc2FnZSgpLmVxdWFscyhuZXdMaW5lLmdldE1lc3NhZ2UoKSkpIHsKLQkJCQkJLy8gY2hhbmdlZAotCQkJCQlhZGRDaGFuZ2VkKG9sZExpbmUsIG5ld0xpbmUpOwotCQkJCX0KLQkJCQlpZiAob2xkSXRlcmF0b3IuaGFzTmV4dCgpICYmIG5ld0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlvbGRMaW5lID0gKFByb3BlcnR5TGluZSkgb2xkSXRlcmF0b3IubmV4dCgpOwotCQkJCQluZXdMaW5lID0gKFByb3BlcnR5TGluZSkgbmV3SXRlcmF0b3IubmV4dCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJb2xkTGluZSA9IG51bGw7Ci0JCQkJCW5ld0xpbmUgPSBudWxsOwotCQkJCX0KLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gYWRkZWQKLQkJCQlfYWRkZWQuYWRkKG5ld0xpbmUpOwotCQkJCWlmIChuZXdJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJbmV3TGluZSA9IChQcm9wZXJ0eUxpbmUpIG5ld0l0ZXJhdG9yLm5leHQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5ld0xpbmUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChvbGRMaW5lICE9IG51bGwpIHsKLQkJCV9kZWxldGVkLmFkZChvbGRMaW5lKTsKLQkJfQotCi0JCWlmIChuZXdMaW5lICE9IG51bGwpIHsKLQkJCV9hZGRlZC5hZGQobmV3TGluZSk7Ci0JCX0KLQotCQl3aGlsZSAob2xkSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkvLyBhbGwgb2YgdGhlIHJlc3QgaGF2ZSBiZWVuIGRlbGV0ZWQKLQkJCV9kZWxldGVkLmFkZChvbGRJdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0KLQkJd2hpbGUgKG5ld0l0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJLy8gYWxsIG9mIHRoZSByZXN0IGhhdmUgYmVlbiBhZGRlZAotCQkJX2FkZGVkLmFkZChuZXdJdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIENvbGxjdGlvbiBvZiBQcm9wZXJ0eUxpbmUgaW5zdGFuY2VzIHRoYXQgZXhpc3QgaW4KLQkgKiB0aGUgbmV3ZXIgUHJvcGVydHlGaWxlIHRoYXQgYXJlbid0IGluIHRoZSBvbGRlciBQcm9wZXJ0eUZpbGUuCi0JICovCi0JcHVibGljIFNldCBnZXRBZGRlZCgpIHsKLQkJcmV0dXJuIF9hZGRlZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgQ29sbGVjdGlvbiBvZiBDb21wYXJlTGluZSBpbnN0YW5jZXMgdGhhdCByZXByZXNlbnQKLQkgKiB0aGUgdHdvIFByb3BlcnR5TGluZSBpbnN0YW5jZXM7IG9uZSBmcm9tIHRoZSBvbGRlciBQcm9wZXJ0eUZpbGUsCi0JICogYW5kIG9uZSBmcm9tIHRoZSBuZXdlciBQcm9wZXJ0eUZpbGUuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0Q2hhbmdlZCgpIHsKLQkJcmV0dXJuIF9jaGFuZ2VkLnZhbHVlcygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBDb2xsZWN0aW9uIG9mIFByb3BlcnR5TGluZSBpbnN0YW5jZXMgdGhhdCBkbyBub3QKLQkgKiBleGlzdCBpbiB0aGUgbmV3ZXIgUHJvcGVydHlGaWxlIHlldCB0aGF0IGV4aXN0IGluIHRoZSBvbGRlcgotCSAqIFByb3BlcnR5RmlsZS4KLQkgKi8KLQlwdWJsaWMgU2V0IGdldERlbGV0ZWQoKSB7Ci0JCXJldHVybiBfZGVsZXRlZDsKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgb3V0IGFsbCBvZiB0aGUgY29sbGVjdGlvbnMgb2YgdmFyaWFibGUgc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludFJlc3VsdHMoKSB7Ci0JCS8vIGNyZWF0ZSBhbiBvdXRwdXQgbG9nIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIGluIGl0IGxpc3QgdGhlIHN0cmluZ3MgaW4gYSBzZWN0aW9uIGVhY2guCi0JCWludCBudW1OZXcgPSBwcmludFN0cmluZ3MoIk5FVyBQUk9QRVJUSUVTIiwgX2FkZGVkKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaW50IG51bVdvcmRzRGVsZXRlZCA9IHByaW50U3RyaW5ncygiREVMRVRFRCBQUk9QRVJUSUVTIiwgX2RlbGV0ZWQpOyAvLyROT04tTkxTLTEkCi0JCWludCBudW1Xb3Jkc0NoYW5nZWQgPSAgcHJpbnRTdHJpbmdzKCJDSEFOR0VEIFBST1BFUlRJRVMiLCBfY2hhbmdlZC52YWx1ZXMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJZmxvYXQgdG90YWxDaGFuZ2UgPSBudW1OZXcgKyBudW1Xb3Jkc0RlbGV0ZWQgKyBudW1Xb3Jkc0NoYW5nZWQ7Ci0JCWZsb2F0IG51bVdvcmRzID0gX25ld0ZpbGUuZ2V0TnVtV29yZHMoKTsKLQkJZmxvYXQgcGVyY2VudCA9IHRvdGFsQ2hhbmdlIC8gbnVtV29yZHMgKiAxMDA7Ci0JCQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJOdW1iZXIgb2YgbmV3IHdvcmRzOiAiICsgbnVtTmV3KTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiB3b3JkcyBpbiBkZWxldGVkIG1lc3NhZ2VzOiAiICsgbnVtV29yZHNEZWxldGVkKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiBjaGFuZ2VkIHdvcmRzIGluIG1vZGlmaWVkIG1lc3NhZ2VzOiAiICsgbnVtV29yZHNDaGFuZ2VkKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiB3b3JkcyBpbiBmaWxlICIgKyBfbmV3RmlsZS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpICsgIjogIiArIG51bVdvcmRzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWwgY2hhbmdlIG9mIHdvcmRzOiAiICsgdG90YWxDaGFuZ2UgKyAiLCB3aGljaCBpcyBhICIgKyBwZXJjZW50ICsgIiUgY2hhbmdlLiIpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0JCi0JcHVibGljIHZvaWQgcHJpbnRSZXN1bHRzRm9yVHJhbnNsYXRpb24oKSB7Ci0JCS8vIGNyZWF0ZSBhbiBvdXRwdXQgbG9nIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYW5kIGluIGl0IGxpc3QgdGhlIHN0cmluZ3MgaW4gYSBzZWN0aW9uIGVhY2guCi0JCXByaW50U3RyaW5nc0ZvclRyYW5zbGF0aW9uKCJERUxFVEVEIFBST1BFUlRJRVMiLCBfZGVsZXRlZCk7IC8vJE5PTi1OTFMtMSQKLQkJcHJpbnRTdHJpbmdzRm9yVHJhbnNsYXRpb24oIk5FVyBQUk9QRVJUSUVTIiwgX2FkZGVkKTsgLy8kTk9OLU5MUy0xJAotCQlwcmludFN0cmluZ3NGb3JUcmFuc2xhdGlvbigiQ0hBTkdFRCBQUk9QRVJUSUVTIiwgX2NoYW5nZWQudmFsdWVzKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFByaW50IHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBpbnQgcHJpbnRTdHJpbmdzKFN0cmluZyBoZWFkZXIsIENvbGxlY3Rpb24gbGluZXMpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihoZWFkZXIpOwotCQlpbnQgY291bnQgPSAwOwotCQlpbnQgbnVtV29yZHMgPSAwOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGxpbmVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBsaW5lID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYobGluZSBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkgewotCQkJCW51bVdvcmRzICs9ICgoUHJvcGVydHlMaW5lKWxpbmUpLmdldE51bVdvcmRzKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBtdXN0IGJlIGEgY29tcGFyZSBsaW5lCi0JCQkJbnVtV29yZHMgKz0gKChDb21wYXJlTGluZSlsaW5lKS5nZXROdW1Xb3JkcygpOwotCQkJfQotCQkJCi0JCQljb3VudCsrOwotCQkJU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVyIG9mIHByb3BlcnRpZXM6ICIgKyBjb3VudCk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCXJldHVybiBudW1Xb3JkczsKLQl9Ci0JCi0JLyoqCi0JICogUHJpbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzb3J0ZWQgY29sbGVjdGlvbiBvZiBsaW5lcyBmcm9tIHRoZSAucHJvcGVydGllcyBmaWxlLgotCSAqLwotCXByaXZhdGUgdm9pZCBwcmludFN0cmluZ3NGb3JUcmFuc2xhdGlvbihTdHJpbmcgaGVhZGVyLCBDb2xsZWN0aW9uIGxpbmVzKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oaGVhZGVyKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaW5lcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQljb3VudCsrOwotCQkJT2JqZWN0IGxpbmUgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobGluZSBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkgewotCQkJCVByb3BlcnR5TGluZSBwcm9wbGluZSA9IChQcm9wZXJ0eUxpbmUpIGxpbmU7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKHByb3BsaW5lLmdldE1lc3NhZ2VJZCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxpbmUgaW5zdGFuY2VvZiBDb21wYXJlTGluZSkgewotCQkJCUNvbXBhcmVMaW5lIHByb3BsaW5lID0gKENvbXBhcmVMaW5lKSBsaW5lOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9wbGluZS5nZXRNZXNzYWdlSWQoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImluc3RhbmNlIG9mICIgKyBsaW5lLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWw6ICIgKyBjb3VudCk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvSVZhbGlkYXRpb25Db25zdGFudHMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvSVZhbGlkYXRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhhZTllNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL0lWYWxpZGF0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXI7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIHRoZSBtZXNzYWdlIGlkcyBvZiBhbGwgb2YgdGhlIFByb3BlcnRpZXMKLSAqIFZhbGlkYXRvcidzIG1lc3NhZ2VzLCBhbmQgdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSB0aGF0IAotICogY29udGFpbnMgdGhvc2UgbWVzc2FnZXMuIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElWYWxpZGF0aW9uQ29uc3RhbnRzIHsKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRU5BTUUgPSAicHJvcGVydGllc1ZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDAwID0gIkFCQ0QwMDAwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAwMTBFID0gIkFCQ0QwMDEwRSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDEwVyA9ICJBQkNEMDAxMFciOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDAyMCA9ICJBQkNEMDAyMCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDMwID0gIkFCQ0QwMDMwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAwNDAgPSAiQUJDRDAwNDAiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDA1MCA9ICJBQkNEMDA1MCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDYwID0gIkFCQ0QwMDYwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAwNzAgPSAiQUJDRDAwNzAiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDA4MCA9ICJBQkNEMDA4MCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMDkwID0gIkFCQ0QwMDkwIjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJDRDAxMTAgPSAiQUJDRDAxMTAiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBQkNEMDEyMCA9ICJBQkNEMDEyMCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQ0QwMTMwID0gIkFCQ0QwMTMwIjsgLy8kTk9OLU5MUy0xJAotCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0xPQyA9ICJMSU5FX0xPQyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvTWFpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDZlZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcGVyZm9ybSB2YWxpZGF0aW9uIG9yIC5wcm9wZXJ0aWVzIGZpbGUgcXVlcmllcwotICogd2l0aG91dCB1c2luZyBhbiBJVmFsaWRhdG9yLiAKLSAqLwotcHVibGljIGNsYXNzIE1haW4gewotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3YpIHsKLQkJaWYoYXJndi5sZW5ndGggPCAxKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInByb3AgLXRyIFstYSB8IC1hYyB8IC1hbSB8IC1hbiB8IC1hbCBQUkVGSVggfCAtYXAgUFJFRklYIHwgLWF1IHwgLWIgfCAtZGkgfCAtZHAgfCAtbCB8IC1sZSA8cG9zaXRpdmUgaW50ZWdlcj4gfCAtcCBdIGY6XFxkaXIxXFxkaXIyXFxteVByb3BlcnRpZXNGaWxlLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJvciAiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJwcm9wIFstY3wtY3RdIGY6XFxkaXIxXFxkaXIyXFxteVByb3BlcnRpZXNGaWxlLnByb3BlcnRpZXMgZjpcXGRpcjFcXGRpcjJcXG15TmV3UHJvcGVydGllc0ZpbGUucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC1hOiBwcmludCBhbGwgZXJyb3Ivd2FybmluZy9pbmZvIHByZWZpeGVzIGluIHRoZSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtYWM6IHByaW50IGEgY291bnQgb2YgbWVzc2FnZXMgd2l0aCBhbmQgd2l0aG91dCBwcmVmaXhlcyBpbiB0aGUgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWFtOiBwcmludCBhbGwgbWVzc2FnZXMgd2l0aCBhIHByZWZpeCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWFuOiBwcmludCBhbGwgbWVzc2FnZXMgd2l0aG91dCBhbiBlcnJvciBwcmVmaXgiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIC1hbDogcHJpbnQgdGhlIGxhc3QgZXJyb3Ivd2FybmluZy9pbmZvIHByZWZpeCwgc3RhcnRpbmcgd2l0aCBQUkVGSVgsIGluIHRoZSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtYXA6IHByaW50IGFueSBlcnJvci93YXJuaW5nL2luZm8gcHJlZml4ZXMsIHN0YXJ0aW5nIHdpdGggUFJFRklYLCBpbiB0aGUgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWF1OiBwcmludCBhbGwgZXJyb3Ivd2FybmluZy9pbmZvIHByZWZpeGVzIHRoYXQgYXJlIG5vdCB1c2VkIGluIHRoZSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgLWI6IHByaW50IGFueSBibGFuayBtZXNzYWdlcyBpbiB0aGUgcHJvcGVydGllcyBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgLWM6IGNvbXBhcmUgdGhlIHR3byBwcm9wZXJ0eSBmaWxlcyBsaXN0ZWQuIFRoZSBmaXJzdCBpcyB0aGUgb2xkZXIsIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBuZXdlci4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIC1jdDogY29tcGFyZSB0aGUgdHdvIHByb3BlcnR5IGZpbGVzIGxpc3RlZC4gVGhlIGZpcnN0IGlzIHRoZSBvbGRlciwgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIG5ld2VyLiBPdXRwdXQgYSBsaXN0IG9mIHRoZSBhZGRlZCwgZGVsZXRlZCwgYW5kIGNoYW5nZWQgc3RyaW5ncywgYnV0IHByaW50IG9ubHkgdGhlIG1lc3NhZ2UgaWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtZGk6IHByaW50IGFueSBkdXBsaWNhdGUgbWVzc2FnZSBpZHMgYW5kIHN5bnRheCBlcnJvcnMgaW4gdGhlIHByb3BlcnRpZXMgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWRwOiBwcmludCBhbnkgZHVwbGljYXRlIGVycm9yL3dhcm5pbmcvaW5mbyBwcmVmaXhlcyBpbiB0aGUgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC1sOiBwcmludCB0aGUgbGVuZ3RoIG9mIGVhY2ggbWVzc2FnZSBpbiB0aGUgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgLWxlOiBwcmludCB0aGUgbGVuZ3RoIG9mIGVhY2ggbWVzc2FnZSBpbiB0aGUgZmlsZSBpZiBlYWNoIHBhcmFtZXRlciBpcyA8cG9zaXRpdmUgaW50ZWdlcj4gY2hhcmFjdGVycyBsb25nLiIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC1uOiBwcmludCB0aGUgbnVtYmVyIG9mIHdvcmRzIGluIHRoZSBmaWxlLCBpbmNsdWRpbmcgbWVzc2FnZSBwcmVmaXhlcyBhbmQgcGFyYW1ldGVycyIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgIC1wOiBwcmludCB0aGUgY29udGVudHMgb2YgdGhlIHByb3BlcnR5IGZpbGUsIHNvcnRlZCBieSBtZXNzYWdlIGlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAtdHI6IHByaW50IHRyYWNlIGluZm9ybWF0aW9uIHdoaWxlIHBhcnNpbmcgdGhlIC5wcm9wZXJ0aWVzIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBkZWZhdWx0IGFjdGlvbiBpcyB0byBwcmludCB0aGUgc3ludGF4IGVycm9ycywgZHVwbGljYXRlcywgYW5kIG90aGVyIHR5cGVzIG9mIGVycm9ycyBpbiB0aGUgZ2l2ZW4gLnByb3BlcnRpZXMgZmlsZS4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLmV4aXQoLTEpOwotCQl9Ci0KLQkJLy8gVGhpcyBpcyBub3Qgcm9idXN0IGVycm9yLWNoZWNraW5nIGJ5IGFueSBzdHJldGNoIG9mIHRoZSBpbWFnaW5hdGlvbiEKLQkJaW50IGluZGV4ID0gMDsKLQkJU3RyaW5nIG9wdGlvbiA9IGFyZ3ZbaW5kZXgrK10udG9Mb3dlckNhc2UoKTsKLQkJYm9vbGVhbiB0cmFjZSA9IGZhbHNlOwotCQlpZihvcHRpb24uZXF1YWxzKCItdHIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0cmFjZSA9IHRydWU7Ci0JCQlvcHRpb24gPSBhcmd2W2luZGV4KytdLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJCi0JCWlmIChvcHRpb24uZXF1YWxzKCItYSIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRBbGxFcnJvclByZWZpeCh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hYyIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRQcmVmaXhDb3VudCh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hbCIpICYmIChhcmd2Lmxlbmd0aCA+PSAzKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDIsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRFcnJvclByZWZpeCh0cmFjZSwgYXJndltpbmRleF0sIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItYW0iKSAmJiAoYXJndi5sZW5ndGggPj0gMikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2FyZ3YubGVuZ3RoLTFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmd2LCAxLCBmaWxlcywgMCwgZmlsZXMubGVuZ3RoKTsKLQkJCXByaW50RXJyb3JNZXNzYWdlcyh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hbiIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRNZXNzYWdlc1dpdGhvdXRQcmVmaXhlcyh0cmFjZSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hcCIpICYmIChhcmd2Lmxlbmd0aCA+PSAzKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDIsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRFcnJvclByZWZpeFJhbmdlKHRyYWNlLCBhcmd2W2luZGV4XSwgZmlsZXMpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1hdSIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRBbGxNaXNzaW5nRXJyb3JQcmVmaXgodHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItYiIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRCbGFua3ModHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItYyIpICYmIChhcmd2Lmxlbmd0aCA9PSAzKSkgeyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIG9sZEZpbGUgPSBuZXcgRmlsZShhcmd2W2luZGV4KytdKTsKLQkJCUZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKGFyZ3ZbaW5kZXhdKTsKLQkJCWNvbXBhcmVGaWxlcyh0cmFjZSwgb2xkRmlsZSwgbmV3RmlsZSk7Ci0JCX0KLQkJZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLWN0IikgJiYgKGFyZ3YubGVuZ3RoID09IDMpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgb2xkRmlsZSA9IG5ldyBGaWxlKGFyZ3ZbaW5kZXgrK10pOwotCQkJRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUoYXJndltpbmRleF0pOwotCQkJY29tcGFyZUZpbGVzRm9yVHJhbnNsYXRpb24odHJhY2UsIG9sZEZpbGUsIG5ld0ZpbGUpOwotCQl9Ci0JCWVsc2UgaWYgKG9wdGlvbi5lcXVhbHMoIi1kaSIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnREdXBsaWNhdGVJZHModHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItZHAiKSAmJiAoYXJndi5sZW5ndGggPj0gMikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2FyZ3YubGVuZ3RoLTFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmd2LCAxLCBmaWxlcywgMCwgZmlsZXMubGVuZ3RoKTsKLQkJCXByaW50RHVwbGljYXRlUHJlZml4ZXModHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItbCIpICYmIChhcmd2Lmxlbmd0aCA+PSAyKSkgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmdbXSBmaWxlcyA9IG5ldyBTdHJpbmdbYXJndi5sZW5ndGgtMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3YsIDEsIGZpbGVzLCAwLCBmaWxlcy5sZW5ndGgpOwotCQkJcHJpbnRTdHJpbmdMZW5ndGgodHJhY2UsIGZpbGVzKTsKLQkJfQotCQllbHNlIGlmIChvcHRpb24uZXF1YWxzKCItbGUiKSAmJiAoYXJndi5sZW5ndGggPj0gMykpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2FyZ3YubGVuZ3RoLTJdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmd2LCAyLCBmaWxlcywgMCwgZmlsZXMubGVuZ3RoKTsKLQkJCXByaW50RXhwZWN0ZWRTdHJpbmdMZW5ndGgodHJhY2UsIGFyZ3ZbaW5kZXhdLCBmaWxlcyk7Ci0JCX0KLQkJZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLW4iKSAmJiAoYXJndi5sZW5ndGggPj0gMikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2FyZ3YubGVuZ3RoLTFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmd2LCAxLCBmaWxlcywgMCwgZmlsZXMubGVuZ3RoKTsKLQkJCXByaW50V29yZENvdW50KHRyYWNlLCBmaWxlcyk7Ci0JCX0KLQkJZWxzZSBpZiAob3B0aW9uLmVxdWFscygiLXAiKSAmJiAoYXJndi5sZW5ndGggPj0gMikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nW10gZmlsZXMgPSBuZXcgU3RyaW5nW2FyZ3YubGVuZ3RoLTFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmd2LCAxLCBmaWxlcywgMCwgZmlsZXMubGVuZ3RoKTsKLQkJCXByaW50RmlsZUNvbnRlbnRzKHRyYWNlLCBmaWxlcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwcmludERlZmF1bHQodHJhY2UsIGFyZ3YpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50QWxsRXJyb3JQcmVmaXgoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50QWxsTWVzc2FnZVByZWZpeGVzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRBbGxNaXNzaW5nRXJyb3JQcmVmaXgoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50QWxsTWlzc2luZ01lc3NhZ2VQcmVmaXhlcygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50QmxhbmtzKGJvb2xlYW4gdHJhY2UsIFN0cmluZ1tdIGZpbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludEFsbE1lc3NhZ2VzV2hpY2hBcmVCbGFuaygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50TWVzc2FnZXNXaXRob3V0UHJlZml4ZXMoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50QWxsTWVzc2FnZXNXaXRob3V0QU1lc3NhZ2VQcmVmaXgoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wYXJlRmlsZXMoYm9vbGVhbiB0cmFjZSwgRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUpIHsKLQkJaWYob2xkRmlsZS5pc0ZpbGUoKSAmJiBuZXdGaWxlLmlzRmlsZSgpKSB7Ci0JCQl0cnkgewotCQkJCVByb3BlcnR5RmlsZSBvbGRQcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUob2xkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdHJhY2UpOwotCQkJCVByb3BlcnR5RmlsZSBuZXdQcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUobmV3RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgdHJhY2UpOwotCQkJCUNvbXBhcmVQcm9wZXJ0aWVzIGNwID0gbmV3IENvbXBhcmVQcm9wZXJ0aWVzKG9sZFByb3BGaWxlLCBuZXdQcm9wRmlsZSk7Ci0JCQkJY3AucHJpbnRSZXN1bHRzKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKG9sZEZpbGUuaXNEaXJlY3RvcnkoKSAmJiBuZXdGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZ1tdIG9sZENoaWxkcmVuID0gb2xkRmlsZS5saXN0KCk7Ci0JCQlmb3IoaW50IGk9MDsgaTxvbGRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCUZpbGUgbmV3Q2hpbGQgPSBuZXcgRmlsZShuZXdGaWxlLCBvbGRDaGlsZHJlbltpXSk7Ci0JCQkJaWYobmV3Q2hpbGQuZXhpc3RzKCkpIHsKLQkJCQkJLy8gRm91bmQgYSBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IGlzIG5hbWVkIHRoZSBzYW1lIGluIHRoZSBvbGQgJiBuZXcuIENvbXBhcmUuCi0JCQkJCWNvbXBhcmVGaWxlcyh0cmFjZSwgbmV3IEZpbGUob2xkRmlsZSwgb2xkQ2hpbGRyZW5baV0pLCBuZXdDaGlsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDb21wYXJlIHR3byBmaWxlcyBvciB0d28gZGlyZWN0b3JpZXMuIERvIG5vdCBjb21wYXJlIGEgZmlsZSB0byBhIGRpcmVjdG9yeSAoIiArIG9sZEZpbGUuZ2V0TmFtZSgpICsgIiwgIiArIG5ld0ZpbGUuZ2V0TmFtZSgpICsgIikuIik7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbXBhcmVGaWxlc0ZvclRyYW5zbGF0aW9uKGJvb2xlYW4gdHJhY2UsIEZpbGUgb2xkRmlsZSwgRmlsZSBuZXdGaWxlKSB7Ci0JCWlmKG9sZEZpbGUuaXNGaWxlKCkgJiYgbmV3RmlsZS5pc0ZpbGUoKSkgewotCQkJdHJ5IHsKLQkJCQlQcm9wZXJ0eUZpbGUgb2xkUHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKG9sZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRyYWNlKTsKLQkJCQlQcm9wZXJ0eUZpbGUgbmV3UHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKG5ld0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIHRyYWNlKTsKLQkJCQlDb21wYXJlUHJvcGVydGllcyBjcCA9IG5ldyBDb21wYXJlUHJvcGVydGllcyhvbGRQcm9wRmlsZSwgbmV3UHJvcEZpbGUpOwotCQkJCWNwLnByaW50UmVzdWx0c0ZvclRyYW5zbGF0aW9uKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKG9sZEZpbGUuaXNEaXJlY3RvcnkoKSAmJiBuZXdGaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZ1tdIG9sZENoaWxkcmVuID0gb2xkRmlsZS5saXN0KCk7Ci0JCQlmb3IoaW50IGk9MDsgaTxvbGRDaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCUZpbGUgbmV3Q2hpbGQgPSBuZXcgRmlsZShuZXdGaWxlLCBvbGRDaGlsZHJlbltpXSk7Ci0JCQkJaWYobmV3Q2hpbGQuZXhpc3RzKCkpIHsKLQkJCQkJLy8gRm91bmQgYSBmaWxlIG9yIGRpcmVjdG9yeSB0aGF0IGlzIG5hbWVkIHRoZSBzYW1lIGluIHRoZSBvbGQgJiBuZXcuIENvbXBhcmUuCi0JCQkJCWNvbXBhcmVGaWxlc0ZvclRyYW5zbGF0aW9uKHRyYWNlLCBuZXcgRmlsZShvbGRGaWxlLCBvbGRDaGlsZHJlbltpXSksIG5ld0NoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvbXBhcmUgdHdvIGZpbGVzIG9yIHR3byBkaXJlY3Rvcmllcy4gRG8gbm90IGNvbXBhcmUgYSBmaWxlIHRvIGEgZGlyZWN0b3J5ICgiICsgb2xkRmlsZS5nZXROYW1lKCkgKyAiLCAiICsgbmV3RmlsZS5nZXROYW1lKCkgKyAiKS4iKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnREdXBsaWNhdGVJZHMoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50RHVwbGljYXRlTWVzc2FnZUlkKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFcnJvclByZWZpeChib29sZWFuIHRyYWNlLCBTdHJpbmcgcHJlZml4LCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnRMYXN0TWVzc2FnZVByZWZpeFN0YXJ0aW5nV2l0aChwcmVmaXgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50RXJyb3JQcmVmaXhSYW5nZShib29sZWFuIHRyYWNlLCBTdHJpbmcgcHJlZml4LCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnRNZXNzYWdlUHJlZml4U3RhcnRpbmdXaXRoKHByZWZpeCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnREdXBsaWNhdGVQcmVmaXhlcyhib29sZWFuIHRyYWNlLCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnREdXBsaWNhdGVNZXNzYWdlUHJlZml4KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRTdHJpbmdMZW5ndGgoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCXByb3BGaWxlLnByaW50U3RyaW5nTGVuZ3RoKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFeHBlY3RlZFN0cmluZ0xlbmd0aChib29sZWFuIHRyYWNlLCBTdHJpbmcgc2xlbmd0aCwgU3RyaW5nW10gZmlsZXMpIHsKLQkJaW50IGxlbmd0aCA9IDA7Ci0JCQotCQl0cnkgewotCQkJbGVuZ3RoID0gbmV3IEludGVnZXIoc2xlbmd0aCkuaW50VmFsdWUoKTsKLQkJfQotCQljYXRjaChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUGFyYW1ldGVyIG11c3QgYmUgYW4gaW50ZWdlci4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludEV4cGVjdGVkU3RyaW5nTGVuZ3RoKGxlbmd0aCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRFcnJvck1lc3NhZ2VzKGJvb2xlYW4gdHJhY2UsIFN0cmluZ1tdIGZpbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludEFsbE1lc3NhZ2VzV2l0aEFNZXNzYWdlUHJlZml4KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRXb3JkQ291bnQoYm9vbGVhbiB0cmFjZSwgU3RyaW5nW10gZmlsZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJUHJvcGVydHlGaWxlIHByb3BGaWxlID0gbmV3IFByb3BlcnR5RmlsZShmaWxlc1tpXSwgdHJhY2UpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9wRmlsZS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpICsgIjo6IE51bWJlciBvZiB3b3JkcyA6OiAiICsgcHJvcEZpbGUuZ2V0TnVtV29yZHMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFByZWZpeENvdW50KGJvb2xlYW4gdHJhY2UsIFN0cmluZ1tdIGZpbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzdWFsbHkgdGhlIG51bWJlciBvZiB1bmlxdWUgcHJlZml4ZXMgYW5kIHRoZSBudW1iZXIgb2YgcHJlZml4ZXMgaXMgdGhlIHNhbWUsIGJ1dCBpZiBhIC5wcm9wZXJ0aWVzIGZpbGUgaGFzIHZhcmlhdGlvbnMgb2YgYSBtZXNzYWdlIChzbGlnaHRseSBkaWZmZXJlbnQgd29yZGluZyBmb3IgYSBkaWZmZXJlbnQgY29udGV4dCksIHRoZW4gdGhlIG51bWJlciBvZiBwcmVmaXggbWVzc2FnZXMgd2lsbCBiZSBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBwcmVmaXhlcy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihwcm9wRmlsZS5nZXRRdWFsaWZpZWRGaWxlTmFtZSgpICsgIjo6IE51bWJlciBvZiB1bmlxdWUgcHJlZml4ZXMgOjogIiArIHByb3BGaWxlLmdldE51bVVuaXF1ZVByZWZpeGVzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKHByb3BGaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCkgKyAiOjogTnVtYmVyIG9mIG1lc3NhZ2VzIHdpdGggcHJlZml4ZXMgOjogIiArIHByb3BGaWxlLmdldE51bVByZWZpeGVzKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKHByb3BGaWxlLmdldFF1YWxpZmllZEZpbGVOYW1lKCkgKyAiOjogTnVtYmVyIG9mIG1lc3NhZ2VzIHdpdGhvdXQgcHJlZml4ZXMgOjogIiArIHByb3BGaWxlLmdldE51bVdpdGhvdXRQcmVmaXhlcygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludEZpbGVDb250ZW50cyhib29sZWFuIHRyYWNlLCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlQcm9wZXJ0eUZpbGUgcHJvcEZpbGUgPSBuZXcgUHJvcGVydHlGaWxlKGZpbGVzW2ldLCB0cmFjZSk7Ci0JCQkJcHJvcEZpbGUucHJpbnRDb250ZW50cygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50RGVmYXVsdChib29sZWFuIHRyYWNlLCBTdHJpbmdbXSBmaWxlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCS8vIHByaW50IGFsbCBlcnJvcnMsIHdhcm5pbmdzLCBldGMuCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb3BlcnR5RmlsZSBwcm9wRmlsZSA9IG5ldyBQcm9wZXJ0eUZpbGUoZmlsZXNbaV0sIHRyYWNlKTsKLQkJCQlwcm9wRmlsZS5wcmludFN5bnRheFdhcm5pbmdzKCk7Ci0JCQkJcHJvcEZpbGUucHJpbnREdXBsaWNhdGVNZXNzYWdlSWQoKTsKLQkJCQlwcm9wRmlsZS5wcmludER1cGxpY2F0ZU1lc3NhZ2VQcmVmaXgoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludChTdHJpbmdbXSBhcmd2KSB7Ci0JCWZvcihpbnQgaSA9MDtpPGFyZ3YubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihpICsgIi4gIiArIGFyZ3ZbaV0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9NZXNzYWdlTWV0YURhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvTWVzc2FnZU1ldGFEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwN2U1NTguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9NZXNzYWdlTWV0YURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXI7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaG9sZHMgdGhlIG1ldGFkYXRhIGZvciBhbiBJTWVzc2FnZSB0aGF0IG11c3QgYmUgCi0gKiByZXBvcnRlZCB0byB0aGUgdXNlciAoaS5lLiwgYSB2YWxpZGF0aW9uIGVycm9yLCB3YXJuaW5nLAotICogb3IgaW5mb3JtYXRpb24gbWVzc2FnZSkuIAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZU1ldGFEYXRhIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRfVU5TRVQgPSAtMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IDM7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgX2J1bmRsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgaW50IF9zZXZlcml0eSA9IElOVF9VTlNFVDsKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZUlkID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIF9wYXJtcyA9IG51bGw7Ci0JcHJpdmF0ZSBPYmplY3QgX3RhcmdldE9iamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgX2xpbmVOdW1iZXIgPSBJTlRfVU5TRVQ7Ci0JcHJpdmF0ZSBpbnQgX29mZnNldCA9IElOVF9VTlNFVDsKLQlwcml2YXRlIGludCBfbGVuZ3RoID0gSU5UX1VOU0VUOwotCXByaXZhdGUgU3RyaW5nIF90ZXh0ID0gbnVsbDsKLQkKLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBtZXNzYWdlIHRleHQgaGFzIGFscmVhZHkKLQkgKiBiZWVuIHRyYW5zbGF0ZWQuCi0JICovCi0JcHVibGljIE1lc3NhZ2VNZXRhRGF0YShTdHJpbmcgbWVzc2FnZVRleHQpIHsKLQkJX3RleHQgPSBtZXNzYWdlVGV4dDsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCBpZiB0aGUgbWVzc2FnZSB0ZXh0IGlzIG5vdCB0cmFuc2xhdGVkCi0JICogdW50aWwganVzdCBiZWZvcmUgdGhlIHRleHQgc2hvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSBpbiB3aGljaCB0aGUgbWVzc2FnZSBpcyBjb250YWluZWQKLQkgKiBAcGFyYW0gc2V2ZXJpdHkgLSBPbmUgb2YgdGhlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5TZXZlcml0eUVudW0gY29uc3RhbnRzOyB0aGlzIHBhcmFtZXRlciByZXByZXNlbnRzIHRoZSBzZXZlcml0eSBvZiB0aGUgSU1lc3NhZ2UuCi0JICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBtZXNzYWdlIGlkIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgYnVuZGxlLgotCSAqIEBwYXJhbSBwYXJtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGJlIHN1YnN0aXR1dGVkIGludG8gdGhlIGphdmEudGV4dC5NZXNzYWdlVGV4dCdzIHBhdHRlcm5zLgotCSAqIEBwYXJhbSB0YXJnZXRPYmplY3QgLSBUaGUgdGFyZ2V0IG9iamVjdCBvZiB0aGUgSU1lc3NhZ2UgKHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmNvcmUuSU1lc3NhZ2UpLgotCSAqIEBwYXJhbSBsaW5lTnVtYmVyIC0gVGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBwcm9ibGVtIGNhbiBiZSBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgTWVzc2FnZU1ldGFEYXRhKFN0cmluZyBidW5kbGVOYW1lLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0T2JqZWN0LCBpbnQgbGluZU51bWJlcikgewotCQl0aGlzKGJ1bmRsZU5hbWUsIHNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QsIGxpbmVOdW1iZXIsIElOVF9VTlNFVCwgSU5UX1VOU0VUKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCBpZiB0aGUgbWVzc2FnZSB0ZXh0IGlzIG5vdCB0cmFuc2xhdGVkCi0JICogdW50aWwganVzdCBiZWZvcmUgdGhlIHRleHQgc2hvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyLgotCSAqIAotCSAqIEBwYXJhbSBidW5kbGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHJlc291cmNlIGJ1bmRsZSBpbiB3aGljaCB0aGUgbWVzc2FnZSBpcyBjb250YWluZWQKLQkgKiBAcGFyYW0gc2V2ZXJpdHkgLSBPbmUgb2YgdGhlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uY29yZS5TZXZlcml0eUVudW0gY29uc3RhbnRzOyB0aGlzIHBhcmFtZXRlciByZXByZXNlbnRzIHRoZSBzZXZlcml0eSBvZiB0aGUgSU1lc3NhZ2UuCi0JICogQHBhcmFtIG1lc3NhZ2VJZCAtIFRoZSBtZXNzYWdlIGlkIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgbWVzc2FnZSB0byBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgYnVuZGxlLgotCSAqIEBwYXJhbSBwYXJtcyAtIFRoZSBwYXJhbWV0ZXJzIHRvIGJlIHN1YnN0aXR1dGVkIGludG8gdGhlIGphdmEudGV4dC5NZXNzYWdlVGV4dCdzIHBhdHRlcm5zLgotCSAqIEBwYXJhbSB0YXJnZXRPYmplY3QgLSBUaGUgdGFyZ2V0IG9iamVjdCBvZiB0aGUgSU1lc3NhZ2UgKHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLmNvcmUuSU1lc3NhZ2UpLgotCSAqIEBwYXJhbSBsaW5lTnVtYmVyIC0gVGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBwcm9ibGVtIGNhbiBiZSBmb3VuZC4KLQkgKiBAcGFyYW0gb2Zmc2V0IC0gSW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMsIGhvdyBtYW55IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIC5wcm9wZXJ0aWVzIGZpbGUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBwcm9ibGVtLgotCSAqIEBwYXJhbSBsZW5ndGggLSBJbiBudW1iZXIgb2YgY2hhcmFjdGVycywgaG93IG1hbnkgY2hhcmFjdGVycyBmcm9tIHRoZSBvZmZzZXQgdG8gdGhlIGVuZCBvZiB0aGUgcHJvYmxlbS4KLQkgKi8KLQlwdWJsaWMgTWVzc2FnZU1ldGFEYXRhKFN0cmluZyBidW5kbGVOYW1lLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0T2JqZWN0LCBpbnQgbGluZU51bWJlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlfYnVuZGxlTmFtZSA9IGJ1bmRsZU5hbWU7Ci0JCV9zZXZlcml0eSA9IHNldmVyaXR5OwotCQlfbWVzc2FnZUlkID0gbWVzc2FnZUlkOwotCQlfcGFybXMgPSBwYXJtczsKLQkJX3RhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdDsKLQkJX2xpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotCQlfb2Zmc2V0ID0gb2Zmc2V0OwotCQlfbGVuZ3RoID0gbGVuZ3RoOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEJ1bmRsZU5hbWUoKSB7Ci0JCXJldHVybiBfYnVuZGxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJcmV0dXJuIF9zZXZlcml0eTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlSWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbXMoKSB7Ci0JCXJldHVybiBfcGFybXM7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0VGFyZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gX3RhcmdldE9iamVjdDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotCQlyZXR1cm4gX2xpbmVOdW1iZXI7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gX29mZnNldDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIF9sZW5ndGg7Ci0JfQotCQotCS8qKgotCSAqIFVzZSB0aGUgZ2l2ZW4gQ2xhc3NMb2FkZXIgdG8gbG9hZCB0aGlzIG1lc3NhZ2UncyB0ZXh0Ci0JICogZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlpZihfdGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VGV4dChMb2NhbGUuZ2V0RGVmYXVsdCgpLCBjbGFzc0xvYWRlcik7Ci0JCX0KLQkJcmV0dXJuIF90ZXh0OwotCX0KLQotCS8qKgotCSAqIFVzZSB0aGUgZ2l2ZW4gQ2xhc3NMb2FkZXIgdG8gbG9hZCB0aGlzIG1lc3NhZ2UncyB0ZXh0LAotCSAqIGZvciB0aGUgTG9jYWxlLCBmcm9tIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICovCQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbG9jYWxlLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlpZihfdGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VGV4dChnZXRCdW5kbGVOYW1lKCksIGxvY2FsZSwgY2xhc3NMb2FkZXIsIGdldElkKCksIGdldFBhcmFtcygpKTsKLQkJfQotCQkKLQkJcmV0dXJuIF90ZXh0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRyYW5zbGF0ZWQgbWVzc2FnZS4KLQkgKiAKLQkgKiBAcGFyYW0gYnVuZGxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHRvIHNlYXJjaCBmb3IgdGhlIG1lc3NhZ2UuCi0JICogQHBhcmFtIGxvY2FsZSBUaGUgTG9jYWxlIGZvciB3aGljaCB0aGUgbWVzc2FnZSBzaG91bGQgYmUgbG9hZGVkLgotCSAqIEBwYXJhbSBjbGFzc0xvYWRlciBUaGUgQ2xhc3NMb2FkZXIgd2hpY2ggY2FuIGxvY2F0ZSB0aGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqIEBwYXJhbSBtZXNzYWdlSWQgVGhlIHVuaXF1ZSBpZCwgaW4gdGhlIHJlc291cmNlIGJ1bmRsZSwgdGhhdCBpZGVudGlmaWVzIHRoZSBtZXNzYWdlLgotCSAqIEBwYXJhbSBwYXJtcyBUaGUgcGFyYW1ldGVycyB0byBzdWJzdGl0dXRlIGludG8gdGhlIHBhdHRlcm4gb2YgdGhlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHQoU3RyaW5nIGJ1bmRsZU5hbWUsIExvY2FsZSBsb2NhbGUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcykgewotCQlTdHJpbmcgbWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGxvY2FsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQotCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGdldEJ1bmRsZShidW5kbGVOYW1lLCBsb2NhbGUsIGNsYXNzTG9hZGVyKTsKLQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQltZXNzYWdlID0gYnVuZGxlLmdldFN0cmluZyhtZXNzYWdlSWQpOwotCi0JCQlpZiAocGFybXMgIT0gbnVsbCkgewotCQkJCW1lc3NhZ2UgPSBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQobWVzc2FnZSwgcGFybXMpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXhjKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZXhjLmdldE1lc3NhZ2UoKSk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZUlkKTsKLQkJfQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZXhjLmdldE1lc3NhZ2UoKSk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZUlkKTsKLQkJfQotCi0JCXJldHVybiBtZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgYnVuZGxlIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXNzYWdlcywgYXMgaWRlbnRpZmllZCBieQotCSAqIEBsaW5rICNnZXRCdW5kbGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcgYnVuZGxlTmFtZSwgTG9jYWxlIGxvY2FsZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChjbGFzc0xvYWRlciA9PSBudWxsKSB7Ci0JCQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUsIGxvY2FsZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoYnVuZGxlTmFtZSwgbG9jYWxlLCBjbGFzc0xvYWRlcik7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBidW5kbGU7Ci0JfQotCQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Byb3BlcnR5RmlsZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI2MGIxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Byb3BlcnR5RmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlcjsKLS8qCi0gKiBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSAqIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSAqIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgCi0gKiByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0gKgotICogRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotICogVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSAqIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSAqIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotICogeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0gKiAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0gKiBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotICogRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0gKiBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSAqIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSAqIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSAqIAotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogVGhpcyBQcm9wZXJ0eUZpbGUgaXMgaW5zdGFudGlhdGVkIGJ5IGNvZGUgdGhhdCBpc24ndCBhbiBJVmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlGaWxlIGV4dGVuZHMgQVByb3BlcnR5RmlsZSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX2VuY2xvc2luZ1ppcEZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfcHJvcGVydHlGaWxlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX2ZpbGVOYW1lID0gbnVsbDsKLQkKLQlwdWJsaWMgUHJvcGVydHlGaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl0aGlzKGZpbGVOYW1lLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIFByb3BlcnR5RmlsZShTdHJpbmcgZmlsZU5hbWUsIGJvb2xlYW4gdHJhY2UpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJdGhpcyhuZXcgRmlsZShmaWxlTmFtZSksIHRyYWNlKTsKLQl9Ci0JCi0JcHVibGljIFByb3BlcnR5RmlsZShGaWxlIHByb3BlcnR5RmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl0aGlzKHByb3BlcnR5RmlsZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgUHJvcGVydHlGaWxlKEZpbGUgcHJvcGVydHlGaWxlLCBib29sZWFuIHRyYWNlKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXRoaXMobnVsbCwgcHJvcGVydHlGaWxlLCB0cmFjZSk7Ci0JfQotCQotCXB1YmxpYyBQcm9wZXJ0eUZpbGUoU3RyaW5nIGVuY2xvc2luZ1ppcEZpbGVOYW1lLCBGaWxlIHByb3BlcnR5RmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQl0aGlzKGVuY2xvc2luZ1ppcEZpbGVOYW1lLCBwcm9wZXJ0eUZpbGUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHlGaWxlKFN0cmluZyBlbmNsb3NpbmdaaXBGaWxlTmFtZSwgRmlsZSBwcm9wZXJ0eUZpbGUsIGJvb2xlYW4gZGVidWcpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJaWYgKCFwcm9wZXJ0eUZpbGUuZXhpc3RzKCkpCi0JCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbigiQ2Fubm90IGZpbmQgZmlsZSAiICsgcHJvcGVydHlGaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFwcm9wZXJ0eUZpbGUuaXNGaWxlKCkpCi0JCQl0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbihwcm9wZXJ0eUZpbGUuZ2V0TmFtZSgpICsgIiBpcyBub3QgYSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFwcm9wZXJ0eUZpbGUuY2FuUmVhZCgpKQotCQkJdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oIkNhbm5vdCByZWFkICIgKyBwcm9wZXJ0eUZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIXByb3BlcnR5RmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoInByb3BlcnRpZXMiKSkgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oIkNhbiBwYXJzZSBvbmx5IC5wcm9wZXJ0aWVzIGZpbGVzOyBpZ25vcmluZyAiICsgcHJvcGVydHlGaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlzZXREZWJ1ZyhkZWJ1Zyk7Ci0JCQkKLQkJX2VuY2xvc2luZ1ppcEZpbGVOYW1lID0gZW5jbG9zaW5nWmlwRmlsZU5hbWU7Ci0JCQotCQlfZmlsZU5hbWUgPSBwcm9wZXJ0eUZpbGUuZ2V0TmFtZSgpOwotCQkKLQkJcmVwb3J0KCJGaWxlIG5hbWU6ICIgKyBfZmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlRmlsZShwcm9wZXJ0eUZpbGUpOwotCQlyZXBvcnQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJcHJvcGVydHlGaWxlID0gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIEFQcm9wZXJ0eUZpbGUjcmVwb3J0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoU3RyaW5nIHN0cikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIEFQcm9wZXJ0eUZpbGUjcmVwb3J0KE1lc3NhZ2VNZXRhRGF0YSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoTWVzc2FnZU1ldGFEYXRhIG1lc3NhZ2UpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobWVzc2FnZS5nZXRUZXh0KGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkpOwotCQlidWZmZXIuYXBwZW5kKFJlc291cmNlSGFuZGxlci5nZXRFeHRlcm5hbGl6ZWRNZXNzYWdlKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIElWYWxpZGF0aW9uQ29uc3RhbnRzLkxJTkVfTE9DLCBuZXcgU3RyaW5nW117U3RyaW5nLnZhbHVlT2YobWVzc2FnZS5nZXRMaW5lTnVtYmVyKCkpLCBnZXRRdWFsaWZpZWRGaWxlTmFtZSgpfSkpOwotCQlyZXBvcnQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZEZpbGVOYW1lKCkgewotCQlpZiAoX3Byb3BlcnR5RmlsZU5hbWUgPT0gbnVsbCkgewotCQkJaWYgKF9lbmNsb3NpbmdaaXBGaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQkJX3Byb3BlcnR5RmlsZU5hbWUgPSBfZmlsZU5hbWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlfcHJvcGVydHlGaWxlTmFtZSA9IF9lbmNsb3NpbmdaaXBGaWxlTmFtZSArICI6OiIgKyBfZmlsZU5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gX3Byb3BlcnR5RmlsZU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIF9maWxlTmFtZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUxpbmUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvUHJvcGVydHlMaW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NjljN2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUxpbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS5wYXJzZXI7Ci0vKgotICogTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0gKiAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAyLCAyMDAzIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCi0gKiBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotICogcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotICoKLSAqIERJU0NMQUlNRVIgT0YgV0FSUkFOVElFUy4KLSAqIFRoZSBmb2xsb3dpbmcgW2VuY2xvc2VkXSBjb2RlIGlzIHNhbXBsZSBjb2RlIGNyZWF0ZWQgYnkgSUJNCi0gKiBDb3Jwb3JhdGlvbi4gVGhpcyBzYW1wbGUgY29kZSBpcyBub3QgcGFydCBvZiBhbnkgc3RhbmRhcmQgb3IgSUJNCi0gKiBwcm9kdWN0IGFuZCBpcyBwcm92aWRlZCB0byB5b3Ugc29sZWx5IGZvciB0aGUgcHVycG9zZSBvZiBhc3Npc3RpbmcKLSAqIHlvdSBpbiB0aGUgZGV2ZWxvcG1lbnQgb2YgeW91ciBhcHBsaWNhdGlvbnMuICBUaGUgY29kZSBpcyBwcm92aWRlZAotICogIkFTIElTIi4gSUJNIE1BS0VTIE5PIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVAotICogTk9UIExJTUlURUQgVE8gVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MKLSAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgUkVHQVJESU5HIFRIRSBGVU5DVElPTiBPUiBQRVJGT1JNQU5DRSBPRgotICogVEhJUyBDT0RFLiAgVEhJUyBDT0RFIE1BWSBDT05UQUlOIEVSUk9SUy4gIElCTSBzaGFsbCBub3QgYmUgbGlhYmxlCi0gKiBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBvdXQgb2YgeW91ciB1c2Ugb2YgdGhlIHNhbXBsZSBjb2RlLCBldmVuCi0gKiBpZiBpdCBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0gKiAKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogUHJvcGVydHlMaW5lIHJlcHJlc2VudHMgYSBsaW5lIGluIGEgUHJvcGVydHlGaWxlLiBJdCBoYXMgYSBtZXNzYWdlIGlkLAotICogYSBtZXNzYWdlIHZhbHVlICh0aGUgdGV4dCBvZiB0aGUgcHJvcGVydHk7IHRoaXMgaXMgdGhlIHRleHQgd2hpY2ggaXMKLSAqIHRyYW5zbGF0ZWQpLCBhIGxpbmUgbnVtYmVyLCBhbmQsIG9wdGlvbmFsbHksIGFuIHVuaXF1ZSBlcnJvciBpZCAob2YgdGhlCi0gKiBmb3JtIEFCQ0QxMjM0e0V8V3xJfSkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUxpbmUgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZUlkOyAvLyB0aGUgbWVzc2FnZSBpZCAobm90IHRyYW5zbGF0ZWQpCi0JcHJpdmF0ZSBTdHJpbmcgX21lc3NhZ2UgPSBudWxsOyAvLyB0aGUgbWVzc2FnZSB2YWx1ZSB3aXRoIHRoZSBlcnJvciBpZCAodHJhbnNsYXRlZCkKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZVByZWZpeCA9IG51bGw7IC8vIHRoZSBwcmVmaXggKGUuZy4gQUJDRDEyMzR7RXxXfEl9Ci0JcHJpdmF0ZSBTdHJpbmcgX3Nob3J0TWVzc2FnZSA9IG51bGw7IC8vIHRoZSBtZXNzYWdlIHZhbHVlIHdpdGhvdXQgdGhlIGVycm9yIGlkICh0cmFuc2xhdGVkKQotCXByaXZhdGUgaW50IF9saW5lTnVtYmVyID0gLTE7IC8vIHRoZSBsaW5lIG51bWJlciBvZiB0aGlzIG1lc3NhZ2UgdmFsdWUKLQlwcml2YXRlIGludCBfbnVtV29yZHMgPSAtMTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBBUHJvcGVydHlGaWxlIF9maWxlID0gbnVsbDsKLQlwcml2YXRlIGludCBfb2Zmc2V0ID0gLTE7IC8vIHRoZSBvZmZzZXQsIGluIHRoZSAucHJvcGVydGllcyBmaWxlLCB3aGVyZSB0aGlzIGxpbmUgYmVnaW5zCi0JcHJpdmF0ZSBpbnQgX21lc3NhZ2VPZmZzZXQgPSAtMTsgIC8vIHRoZSBvZmZzZXQgaW4gdGhlIGxpbmUsIGFmdGVyIHRoZSBFUVVBTFMsIHdoZXJlIHRoZSBtZXNzYWdlIHByZWZpeCBiZWdpbnMKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFFVT1RFID0gJ1wnJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIE9CUkFDS0VUID0gJ3snOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQ0JSQUNLRVQgPSAnfSc7Ci0KLQkvLyBUaGUgRW51bSBmb3IgdGhlIG1lc3NhZ2Ugc2V2ZXJpdHkgY2FuIGJlIG9uZSBvZiB0aGVzZSBmb3VyIHZhbHVlcy4gSWYgdGhlcmUgaXMgYW4gZXJyb3IgaWQsCi0JLy8gVU5BU1NJR05FRCBpbmRpY2F0ZXMgYW4gaW52YWxpZCB2YWx1ZS4gCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVU5BU1NJR05FRCA9IDA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRVJST1IgPSAweDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgV0FSTklORyA9IDB4MjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTkZPID0gMHgzOwotCi0JcHJpdmF0ZSBpbnQgX3NldmVyaXR5ID0gVU5BU1NJR05FRDsgLy8gdGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLCBpZiB0aGlzIG1lc3NhZ2UgaGFzIGFuIGVycm9yIGlkLiBVTkFTU0lHTkVEIG1lYW5zIGVpdGhlciB0aGF0IHRoZSBzZXZlcml0eSB3YXMgYW4gaW52YWxpZCBzZXZlcml0eSAobm90IGluZm8sIHdhcm4sIG9yIGVycm9yKSwgb3IgdGhhdCB0aGUgbWVzc2FnZSBoYXMgbm8gZXJyb3IgaWQuIENoZWNrIHRoZSB2YWx1ZSBvZiB0aGUgZXJyb3IgaWQgdG8gZmluZCBvdXQgd2hpY2ggb2YgdGhlIHR3byBpcyB0aGUgY2FzZS4KLQlwcml2YXRlIGludCBfbnVtUGFybXMgPSAwOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBCTEFOSyA9ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi50b0NoYXJBcnJheSgpOyAvLyB0aGlzIHN0cmluZyBpcyAxMDAgY2hhcmFjdGVycyBsb25nLiBJdCdzIHVzZWQgdG8gcXVpY2tseSBnZXQgYSBibGFuayBzdHJpbmcgaW4gdGhlIGdldEJsYW5rKGludCkgbWV0aG9kLiBIb3BlZnVsbHkgdGhlIHVzZXIgd2lsbCBuZXZlciB3YW50IG1vcmUgdGhhbiAxMDAgY2hhciBpbiBhIGdpdmVuIHBhcmFtZXRlci4gLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFByb3BlcnR5TGluZShBUHJvcGVydHlGaWxlIGZpbGUsIGludCBvZmZzZXQsIGludCBtZXNzYWdlT2Zmc2V0LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmVOdW1iZXIpIHsKLQkJLy8gQ29tbWVudCBvbiB0aGUgdXNlIG9mIGludGVybigpLgotCQkvLyBCZWNhdXNlIGl0J3MgbGlrZWx5IHRoYXQgd2UnbGwgYmUgY29tcGFyaW5nIHRoaXMgc3RyaW5nIGEgbG90LAotCQkvLyBsb2FkIGl0IGludG8gdGhlIEphdmEgY29uc3RhbnRzIHNwYWNlIHRocm91Z2ggaW50ZXJuKCkuIFNpbmNlIHdlIHdvbid0Ci0JCS8vIGJlIG1vZGlmeWluZyB0aGlzIHN0cmluZywgaXQncyBzYWZlIHRvIGxvYWQgaXQgaW50byB0aGUgY29uc3RhbnRzIHNwYWNlLgotCQkvLwotCQlfb2Zmc2V0ID0gb2Zmc2V0OyAvLyB0aGUgb2Zmc2V0IGluIHRoZSAucHJvcGVydGllcyBmaWxlIHdoZXJlIHRoaXMgbGluZSBiZWdpbnMKLQkJX21lc3NhZ2VPZmZzZXQgPSBtZXNzYWdlT2Zmc2V0OyAvLyB0aGUgb2Zmc2V0IGluIHRoZSBsaW5lLCBhZnRlciB0aGUgRVFVQUxTLCB3aGVyZSB0aGUgbWVzc2FnZSBwcmVmaXggYmVnaW5zCi0JCV9tZXNzYWdlSWQgPSBtZXNzYWdlSWQ7Ci0JCV9tZXNzYWdlID0gbWVzc2FnZTsgLy8gcmU6IGludGVybigpLiBEaXR0by4KLQkJX2xpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotCQlfZmlsZSA9IGZpbGU7Ci0KLQkJcGFyc2UobWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQkJLy8gYnkgZGVmYXVsdCwgc29ydCBieSBtZXNzYWdlIGlkCi0JCWlmICghKG8gaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpKSB7Ci0JCQkvLyB0aGVuIGhvdyBvbiBlYXJ0aCBkaWQgdGhpcyBtZXRob2QgZ2V0IGNhbGxlZD8/Ci0JCQkvLyBwdXQgaXQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdAotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0TWVzc2FnZUlkKCkuY29tcGFyZVRvKCgoUHJvcGVydHlMaW5lKSBvKS5nZXRNZXNzYWdlSWQoKSk7Ci0JfQotCi0JcHVibGljIEFQcm9wZXJ0eUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIF9maWxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVByZWZpeCgpIHsKLQkJcmV0dXJuIF9tZXNzYWdlUHJlZml4OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNNZXNzYWdlUHJlZml4KCkgewotCQlpZihfbWVzc2FnZVByZWZpeCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKF9tZXNzYWdlUHJlZml4LmVxdWFscyhFTVBUWSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIF9saW5lTnVtYmVyOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBfbWVzc2FnZTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWQoKSB7Ci0JCXJldHVybiBfbWVzc2FnZUlkOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIF9zaG9ydE1lc3NhZ2U7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiB3b3JkcyBpbiB0aGUgbWVzc2FnZSBleGNsdWRpbmcgCi0JICogdGhlIG1lc3NhZ2UgZXJyb3IgaWQgcHJlZml4LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtV29yZHMoKSB7Ci0JCWlmKF9udW1Xb3JkcyA9PSAtMSkgewotCQkJX251bVdvcmRzID0gMDsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGdldFNob3J0TWVzc2FnZSgpKTsKLQkJCV9udW1Xb3JkcyA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQl9Ci0JCXJldHVybiBfbnVtV29yZHM7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSAKLQkgKiBtZXNzYWdlIGluY2x1ZGluZyB0aGUgbWVzc2FnZSBwcmVmaXggYW5kIHBhcmFtZXRlcnMuIChpLmUuLCB7MH0gd291bGQKLQkgKiBiZSBjb3VudGVkIGFzIHRocmVlIGNoYXJhY3RlcnMuKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0TWVzc2FnZSgpLmxlbmd0aCgpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgCi0JICogbWVzc2FnZSBpbmNsdWRpbmcgdGhlIG1lc3NhZ2UgcHJlZml4IGFuZCB0aGUgZXhwZWN0ZWQgCi0JICogbnVtYmVyIG9mIGNoYXJhY3RlcnMuIChUaGF0IGlzLCB0aGUgbGVuZ3RoUGFybSBwYXJhbWV0ZXIKLQkgKiBpcyB1c2VkIGFzIGFuIGFwcHJveGltYXRpb24gb2YgdGhlIGxlbmd0aCBvZiBlYWNoIHBhcmFtZXRlcgotCSAqIGluIHRoZSBtZXNzYWdlLikKLQkgKi8KLQlwdWJsaWMgaW50IGdldEV4cGVjdGVkTGVuZ3RoKGludCBsZW5ndGhQYXJtKSB7Ci0JCWlmKGhhc1BhcmFtZXRlcnMoKSAmJiAobGVuZ3RoUGFybSA+IDApKSB7Ci0JCQlyZXR1cm4gZ2V0RXhwZWN0ZWRNZXNzYWdlKGxlbmd0aFBhcm0pLmxlbmd0aCgpOwotCQl9Ci0JCXJldHVybiBnZXRMZW5ndGgoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc3Vic3RpdHV0ZXMgYSBibGFuayBzdHViIG9mIHRoZSBnaXZlbiBsZW5ndGgKLQkgKiBldmVyeSBwbGFjZSBpbiB0aGUgc3RyaW5nIHdoZXJlIHRoZXJlIGlzIGEgcGFybS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEV4cGVjdGVkTWVzc2FnZShpbnQgbGVuZ3RoUGFybSkgewotCQlpZihoYXNQYXJhbWV0ZXJzKCkgJiYgKGxlbmd0aFBhcm0gPiAwKSkgewotCQkJLy8gbWVzc2FnZSBjYW5ub3QgYmUgbnVsbCBvciBibGFuayBvciBpdCB3b3VsZG4ndCBoYXZlIHBhcmFtZXRlcnMKLQkJCVN0cmluZyBibGFuayA9IGdldEJsYW5rKGxlbmd0aFBhcm0pOwotCQkJCi0JCQlpbnQgbnVtUGFybSA9IGdldE51bVBhcmFtZXRlcnMoKTsKLQkJCVN0cmluZ1tdIHBhcm0gPSBuZXcgU3RyaW5nW251bVBhcm1dOwotCQkJZm9yKGludCBpPTA7IGk8cGFybS5sZW5ndGg7IGkrKykgewotCQkJCXBhcm1baV0gPSBibGFuazsKLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldE1lc3NhZ2UoKSwgcGFybSk7Ci0JCQl9Ci0JCQljYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJaWYoZ2V0RmlsZSgpLmRlYnVnKCkpIHsKLQkJCQkJZ2V0RmlsZSgpLnJlcG9ydChleGMuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJZ2V0RmlsZSgpLnJlcG9ydChnZXRGaWxlKCkuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKSArICI6OiIgKyBnZXRNZXNzYWdlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIGdldE1lc3NhZ2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0TWVzc2FnZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBibGFuayBzdHJpbmcgb2YgdGhlIGdpdmVuIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCbGFuayhpbnQgbGVuZ3RoKSB7Ci0JCWNoYXJbXSBibGFuayA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCWlmKGxlbmd0aCA+IEJMQU5LLmxlbmd0aCkgewotCQkJZm9yKGludCBpPTA7IGk8bGVuZ3RoOyBpKyspIHsKLQkJCQlibGFua1tpXSA9ICcgJzsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoQkxBTkssIDAsIGJsYW5rLCAwLCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKGJsYW5rKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbGluZSBoYXMgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQgcGF0dGVybnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzUGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIGdldE51bVBhcmFtZXRlcnMoKSA+IDA7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IHBhdHRlcm5zIGluIHRoZSBwcm9wZXJ0eSBsaW5lLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtUGFyYW1ldGVycygpIHsKLQkJcmV0dXJuIF9udW1QYXJtczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycywgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUsIHRvCi0JICogdGhlIGJlZ2lubmluZyBvZiB0aGUgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1lc3NhZ2VPZmZzZXQoKSB7Ci0JCXJldHVybiBfbWVzc2FnZU9mZnNldDsKLQl9Ci0JCi0JLyoqCi0JICogVGhlIG9mZnNldCwgaW4gdGhlIC5wcm9wZXJ0aWVzIGZpbGUsIHdoZXJlIHRoaXMgbGluZSBiZWdpbnMuCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBfb2Zmc2V0OwotCX0KLQkKLQkvKioKLQkgKiBUaGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UsIGlmIHRoaXMgbWVzc2FnZSBoYXMgYW4gZXJyb3IgaWQuIAotCSAqIFVOQVNTSUdORUQgbWVhbnMgZWl0aGVyIHRoYXQgdGhlIHNldmVyaXR5IHdhcyBhbiBpbnZhbGlkIHNldmVyaXR5IAotCSAqIChub3QgaW5mbywgd2Fybiwgb3IgZXJyb3IpLCBvciB0aGF0IHRoZSBtZXNzYWdlIGhhcyBubyBlcnJvciBpZC4gQ2hlY2sgCi0JICogdGhlIHZhbHVlIG9mIHRoZSBlcnJvciBpZCB0byBmaW5kIG91dCB3aGljaCBvZiB0aGUgdHdvIGlzIHRoZSBjYXNlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBfc2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JKiBQYXJzZSB0aGUgbWVzc2FnZSB2YWx1ZSB0byBleHRyYWN0IHRoZSB1bmlxdWUgZXJyb3IgaWQsIGlmIGFueSBleGlzdHMuCi0JKiBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBzb21lIG9mIHRoZSBmaWVsZHMgaW4gdGhpcyBjbGFzcy4KLQkqLwotCXB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCS8vIFRvIHNlZSB3aHkgaXQncyBzYWZlIHRvIGNhbGwgaW50ZXJuKCksIHJlYWQgdGhlIGNvbW1lbnQgaW4gdGhlCi0JCS8vIGNvbnN0cnVjdG9yLgotCi0JCS8vIENhc2UgMTogQUJDRDAwMDBFOiBCbGFoIEJsYWggQmxhaAotCQkvLyBDYXNlIDI6IEFCQ0QwMDAwRSAgQmxhaCBCbGFoIEJsYWgKLQkJLy8gQ2FzZSAzOiBBQkNEMDAwMEUgOiBCbGFoIEJsYWggQmxhaAotCQkvLyBDYXNlIDQ6IEFCQ0QwMDAwRSAgQmxhaDpCbGFoIEJsYWgKLQkJLy8gQ2FzZSA1OiBBQkNEMDAwMEUgOgotCQkvLyBDYXNlIDY6IEJsYWggQmxhaCBCbGFoIChpLmUuLCBubyBwcmVmaXgpCi0JCS8vIENhc2UgNzogQUJDRDAwMDBFOiBCbGFoCi0JCS8vIENhc2UgODogQUJDRDAwMDBFICBCbGFoCi0JCS8vIENhc2UgOTogQUJDRDAwMDBFIDogQmxhaAotCQkvLyBDYXNlIDEwOiBBQkNEMDAwMEUgQmxhaAotCQkvLyBDYXNlIDExOiBBQkNEMDAwMEUKLQotCQlpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlfbWVzc2FnZVByZWZpeCA9IEVNUFRZOwotCQkJX3Nob3J0TWVzc2FnZSA9IEVNUFRZOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobWVzc2FnZSk7Ci0JCWludCBudW1Ub2tlbnMgPSB0b2tlbml6ZXIuY291bnRUb2tlbnMoKTsKLQkJaWYgKG51bVRva2VucyA9PSAwKSB7Ci0JCQlfbWVzc2FnZVByZWZpeCA9IEVNUFRZOwotCQkJX3Nob3J0TWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZXJyb3JJZCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWJvb2xlYW4gcHJlZml4RXhpc3RzID0gZmFsc2U7Ci0KLQkJCS8vIFNvbWV0aW1lcyB0aGUgJzonIGlzbid0IHRoZXJlIG9yIGlzbid0IGluIHRoZSByaWdodCBwbGFjZSwgc28gZG9uJ3QgZGV0ZXJtaW5lIHRoZSBtZXNzYWdlIHByZWZpeCBiYXNlZCBvbiB0aGF0LgotCQkJU3RyaW5nIGFmdGVyUHJlZml4ID0gbnVsbDsKLQkJCWlmKGVycm9ySWQubGVuZ3RoKCkgPj0gOSkgewotCQkJCWFmdGVyUHJlZml4ID0gZXJyb3JJZC5zdWJzdHJpbmcoMCwgOSk7IC8vIE11c3QgYmUgb2YgdGhlIGZvcm0gQUJDRDEyMzRFLCB3aGljaCBpcyA5IGNoYXIgbG9uZwotCQkJCWNoYXJbXSB0ZW1wID0gYWZ0ZXJQcmVmaXgudG9DaGFyQXJyYXkoKTsKLQkJCQlwcmVmaXhFeGlzdHMgPSBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFswXSkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHRlbXBbMF0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFsxXSkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHRlbXBbMF0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFsyXSkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHRlbXBbMF0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNMZXR0ZXIodGVtcFszXSkgJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHRlbXBbMF0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNEaWdpdCh0ZW1wWzRdKTsKLQkJCQlwcmVmaXhFeGlzdHMgPSBwcmVmaXhFeGlzdHMgJiYgQ2hhcmFjdGVyLmlzRGlnaXQodGVtcFs1XSk7Ci0JCQkJcHJlZml4RXhpc3RzID0gcHJlZml4RXhpc3RzICYmIENoYXJhY3Rlci5pc0RpZ2l0KHRlbXBbNl0pOwotCQkJCXByZWZpeEV4aXN0cyA9IHByZWZpeEV4aXN0cyAmJiBDaGFyYWN0ZXIuaXNEaWdpdCh0ZW1wWzddKTsKLQkJCQlwcmVmaXhFeGlzdHMgPSBwcmVmaXhFeGlzdHMgJiYgQ2hhcmFjdGVyLmlzTGV0dGVyKHRlbXBbOF0pICYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZSh0ZW1wWzBdKTsKLQotCQkJCWlmIChwcmVmaXhFeGlzdHMpIHsKLQkJCQkJc3dpdGNoICh0ZW1wWzhdKSB7Ci0JCQkJCQljYXNlICgnRScpIDoKLQkJCQkJCQl7Ci0JCQkJCQkJCV9zZXZlcml0eSA9IEVSUk9SOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQljYXNlICgnVycpIDoKLQkJCQkJCQl7Ci0JCQkJCQkJCV9zZXZlcml0eSA9IFdBUk5JTkc7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCWNhc2UgKCdJJykgOgotCQkJCQkJCXsKLQkJCQkJCQkJX3NldmVyaXR5ID0gSU5GTzsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQotCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJewotCQkJCQkJCQlfc2V2ZXJpdHkgPSBVTkFTU0lHTkVEOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCX0KLQkJCQkJX21lc3NhZ2VQcmVmaXggPSBhZnRlclByZWZpeDsKLQkJCQkJCi0JCQkJCWludCBjb2xvbkluZGV4ID0gZXJyb3JJZC5pbmRleE9mKCc6Jyk7Ci0JCQkJCWJvb2xlYW4gbm9Db2xvbiA9IChjb2xvbkluZGV4ID09IC0xKTsKLQkKLQkJCQkJaW50IHNob3J0TWVzc2FnZUluZGV4ID0gMTA7IC8vIGFzc3VtZSB0aGF0IG9ubHkgdGhlIEFCQ0QwMDAwRSBwcmVmaXggd2lsbCBiZSBzdHJpcHBlZCAoaS5lLiwgbm8gY29sb24pCi0JCQkJCWlmKG5vQ29sb24pIHsKLQkJCQkJCS8vIE5vIGNvbG9uIGZvbGxvd2luZyBtZXNzYWdlIHByZWZpeCBpbW1lZGlhdGVseS4KLQkJCQkJCS8vIElzIHRoZXJlIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBjb2xvbj8KLQkJCQkJCWlmIChudW1Ub2tlbnMgPiAxKSB7Ci0JCQkJCQkJU3RyaW5nIG5leHRUb2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJCQljb2xvbkluZGV4ID0gbmV4dFRva2VuLmluZGV4T2YoJzonKTsKLQkJCQkJCQlub0NvbG9uID0gKChjb2xvbkluZGV4ID09IC0xKSB8fCAobmV4dFRva2VuLnRyaW0oKS5pbmRleE9mKCc6JykgIT0gMCkpOyAvLyBjYXNlIDQgdHJpbSBjb25kaXRpb24gd2lsbCBiZSB0cnVlCi0JCQkJCQkJCi0JCQkJCQkJLy8gIjoiIHNob3VsZCBmb2xsb3cgdGhlIG1lc3NhZ2UgcHJlZml4IGltbWVkaWF0ZWx5Ci0JCQkJCQkJLy8gS25vdyB0aGVyZSdzIGEgcHJlZml4LCBhbmQgdGhhdCdzIDkgY2hhcgotCQkJCQkJCWlmKG5vQ29sb24pIHsKLQkJCQkJCQkJLy8gQ2FzZSAyLCA0LCA4IG9yIDEwCi0vLwkJCQkJCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLklORk8sIElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMTIwLCBuZXcgU3RyaW5nW117fSwgdGhpcywgZ2V0TGluZU51bWJlcigpKTsKLS8vCQkJCQkJCQlnZXRGaWxlKCkuYWRkUGFyc2VXYXJuaW5nKG1tZCk7Ci0JCQkJCQkJCXNob3J0TWVzc2FnZUluZGV4ID0gMTA7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotLy8JCQkJCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5JTkZPLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDEzMCwgbmV3IFN0cmluZ1tde30sIHRoaXMsIGdldExpbmVOdW1iZXIoKSk7Ci0vLwkJCQkJCQkJZ2V0RmlsZSgpLmFkZFBhcnNlV2FybmluZyhtbWQpOwotCQkJCQkJCQkKLQkJCQkJCQkJaWYobnVtVG9rZW5zID4gMikgewotCQkJCQkJCQkJLy8gQ2FzZSAzIG9yIDkKLQkJCQkJCQkJCW5leHRUb2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJCQkJCXNob3J0TWVzc2FnZUluZGV4ID0gbWVzc2FnZS5pbmRleE9mKG5leHRUb2tlbik7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkvLyBDYXNlIDUKLQkJCQkJCQkJCXNob3J0TWVzc2FnZUluZGV4ID0gY29sb25JbmRleCArIDE7Ci0JCQkJCQkJCX0JCQkJCQkJCQotCQkJCQkJCX0KLQkJCQkJCQlfc2hvcnRNZXNzYWdlID0gbWVzc2FnZS5zdWJzdHJpbmcoc2hvcnRNZXNzYWdlSW5kZXgsIG1lc3NhZ2UubGVuZ3RoKCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gQ2FzZSAxMQotCQkJCQkJCV9zaG9ydE1lc3NhZ2UgPSBFTVBUWTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIENhc2UgMSBvciA3Ci0JCQkJCQlzaG9ydE1lc3NhZ2VJbmRleCA9IGNvbG9uSW5kZXggKyAxOwotCQkJCQkJX3Nob3J0TWVzc2FnZSA9IG1lc3NhZ2Uuc3Vic3RyaW5nKHNob3J0TWVzc2FnZUluZGV4LCBtZXNzYWdlLmxlbmd0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkKLQkJCX0KLQotCQkJaWYgKCFwcmVmaXhFeGlzdHMpIHsKLQkJCQkvLyBDYXNlIDYKLQkJCQlfbWVzc2FnZVByZWZpeCA9IEVNUFRZOwotCQkJCV9zaG9ydE1lc3NhZ2UgPSBtZXNzYWdlOwotCQkJfQotCQl9Ci0KLQkJZ2V0RmlsZSgpLmFkZFBhcnNlV2FybmluZ3MocGFyc2VNZXNzYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIE9uY2UgdGhlIGZpZWxkIHRoYXQgaG9sZHMgdGhlIG1lc3NhZ2UgdGV4dCBoYXMgYmVlbiBzZXQgKGkuZS4sIHBhcnNlKFN0cmluZykKLQkgKiBoYXMgYmVlbiBjYWxsZWQpLCB0aGlzIG1ldGhvZCBwYXJzZXMgdGhlIG1lc3NhZ2UgdGV4dCwgZmluZHMgYW55IHN5bnRheCBvcgotCSAqIG90aGVyIHByb2JsZW1zLCBhbmQgcmV0dXJucyBhIExpc3Qgb2YgTWVzc2FnZU1ldGFEYXRhLCB3aXRoIG9uZSBNZXNzYWdlTWV0YURhdGEKLQkgKiBmb3IgZWFjaCBwcm9ibGVtLgotCSAqLwotCXB1YmxpYyBMaXN0IHBhcnNlTWVzc2FnZSgpIHsKLQkJLy8gbm93IHBhcnNlIHRvIHNlZSBpZiBhbGwgYXBvc3Ryb3BoZXMgYXJlIGluIHBhaXJzLCBpZiB0aGVyZSBhcmUgcGFyYW1ldGVycyBvciBub3QsIGV0Yy4KLQkJQXJyYXlMaXN0IGludExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWludCBudW1PYnJhY2tldHMgPSAwOwotCQlpbnQgbnVtQ2JyYWNrZXRzID0gMDsKLQkJaW50IGluZGV4ID0gMDsKLQkJY2hhciB0b2tlbjsKLQkJaW50IHNpbmdsZVF1b3RlSW5kZXggPSAtMTsKLQkJaW50IGRvdWJsZVF1b3RlSW5kZXggPSAtMTsKLQkJaW50IG1pc3NpbmdUZXJtaW5hdGluZ1F1b3RlSW5kZXggPSAtMTsKLQkJYm9vbGVhbiBwYXJtRXhpc3RzID0gZmFsc2U7Ci0JCWludCBudW1DaGFyQmVmb3JlU2hvcnQgPSBnZXRNZXNzYWdlT2Zmc2V0KCkgKyBnZXRNZXNzYWdlKCkuaW5kZXhPZihnZXRTaG9ydE1lc3NhZ2UoKSk7Ci0JCQotCQl3aGlsZSAoaW5kZXggPCBnZXRTaG9ydE1lc3NhZ2UoKS5sZW5ndGgoKSkgewotCQkJdG9rZW4gPSBnZXRTaG9ydE1lc3NhZ2UoKS5jaGFyQXQoaW5kZXgrKyk7Ci0JCQlpZiAodG9rZW4gPT0gUVVPVEUpIHsKLQkJCQlpZiAoaW5kZXggPCBnZXRTaG9ydE1lc3NhZ2UoKS5sZW5ndGgoKSkgewotCQkJCQl0b2tlbiA9IGdldFNob3J0TWVzc2FnZSgpLmNoYXJBdChpbmRleCsrKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRva2VuID0gJyAnOwotCQkJCX0KLQkJCQkKLQkJCQlpZiAoKHRva2VuID09IE9CUkFDS0VUKSB8fCAodG9rZW4gPT0gQ0JSQUNLRVQpKXsKLQkJCQkJaWYgKGluZGV4IDwgZ2V0U2hvcnRNZXNzYWdlKCkubGVuZ3RoKCkpIHsKLQkJCQkJCXRva2VuID0gZ2V0U2hvcnRNZXNzYWdlKCkuY2hhckF0KGluZGV4KyspOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdG9rZW4gPSAnICc7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCS8vIERvZXMgdGhlIHsgb3IgfSBjaGFyYWN0ZXIgaGF2ZSBhIHRlcm1pbmF0aW5nIHNpbmdsZSBxdW90ZT8KLQkJCQkJaWYodG9rZW4gIT0gUVVPVEUpIHsKLQkJCQkJCW1pc3NpbmdUZXJtaW5hdGluZ1F1b3RlSW5kZXggPSAobnVtQ2hhckJlZm9yZVNob3J0ICsgaW5kZXgtMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHRva2VuID09IFFVT1RFKSkgewotCQkJCQlkb3VibGVRdW90ZUluZGV4ID0gKG51bUNoYXJCZWZvcmVTaG9ydCArIGluZGV4LTEpOwotCQkJCX0KLQkJCQllbHNlICB7Ci0JCQkJCS8vICd7JyBtZWFucyB0aGF0IGEgeyB3aWxsIGJlIG91dHB1dCwKLQkJCQkJLy8gJ30nIG1lYW5zIHRoYXQgYSB9IHdpbGwgYmUgb3V0cHV0LAotCQkJCQkvLyAnJyBtZWFucyB0aGF0IGEgJyB3aWxsIGJlIG91dHB1dC4KLQkJCQkJCi0JCQkJCS8vIFNpbmNlIHRoZSBxdW90ZSBpcyBhIHNwZWNpYWwgY2hhcmFjdGVyLCBhbmQgdGhlIG9wZW5pbmcgYnJhY2tldCBpcyBhIAotCQkJCQkvLyBzcGVjaWFsIGNoYXJhY3Rlciwga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIG9wZW4gYnJhY2tldHMuIElmIHRoZQotCQkJCQkvLyBmb2xsb3dpbmcgY2hhcmFjdGVyIGlzbid0IGEgcXVvdGUgb3Igb3BlbmluZyBicmFja2V0LCB3YXJuIHRoZSB1c2VyIAotCQkJCQkvLyB0aGF0IGl0IHRha2VzIHR3byBhcG9zdHJvcGhlcyB0byBzZWUgb25lIGFwb3N0cm9waGUuCi0JCQkJCXNpbmdsZVF1b3RlSW5kZXggPSAobnVtQ2hhckJlZm9yZVNob3J0ICsgaW5kZXgtMSk7Ci0JCQkJfQotCQkJCQotCQkJfQotCQkJZWxzZSBpZiAodG9rZW4gPT0gT0JSQUNLRVQpIHsKLQkJCQludW1PYnJhY2tldHMrKzsKLQkJCQlwYXJtRXhpc3RzID0gdHJ1ZTsKLQkJCQlTdHJpbmdCdWZmZXIgbnVtQnVmZmVyID0gbnVsbDsKLQkJCQlpZiAoaW5kZXggPCBnZXRTaG9ydE1lc3NhZ2UoKS5sZW5ndGgoKSkgewotCQkJCQludW1CdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCXdoaWxlIChpbmRleCA8IGdldFNob3J0TWVzc2FnZSgpLmxlbmd0aCgpKSB7Ci0JCQkJCQljaGFyIGRpZ2l0ID0gZ2V0U2hvcnRNZXNzYWdlKCkuY2hhckF0KGluZGV4KTsKLQkJCQkJCWlmICgoQ2hhcmFjdGVyLmlzRGlnaXQoZGlnaXQpKSB8fCAoZGlnaXQgPT0gJy0nKSB8fCAoZGlnaXQgPT0gJysnKSkgewotCQkJCQkJCW51bUJ1ZmZlci5hcHBlbmQoZGlnaXQpOwotCQkJCQkJCWluZGV4Kys7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm90IGFuIGVycm9yOyBqdXN0IG5vdCBhIG51bWJlci4gQ291bGQgYmUgb25lIG9mIHRoZSBvdGhlciAKLQkJCQkJLy8gQ2hvaWNlRm9ybWF0LCBvciB3aGF0ZXZlciwgZm9ybWF0cy4gRG8gbm90IGdldCB0aGUgbmV4dCAKLQkJCQkJLy8gdG9rZW4sIGJlY2F1c2Ugd2Ugc3RpbGwgbmVlZCB0byBwcm9jZXNzIHRoaXMgb25lLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl0cnkgewotCQkJCQlpZiAoKG51bUJ1ZmZlciAhPSBudWxsKSAmJiAobnVtQnVmZmVyLmxlbmd0aCgpID4gMCkpIHsKLQkJCQkJCUludGVnZXIgcGFybU51bSA9IEludGVnZXIudmFsdWVPZihudW1CdWZmZXIudG9TdHJpbmcoKSk7Ci0JCQkJCQlpbnRMaXN0LmFkZChwYXJtTnVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4YykgewotCQkJCQkvLyBub3QgYW4gZXJyb3I7IGp1c3Qgbm90IGEgbnVtYmVyLiBDb3VsZCBiZSBvbmUgb2YgdGhlIG90aGVyIAotCQkJCQkvLyBDaG9pY2VGb3JtYXQsIG9yIHdoYXRldmVyLCBmb3JtYXRzLiBEbyBub3QgZ2V0IHRoZSBuZXh0IAotCQkJCQkvLyB0b2tlbiwgYmVjYXVzZSB3ZSBzdGlsbCBuZWVkIHRvIHByb2Nlc3MgdGhpcyBvbmUuCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodG9rZW4gPT0gQ0JSQUNLRVQpIHsKLQkJCQludW1DYnJhY2tldHMrKzsKLQkJCX0KLQkJfQotCQkKLQkJX251bVBhcm1zID0gTWF0aC5tYXgobnVtT2JyYWNrZXRzLCBudW1DYnJhY2tldHMpOwotCi0JCS8vIGZpbmQgcGFyc2Ugd2FybmluZ3MKLQkJTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKG51bU9icmFja2V0cyAhPSBudW1DYnJhY2tldHMpIHsKLQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5FUlJPUiwgSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAwMDAsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihudW1PYnJhY2tldHMpLCBTdHJpbmcudmFsdWVPZihudW1DYnJhY2tldHMpfSwgdGhpcywgZ2V0TGluZU51bWJlcigpKTsKLQkJCW1lc3NhZ2VzLmFkZChtbWQpOwotCQl9Ci0JCQotCQlpZihtaXNzaW5nVGVybWluYXRpbmdRdW90ZUluZGV4ICE9IC0xKSB7Ci0JCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuSU5GTywgSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAxMTAsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihtaXNzaW5nVGVybWluYXRpbmdRdW90ZUluZGV4KX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSwgZ2V0T2Zmc2V0KCkgKyBtaXNzaW5nVGVybWluYXRpbmdRdW90ZUluZGV4LCAxKTsgLy8gbWFnaWMgbnVtYmVyIDEgYmVjYXVzZSBhIHF1b3RlIGlzIG9uZSBjaGFyYWN0ZXIgbG9uZwotCQkJbWVzc2FnZXMuYWRkKG1tZCk7Ci0JCX0KLQotCQkvLyBOb3cgc29ydCB0aGUgbGlzdCwgdG8gc2VlIGlmIHRoZXJlJ3MgYW55IG51bWJlcnMgbWlzc2luZywgZHVwbGljYXRlZCwgb3IgbmVnYXRpdmUKLQkJQ29sbGVjdGlvbnMuc29ydChpbnRMaXN0LCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCQkvLyBuZWdhdGl2ZSA9IGIgYmVmb3JlIGEKLQkJCQkvLyB6ZXJvID0gYSA9IGIKLQkJCQkvLyBwb3NpdGl2ZSA9IGEgYmVmb3JlIGIKLQkJCQlyZXR1cm4gKChJbnRlZ2VyKSBhKS5pbnRWYWx1ZSgpIC0gKChJbnRlZ2VyKSBiKS5pbnRWYWx1ZSgpOwotCQkJfQotCQl9KTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBpbnRMaXN0Lml0ZXJhdG9yKCk7Ci0JCWludCBwYXJtQ291bnQgPSAwOwotCQlpbnQgbGFzdE51bWJlciA9IC0xOwotCQlpbnQgbGFyZ2VzdE51bWJlciA9IC0xOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJbnRlZ2VyIHBhcm0gPSAoSW50ZWdlcikgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHBhcm0uaW50VmFsdWUoKSA8IDApIHsKLQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuRVJST1IsIElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMDEwRSwgbmV3IFN0cmluZ1tde1N0cmluZy52YWx1ZU9mKHBhcm0uaW50VmFsdWUoKSl9LCB0aGlzLCBnZXRMaW5lTnVtYmVyKCkpOwotCQkJCW1lc3NhZ2VzLmFkZChtbWQpOwotCQkJfQotCQkJZWxzZSBpZiAocGFybS5pbnRWYWx1ZSgpID09IGxhc3ROdW1iZXIpIHsKLQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuSU5GTywgSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAwMjAsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihsYXN0TnVtYmVyKX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSk7Ci0JCQkJbWVzc2FnZXMuYWRkKG1tZCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwYXJtLmludFZhbHVlKCkgIT0gcGFybUNvdW50KSB7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEoSVZhbGlkYXRpb25Db25zdGFudHMuQlVORExFTkFNRSwgTWVzc2FnZU1ldGFEYXRhLklORk8sIElWYWxpZGF0aW9uQ29uc3RhbnRzLkFCQ0QwMDMwLCBuZXcgU3RyaW5nW117U3RyaW5nLnZhbHVlT2YocGFybUNvdW50KX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSk7Ci0JCQkJbWVzc2FnZXMuYWRkKG1tZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJtQ291bnQrKzsKLQkJCX0KLQkJCWxhc3ROdW1iZXIgPSBwYXJtLmludFZhbHVlKCk7Ci0JCQlsYXJnZXN0TnVtYmVyID0gTWF0aC5tYXgobGFyZ2VzdE51bWJlciwgcGFybS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlpZihsYXJnZXN0TnVtYmVyID4gMCkgewotCQkJLy8gTm90IGEgY2hvaWNlIGZvcm1hdC4KLQkJCS8vCi0JCQkvLyBBbHRob3VnaCB0aGUgZmlyc3QgZGVmYXVsdCAoY291bnRpbmcgdGhlIG51bWJlciBvZiAKLQkJCS8vIGJyYWNrZXRzKSBpcyBva2F5IGluIG1vc3QgY2FzZXMsIHNvbWV0aW1lcyBhIHBhcmFtZXRlciAKLQkJCS8vIGlzIG1pc3NpbmcsIGFuZCBzbyB0aGUgbnVtYmVyIG9mIHBhcmFtdGVycyBwYXNzZWQgaW50byAKLQkJCS8vIHRoZSBNZXNzYWdlRm9ybWF0IG5lZWRzIHRvIGJlIGxhcmdlci4gKGUuZy4gezB9IHsyfSwgCi0JCQkvLyBuZWVkIFN0cmluZ1tdIHRvIGJlIHsiIiwgIiIsICIifSwgbm90IHsiIiwgIiJ9KS4gCi0JCQkKLQkJCS8vIE5lZWQgdG8gYWRkICIxIiB0byBpdCBiZWNhdXNlIHRoZSBudW1iZXJzIHN0YXJ0IGF0IGEgMCBpbmRleC4KLQkJCV9udW1QYXJtcyA9IGxhcmdlc3ROdW1iZXIgKyAxOyAKLQkJfQotCQkKLQkJaWYobGFyZ2VzdE51bWJlciA+IDkpIHsKLQkJCS8vIE1lc3NhZ2VGb3JtYXQgd2lsbCBub3Qgc3Vic3RpdHV0ZSBpbiBwYXJhbWV0ZXJzIGFmdGVyIHRoZSAxMCBwYXJhbWV0ZXIgKGkuZS4sIG51bWJlciA5KS4KLQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5XQVJOSU5HLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDAxMFcsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihsYXJnZXN0TnVtYmVyKX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSk7Ci0JCQltZXNzYWdlcy5hZGQobW1kKTsKLQkJfQotCi0JCWlmICgoc2luZ2xlUXVvdGVJbmRleCA+IC0xKSAmJiBwYXJtRXhpc3RzKSB7Ci0JCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbmV3IE1lc3NhZ2VNZXRhRGF0YShJVmFsaWRhdGlvbkNvbnN0YW50cy5CVU5ETEVOQU1FLCBNZXNzYWdlTWV0YURhdGEuSU5GTywgSVZhbGlkYXRpb25Db25zdGFudHMuQUJDRDAwNDAsIG5ldyBTdHJpbmdbXXtTdHJpbmcudmFsdWVPZihzaW5nbGVRdW90ZUluZGV4KX0sIHRoaXMsIGdldExpbmVOdW1iZXIoKSwgZ2V0T2Zmc2V0KCkgKyBzaW5nbGVRdW90ZUluZGV4LCAxKTsgLy8gbWFnaWMgbnVtYmVyIDEgYmVjYXVzZSBhIHF1b3RlIGlzIG9uZSBjaGFyYWN0ZXIgbG9uZwotCQkJbWVzc2FnZXMuYWRkKG1tZCk7Ci0JCX0KLQkJZWxzZSBpZiAoKGRvdWJsZVF1b3RlSW5kZXggPiAtMSkgJiYgIXBhcm1FeGlzdHMpIHsKLQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKElWYWxpZGF0aW9uQ29uc3RhbnRzLkJVTkRMRU5BTUUsIE1lc3NhZ2VNZXRhRGF0YS5JTkZPLCBJVmFsaWRhdGlvbkNvbnN0YW50cy5BQkNEMDA1MCwgbmV3IFN0cmluZ1tde1N0cmluZy52YWx1ZU9mKGRvdWJsZVF1b3RlSW5kZXgpfSwgdGhpcywgZ2V0TGluZU51bWJlcigpLCBnZXRPZmZzZXQoKSArIGRvdWJsZVF1b3RlSW5kZXgsIDEpOyAvLyBtYWdpYyBudW1iZXIgMSBiZWNhdXNlIGEgcXVvdGUgaXMgb25lIGNoYXJhY3RlciBsb25nCi0JCQltZXNzYWdlcy5hZGQobW1kKTsKLQkJfQotCi0JCXJldHVybiBtZXNzYWdlczsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXQgdGhpcyAucHJvcGVydGllcyBsaW5lIGZvciBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlpZihnZXRGaWxlKCkgPT0gbnVsbCkgewotCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl9Ci0JCWVsc2UgewotCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRGaWxlKCkuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiXHRMaW5lIG51bWJlcjogIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihnZXRMaW5lTnVtYmVyKCkpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGdldE1lc3NhZ2VJZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChnZXRNZXNzYWdlKCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIEZvcm1hdCB0aGlzIC5wcm9wZXJ0aWVzIGxpbmUgZm9yIGRpc3BsYXksIGFuZCBzdWJzdGl0dXRlIGEgc3R1YiwKLQkgKiBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaW50byBlYWNoIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0IHBhdHRlcm4uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZ1dpdGhFeHBlY3RlZExlbmd0aChpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlpZihnZXRGaWxlKCkgPT0gbnVsbCkgewotCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl9Ci0JCWVsc2UgewotCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihnZXRGaWxlKCkuZ2V0UXVhbGlmaWVkRmlsZU5hbWUoKSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiXHRMaW5lIG51bWJlcjogIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChTdHJpbmcudmFsdWVPZihnZXRMaW5lTnVtYmVyKCkpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXHQiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGdldE1lc3NhZ2VJZCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChnZXRFeHBlY3RlZE1lc3NhZ2UobGVuZ3RoKSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXNzYWdlIHByZWZpeCB3aXRob3V0IHRoZSBzZXZlcml0eSwgZS5nLiwKLQkgKiBBQkNEMDAwMCBpbnN0ZWFkIG9mIEFCQ0QwMDAwRS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TWVzc2FnZVByZWZpeCgpIHsKLQkJU3RyaW5nIHByZWZpeCA9IGdldE1lc3NhZ2VQcmVmaXgoKTsKLQkJaWYocHJlZml4LmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCWNoYXIgcHJlZml4RW5kID0gcHJlZml4LmNoYXJBdChwcmVmaXgubGVuZ3RoKCkgLSAxKTsKLQkJaWYgKChwcmVmaXhFbmQgPT0gJ0UnKSB8fCAocHJlZml4RW5kID09ICdXJykgfHwgKHByZWZpeEVuZCA9PSAnSScpKSB7Ci0JCQlwcmVmaXggPSBwcmVmaXguc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JCXJldHVybiBwcmVmaXg7Ci0JfQotCQotCS8qKgotCSAqIEEgUHJvcGVydHlMaW5lIGlzIGVxdWFsIGlmIGl0IGlzIGluIHRoZSBzYW1lIGZpbGUgYW5kIG9uIHRoZSBzYW1lIGxpbmUgbnVtYmVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZihvID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoIShvIGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlQcm9wZXJ0eUxpbmUgb0xpbmUgPSAoUHJvcGVydHlMaW5lKW87Ci0JCWlmKCEoZ2V0TGluZU51bWJlcigpID09IG9MaW5lLmdldExpbmVOdW1iZXIoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYoIWdldEZpbGUoKS5lcXVhbHMob0xpbmUuZ2V0RmlsZSgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIChnZXRGaWxlKCkuaGFzaENvZGUoKSArIGdldExpbmVOdW1iZXIoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3NhbXBsZS9wYXJzZXIvUHJvcGVydHlMaW5lQ29tcGFyYXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYWFkMjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9Qcm9wZXJ0eUxpbmVDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgYWxsIG9mIHRoZSBDb21wYXJhdG9yIGNsYXNzZXMgdGhhdCBjYW4gYmUgdXNlZAotICogdG8gc29ydCBQcm9wZXJ0eUxpbmUgaW5zdGFuY2VzIGluIGFuIEFQcm9wZXJ0eUZpbGUuIChGb3IgZXhhbXBsZSwKLSAqIHRvIGZpbmQgZHVwbGljYXRlIG1lc3NhZ2UgaWRzLCB0aGUgTWVzc2FnZUlkQ29tcGFyYXRvciB3b3VsZCBiZSB1c2VkCi0gKiB0byBzb3J0IHRoZSBsaW5lcyBhY2NvcmRpbmcgdG8gbWVzc2FnZSBpZC4gVGhlIHNvcnRlZCBsaXN0IGlzIAotICogdHJhdmVyc2VkIHRvIGZpbmQgb3V0IGlmIG9uZSBsaW5lIGhhcyBhbiBpZGVudGljYWwgbWVzc2FnZSBpZCAKLSAqIHRvIHRoZSBsaW5lIHRoYXQgZm9sbG93cyBpdCwgYW5kIGlmIHNvLCBhIHBhcnNlIHdhcm5pbmcgaXMgcmVwb3J0ZWQuKQotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlMaW5lQ29tcGFyYXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydHlMaW5lQ29tcGFyYXRvciBpbnN0ID0gbmV3IFByb3BlcnR5TGluZUNvbXBhcmF0b3IoKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIF9tZXNzYWdlUHJlZml4Q29tcGFyYXRvciA9IGluc3QubmV3IE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBfbWVzc2FnZUlkQ29tcGFyYXRvciA9IGluc3QubmV3IE1lc3NhZ2VJZENvbXBhcmF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBDb21wYXJhdG9yIF9zdHJpbmdMZW5ndGhDb21wYXJhdG9yID0gbmV3IFN0cmluZ0xlbmd0aENvbXBhcmF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIF92YWx1ZUNvbXBhcmF0b3IgPSBpbnN0Lm5ldyBWYWx1ZUNvbXBhcmF0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIF9saW5lTm9Db21wYXJhdG9yID0gaW5zdC5uZXcgTGluZU5vQ29tcGFyYXRvcigpOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUxpbmVDb21wYXJhdG9yKCkgewotCX0JCi0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIGNvbXBhcmVzIFByb3BlcnR5TGluZSBpbnN0YW5jZXMgYW5kIHNvcnRzIHRoZW0gYWNjb3JkaW5nIHRvIAotCSAqIHRoZWlyIG1lc3NhZ2UgcHJlZml4IChlLmcuLCBBQkNEMDAwMEUpLgotCSAqLwotCXByaXZhdGUgY2xhc3MgTWVzc2FnZVByZWZpeENvbXBhcmF0b3IgaW1wbGVtZW50cyBqYXZhLnV0aWwuQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCWlmKChhID09IG51bGwpICYmIChiID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKGEgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQkKLQkJCS8vIENhbid0IGp1c3QgbG9vayB0byBzZWUgaWYgdGhleSdyZSB0aGUgc2FtZTsgbmVlZCB0byBtYXJrCi0JCQkvLyB0aGVtIGFzIHRoZSBzYW1lIGV2ZW4gaWYgdGhlIGxhc3QgbGV0dGVyIChFfFd8SSkgaXMgZGlmZmVyZW50LgotCQkJU3RyaW5nIGFpZCA9ICgoUHJvcGVydHlMaW5lKSBhKS5nZXRNZXNzYWdlUHJlZml4KCk7Ci0JCQlTdHJpbmcgYmlkID0gKChQcm9wZXJ0eUxpbmUpIGIpLmdldE1lc3NhZ2VQcmVmaXgoKTsKLQkJCWlmKChhaWQgPT0gbnVsbCkgJiYgKGJpZCA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhaWQgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYmlkID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQkKLQkJCWFpZCA9IGFpZC50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKLQkJCWJpZCA9IGJpZC50b1VwcGVyQ2FzZSgpLnRyaW0oKTsKLQotCQkJaWYoKGFpZC5lcXVhbHMoIiIpKSAmJiAoYmlkLmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYWlkLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYmlkLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiAxOwotCQkJfQotCi0JCQlyZXR1cm4gKChQcm9wZXJ0eUxpbmUpYSkuZ2V0U2hvcnRNZXNzYWdlUHJlZml4KCkudG9VcHBlckNhc2UoKS5jb21wYXJlVG8oKChQcm9wZXJ0eUxpbmUpYikuZ2V0U2hvcnRNZXNzYWdlUHJlZml4KCkudG9VcHBlckNhc2UoKSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBjb21wYXJhdG9yIHNvcnRzIFByb3BlcnR5TGluZSBieSB0aGVpciBtZXNzYWdlIGlkLgotCSAqLwotCXByaXZhdGUgY2xhc3MgTWVzc2FnZUlkQ29tcGFyYXRvciBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIGFNZXNzYWdlSWQgPSBudWxsOwotCQkJU3RyaW5nIGJNZXNzYWdlSWQgPSBudWxsOwotCQkJaWYoYSBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkgewotCQkJCWFNZXNzYWdlSWQgPSAoKFByb3BlcnR5TGluZSlhKS5nZXRNZXNzYWdlSWQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFNZXNzYWdlSWQgPSAoU3RyaW5nKWE7Ci0JCQl9Ci0JCQkKLQkJCWlmKGIgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpIHsKLQkJCQliTWVzc2FnZUlkID0gKChQcm9wZXJ0eUxpbmUpYikuZ2V0TWVzc2FnZUlkKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQliTWVzc2FnZUlkID0gKFN0cmluZyliOwotCQkJfQotCQkJCQotCQkJCi0JCQlpZigoYU1lc3NhZ2VJZCA9PSBudWxsKSAmJiAoYk1lc3NhZ2VJZCA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhTWVzc2FnZUlkID09IG51bGwpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQllbHNlIGlmKGJNZXNzYWdlSWQgPT0gbnVsbCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIGFNZXNzYWdlSWQuY29tcGFyZVRvKGJNZXNzYWdlSWQpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNvcnQgdGhlIFByb3BlcnR5TGluZSBieSB0aGUgbGVuZ3RoIG9mIGNoYXJhY3RlcnMgaW4gdGhlIG1lc3NhZ2UgdGV4dDsKLQkgKiBpZiB5b3Ugd2FudCB0byBzdWJzdGl0dXRlIGNoYXJhY3RlcnMgZm9yIHRoZSBtZXNzYWdlIHBhcmFtZXRlcnMsIAotCSAqIHNldCB0aGUgbGVuZ3RoIGZpZWxkLgotCSAqLwotCXN0YXRpYyBjbGFzcyBTdHJpbmdMZW5ndGhDb21wYXJhdG9yIGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IgewotCQlwdWJsaWMgc3RhdGljIGludCBsZW5ndGggPSAwOwotCQkKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJLy8gcmV0dXJuIGEgbmVnYXRpdmUgbnVtYmVyIGlmIG9iamVjdCBhIGlzIGxlc3MgdGhhbiBvYmplY3QgYgotCQkJLy8gcmV0dXJuIGEgemVybyBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1YWwKLQkJCS8vIHJldHVybiBhIHBvc2l0aXZlIG51bWJlciBpZiBvYmplY3QgYSBpcyBncmVhdGVyIHRoYW4gb2JqZWN0IGIKLQkJCWlmKChhID09IG51bGwpICYmIChiID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKGEgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQkKLQkJCWludCBhTGVuZ3RoID0gKChQcm9wZXJ0eUxpbmUpYSkuZ2V0RXhwZWN0ZWRMZW5ndGgobGVuZ3RoKTsKLQkJCWludCBiTGVuZ3RoID0gKChQcm9wZXJ0eUxpbmUpYikuZ2V0RXhwZWN0ZWRMZW5ndGgobGVuZ3RoKTsKLQkJCQkKLQkJCXJldHVybiAoYUxlbmd0aCAtIGJMZW5ndGgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFscGhhYmV0aXplIHRoZSBtZXNzYWdlIHRleHQgb2YgdGhlIFByb3BlcnR5TGluZS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFZhbHVlQ29tcGFyYXRvciBpbXBsZW1lbnRzIGphdmEudXRpbC5Db21wYXJhdG9yIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhLCBPYmplY3QgYikgewotCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIGFNZXNzYWdlID0gKChQcm9wZXJ0eUxpbmUpYSkuZ2V0TWVzc2FnZSgpOwotCQkJU3RyaW5nIGJNZXNzYWdlID0gKChQcm9wZXJ0eUxpbmUpYikuZ2V0TWVzc2FnZSgpOwotCQkJaWYoKGFNZXNzYWdlID09IG51bGwpICYmIChiTWVzc2FnZSA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhTWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiTWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQkJCi0JCQlyZXR1cm4gYU1lc3NhZ2UuY29tcGFyZVRvKGJNZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTb3J0IGJ5IGxpbmUgbnVtYmVyIG9mIHRoZSBQcm9wZXJ0eUxpbmUsIHdpdGggdGhlIHNtYWxsZXN0IGxpbmUKLQkgKiBudW1iZXIgZmlyc3QgaW4gdGhlIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBMaW5lTm9Db21wYXJhdG9yIGltcGxlbWVudHMgamF2YS51dGlsLkNvbXBhcmF0b3IgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQkvLyByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIgaWYgb2JqZWN0IGEgaXMgbGVzcyB0aGFuIG9iamVjdCBiCi0JCQkvLyByZXR1cm4gYSB6ZXJvIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVhbAotCQkJLy8gcmV0dXJuIGEgcG9zaXRpdmUgbnVtYmVyIGlmIG9iamVjdCBhIGlzIGdyZWF0ZXIgdGhhbiBvYmplY3QgYgotCQkJaWYoKGEgPT0gbnVsbCkgJiYgKGIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJZWxzZSBpZihiID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQotCQkJaW50IGFMaW5lTm8gPSAoKFByb3BlcnR5TGluZSlhKS5nZXRMaW5lTnVtYmVyKCk7Ci0JCQlpbnQgYkxpbmVObyA9ICgoUHJvcGVydHlMaW5lKWIpLmdldExpbmVOdW1iZXIoKTsKLQkJCWlmKChhTGluZU5vIDwgMCkgJiYgKGJMaW5lTm8gPCAwKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhTGluZU5vIDwgMCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCWVsc2UgaWYoYkxpbmVObyA8IDApIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIChhTGluZU5vIC0gYkxpbmVObyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBhcmF0b3IgZ2V0TWVzc2FnZVByZWZpeENvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBfbWVzc2FnZVByZWZpeENvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIGdldE1lc3NhZ2VJZENvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBfbWVzc2FnZUlkQ29tcGFyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbXBhcmF0b3IgZ2V0U3RyaW5nTGVuZ3RoQ29tcGFyYXRvcihpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0xlbmd0aENvbXBhcmF0b3IubGVuZ3RoID0gbGVuZ3RoOwotCQlyZXR1cm4gX3N0cmluZ0xlbmd0aENvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIGdldFZhbHVlQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIF92YWx1ZUNvbXBhcmF0b3I7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBnZXRMaW5lTm9Db21wYXJhdG9yKCkgewotCQlyZXR1cm4gX2xpbmVOb0NvbXBhcmF0b3I7Ci0JfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Jlc291cmNlSGFuZGxlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3Ivb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vc2FtcGxlL3BhcnNlci9SZXNvdXJjZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkN2I1NS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvcHJvcGVydGllc1ZhbGlkYXRvci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9zYW1wbGUvcGFyc2VyL1Jlc291cmNlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyOwotLyoKLSAqIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvcGVydHkgb2YgSUJNIAotICogKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotICogVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSAqIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAKLSAqCi0gKiBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0gKiBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotICogQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotICogcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0gKiB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSAqICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0gKiBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSAqIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotICogZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotICogaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotICogCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmV0cmlldmVzIHRoZSBTdHJpbmdzIGZyb20gdGhlIC5wcm9wZXJ0aWVzIGZpbGUgYXBwcm9wcmlhdGUKLSAqIGZvciB0aGUgbWFjaGluZSdzIExvY2FsZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFJlc291cmNlSGFuZGxlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgX2J1bmRsZSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBSZXNvdXJjZUhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgYnVuZGxlIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXNzYWdlcwotCSAqIGluIHRoZSByZXNvdXJjZSBpZGVudGlmaWVkIGJ5IGJ1bmRsZU5hbWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBidW5kbGVOYW1lKSB7Ci0JCWlmIChfYnVuZGxlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJX2J1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lKTsKLQkJCX0KLQkJCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXhjKSB7Ci0JCQkJX2J1bmRsZSA9IG51bGw7Ci0JCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBfYnVuZGxlOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBuYW1lIG9mIHRoZSBidW5kbGUgYW5kIHRoZSBtZXNzYWdlIGlkIChrZXkpIGludG8gdGhlCi0JICogYnVuZGxlLCByZXR1cm4gdGhlIG1lc3NhZ2UgdGV4dCBpZGVudGlmaWVkIGJ5IHRoZSBpZC4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RXh0ZXJuYWxpemVkTWVzc2FnZShTdHJpbmcgYnVuZGxlTmFtZSwgU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKGJ1bmRsZU5hbWUpOwotCQkJaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGtleTsKLQkJCX0KLQotCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfQotCQljYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIGtleTsKLQl9Ci0JCi0JLyoqCi0JICogR2l2ZW4gdGhlIG5hbWUgb2YgdGhlIGJ1bmRsZSwgdGhlIG1lc3NhZ2UgaWQgKGtleSkgaW50byB0aGUKLQkgKiBidW5kbGUsIGFuZCBwYXJhbWV0ZXJzIHRvIGJlIHN1YnN0aXR1dGVkIGludG8gdGhlIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0J3MKLQkgKiBwYXR0ZXJucywgcmV0dXJuIHRoZSBtZXNzYWdlIHdpdGggdGhlIHBhcmFtZXRlcnMgc3Vic3RpdHV0ZWQgaW4uCi0JICovCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEV4dGVybmFsaXplZE1lc3NhZ2UoU3RyaW5nIGJ1bmRsZU5hbWUsIFN0cmluZyBrZXksIFN0cmluZ1tdIHBhcm1zKSB7Ci0JCVN0cmluZyByZXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcmVzID0gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldEV4dGVybmFsaXplZE1lc3NhZ2UoYnVuZGxlTmFtZSwga2V5KSwgcGFybXMpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3IvcHJvcGVydGllc1ZhbGlkYXRvci5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Byb3BlcnRpZXNWYWxpZGF0b3IvcHJvcGVydGllc1ZhbGlkYXRvci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2E1YmRlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS9wcm9wZXJ0aWVzVmFsaWRhdG9yL3Byb3BlcnRpZXNWYWxpZGF0b3IucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMKLSMgTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0jIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSMgVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSMgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotIwotIyAgRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotIyAgVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSMgIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSMgIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotIyAgeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0jICAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0jICBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotIyAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0jICBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSMgIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSMgIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSMKLQotQUJDRDAwMDAgPSBBQkNEMDAwMEU6IE1hdGNoIHRoZSBicmFjZXMgaW4gdGhlIG1lc3NhZ2UuIFRoZXJlIGFyZSB7MH0gJ3snIGFuZCB7MX0gJ30nLiBNZXNzYWdlRm9ybWF0IHdpbGwgdGhyb3cgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3aGVuIHRoZXJlIGFyZSBtaXNtYXRjaGluZyBicmFjZXMuCi1BQkNEMDAxMEUgPSBBQkNEMDAxMEU6IENoYW5nZSBhcmd1bWVudCAoJ3snezB9J30nKSB0byBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgOSBpbmNsdXNpdmUgaW4gdGhlIG1lc3NhZ2UuIE1lc3NhZ2VGb3JtYXQgY2Fubm90IHByb2Nlc3MgYW4gaW50ZWdlciBwYXJhbWV0ZXIgdGhhdCBpcyBsZXNzIHRoYW4gMC4KLUFCQ0QwMDEwVyA9IEFCQ0QwMDEwVzogQ2hhbmdlIGFyZ3VtZW50ICgneyd7MH0nfScpIHRvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA5IGluY2x1c2l2ZSBpbiB0aGUgbWVzc2FnZS4gTWVzc2FnZUZvcm1hdCBpZ25vcmVzIGFueSBwYXJhbWV0ZXJzIGxhcmdlciB0aGFuIDkuCi1BQkNEMDAyMCA9IEFCQ0QwMDIwSTogUmVtb3ZlIHJlZHVuZGFudCBwYXJhbWV0ZXIgJ3snezB9J30nIGZyb20gdGhlIG1lc3NhZ2UuIE1ha2UgbWVzc2FnZXMgc3VjY2luY3QuCi1BQkNEMDAzMCA9IEFCQ0QwMDMwSTogQ2hlY2sgdGhhdCBhcmd1bWVudCAneyd7MH0nfScgd2FzIG9taXR0ZWQgZnJvbSB0aGUgbWVzc2FnZSBkZWxpYmVyYXRlbHkuIElmIGl0IHdhcyBvbWl0dGVkIGFjY2lkZW50YWxseSwgYW5kIHRoZSBjb2RlIGRvZXMgbm90IHByb3ZpZGUgZW5vdWdoIHBhcmFtZXRlcnMsIE1lc3NhZ2VGb3JtYXQgd2lsbCB0aHJvdyBhIE51bGxQb2ludGVyRXhjZXB0aW9uLgotQUJDRDAwNDAgPSBBQkNEMDA0MEk6IFVzZSB0d28gYXBvc3Ryb3BoZXMgaW4gdGhlIG1lc3NhZ2UgYXQgY29sdW1uIHswfS4gTWVzc2FnZUZvcm1hdCByZW1vdmVzIHNpbmdsZSBhcG9zdHJvcGhlczsgZm9yIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkgYW4gYXBvc3Ryb3BoZSwgdHdvIGFwb3N0cm9waGVzIG11c3QgZXhpc3QgaW4gdGhlIHN0cmluZy4gKEFuIGFwb3N0cm9waGUgaXMgYSByZXNlcnZlZCBjaGFyYWN0ZXIgb2YgTWVzc2FnZUZvcm1hdC4pCi1BQkNEMDA1MCA9IEFCQ0QwMDUwSTogVXNlIG9uZSBhcG9zdHJvcGhlIGluIHRoZSBtZXNzYWdlIGF0IGNvbHVtbiB7MH0uIE1lc3NhZ2VGb3JtYXQgcHJvY2Vzc2VzIG9ubHkgbWVzc2FnZXMgd2l0aCBwYXJhbWV0ZXJzOyB3aXRob3V0IE1lc3NhZ2VGb3JtYXQsIHRoZSBleHRyYSBhcG9zdHJvcGhlIHdpbGwgbm90IGJlIHJlbW92ZWQuCi0KLUFCQ0QwMDYwID0gQUJDRDAwNjBXOiBNYWtlIHswfSB1bmlxdWUuIFdoZW4gYW4gaWQgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSBpbiBhIGZpbGUsIFJlc291cmNlQnVuZGxlIHdpbGwgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdCBtZXNzYWdlIGlkLgotQUJDRDAwNzAgPSBBQkNEMDA3MFc6IHswfSBtYXkgbmVlZCB0byBiZSB1bmlxdWUuIENvbnZlbnRpb25hbGx5LCBhIG1lc3NhZ2UgcHJlZml4IGFwcGxpZXMgdG8gb25seSBvbmUgZXJyb3IgY29uZGl0aW9uLgotCi1BQkNEMDA4MCA9IEFCQ0QwMDgwRTogRml4IHRoZSBzeW50YXggZXJyb3I7IGVhY2ggbGluZSBtdXN0IGZvcm0gTUVTU0FHRV9JRCA9IE1FU1NBR0UuCi1BQkNEMDA5MCA9IEFCQ0QwMDkwVzogQ2hlY2sgdGhlIHJlYWQgcGVybWlzc2lvbnMgb2YgZmlsZSB7MH0uIFRoZSBQcm9wZXJ0aWVzVmFsaWRhdG9yIGVpdGhlciBjYW5ub3QgcmVhZCBvciBjYW5ub3QgZmluZCB0aGUgZmlsZS4KLQotQUJDRDAxMTAgPSBBQkNEMDExMEk6IEFkZCBhIHRlcm1pbmF0aW5nIGFwb3N0cm9waGUgYXQgY29sdW1uIHswfS4gVGhlICd7JyBhbmQgJ30nIGNoYXJhY3RlcnMgbXVzdCBiZSBlbmNsb3NlZCBpbiBhcG9zdHJvcGhlcy4KLQotQUJDRDAxMjAgPSBBQkNEMDEyMEk6IFRlcm1pbmF0ZSBtZXNzYWdlIHByZWZpeCB7MH0gd2l0aCBhICcnOicnLiBUaGUgSUJNIHN0YW5kYXJkIHJlcXVpcmVzIHRoYXQgbWVzc2FnZSBwcmVmaXhlcyBlbmQgd2l0aCBhIGNvbG9uLgotQUJDRDAxMzAgPSBBQkNEMDEzMEk6IFJlbW92ZSB0aGUgd2hpdGVzcGFjZSBiZXR3ZWVuIHswfSBhbmQgdGhlICcnOicnLiBUaGUgSUJNIHN0YW5kYXJkIHJlcXVpcmVzIGFuIGFic2VuY2Ugb2Ygd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdGhlIGNvbG9uLgotCi0jIE91dHNpZGUgV1NBRCwgYXBwZW5kIHRoZSBsaW5lIG51bWJlciBhbmQgZmlsZSBuYW1lIHRvIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2UuCi1MSU5FX0xPQyA9IExpbmUgezB9LCBmaWxlIHsxfS4KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Rlc3QvdGVzdC5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Rlc3QvdGVzdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGJjOTgyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS90ZXN0L3Rlc3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLSMKLSMgTGljZW5zZWQgTWF0ZXJpYWwgLSBQcm9wZXJ0eSBvZiBJQk0gCi0jIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDMgLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAKLSMgVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSAKLSMgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIAotIwotIyAgRElTQ0xBSU1FUiBPRiBXQVJSQU5USUVTLgotIyAgVGhlIGZvbGxvd2luZyBbZW5jbG9zZWRdIGNvZGUgaXMgc2FtcGxlIGNvZGUgY3JlYXRlZCBieSBJQk0KLSMgIENvcnBvcmF0aW9uLiBUaGlzIHNhbXBsZSBjb2RlIGlzIG5vdCBwYXJ0IG9mIGFueSBzdGFuZGFyZCBvciBJQk0KLSMgIHByb2R1Y3QgYW5kIGlzIHByb3ZpZGVkIHRvIHlvdSBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGFzc2lzdGluZwotIyAgeW91IGluIHRoZSBkZXZlbG9wbWVudCBvZiB5b3VyIGFwcGxpY2F0aW9ucy4gIFRoZSBjb2RlIGlzIHByb3ZpZGVkCi0jICAiQVMgSVMiLiBJQk0gTUFLRVMgTk8gV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUCi0jICBOT1QgTElNSVRFRCBUTyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUwotIyAgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBSRUdBUkRJTkcgVEhFIEZVTkNUSU9OIE9SIFBFUkZPUk1BTkNFIE9GCi0jICBUSElTIENPREUuICBUSElTIENPREUgTUFZIENPTlRBSU4gRVJST1JTLiAgSUJNIHNoYWxsIG5vdCBiZSBsaWFibGUKLSMgIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB5b3VyIHVzZSBvZiB0aGUgc2FtcGxlIGNvZGUsIGV2ZW4KLSMgIGlmIGl0IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLSMKLQotIyBUaGlzIGZpbGUgaXMgdXNlZCB0byB0ZXN0IHRoZSBQcm9wZXJ0aWVzIFZhbGlkYXRvci4KLSMKLQotTUlTTUFUQ0hFRF9CUkFDRVMgPSBUaGlzIGxpbmUgaGFzICd7MH0nIG1pc21hdGNoaW5nIGJyYWNlcy4KLU1JU01BVENIRURfQlJBQ0VTXzIgPSBUaGlzIGxpbmUgaGFzIHsgYSBtaXNtYXRjaGluZyBicmFjZS4KLU1JU01BVENIRURfQlJBQ0VTXzMgPSBUaGlzIGxpbmUgaGFzIH0gYSBtaXNtYXRjaGluZyBicmFjZS4KLU1JU01BVENIRURfQlJBQ0VTX09LQVkgPSBUaGlzIGxpbmUgaGFzIG5vICd7JyBtaXNtYXRjaGluZyBicmFjZXMgJ30nLgotTUlTTUFUQ0hFRF9CUkFDRVNfT0tBWTIgPSBUaGlzIGxpbmUgYWxzbyBoYXMgbm8gbWlzbWF0Y2hpbmcgYnJhY2VzIHswfSAneycgJ30nLgotCi1UT09fTUFOWV9BUkdVTUVOVFMgPSBNZXNzYWdlRm9ybWF0IGZvcm1hdHMgb25seSAxMCBwYXJhbWV0ZXJzIHswfSB7MX0gezJ9IHszfSB7NH0gezV9IHs2fSB7N30gezh9IHs5fSB7MTB9LgotVE9PX01BTllfQVJHVU1FTlRTXzIgPSBNZXNzYWdlRm9ybWF0IGZvcm1hdHMgb25seSAxMCBwYXJhbWV0ZXJzIHsxMH0uCi0KLU5FR0FUSVZFX0FSR1VNRU5UID0gVGhpcyBsaW5lIHVzZXMgYSBuZWdhdGl2ZSB7LTF9IGFyZ3VtZW50LgotQiA9IG9rYXkKLVJFRFVOREFOVF9BUkdVTUVOVCA9IFRoaXMgbGluZSB1c2VzIGEgcmVkdW5kYW50IHswfSB7MH0gYXJndW1lbnQuCi1NSVNTRURfUEFSTSA9IFRoaXMgbGluZSB1c2VzIHswfSBhbmQgezJ9IGJ1dCBub3QgKDEpLgotTkVFRFNfRE9VQkxFX0FQT1MgPSBUaGlzIGxpbmUgdXNlcyBhIHNpbmdsZSBhcG9zdHJvcGhlICgnKSBidXQgc2hvdWxkIHVzZSB0d28gezB9LgotTkVFRFNfU0lOR0xFX0FQT1MgPSBUaGlzIGxpbmUgdXNlcyBhIGRvdWJsZSBhcG9zdHJvcGhlICgnJykgYnV0IHNob3VsZCB1c2Ugb25lLgotQSA9IG9rYXkKLVNZTQotRFVQTElDQVRFX0lEID0gVGhpcyBsaW5lIHVzZXMgYSBkdXBsaWNhdGUgbWVzc2FnZSBpZC4KLURVUExJQ0FURV9JRCA9IFRoaXMgbGluZSBhbHNvIHVzZXMgYSBkdXBsaWNhdGUgbWVzc2FnZSBpZC4KLURVUExJQ0FURV9QUkVGSVggPSBBQUFBMDAwMFc6IFRoaXMgbGluZSB1c2VzIGEgZHVwbGljYXRlIG1lc3NhZ2UgcHJlZml4LgotPSBqamoKLQotRFVQTElDQVRFX1BSRUZJWDIgPSBBQUFBMDAwMFc6IFRoaXMgbGluZSBhbHNvIHVzZXMgYSBkdXBsaWNhdGUgbWVzc2FnZSBwcmVmaXguCi1aX0RVUExJQ0FURSA9IGpqagotWl9EVVBMSUNBVEUgPSBtbW0KLQotIyBUaGlzIGlzIGEgY29tbWVudAotWl9EVVBMSUNBVEUgPSBubm4KLUMgPSBva2F5Ci1GID0gYSBcCi1iIFwKLWMKLUQgPSBva2F5Ci0KLUNBU0UxID0gQUJDRDAwMDBFOiBCbGFoIEJsYWggQmxhaAotQ0FTRTIgPSBBQkNEMDAwMEUgIEJsYWggQmxhaCBCbGFoCi1DQVNFMyA9IEFCQ0QwMDAwRSA6IEJsYWggQmxhaCBCbGFoCi1DQVNFNCA9IEFCQ0QwMDAwRSAgQmxhaDpCbGFoIEJsYWgKLUNBU0U1ID0gQUJDRDAwMDBFIDoKLUNBU0U2ID0gQmxhaCBCbGFoIEJsYWggKGkuZS4sIG5vIHByZWZpeCkKLUNBU0U3ID0gQUJDRDAwMDBFOiBCbGFoCi1DQVNFOCA9IEFCQ0QwMDAwRSAgQmxhaAotQ0FTRTkgPSBBQkNEMDAwMEUgOiBCbGFoCi1DQVNFMTAgPSBBQkNEMDAwMEUgQmxhaAotQ0FTRTExID0gQUJDRDAwMDBFCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvdGVzdC90ZXN0Mi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlL3Rlc3QvdGVzdDIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRjMGYzMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvdGVzdC90ZXN0Mi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIwotIyBMaWNlbnNlZCBNYXRlcmlhbCAtIFByb3BlcnR5IG9mIElCTSAKLSMgKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMiwgMjAwMyAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAotIyBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIAotIyByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gCi0jCi0jICBESVNDTEFJTUVSIE9GIFdBUlJBTlRJRVMuCi0jICBUaGUgZm9sbG93aW5nIFtlbmNsb3NlZF0gY29kZSBpcyBzYW1wbGUgY29kZSBjcmVhdGVkIGJ5IElCTQotIyAgQ29ycG9yYXRpb24uIFRoaXMgc2FtcGxlIGNvZGUgaXMgbm90IHBhcnQgb2YgYW55IHN0YW5kYXJkIG9yIElCTQotIyAgcHJvZHVjdCBhbmQgaXMgcHJvdmlkZWQgdG8geW91IHNvbGVseSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXNzaXN0aW5nCi0jICB5b3UgaW4gdGhlIGRldmVsb3BtZW50IG9mIHlvdXIgYXBwbGljYXRpb25zLiAgVGhlIGNvZGUgaXMgcHJvdmlkZWQKLSMgICJBUyBJUyIuIElCTSBNQUtFUyBOTyBXQVJSQU5USUVTLCBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQKLSMgIE5PVCBMSU1JVEVEIFRPIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTCi0jICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIFJFR0FSRElORyBUSEUgRlVOQ1RJT04gT1IgUEVSRk9STUFOQ0UgT0YKLSMgIFRISVMgQ09ERS4gIFRISVMgQ09ERSBNQVkgQ09OVEFJTiBFUlJPUlMuICBJQk0gc2hhbGwgbm90IGJlIGxpYWJsZQotIyAgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgb3V0IG9mIHlvdXIgdXNlIG9mIHRoZSBzYW1wbGUgY29kZSwgZXZlbgotIyAgaWYgaXQgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotIwotCi0jCi0jIFRoaXMgZmlsZSBpcyB1c2VkIHRvIHRlc3QgdGhlIFByb3BlcnRpZXMgVmFsaWRhdG9yLgotIwotCi1JRDEgPSBUaGlzIGZpbGUgaGFzIG5vIGVycm9ycyBpbiBpdC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUvdHZ0cGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS90dnRwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTI1MGEzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnNhbXBsZS90dnRwbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4KLSAgIGlkPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnByb3AiCi0gICBuYW1lPSJQcm9wZXJ0aWVzIFZhbGlkYXRvciIKLSAgIHZlcnNpb249IjUuMS4wIgotICAgY2xhc3M9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24ucHJvcGVydGllcy53b3JrYmVuY2hpbXBsLlByb3BlcnRpZXNWYWxpZGF0b3JQbHVnaW4iPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBXaGVuIHRlc3RpbmcgVFZUIGluIEVKQkRlcGxveSwgYmVjYXVzZSBvcmcuZWNsaXBzZS5oZWxwIGlzbid0ICAgLS0+Ci0JPCEtLSBwYWNrYWdlZCB3aXRoIEVKQkRlcGxveSwgdGhpcyBwbHVnaW4gaXMgZGVhY3RpdmF0ZWQuIEhvd2V2ZXIsICAgLS0+Ci0JPCEtLSBiZWNhdXNlIHRoZSBUVlQgcGx1Z2luIGRvZXNuJ3Qgc2hpcCB0aGUgZG9jdW1lbnRhdGlvbiwgYWxsICAgICAgLS0+Ci0JPCEtLSByZWZlcmVuY2VzIHRvIHRoZSBoZWxwIGNhbiBiZSByZW1vdmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InJ1bnRpbWUvcHJvcGVydGllc1ZhbGlkYXRvci5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJydW50aW1lL3Byb3BlcnRpZXNWYWxGUy5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJydW50aW1lL3Byb3BlcnRpZXNWYWxXQi5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJydW50aW1lL2ZpbGVzeXN0ZW1GV0suamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgCi0gICAgPHJlcXVpcmVzPgotICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiIHZlcnNpb249IjIuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiIHZlcnNpb249IjIuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmNvcmUiIHZlcnNpb249IjIuMSIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgICA8aW1wb3J0IHBsdWdpbj0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbiIgZXhwb3J0PSJ0cnVlIiB2ZXJzaW9uPSI1LjEiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICAgPGltcG9ydCBwbHVnaW49ImNvbS5pYm0uZXRvb2xzLmxvZ2dpbmcudXRpbCIgdmVyc2lvbj0iNS4xIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgIDwvcmVxdWlyZXM+Ci0KLSAgICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gICAgPCEtLSBQcm9wZXJ0aWVzIFZhbGlkYXRvciBDb250cmlidXRpb25zICAgIC0tPgotICAgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgaWQ9IlByb3BlcnRpZXNWYWxpZGF0b3IiCi0gICAgICAgbmFtZT0iUHJvcGVydGllcyBWYWxpZGF0b3IiCi0gICAgICAgcG9pbnQ9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLSAgICAgICA8dmFsaWRhdG9yPgotICAgICAgICAgICA8cHJvamVjdE5hdHVyZSBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIvPgotICAgICAgICAgICA8ZmlsdGVyIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIgbmFtZUZpbHRlcj0iKi5wcm9wZXJ0aWVzIiBhY3Rpb249ImFkZCwgY2hhbmdlIi8+Ci0gICAgICAgICAgIDxydW4gY2xhc3M9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24ucHJvcGVydGllcy5Qcm9wZXJ0aWVzVmFsaWRhdG9yIiBlbmFibGVkPSJmYWxzZSIgYXN5bmM9InRydWUiLz4KLSAgICAgICAgICAgPGhlbHBlciBjbGFzcz0iY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5wcm9wZXJ0aWVzLndvcmtiZW5jaGltcGwuUHJvcGVydGllc0hlbHBlciIvPgotICAgICAgIDwvdmFsaWRhdG9yPgotICAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzc1YTUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJqVW5pdFdyYXBwZXIvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdC8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0ZXN0RndrLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5jdnNpZ25vcmUgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODRjNWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1iaW4KLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLXZhbGlkYXRpb250ZXN0LmphcgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8ucHJvamVjdCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZTNjY2MuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+Y29tLmlibS5ldG9vbHMudmFsaWRhdGlvbjwvcHJvamVjdD4KLQkJPHByb2plY3Q+Y29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5wcm9wPC9wcm9qZWN0PgotCQk8cHJvamVjdD5jb20uaWJtLnd0cC5jb21tb248L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmplbS53b3JrYmVuY2g8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ODY3OGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jU3VuIEZlYiAxMiAwMjo0ODo1NCBFU1QgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmZjg2OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1zb3VyY2UudmFsaWRhdGlvbnRlc3QuamFyID0galVuaXRXcmFwcGVyLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdC8sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RGd2svCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRlc3RJbnB1dC8sXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgdmFsaWRhdGlvbnRlc3QuamFyLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLW91dHB1dC52YWxpZGF0aW9udGVzdC5qYXIgPSBiaW4vCi1qYXJzLmNvbXBpbGUub3JkZXIgPSB2YWxpZGF0aW9udGVzdC5qYXIKLSAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYnVpbGQvYnVpbGRjb250cm9sLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MTQ3ZGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC9idWlsZGNvbnRyb2wucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotQ09OVEFDVD1ydXRoZGFseUBjYS5pYm0uY29tCi1Db21wb25lbnRTaG9ydE5hbWU9VmFsVGVzdAotQ29tcG9uZW50RnVsbE5hbWU9VmFsaWRhdGlvbiBCVlQgUGx1Z2luCi1Db21wb25lbnRDb21wZXRlbmN5PUJWVAotSmF2YUNvbXBpbGUuMT1zcmNqYXIKLUJ1aWxkVmVyaWZpY2F0aW9uLjE9ZGlyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC9wYWNrYWdlLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYnVpbGQvcGFja2FnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OTBkOGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC9wYWNrYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24udGVzdCIgZGVmYXVsdD0icGFja2FnaW5nUGx1Z2luIiBiYXNlZGlyPSIuLy4uIj4KLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGFja2FnZURpciIgdmFsdWU9IiIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLmRpcmVjdG9yeSIgIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uaWQiIHZhbHVlPSJjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLnRlc3QiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi52ZXJzaW9uIiAgdmFsdWU9IiIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0icGFja2FnaW5nUGx1Z2luIiBkZXBlbmRzPSJpbml0Ij4KLSAgICAgICAgPGVjaG8gbWVzc2FnZT0iJHtwbHVnaW4uaWR9Ii8+Ci0gICAgICAgIDxjb3B5IHRvZGlyPSIke3BhY2thZ2VEaXJ9L3BsdWdpbnMvJHtwbHVnaW4uaWR9XyR7cGx1Z2luLnZlcnNpb259Ij4KLSAgICAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtwbHVnaW4uZGlyZWN0b3J5fSI+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icGx1Z2luLnhtbCIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InRlc3R2YWxpZGF0aW9uLmJhdCIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InRlc3R2YWxpZGF0aW9uLnNoIi8+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0icnVudGltZS90ZXN0LmphciIvPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9InJ1bnRpbWUvalVuaXRXcmFwcGVyLmphciIvPgotICAgICAgICAgICAgPC9maWxlc2V0PgotICAgICAgICA8L2NvcHk+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL3NvdXJjZWphci50eHQgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2J1aWxkL3NvdXJjZWphci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YmQ0NzMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC9zb3VyY2VqYXIudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi10ZXN0Ci1qVW5pdFdyYXBwZXIKLQotCi0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC93c0J1aWxkLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvYnVpbGQvd3NCdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZGI5NWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9idWlsZC93c0J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCFET0NUWVBFIHByb2plY3QgWwotCTwhRU5USVRZIGJhc2VCdWlsZCBTWVNURU0gImZpbGU6Li4vLi4vd3NCdWlsZERlZi54bWwiPgotXT4KLQotPHByb2plY3QgbmFtZT0iYnVpbGRQbHVnaW4iIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLy4uIj4KLQotPCEtLSBpbmNsdWRlIHRoZSBjb21tb24geG1sIGJ1aWxkIGZpbGUgLS0+Ci0mYmFzZUJ1aWxkOwotCi08IS0tIGN1c3RvbWl6ZSB0aGUgamFyIGNyZWF0aW9uIGhlcmUgZm9yIG11bHRpLWphciBidWlsZHMgLS0+Ci08dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJwcmVwYXJlIiBpZj0icGx1Z2luLmlkIj4KLSAgICA8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkamFyIj4KLSAgICAgICAgPHBhcmFtIG5hbWU9Imphcm5hbWUiIHZhbHVlPSJ0ZXN0Ii8+Ci0gICAgICAgIDxwYXJhbSBuYW1lPSJqYXJjbGFzc3BhdGgiIHZhbHVlPSIke3BsdWdpbi5jbGFzc3BhdGh9Ii8+Ci0gICAgPC9hbnRjYWxsPgotCi0gICAgPGFudGNhbGwgdGFyZ2V0PSJidWlsZGphciI+Ci0gICAgICAgIDxwYXJhbSBuYW1lPSJqYXJuYW1lIiB2YWx1ZT0ialVuaXRXcmFwcGVyIi8+Ci0gICAgICAgIDxwYXJhbSBuYW1lPSJqYXJjbGFzc3BhdGgiIHZhbHVlPSIke3BsdWdpbi5jbGFzc3BhdGh9OyR7cGx1Z2luLmRpcmVjdG9yeX0vJHtwbHVnaW4ubGlicmFyeS5kaXJlY3Rvcnl9L3Rlc3QuamFyIi8+Ci0gICAgPC9hbnRjYWxsPgotCi08L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9BdXRvbWF0ZWRWYWxpZGF0aW9uQlZULmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0F1dG9tYXRlZFZhbGlkYXRpb25CVlQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiYzM1MC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0F1dG9tYXRlZFZhbGlkYXRpb25CVlQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEZlYiA5LCAyMDA1Ci0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIFN0eWxlIC0gQ29kZSBUZW1wbGF0ZXMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0OwotCi0vKioKLSAqIEBhdXRob3IgamlhbGluCi0gKgotICogVE9ETyBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgU3R5bGUgLSBDb2RlIFRlbXBsYXRlcwotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBqdW5pdC50ZXh0dWkuVGVzdFJ1bm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uYXBpLnRlc3QuQXBpVGVzdHNTdWl0ZTsKLQotCi0vKioKLSAqIEBhdXRob3IganNob2xsCi0gKgotICogVG8gY2hhbmdlIHRoaXMgZ2VuZXJhdGVkIGNvbW1lbnQgZ28gdG8gCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEF1dG9tYXRlZFZhbGlkYXRpb25CVlQgZXh0ZW5kcyBUZXN0U3VpdGUgewotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgYmFzZURpcmVjdG9yeSA9IG51bGw7Ci0gICAgCi0gICAgc3RhdGljIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIElQbHVnaW5EZXNjcmlwdG9yIHBsdWdpbkRlc2NyaXB0b3IgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QiKTsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKTsgCi0gICAgICAgIAlBdXRvbWF0ZWRWYWxpZGF0aW9uQlZULmJhc2VEaXJlY3RvcnkgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKHVybCkuZ2V0RmlsZSgpICsgInZhbGlkYXRpb25SZXNvdXJjZXMiICsgRmlsZS5zZXBhcmF0b3JDaGFyOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNpbmcgd29ya2luZyBkaXJlY3Rvcnkgc2luY2UgYSB3b3Jrc3BhY2UgVVJMIGNvdWxkIG5vdCBiZSBsb2NhdGVkLiIpOwotCQl9IAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IHVuaW1wbGVtZW50ZWRNZXRob2RzOwotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotICAgICAgICB1bmltcGxlbWVudGVkTWV0aG9kcyA9IDA7Ci0gICAgICAgIFRlc3RSdW5uZXIucnVuKHN1aXRlKCkpOwotICAgICAgICBpZiAodW5pbXBsZW1lbnRlZE1ldGhvZHMgPiAwKSB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlxuQ2FsbHMgdG8gd2FyblVuaW1wbDogIiArIHVuaW1wbGVtZW50ZWRNZXRob2RzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBBdXRvbWF0ZWRWYWxpZGF0aW9uQlZUKCkgewotICAgICAgICBzdXBlcigpOwotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSAoVGVzdFN1aXRlKSBBdXRvbWF0ZWRWYWxpZGF0aW9uQlZULnN1aXRlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VpdGUudGVzdENvdW50KCk7IGkrKykgewotICAgICAgICAgICAgYWRkVGVzdChzdWl0ZS50ZXN0QXQoaSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotICAgICAgICBUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0IGZvciBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Iik7Ci0gICAgICAgIC8vc3VpdGUuYWRkVGVzdChCVlRTdWl0ZS5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChBcGlUZXN0c1N1aXRlLnN1aXRlKCkpOwotICAgICAgICByZXR1cm4gc3VpdGU7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9CVlRTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9CVlRTdWl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTBjOTBhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvQlZUU3VpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5qdW5pdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5Lk9wZXJhdGlvblRlc3RjYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVmFsaWRhdG9yVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFZhbGlkYXRpb25VdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotCi0vKioKLSAqIFdyYXBzIHRoZSBleGlzdGluZyB2YWxpZGF0aW9uIGJ2dCBjb2RlIGluIGEgSlVuaXQgYXJ0aWZhY3QKLSAqIHNvIHRoYXQgdGhlIHRlc3RzIGNhbiBiZSBydW4gd2l0aGluIEpVbml0LiBJbnN0YW5jZXMgb2YgdGhpcwotICogY2xhc3Mgd3JhcCBhbGwgb2YgdGhlIFZhbGlkYXRvclN1aXRlIGluc3RhbmNlcyB0aGF0IG11c3QgYmUgcnVuLgotICovCi1wdWJsaWMgY2xhc3MgQlZUU3VpdGUgZXh0ZW5kcyBUZXN0U3VpdGUgewotCXByaXZhdGUgTWFwIF92YWxpZGF0b3JTdWl0ZXMgPSBudWxsOwotCQotCXB1YmxpYyBCVlRTdWl0ZSgpIHsKLQkJX3ZhbGlkYXRvclN1aXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWxvYWRWYWxpZGF0b3JTdWl0ZXMoKTsKLQkJbG9hZE9wZXJhdGlvblN1aXRlcygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZFZhbGlkYXRvclN1aXRlcygpIHsKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCi0JCVZhbGlkYXRvclRlc3RjYXNlW10gdG1kcyA9IEJWVFZhbGlkYXRpb25VdGlsaXR5LmdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IpOwotCQlmb3IoaW50IGk9MDsgaTx0bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZSB0bWQgPSB0bWRzW2ldOwotCi0JCQlpZih0bWQuaXNWaXNpYmxlKCkpIHsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSB0bWQuZ2V0VmFsaWRhdG9yTWV0YURhdGEoKTsKLQkJCQlWYWxpZGF0b3JTdWl0ZSB2cyA9IChWYWxpZGF0b3JTdWl0ZSlfdmFsaWRhdG9yU3VpdGVzLmdldCh2bWQpOwotCQkJCWlmKHZzID09IG51bGwpIHsKLQkJCQkJdnMgPSBuZXcgVmFsaWRhdG9yU3VpdGUodm1kKTsKLQkJCQl9Ci0JCQkJVmFsaWRhdG9yVGVzdCB2dCA9IG5ldyBWYWxpZGF0b3JUZXN0KHRtZCwgdnMpOwotCQkJCXZzLmFkZFRlc3QodnQpOwotCQkJCV92YWxpZGF0b3JTdWl0ZXMucHV0KHZtZCwgdnMpOwotCQkJfQotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IF92YWxpZGF0b3JTdWl0ZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlWYWxpZGF0b3JTdWl0ZSB2cyA9IChWYWxpZGF0b3JTdWl0ZSlpdGVyYXRvci5uZXh0KCk7Ci0JCQlhZGRUZXN0KHZzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9hZE9wZXJhdGlvblN1aXRlcygpIHsKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCi0JCU9wZXJhdGlvblRlc3RjYXNlW10gdG1kcyA9IEJWVFZhbGlkYXRpb25VdGlsaXR5LmdldE9wZXJhdGlvblRlc3RzKG1vbml0b3IpOwotCQlPcGVyYXRpb25TdWl0ZSBvcyA9IG5ldyBPcGVyYXRpb25TdWl0ZSgpOwotCQlmb3IoaW50IGk9MDsgaTx0bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlPcGVyYXRpb25UZXN0Y2FzZSB0bWQgPSB0bWRzW2ldOwotCi0JCQlpZih0bWQuaXNWaXNpYmxlKCkpIHsKLQkJCQlPcGVyYXRpb25UZXN0IG90ID0gbmV3IE9wZXJhdGlvblRlc3QodG1kLCBvcyk7Ci0JCQkJb3MuYWRkVGVzdChvdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWFkZFRlc3Qob3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJLy8gVHVybiBsb2dnaW5nIHRvIFNFVkVSRQotCQlCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLnNldExldmVsKExldmVsLlNFVkVSRSk7Ci0JCXJldHVybiBuZXcgQlZUU3VpdGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlZhbGlkYXRpb24gQlZUIFN1aXRlIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvQnVpbGRJbmZvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0J1aWxkSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWYwNmQxLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvQnVpbGRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5qdW5pdDsKLXB1YmxpYyBjbGFzcyBCdWlsZEluZm8gewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiTGljZW5zZWQgTWF0ZXJpYWxzIC0tIFByb3BlcnR5IG9mIElCTVxuKGMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCAyMDAxLDIwMDNcblVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdCdWlsZExldmVsID0gIjIwMDMxMTEyXzE5MTUtV0IyMTItQUQtVjUxMUQtVzUiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBsZXZlbCgpIHsgcmV0dXJuIGZnQnVpbGRMZXZlbDsgfQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0FCdWlsZExldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0pVbml0QnVmZmVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L0pVbml0QnVmZmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOWZlNjAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9KVW5pdEJ1ZmZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEFwciAxNiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGdvIHRvIAotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5qdW5pdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CdWZmZXJlZFRhc2tTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotCi0KLS8qKgotICogV2hlbiB0aGUgdGVzdHMgYXJlIHJ1biBhcyBwYXJ0IG9mIEpVbml0LCByZWRpcmVjdCB0aGUgb3V0cHV0Ci0gKiB0byB0aGUgSlVuaXQgdGVzdCBjYXNlLgotICovCi1wdWJsaWMgY2xhc3MgSlVuaXRCdWZmZXIgaW1wbGVtZW50cyBJQnVmZmVyIHsKLQlwcml2YXRlIFN0cmluZyBfbG9nRmlsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgQnVmZmVyZWRUYXNrU3RhdHVzIF9zdGF0dXMgPSBudWxsOwotCQotCUpVbml0QnVmZmVyKFN0cmluZyBsb2dGaWxlTmFtZSkgewotCQlfc3RhdHVzID0gbmV3IEJ1ZmZlcmVkVGFza1N0YXR1cyhnZXRMb2dGaWxlTmFtZShsb2dGaWxlTmFtZSksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCV9zdGF0dXMuc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRMb2dGaWxlTmFtZShTdHJpbmcgbG9nRmlsZU5hbWUpIHsKLQkJaWYoX2xvZ0ZpbGVOYW1lID09IG51bGwpIHsKLQkJCWxvZ0ZpbGVOYW1lID0gbG9nRmlsZU5hbWUucmVwbGFjZSgnICcsICdfJyk7Ci0JCQlJUGF0aCBzdGF0ZUxvY2F0aW9uID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCk7Ci0JCQlGaWxlIGxvZyA9IG5ldyBGaWxlKHN0YXRlTG9jYXRpb24udG9PU1N0cmluZygpLCBsb2dGaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCV9sb2dGaWxlTmFtZSA9IGxvZy5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCQlyZXR1cm4gX2xvZ0ZpbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExvZ0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gX3N0YXR1cy5nZXRMb2dGaWxlTmFtZSgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJX3N0YXR1cy5jbGVhcigpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjZGVsaW5lYXRlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZGVsaW5lYXRlKFN0cmluZyB0YXNrTmFtZSkgewotCQlfc3RhdHVzLmRlbGluZWF0ZSh0YXNrTmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI2dldFByb2dyZXNzTW9uaXRvcigpCi0JICovCi0JcHVibGljIElQcm9ncmVzc01vbml0b3IgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkgewotCQlyZXR1cm4gX3N0YXR1cy5nZXRQcm9ncmVzc01vbml0b3IoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjcmVwb3J0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXBvcnQoKSB7Ci0JCV9zdGF0dXMucmVwb3J0KCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciN3cml0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9zdGF0dXMud3JpdGUobWVzc2FnZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNhZGRFbGFwc2VkVGltZShqYXZhLmxhbmcuU3RyaW5nLCBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsYXBzZWRUaW1lKFN0cmluZyB0YXNrTmFtZSwgbG9uZyBlbGFwc2VkVGltZSkgewotCQlfc3RhdHVzLmFkZEVsYXBzZWRUaW1lKHRhc2tOYW1lLCBlbGFwc2VkVGltZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNhZGRFeGVjdXRpb25TdGF0dXMoamF2YS5sYW5nLlN0cmluZywgaW50LCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0ZXN0Y2FzZU5hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgaW50IHBhc3NPckZhaWwsIElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfc3RhdHVzLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0Y2FzZU5hbWUsIHN1YlRhc2tOYW1lLCBwYXNzT3JGYWlsLCBidWZmZXIsIG1lc3NhZ2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjYWRkR2xvYmFsRXhlY3V0aW9uU3RhdHVzKGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRlc3RQYXNzTmFtZSwgYm9vbGVhbiBwYXNzKSB7Ci0JCV9zdGF0dXMuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3RQYXNzTmFtZSwgcGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0ZXN0UGFzc05hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgYm9vbGVhbiBwYXNzKSB7Ci0JCV9zdGF0dXMuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3RQYXNzTmFtZSwgc3ViVGFza05hbWUsIHBhc3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjaXNTdWNjZXNzZnVsKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoKSB7Ci0JCXJldHVybiBfc3RhdHVzLmlzU3VjY2Vzc2Z1bCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjaXNTdWNjZXNzZnVsKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXJldHVybiBfc3RhdHVzLmlzU3VjY2Vzc2Z1bCh0ZXN0TmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L09wZXJhdGlvblN1aXRlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L09wZXJhdGlvblN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZjdkMGIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9PcGVyYXRpb25TdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQ7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB3cmFwIGFsbCBvZiB0aGUgb3BlcmF0aW9ucywgaW4gcGx1Z2luLnhtbCwKLSAqIGZvciB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25TdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0JcHJpdmF0ZSBKVW5pdEJ1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQotCXB1YmxpYyBPcGVyYXRpb25TdWl0ZSgpIHsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJWYWxpZGF0aW9uIEZyYW1ld29yayBUZXN0cyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSlVuaXRCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlpZihfYnVmZmVyID09IG51bGwpIHsKLQkJCV9idWZmZXIgPSBuZXcgSlVuaXRCdWZmZXIodG9TdHJpbmcoKSArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIi5sb2ciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIF9idWZmZXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUganVuaXQuZnJhbWV3b3JrLlRlc3QjcnVuKGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihUZXN0UmVzdWx0IHJlc3VsdCkgewotCQlzdXBlci5ydW4ocmVzdWx0KTsKLQkJZ2V0QnVmZmVyKCkucmVwb3J0KCk7IC8vIHJlcG9ydCBvbmx5IGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaW4gdGhpcyBzdWl0ZSBoYXZlIGZpbmlzaGVkCi0JCWdldEJ1ZmZlcigpLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9PcGVyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L09wZXJhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwYjc2Yi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L09wZXJhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5qdW5pdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuT3BlcmF0aW9uVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5UZXN0Y2FzZVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFJ1bm5lcjsKLQotCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJ1biBhbiBJV29ya3NwYWNlUnVubmFibGUgdGhhdCB0ZXN0cyB0aGUKLSAqIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIE9wZXJhdGlvblN1aXRlIF9zdWl0ZSA9IG51bGw7Ci0JcHJpdmF0ZSBPcGVyYXRpb25UZXN0Y2FzZSBfdG1kID0gbnVsbDsKLQotCXB1YmxpYyBPcGVyYXRpb25UZXN0KE9wZXJhdGlvblRlc3RjYXNlIHRtZCwgT3BlcmF0aW9uU3VpdGUgc3VpdGUpIHsKLQkJc3VwZXIodG1kLmdldE5hbWUoKSk7IC8vIHRoZSBtZXRob2QgbmFtZWQgInRlc3QiIHJ1bnMgdGhlIHRlc3QuCi0JCV90bWQgPSB0bWQ7Ci0JCV9zdWl0ZSA9IHN1aXRlOwotCX0KLQkKLQlwdWJsaWMgSlVuaXRCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlyZXR1cm4gX3N1aXRlLmdldEJ1ZmZlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gX3RtZC5nZXROYW1lKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNydW5UZXN0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gVGVzdGNhc2VVdGlsaXR5LmZpbmRQcm9qZWN0KF90bWQpOwotCQkJaWYoKHByb2plY3QgPT0gbnVsbCkgfHwgIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkvLyBGaWxlIG5lZWRzIHRvIGJlIGltcG9ydGVkIChpLmUuLCBzZXQgdXAgdGhlIHRlc3QpLgotCQkJCWlmKCFCVlRSdW5uZXIuc2luZ2xldG9uKCkuc2V0dXBUZXN0cyhnZXRCdWZmZXIoKSwgX3RtZCwgZmFsc2UpKSB7Ci0JCQkJCWZhaWwoIkNvdWxkIG5vdCBpbXBvcnQgaW5wdXQgZnJvbSBkaXJlY3RvcnkgIiArIFRlc3RjYXNlVXRpbGl0eS5nZXRJbnB1dERpcihfdG1kKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKCFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJZmFpbCgiUHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIGlzIG5vdCBhY2Nlc3NpYmxlLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCQotCQkJX3RtZC5ydW4oZ2V0QnVmZmVyKCksIHByb2plY3QpOwotCQkJaWYoIWdldEJ1ZmZlcigpLmlzU3VjY2Vzc2Z1bChfdG1kLmdldE5hbWUoKSkpIHsKLQkJCQlmYWlsKF90bWQuZ2V0TmFtZSgpICsgIiBmYWlsZWQuIFJlYWQgdGhlIGxvZyBmb3IgZGV0YWlscy4gIiArIGdldEJ1ZmZlcigpLmdldExvZ0ZpbGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBXaGV0aGVyIHRoaXMgdGVzdCBjYXNlIGZhaWxzIG9yIG5vdCwgc2VuZCBpdHMgcmVzdWx0cyB0byB0aGUgbG9nLgotCQkJZ2V0QnVmZmVyKCkuZGVsaW5lYXRlKF90bWQuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvVmFsaWRhdG9yU3VpdGUuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvVmFsaWRhdG9yU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmZWEzNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L2pVbml0V3JhcHBlci9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2p1bml0L1ZhbGlkYXRvclN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci0KLS8qKgotICogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3Mgd3JhcCBhbGwgb2YgdGhlIDx0ZXN0PiBpbnN0YW5jZXMsCi0gKiBjb250cmlidXRlZCBpbiBwbHVnaW4ueG1sLCBmb3Igb25lIHZhbGlkYXRvci4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIF92bWQgPSBudWxsOwotCXByaXZhdGUgSlVuaXRCdWZmZXIgX2J1ZmZlciA9IG51bGw7Ci0KLQlwdWJsaWMgVmFsaWRhdG9yU3VpdGUoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCV92bWQgPSB2bWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBfdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBKVW5pdEJ1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCWlmKF9idWZmZXIgPT0gbnVsbCkgewotCQkJX2J1ZmZlciA9IG5ldyBKVW5pdEJ1ZmZlcih0b1N0cmluZygpICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLmxvZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gX2J1ZmZlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdCNydW4oanVuaXQuZnJhbWV3b3JrLlRlc3RSZXN1bHQpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKFRlc3RSZXN1bHQgcmVzdWx0KSB7Ci0JCXN1cGVyLnJ1bihyZXN1bHQpOwotCQlnZXRCdWZmZXIoKS5yZXBvcnQoKTsgLy8gcmVwb3J0IG9ubHkgYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBpbiB0aGlzIHN1aXRlIGhhdmUgZmluaXNoZWQKLQkJZ2V0QnVmZmVyKCkuY2xlYXIoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvalVuaXRXcmFwcGVyL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvanVuaXQvVmFsaWRhdG9yVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9WYWxpZGF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOWIyMjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC9qVW5pdFdyYXBwZXIvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9qdW5pdC9WYWxpZGF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuanVuaXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlRlc3RjYXNlVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlZhbGlkYXRvclRlc3RjYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbC5CVlRSdW5uZXI7Ci0KLQotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgb25lIDx0ZXN0PiwgY29udHJpYnV0ZWQgaW4KLSAqIHBsdWdpbi54bWwsIGZvciBvbmUgdmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFZhbGlkYXRvclRlc3RjYXNlIF90bWQgPSBudWxsOwotCXByaXZhdGUgVmFsaWRhdG9yU3VpdGUgX3N1aXRlID0gbnVsbDsKLQotCXB1YmxpYyBWYWxpZGF0b3JUZXN0KFZhbGlkYXRvclRlc3RjYXNlIHRtZCwgVmFsaWRhdG9yU3VpdGUgc3VpdGUpIHsKLQkJc3VwZXIodG1kLmdldE5hbWUoKSk7IC8vIHRoZSBtZXRob2QgbmFtZWQgInRlc3QiIHJ1bnMgdGhlIHRlc3QuCi0JCV90bWQgPSB0bWQ7Ci0JCV9zdWl0ZSA9IHN1aXRlOwotCX0KLQkKLQlwdWJsaWMgSlVuaXRCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlyZXR1cm4gX3N1aXRlLmdldEJ1ZmZlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gX3RtZC5nZXRQcm9qZWN0TmFtZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZSNydW5UZXN0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBydW5UZXN0KCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCXRyeSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gVGVzdGNhc2VVdGlsaXR5LmZpbmRQcm9qZWN0KF90bWQpOwotCQkJaWYoKHByb2plY3QgPT0gbnVsbCkgfHwgIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQkvLyBGaWxlIG5lZWRzIHRvIGJlIGltcG9ydGVkIChpLmUuLCBzZXQgdXAgdGhlIHRlc3QpLgotCQkJCWlmKCFCVlRSdW5uZXIuc2luZ2xldG9uKCkuc2V0dXBUZXN0cyhnZXRCdWZmZXIoKSwgX3RtZCwgZmFsc2UpKSB7Ci0JCQkJCWZhaWwoIkNvdWxkIG5vdCBpbXBvcnQgaW5wdXQgZnJvbSBkaXJlY3RvcnkgIiArIFRlc3RjYXNlVXRpbGl0eS5nZXRJbnB1dERpcihfdG1kKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmKCFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJZmFpbCgiUHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIGlzIG5vdCBhY2Nlc3NpYmxlLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCQotCQkJX3RtZC5ydW4oZ2V0QnVmZmVyKCksIHByb2plY3QpOwotCQkJaWYoIWdldEJ1ZmZlcigpLmlzU3VjY2Vzc2Z1bChfdG1kLmdldE5hbWUoKSkpIHsKLQkJCQlmYWlsKF90bWQuZ2V0TmFtZSgpICsgIiBmYWlsZWQuIFJlYWQgdGhlIGxvZyBmb3IgZGV0YWlscy4gIiArIGdldEJ1ZmZlcigpLmdldExvZ0ZpbGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBXaGV0aGVyIHRoaXMgdGVzdCBjYXNlIGZhaWxzIG9yIG5vdCwgc2VuZCBpdHMgcmVzdWx0cyB0byB0aGUgbG9nLgotCQkJZ2V0QnVmZmVyKCkuZGVsaW5lYXRlKF90bWQuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvcGx1Z2luLnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcwYTQ0Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwbHVnaW4KLSAgIGlkPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0IgotICAgbmFtZT0iVmFsaWRhdGlvbiBUZXN0aW5nIENvbXBvbmVudCIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0idmFsaWRhdGlvbnRlc3QuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24iLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZW0ud29ya2JlbmNoIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamVtLnV0aWwiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmplbSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVtZi5lY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qMmVlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+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+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0LnhtbCBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkY2FhN2IuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0LiAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAgICAgICAgICAgLS0+Ci0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8IS0tIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9XC4uIi8+IC0tPgotCi0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8IS0tIFNldCB0aGUgZW52aXJvbm1lbnQgcHJvcGVydGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QiLz4KLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIKLSAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0XzMuMS4wL2xpYnJhcnkueG1sIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9Ii1EWG14NzAwTSIvPgotCi0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPCEtLSBUaGlzIHRhcmdldCBpbml0aWFsaXplcyBhbGwgb2YgdGhlIHRlc3RzIHRoYXQgd2lsbCBydW4uICAgICAgIC0tPgotICA8IS0tIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgLS0+IAotICA8IS0tIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgIDx0c3RhbXAvPgotICAgICAgPGRlbGV0ZT4KLSAgICAgICAgIDxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLWhvbWV9IiBpbmNsdWRlcz0ib3JnLioueG1sIi8+Ci0gICAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIHJ1bi4gICAgICAgICAgICAgIC0tPgotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0id29ya3NwYWNlIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2pzdF9mb2xkZXIiLz4KLSAgICAgIDxkZWxldGUgZGlyPSIke3dvcmtzcGFjZX0iIHF1aWV0PSJ0cnVlIi8+Ci0gICAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7d29ya3NwYWNlfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0Lmp1bml0LkF1dG9tYXRlZFZhbGlkYXRpb25CVlQiLz4KLSAgIAkgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zLyR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAJICA8cHJvcGVydHkgbmFtZT0iZXh0cmFWTWFyZ3MiIHZhbHVlPSIke2V4dHJhVk1hcmdzfSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyICAtLT4KLSAgPCEtLSBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvICAgICAgIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gICAgICAgICAgICAgICAgICAgLS0+Ci0gIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcuKi54bWwiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vYXBpL3Rlc3QvQXBpVGVzdHNTdWl0ZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL2FwaS90ZXN0L0FwaVRlc3RzU3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwNjdlMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vYXBpL3Rlc3QvQXBpVGVzdHNTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5hcGkudGVzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBBcGlUZXN0c1N1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQkKLQkgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCl7Ci0JICAgICAgICByZXR1cm4gbmV3IEFwaVRlc3RzU3VpdGUoKTsKLQkgICAgfQotCi0JcHVibGljIEFwaVRlc3RzU3VpdGUoKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZFRlc3QoVmFsaWRhdGlvblJlZ2lzdHJ5QXBpVGVzdC5zdWl0ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9hcGkvdGVzdC9WYWxpZGF0aW9uUmVnaXN0cnlBcGlUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vYXBpL3Rlc3QvVmFsaWRhdGlvblJlZ2lzdHJ5QXBpVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTE5N2Y5Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi9hcGkvdGVzdC9WYWxpZGF0aW9uUmVnaXN0cnlBcGlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLmFwaS50ZXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLlZhbGlkYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIFZhbGlkYXRpb25SZWdpc3RyeUFwaVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShWYWxpZGF0aW9uUmVnaXN0cnlBcGlUZXN0LmNsYXNzKTsKLQl9IAotCi0JcHVibGljIFZhbGlkYXRpb25SZWdpc3RyeUFwaVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFZhbGlkYXRpb25SZWdpc3RyeUFwaVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RfZ2V0VmFsaWRhdG9yKCkgewotCXRyeSB7Ci0JCVZhbGlkYXRpb25GYWN0b3J5IHZhbEZhY3RvcnkgPSBWYWxpZGF0aW9uRmFjdG9yeS5pbnN0YW5jZTsKLQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSB2YWxGYWN0b3J5LmdldFZhbGlkYXRvcigib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZWpiLndvcmtiZW5jaC52YWxpZGF0aW9uLlVJRWpiVmFsaWRhdG9yIik7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKHZhbGlkYXRvcik7Ci0JIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JICB9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CVlRWYWxpZGF0aW9uQmF0Y2guamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0JWVFZhbGlkYXRpb25CYXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGZhM2VlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0JWVFZhbGlkYXRpb25CYXRjaC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ib290LklQbGF0Zm9ybVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWwuQlZUUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbC5CVlRWYWxpZGF0aW9uVXRpbGl0eTsKLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQlZUVmFsaWRhdGlvbkJhdGNoIGltcGxlbWVudHMgSVBsYXRmb3JtUnVubmFibGUgewotCXByaXZhdGUgU3RyaW5nIF9kaXIgPSBudWxsOyAvLyBUaGUgdGVzdCBjYXNlcyAoLmVhciwgLmphcikgYXJlIGlkZW50aWZpZWQgdGhyb3VnaCBhIHJlbGF0aXZlIGRpcmVjdG9yeSwgYW5kIHRoaXMgaXMgdGhlIHBhcmVudCBvZiB0aGF0IHJlbGF0aXZlIGRpcmVjdG9yeS4KLQlwcml2YXRlIGJvb2xlYW4gX3ZlcmJvc2UgPSBmYWxzZTsKLQlzdGF0aWMgQm9vbGVhbiBfcGFzc2VkID0gbnVsbDsKLQkKLQlib29sZWFuIGlzVmVyYm9zZSgpIHsKLQkJcmV0dXJuIF92ZXJib3NlOwotCX0KLQkKLQl2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2KSB7Ci0JCV92ZXJib3NlID0gdjsKLQl9Ci0JCi0JU3RyaW5nIGdldERpcigpIHsKLQkJcmV0dXJuIF9kaXI7Ci0JfQotCQotCXZvaWQgc2V0RGlyKFN0cmluZyBkaXIpIHsKLQkJX2RpciA9IGRpcjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBhcnNlVXNlclNldHRpbmdzKE9iamVjdCBhcmdzKSB7Ci0JCWlmKGFyZ3MgPT0gbnVsbCkgewotCQkJLy8gbm90aGluZyB0byBzZXQKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYoYXJncyBpbnN0YW5jZW9mIFN0cmluZ1tdKSB7Ci0JCQlTdHJpbmdbXSB1c2VyU2V0dGluZ3MgPSAoU3RyaW5nW10pYXJnczsKLQkJCWlmKHVzZXJTZXR0aW5ncy5sZW5ndGggPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJZm9yKGludCBpPTA7IGk8dXNlclNldHRpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYodXNlclNldHRpbmdzW2ldLmVxdWFscygiLWRpciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc2V0RGlyKHVzZXJTZXR0aW5nc1tpKzFdKTsKLQkJCQl9Ci0JCQkJCi0JCQkJaWYodXNlclNldHRpbmdzW2ldLmVxdWFscygiLXRyYWNlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlzZXRWZXJib3NlKHRydWUpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gdHVybiBvbiBmcmFtZXdvcmsgdmFsaWRhdGlvbiBsb2dnaW5nCi0JCQlpZihpc1ZlcmJvc2UoKSkgewotCQkJCUJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkuc2V0TGV2ZWwoTGV2ZWwuRklORVNUKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogUGFyc2UgdGhlIHVzZXIncyBzZXR0aW5ncywgaW1wb3J0IHRoZSB0ZXN0IGNhc2VzLCBhbmQgcnVuIHRoZSB0ZXN0IGNhc2VzLgotCSAqLwotCXB1YmxpYyBPYmplY3QgcnVuKE9iamVjdCBhcmdzKSB0aHJvd3MgQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCXBhcnNlVXNlclNldHRpbmdzKGFyZ3MpOwotCi0JCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CQkKLQkJCQl0cnkgewotCQkJCQltb25pdG9yLnN1YlRhc2soIldvcmtzcGFjZSBpcyBsb2NhdGVkIGF0OiAiICsgQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQkJCUNvbnNvbGVCdWZmZXIgYnVmZmVyID0gbmV3IENvbnNvbGVCdWZmZXIoKTsKLQkJCQkJQlZUUnVubmVyLnNpbmdsZXRvbigpLnNldHVwVGVzdHMoYnVmZmVyLCBpc1ZlcmJvc2UoKSk7Ci0JCQkJCQotCQkJCQlpbnQgbnVtVGVzdHMgPSBCVlRWYWxpZGF0aW9uVXRpbGl0eS5udW1WYWxpZGF0b3JUZXN0cyhtb25pdG9yLCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCkpOwotCQkJCQlpbnQgbnVtUGFzc2VkID0gQlZUUnVubmVyLnNpbmdsZXRvbigpLnRlc3QoYnVmZmVyLCBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCkpOwotCQkJCQlfcGFzc2VkID0gKChudW1QYXNzZWQgPT0gbnVtVGVzdHMpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSk7Ci0JCQkJfQotCQkJCWNhdGNoKEJWVFZhbGlkYXRpb25FeGNlcHRpb24gZXhjKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9OwotCQkKLQkJdHJ5IHsKLQkJCUNvbnNvbGVQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBDb25zb2xlUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBtb25pdG9yKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJdGhyb3cgbmV3IEJWVFZhbGlkYXRpb25FeGNlcHRpb24oZXhjKTsKLQkJfQotCQlyZXR1cm4gX3Bhc3NlZDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CVlRWYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CVlRWYWxpZGF0aW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkODA5ZDkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0OwotCi1wdWJsaWMgY2xhc3MgQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JcHJpdmF0ZSBUaHJvd2FibGUgX3RhcmdldCA9IG51bGw7Ci0JCi0JcHVibGljIEJWVFZhbGlkYXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIHQpIHsKLQkJc2V0VGFyZ2V0RXhjZXB0aW9uKHQpOwotCX0KLQkKLQlwdWJsaWMgQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbihTdHJpbmcgcykgewotCQlzdXBlcihzKTsKLQl9Ci0JCi0JcHVibGljIEJWVFZhbGlkYXRpb25FeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSB0YXJnZXQpIHsKLQkJc3VwZXIocyk7Ci0JCXNldFRhcmdldEV4Y2VwdGlvbih0YXJnZXQpOwotCX0KLQkKLQlwdWJsaWMgVGhyb3dhYmxlIGdldFRhcmdldEV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIF90YXJnZXQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRhcmdldEV4Y2VwdGlvbihUaHJvd2FibGUgdGFyZ2V0KSB7Ci0JCV90YXJnZXQgPSB0YXJnZXQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQlZUVmFsaWRhdGlvblBsdWdpbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQlZUVmFsaWRhdGlvblBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTA1ZjU3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0JWVFZhbGlkYXRpb25QbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHlyZW5kZXIuRGVmYXVsdFBsdWdpblRyYWNlUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotLyoqCi0gKiBQbHVnaW4gZm9yIFRWVCB0ZXN0aW5nLgotICovCi1wdWJsaWMgY2xhc3MgQlZUVmFsaWRhdGlvblBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgQlZUVmFsaWRhdGlvblBsdWdpbiBpbnN0ID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCXByb3RlY3RlZCBzdGF0aWMgTG9nZ2VyIGxvZ2dlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBWYWxpZGF0aW9uVFZUUGx1Z2luIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIGRlc2NyaXB0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yCi0JICovCi0JcHVibGljIEJWVFZhbGlkYXRpb25QbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3QgPSB0aGlzOwotCX0KLQlwdWJsaWMgc3RhdGljIEJWVFZhbGlkYXRpb25QbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gaW5zdDsKLQl9Ci0JCi0JcHVibGljIEJWVFZhbGlkYXRpb25QbHVnaW4oSVBsdWdpbkRlc2NyaXB0b3IgcGQpIHsKLQkJdGhpcygpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklEKCkgewotCSAgICByZXR1cm4gUExVR0lOX0lEOwotCX0KLQkKLQlwdWJsaWMgTG9nZ2VyIGdldE1zZ0xvZ2dlcigpIHsKLQkJaWYgKGxvZ2dlciA9PSBudWxsKSB7Ci0JCQlsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKGdldFBsdWdpbklEKCkpOwotCQkJc2V0UmVuZGVyZXIobG9nZ2VyKTsKLQkJfQotCQlyZXR1cm4gbG9nZ2VyOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYUxvZ2dlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFJlbmRlcmVyKExvZ2dlciBhTG9nZ2VyKSB7Ci0JCW5ldyBEZWZhdWx0UGx1Z2luVHJhY2VSZW5kZXJlcihhTG9nZ2VyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGU9IGdldFBsdWdpbigpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKGJ1bmRsZSE9bnVsbCA/IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KSA6IGtleSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlyZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luUmVzb3VyY2UiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCWluc3QgPSBudWxsOwotCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQnVmZmVyZWRUYXNrU3RhdHVzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CdWZmZXJlZFRhc2tTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI1NDY4Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CdWZmZXJlZFRhc2tTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVGVzdGNhc2VVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlcjsKLQotCi1wdWJsaWMgY2xhc3MgQnVmZmVyZWRUYXNrU3RhdHVzIGV4dGVuZHMgVGFza1N0YXR1cyBpbXBsZW1lbnRzIElCdWZmZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV0xJTkUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgX21vbml0b3IgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIF9idWZmZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9sb2dGaWxlTmFtZSA9IG51bGw7Ci0JCi0JcHVibGljIEJ1ZmZlcmVkVGFza1N0YXR1cygpIHsKLQl9Ci0JCi0JcHVibGljIEJ1ZmZlcmVkVGFza1N0YXR1cyhTdHJpbmcgbG9nRmlsZU5hbWUpIHsKLQkJdGhpcyhsb2dGaWxlTmFtZSwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBCdWZmZXJlZFRhc2tTdGF0dXMoU3RyaW5nIGxvZ0ZpbGVOYW1lLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJX2J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOwotCQlzZXRMb2dGaWxlTmFtZShsb2dGaWxlTmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlzdXBlci5jbGVhcigpOwotCQlfYnVmZmVyID0gbnVsbDsKLQkJX2J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJX21vbml0b3IuZG9uZSgpOwotCQlfbW9uaXRvciA9IG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2dGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIF9sb2dGaWxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9nRmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJX2xvZ0ZpbGVOYW1lID0gbmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ0J1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCXJldHVybiBfYnVmZmVyOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNnZXRQcm9ncmVzc01vbml0b3IoKQotCSAqLwotCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJaWYoX21vbml0b3IgPT0gbnVsbCkgewotCQkJX21vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCXJldHVybiBfbW9uaXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbSkgewotCQlfbW9uaXRvciA9IG07Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI3JlcG9ydCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVwb3J0KCkgewotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJX2J1ZmZlci5hcHBlbmQoIj4+Pj4+Pj4+Pj4+Pj4+Pj5URVNUIFNVSVRFIFJFU1VMVFM+Pj4+Pj4+Pj4+Pj4+Pj4+Iik7IC8vJE5PTi1OTFMtMSQKLQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCi0JCWlmKGdldEVsYXBzZWRUaW1lKCkuc2l6ZSgpID4gMCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBnZXRFbGFwc2VkVGltZSgpLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQlsb25nIHRvdGFsID0gMDsKLQkJCV9idWZmZXIuYXBwZW5kKCI+Pj4+Pj4+Pj4+Pj4+Pj4+RUxBUFNFRCBUSU1FPj4+Pj4+Pj4+Pj4+Pj4+PiIpOyAvLyROT04tTkxTLTEkCi0JCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVN0cmluZyB0YXNrTmFtZSA9IChTdHJpbmcpaXRlcmF0b3IubmV4dCgpOwotCQkJCUxvbmcgZWxhcHNlZFRpbWUgPSAoTG9uZylnZXRFbGFwc2VkVGltZSgpLmdldCh0YXNrTmFtZSk7Ci0JCQkJdG90YWwgKz0gZWxhcHNlZFRpbWUubG9uZ1ZhbHVlKCk7Ci0JCQkJX2J1ZmZlci5hcHBlbmQoIlRvdGFsIGVsYXBzZWQgdGltZSBvZiB0YXNrICIpOyAvLyROT04tTkxTLTEkCi0JCQkJX2J1ZmZlci5hcHBlbmQodGFza05hbWUpOwotCQkJCV9idWZmZXIuYXBwZW5kKCIgaXMgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlfYnVmZmVyLmFwcGVuZChlbGFwc2VkVGltZSk7Ci0JCQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JCQl9Ci0JCQlfYnVmZmVyLmFwcGVuZCgiVG90YWwgdGltZSBvZiBhbGwgdGFza3MgaXMgIiArIHRvdGFsICsgIiwgd2hpY2ggaXMgIiArICh0b3RhbC8xMDAwLzYwKSArICIgbWludXRlcy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCQl9Ci0KLQkJaW50IHRvdE51bVBhc3MgPSAwOwotCQlNYXAgdGFza1N0YXR1cyA9IGdldFRhc2tTdGF0dXMoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0YXNrU3RhdHVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCQlfYnVmZmVyLmFwcGVuZCgiPj4+Pj4+Pj4+Pj4+Pj4+PlBBU1MvRkFJTCBTVU1NQVJZPj4+Pj4+Pj4+Pj4+Pj4+PiIpOyAvLyROT04tTkxTLTEkCi0JCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyB0YXNrTmFtZSA9IChTdHJpbmcpaXRlcmF0b3IubmV4dCgpOwotCQkJVGVzdFN0YXR1cyB0cyA9IChUZXN0U3RhdHVzKXRhc2tTdGF0dXMuZ2V0KHRhc2tOYW1lKTsKLQkJCV9idWZmZXIuYXBwZW5kKHRzKTsKLQkJCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCQkJaWYodHMuaXNTdWNjZXNzZnVsKCkpIHsKLQkJCQl0b3ROdW1QYXNzKys7Ci0JCQl9Ci0JCX0KLQkJCi0JCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCQlfYnVmZmVyLmFwcGVuZChORVdMSU5FKTsKLQkJX2J1ZmZlci5hcHBlbmQoIlRvdGFsIE51bWJlciBPZiBUZXN0czogIik7IC8vJE5PTi1OTFMtMSQKLQkJX2J1ZmZlci5hcHBlbmQobnVtVGVzdHMoKSk7Ci0JCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCQlfYnVmZmVyLmFwcGVuZCgiTnVtYmVyIFBhc3NlZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJX2J1ZmZlci5hcHBlbmQodG90TnVtUGFzcyk7Ci0JCV9idWZmZXIuYXBwZW5kKE5FV0xJTkUpOwotCQkKLQkJaWYoZ2V0TG9nRmlsZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQlfYnVmZmVyLmFwcGVuZCgiVGhpcyByZXBvcnQgaXMgc3RvcmVkIGluIHRoZSBmb2xsb3dpbmcgbG9nIGZpbGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCQlfYnVmZmVyLmFwcGVuZChnZXRMb2dGaWxlTmFtZSgpKTsKLQkKLQkJCVRlc3RjYXNlVXRpbGl0eS5mbHVzaChnZXRMb2dGaWxlTmFtZSgpLCBfYnVmZmVyLnRvU3RyaW5nKCksIHRydWUpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI2RlbGluZWF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGVsaW5lYXRlKFN0cmluZyB0ZXN0Y2FzZU5hbWUpIHsKLQkJVGFza1N0YXR1cy4gVGVzdFN0YXR1cyB0cyA9IGdldFRlc3RTdGF0dXModGVzdGNhc2VOYW1lKTsKLQkJaWYodHMgPT0gbnVsbCkgewotCQkJLy8gbm90aGluZyB0byByZXBvcnQKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmdCdWZmZXIgZXJyb3JzQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQllcnJvcnNCdWZmZXIuYXBwZW5kKHRzLm51bUZhaWx1cmUoKSk7Ci0JCWVycm9yc0J1ZmZlci5hcHBlbmQoIiBlcnJvcnMgd2VyZSByZXBvcnRlZCBhbmQgIik7IC8vJE5PTi1OTFMtMSQKLQkJZXJyb3JzQnVmZmVyLmFwcGVuZCh0cy5udW1XYXJuaW5ncygpKTsKLQkJZXJyb3JzQnVmZmVyLmFwcGVuZCgiIHdhcm5pbmdzIHdlcmUgcmVwb3J0ZWQuIFJlYWQgIik7IC8vJE5PTi1OTFMtMSQKLQkJZXJyb3JzQnVmZmVyLmFwcGVuZChnZXRMb2dGaWxlTmFtZSgpKTsKLQkJZXJyb3JzQnVmZmVyLmFwcGVuZCgiIGZvciBkZXRhaWxzLiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlKGVycm9yc0J1ZmZlci50b1N0cmluZygpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjd3JpdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgbWVzc2FnZSkgewotCQkvLyBDYW4ndCB3cml0ZSB0byB0aGUgSlVuaXQgbG9nLiBDYW4gb25seSB3cml0ZSB0byB0aGUgbG9nIGJ5IGZhaWxpbmcgdGhlCi0JCS8vIHRlc3QgY2FzZSB3aXRoIGEgbWVzc2FnZTsgaW5zdGVhZCwgd3JpdGUgdG8gdGhlIGJ1ZmZlciwgYW5kIHNlbmQgdGhpcwotCQkvLyBpbmZvcm1hdGlvbiB0byBhIGxvZyBpbiB0aGUgdmFsaWRhdGlvbi50ZXN0IHBsdWdpbidzIHN0YXRlIGxvY2F0aW9uLgotCQlfYnVmZmVyLmFwcGVuZChtZXNzYWdlKTsKLQkJX2J1ZmZlci5hcHBlbmQoTkVXTElORSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvQnVpbGRJbmZvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CdWlsZEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyYzZlZi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9CdWlsZEluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0OwotcHVibGljIGNsYXNzIEJ1aWxkSW5mbyB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICJMaWNlbnNlZCBNYXRlcmlhbHMgLS0gUHJvcGVydHkgb2YgSUJNXG4oYykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIDIwMDEsMjAwM1xuVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBmZ0J1aWxkTGV2ZWwgPSAiMjAwMzExMTJfMTkxNS1XQjIxMi1BRC1WNTExRC1XNSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTQUJ1aWxkTGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0NvbnNvbGVCdWZmZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0NvbnNvbGVCdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4YmRjYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9Db25zb2xlQnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotCi0KLS8qKgotICogU2VuZHMgdGhlIFRlc3RDYXNlR2VuZXJhdG9yT3BlcmF0aW9uIG91dHB1dCB0byBTeXN0ZW0ub3V0LgotICovCi1wdWJsaWMgY2xhc3MgQ29uc29sZUJ1ZmZlciBpbXBsZW1lbnRzIElCdWZmZXIgewotCXByaXZhdGUgQnVmZmVyZWRUYXNrU3RhdHVzIF9zdGF0dXMgPSBudWxsOwotCQotCXB1YmxpYyBDb25zb2xlQnVmZmVyKCkgewotCQlfc3RhdHVzID0gbmV3IEJ1ZmZlcmVkVGFza1N0YXR1cygpOyAvLyBubyBsb2cgZmlsZQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI3JlcG9ydCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVwb3J0KCkgewotCQlfc3RhdHVzLnJlcG9ydCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oX3N0YXR1cy5nZXRCdWZmZXIoKS50b1N0cmluZygpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJX3N0YXR1cy5jbGVhcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExvZ0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gX3N0YXR1cy5nZXRMb2dGaWxlTmFtZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNkZWxpbmVhdGUoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxpbmVhdGUoU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCV9zdGF0dXMuZGVsaW5lYXRlKHRhc2tOYW1lKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIjZ2V0UHJvZ3Jlc3NNb25pdG9yKCkKLQkgKi8KLQlwdWJsaWMgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCXJldHVybiBfc3RhdHVzLmdldFByb2dyZXNzTW9uaXRvcigpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciN3cml0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9zdGF0dXMud3JpdGUobWVzc2FnZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNhZGRFbGFwc2VkVGltZShqYXZhLmxhbmcuU3RyaW5nLCBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsYXBzZWRUaW1lKFN0cmluZyB0YXNrTmFtZSwgbG9uZyBlbGFwc2VkVGltZSkgewotCQlfc3RhdHVzLmFkZEVsYXBzZWRUaW1lKHRhc2tOYW1lLCBlbGFwc2VkVGltZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNhZGRFeGVjdXRpb25TdGF0dXMoamF2YS5sYW5nLlN0cmluZywgaW50LCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0ZXN0Y2FzZU5hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgaW50IHBhc3NPckZhaWwsIElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfc3RhdHVzLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0Y2FzZU5hbWUsIHN1YlRhc2tOYW1lLCBwYXNzT3JGYWlsLCBidWZmZXIsIG1lc3NhZ2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjYWRkR2xvYmFsRXhlY3V0aW9uU3RhdHVzKGphdmEubGFuZy5TdHJpbmcsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHRlc3RQYXNzTmFtZSwgYm9vbGVhbiBwYXNzKSB7Ci0JCV9zdGF0dXMuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3RQYXNzTmFtZSwgcGFzcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0ZXN0UGFzc05hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgYm9vbGVhbiBwYXNzKSB7Ci0JCV9zdGF0dXMuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3RQYXNzTmFtZSwgc3ViVGFza05hbWUsIHBhc3MpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjaXNTdWNjZXNzZnVsKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoKSB7Ci0JCXJldHVybiBfc3RhdHVzLmlzU3VjY2Vzc2Z1bCgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSVRlc3RTdGF0dXMjaXNTdWNjZXNzZnVsKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCXJldHVybiBfc3RhdHVzLmlzU3VjY2Vzc2Z1bCh0ZXN0TmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyI3NldFByb2dyZXNzTW9uaXRvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCV9zdGF0dXMuc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0NvbnNvbGVQcm9ncmVzc01vbml0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L0NvbnNvbGVQcm9ncmVzc01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZkOWY2Zi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9Db25zb2xlUHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBUaGlzIHByb2dyZXNzIG1vbml0b3IgZGlyZWN0cyBhbGwgdGFzayBpbmZvcm1hdGlvbiB0byBzdGQub3V0LgotICovCi1wdWJsaWMgY2xhc3MgQ29uc29sZVByb2dyZXNzTW9uaXRvciBpbXBsZW1lbnRzIElQcm9ncmVzc01vbml0b3IgewotCXByaXZhdGUgaW50IF90b3RhbFdvcmsgPSAwOwotCXByaXZhdGUgaW50IF93b3JrRG9uZVNvRmFyID0gMDsKLQlwcml2YXRlIGJvb2xlYW4gX2NhbmNlbFJlcXVlc3RlZCA9IGZhbHNlOwotCQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNiZWdpblRhc2soU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5UYXNrKFN0cmluZyBuYW1lLCBpbnQgdG90YWxXb3JrKSB7Ci0JCV90b3RhbFdvcmsgPSB0b3RhbFdvcms7Ci0JCXJlcG9ydChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2RvbmUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvbmUoKSB7Ci0JCWludCB3b3JrUmVtYWluaW5nID0gX3RvdGFsV29yayAtIF93b3JrRG9uZVNvRmFyOwotCQl3b3JrZWQod29ya1JlbWFpbmluZyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNpbnRlcm5hbFdvcmtlZChkb3VibGUpCi0JICovCi0JcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZG91YmxlIHdvcmspIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2lzQ2FuY2VsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0JCXJldHVybiBfY2FuY2VsUmVxdWVzdGVkOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3Ijc2V0Q2FuY2VsZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKSB7Ci0JCV9jYW5jZWxSZXF1ZXN0ZWQgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI3NldFRhc2tOYW1lKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgbmFtZSkgewotCQlyZXBvcnQobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciNzdWJUYXNrKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7Ci0JCXJlcG9ydChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI3dvcmtlZChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgd29ya2VkKGludCB3b3JrKSB7Ci0JCV93b3JrRG9uZVNvRmFyICs9IHdvcms7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydChTdHJpbmcgbWVzc2FnZSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvSU9wZXJhdGlvblJ1bm5hYmxlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9JT3BlcmF0aW9uUnVubmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q3YjY2ZC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9JT3BlcmF0aW9uUnVubmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci0KLQotLyoqCi0gKiBJbnN0YW5jZXMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIHJ1biBhcyBwYXJ0IG9mIHRoZSBUZXN0IENvbGxlY3RvciBCVlQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9wZXJhdGlvblJ1bm5hYmxlIGV4dGVuZHMgSVdvcmtzcGFjZVJ1bm5hYmxlIHsKLQlwdWJsaWMgdm9pZCBzZXRCdWZmZXIoSUJ1ZmZlciBiKTsKLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHApOwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHRlc3ROYW1lKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L1Rhc2tTdGF0dXMuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L1Rhc2tTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI5ODlkNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9UYXNrU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1czsKLQotCi0vKioKLSAqIEFsbCBvZiB0aGUgSUJ1ZmZlciBpbnN0YW5jZXMgbmVlZCB0byBiZSBhYmxlIHRvIHRyYWNrIGVsYXBzZWQgdGltZQotICogYW5kIGV4ZWN1dGlvbiBzdGF0dXMuIEVhY2ggYnVmZmVyIGNhbiBjcmVhdGUgYW4gaW50ZXJuYWwgaW5zdGFuY2Ugb2YKLSAqIHRoaXMgY2xhc3MgdG8gcGVyZm9ybSB0aG9zZSB0YXNrcy4KLSAqLwotcHVibGljIGNsYXNzIFRhc2tTdGF0dXMgaW1wbGVtZW50cyBJVGVzdFN0YXR1cyB7Ci0JcHJpdmF0ZSBNYXAgX2VsYXBzZWRUaW1lID0gbnVsbDsKLQlwcml2YXRlIE1hcCBfdGFza1N0YXR1cyA9IG51bGw7Ci0KLQlwdWJsaWMgVGFza1N0YXR1cygpIHsKLQkJX2VsYXBzZWRUaW1lID0gbmV3IEhhc2hNYXAoKTsKLQkJX3Rhc2tTdGF0dXMgPSBuZXcgSGFzaE1hcCgpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlciNhZGRFbGFwc2VkVGltZShTdHJpbmcsIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWxhcHNlZFRpbWUoU3RyaW5nIHRhc2tOYW1lLCBsb25nIGVsYXBzZWRUaW1lKSB7Ci0JCUxvbmcgdGltZSA9IChMb25nKV9lbGFwc2VkVGltZS5nZXQodGFza05hbWUpOwotCQlpZih0aW1lID09IG51bGwpIHsKLQkJCXRpbWUgPSBuZXcgTG9uZyhlbGFwc2VkVGltZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aW1lID0gbmV3IExvbmcodGltZS5sb25nVmFsdWUoKSArIGVsYXBzZWRUaW1lKTsKLQkJfQotCQlfZWxhcHNlZFRpbWUucHV0KHRhc2tOYW1lLCB0aW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0YXNrTmFtZSwgYm9vbGVhbiBwYXNzKSB7Ci0JCWFkZEV4ZWN1dGlvblN0YXR1cyh0YXNrTmFtZSwgbnVsbCwgcGFzcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGFza05hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgYm9vbGVhbiBwYXNzKSB7Ci0JCWludCBzdWNjZXNzID0gKHBhc3MpID8gSVRlc3RTdGF0dXMuUEFTUyA6IElUZXN0U3RhdHVzLkZBSUw7Ci0JCWFkZEV4ZWN1dGlvblN0YXR1cyh0YXNrTmFtZSwgc3ViVGFza05hbWUsIHN1Y2Nlc3MsIG51bGwsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgaW50IG51bVRlc3RzKCkgewotCQlyZXR1cm4gX3Rhc2tTdGF0dXMuc2l6ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTWFwIGdldEVsYXBzZWRUaW1lKCkgewotCQlyZXR1cm4gX2VsYXBzZWRUaW1lOwotCX0KLQkKLQlwcm90ZWN0ZWQgTWFwIGdldFRhc2tTdGF0dXMoKSB7Ci0JCXJldHVybiBfdGFza1N0YXR1czsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0ZXN0Y2FzZU5hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgaW50IHNldmVyaXR5LCBJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJVGVzdFN0YXR1cyB0cyA9IGdldFRlc3RTdGF0dXModGVzdGNhc2VOYW1lKTsKLQkJaWYodHMgPT0gbnVsbCkgewotCQkJdHMgPSBuZXcgVGVzdFN0YXR1cyh0ZXN0Y2FzZU5hbWUpOwotCQkJX3Rhc2tTdGF0dXMucHV0KHRlc3RjYXNlTmFtZSwgdHMpOwotCQl9Ci0JCWlmKHN1YlRhc2tOYW1lID09IG51bGwpIHsKLQkJCXRzLmFkZEV4ZWN1dGlvblN0YXR1cyhzZXZlcml0eSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0cy5hZGRFeGVjdXRpb25TdGF0dXMoc3ViVGFza05hbWUsIHNldmVyaXR5KTsKLQkJfQotCi0JCWlmKG1lc3NhZ2UgIT0gbnVsbCkgewotCQkJYnVmZmVyLndyaXRlKG1lc3NhZ2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBUZXN0U3RhdHVzIGdldFRlc3RTdGF0dXMoU3RyaW5nIHRlc3RjYXNlTmFtZSkgewotCQlyZXR1cm4gKFRlc3RTdGF0dXMpX3Rhc2tTdGF0dXMuZ2V0KHRlc3RjYXNlTmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JVGVzdFN0YXR1cyNpc1N1Y2Nlc3NmdWwoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3VjY2Vzc2Z1bCgpIHsKLQkJaWYoX3Rhc2tTdGF0dXMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlJdGVyYXRvciBpdGVyYXRvciA9IF90YXNrU3RhdHVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHRzTmFtZSA9IChTdHJpbmcpaXRlcmF0b3IubmV4dCgpOwotCQkJVGVzdFN0YXR1cyB0cyA9IChUZXN0U3RhdHVzKV90YXNrU3RhdHVzLmdldCh0c05hbWUpOwotCQkJaWYodHMgPT0gbnVsbCB8fCAhdHMuaXNTdWNjZXNzZnVsKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3NmdWwoU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCWlmKF90YXNrU3RhdHVzLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJVGVzdFN0YXR1cyB0cyA9IChUZXN0U3RhdHVzKV90YXNrU3RhdHVzLmdldCh0ZXN0TmFtZSk7Ci0JCWlmKHRzID09IG51bGwgfHwgIXRzLmlzU3VjY2Vzc2Z1bCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlfdGFza1N0YXR1cy5jbGVhcigpOwotCQlfZWxhcHNlZFRpbWUuY2xlYXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGNsYXNzIFRlc3RDb3VudCB7Ci0JCXB1YmxpYyBpbnQgbnVtUmFuID0gMDsKLQkJcHVibGljIGludCBudW1XYXJuID0gMDsgLy8gTnVtYmVyIG9mIHdhcm5pbmcgbWVzc2FnZXMgcmVwb3J0ZWQgZm9yIGEgdGVzdCBjYXNlLgotCQlwdWJsaWMgaW50IG51bUZhaWwgPSAwOyAvLyBOdW1iZXIgb2YgZmFpbHVyZSBtZXNzYWdlcyByZXBvcnRlZCBmb3IgYSB0ZXN0IGNhc2UuCi0JCXB1YmxpYyBpbnQgbnVtUGFzcyA9IDA7IC8vIE51bWJlciBvZiB0ZXN0IGNhc2VzIHRoYXQgcGFzc2VkLgotCX0KLQotCS8qKgotCSAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHRyYWNrIHRoZSBudW1iZXIgb2YgdGVzdCBydW5zIGFuZCB0aGUgCi0JICogbnVtYmVyIG9mIHRlc3QgY2FzZXMgdGhhdCBwYXNzLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBUZXN0U3RhdHVzIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXByaXZhdGUgU3RyaW5nIF90ZXN0Y2FzZU5hbWUgPSBudWxsOwotCQlwcml2YXRlIE1hcCBfdGVzdFN0YXR1cyA9IG51bGw7Ci0JCQotCQkvKioKLQkJICogTmFtZSBtdXN0IG5vdCBiZSBudWxsLgotCQkgKi8KLQkJcHVibGljIFRlc3RTdGF0dXMoU3RyaW5nIG5hbWUpIHsKLQkJCV90ZXN0Y2FzZU5hbWUgPSBuYW1lOwotCQkJX3Rlc3RTdGF0dXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhZGRFeGVjdXRpb25TdGF0dXMoU3RyaW5nIHN1YlRhc2tOYW1lLCBpbnQgc2V2ZXJpdHkpIHsKLQkJCVRlc3RDb3VudCBzb0ZhciA9IChUZXN0Q291bnQpX3Rlc3RTdGF0dXMuZ2V0KHN1YlRhc2tOYW1lKTsKLQkJCWlmKHNvRmFyID09IG51bGwpIHsKLQkJCQlzb0ZhciA9IG5ldyBUZXN0Q291bnQoKTsKLQkJCX0KLQkJCXNvRmFyLm51bVJhbisrOwotCQkJc3dpdGNoKHNldmVyaXR5KSB7Ci0JCQkJY2FzZShJVGVzdFN0YXR1cy5XQVJOKTogewotCQkJCQlzb0Zhci5udW1XYXJuKys7Ci0JCQkJCXNvRmFyLm51bVBhc3MrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQotCQkJCWNhc2UoSVRlc3RTdGF0dXMuRkFJTCk6IHsKLQkJCQkJc29GYXIubnVtRmFpbCsrOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJCi0JCQkJY2FzZShJVGVzdFN0YXR1cy5QQVNTKTogewotCQkJCQlzb0Zhci5udW1QYXNzKys7Ci0JCQkJfQotCQkJCQotCQkJCWRlZmF1bHQ6IHsKLQkJCQkJLy8gY2hhbmdlIG5vdGhpbmcKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlfdGVzdFN0YXR1cy5wdXQoc3ViVGFza05hbWUsIHNvRmFyKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKGludCBzZXZlcml0eSkgewotCQkJYWRkRXhlY3V0aW9uU3RhdHVzKG51bGwsIHNldmVyaXR5KTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUZXN0Y2FzZU5hbWUoKSB7Ci0JCQlyZXR1cm4gX3Rlc3RjYXNlTmFtZTsKLQkJfQotCQkKLQkJcHVibGljIGludCBudW1XYXJuaW5ncygpIHsKLQkJCWludCBudW1XYXJuaW5ncyA9IDA7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IF90ZXN0U3RhdHVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlUZXN0Q291bnQgdGMgPSAoVGVzdENvdW50KWl0ZXJhdG9yLm5leHQoKTsKLQkJCQludW1XYXJuaW5ncyArPSB0Yy5udW1XYXJuOwotCQkJfQotCQkJcmV0dXJuIG51bVdhcm5pbmdzOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IG51bUZhaWx1cmUoKSB7Ci0JCQlpbnQgbnVtRmFpbCA9IDA7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IF90ZXN0U3RhdHVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlUZXN0Q291bnQgdGMgPSAoVGVzdENvdW50KWl0ZXJhdG9yLm5leHQoKTsKLQkJCQludW1GYWlsICs9IHRjLm51bUZhaWw7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtRmFpbDsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsKCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBfdGVzdFN0YXR1cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJVGVzdENvdW50IHRjID0gKFRlc3RDb3VudClpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYodGMubnVtRmFpbCAhPSAwKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCWludCB0b3RhbCA9IDA7Ci0JCQlpbnQgcGFzcyA9IDA7Ci0JCQlpbnQgZmFpbCA9IDA7Ci0JCQlpbnQgd2FybiA9IDA7Ci0JCQkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX3Rlc3RTdGF0dXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCVRlc3RDb3VudCB0YyA9IChUZXN0Q291bnQpaXRlcmF0b3IubmV4dCgpOwotCQkJCXRvdGFsKys7Ci0JCQkJZmFpbCArPSB0Yy5udW1GYWlsOwotCQkJCXdhcm4gKz0gdGMubnVtV2FybjsKLQkJCQlwYXNzICs9IHRjLm51bVBhc3M7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGdldFRlc3RjYXNlTmFtZSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIiBUb3RhbDoiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZCh0b3RhbCk7Ci0JCQlidWZmZXIuYXBwZW5kKCIgW1Bhc3M6ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHBhc3MpOwotCQkJYnVmZmVyLmFwcGVuZCgiIEZhaWw6ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKGZhaWwpOwotCQkJYnVmZmVyLmFwcGVuZCgiIFdhcm46ICIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKHdhcm4pOwotCQkJYnVmZmVyLmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYobyBpbnN0YW5jZW9mIFRlc3RTdGF0dXMpIHsKLQkJCQlUZXN0U3RhdHVzIHMgPSAoVGVzdFN0YXR1cylvOwotCQkJCXJldHVybihfdGVzdGNhc2VOYW1lLmVxdWFscyhzLmdldFRlc3RjYXNlTmFtZSgpKSk7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiBnZXRUZXN0Y2FzZU5hbWUoKS5oYXNoQ29kZSgpOwotCQl9Ci0JCQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS51dGlsLkNvbXBhcmF0b3IjY29tcGFyZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQlpZighKG8xIGluc3RhbmNlb2YgVGVzdFN0YXR1cykgJiYgKG8yIGluc3RhbmNlb2YgVGVzdFN0YXR1cykpIHsKLQkJCQkvLyBTaG91bGQgbmV2ZXIgaGFwcGVuLCBidXQgaWYgaXQgZG9lcywgc2F5IHRoYXQgdGhlc2Ugbm9uLVRlc3RTdGF0dXMgb2JqZWN0cyBhcmUgZXF1YWwuCi0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCVRlc3RTdGF0dXMgYSA9IChUZXN0U3RhdHVzKW8xOwotCQkJVGVzdFN0YXR1cyBiID0gKFRlc3RTdGF0dXMpbzI7Ci0JCQlyZXR1cm4gYS5nZXRUZXN0Y2FzZU5hbWUoKS5jb21wYXJlVG8oYi5nZXRUZXN0Y2FzZU5hbWUoKSk7CQkJCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9WYWxpZGF0aW9uVHlwZUVudW0uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L1ZhbGlkYXRpb25UeXBlRW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmUxMGMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L1ZhbGlkYXRpb25UeXBlRW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLQotLyoqCi0gKiBFbnVtZXJhdGlvbiBvZiB0aGUgdHlwZXMgb2YgdmFsaWRhdGlvbnMgdGhhdCBjYW4gYmUgcnVuLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvblR5cGVFbnVtIHsKLQlwcml2YXRlIFZhbGlkYXRpb25UeXBlRW51bSgpIHsKLQkJLy8gRG8gbm90IHBlcm1pdCBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyB0byBiZSBjcmVhdGVkLgotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVU5fVkFMSURBVElPTiA9IDA7IC8vIE1hbnVhbCBmdWxsIGludm9jYXRpb24gb2YgYSB2YWxpZGF0aW9uIGJ5IGEgdXNlci4gQWxsIHZhbGlkYXRvcnMgbXVzdCBzdXBwb3J0IHRoaXMgdHlwZSBvZiB2YWxpZGF0aW9uLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZVTExfVkFMSURBVElPTiA9IEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRDsgLy8gTWFudWFsIGludm9jYXRpb24gb2YgYSBmdWxsIGJ1aWxkIGJ5IGEgdXNlciB0aGF0IHRyaWdnZXJzIGEgZnVsbCB2YWxpZGF0aW9uLiBWYWxpZGF0b3JzIGNhbiwgYnV0IGFyZSBub3QgcmVxdWlyZWQgdG8sIHN1cHBvcnQgdGhpcyB0eXBlIG9mIHZhbGlkYXRpb24uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DUkVNRU5UQUxfVkFMSURBVElPTiA9IEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQ7IC8vIE1hbnVhbCBpbnZvY2F0aW9uIG9mIGFuIGluY3JlbWVudGFsIGJ1aWxkIGJ5IGEgdXNlciB0aGF0IHRyaWdnZXJzIGFuIGluY3JlbWVudGFsIHZhbGlkYXRpb24uIFZhbGlkYXRvcnMgY2FuLCBidXQgYXJlIG5vdCByZXF1aXJlZCB0bywgc3VwcG9ydCB0aGlzIHR5cGUgb2YgdmFsaWRhdGlvbi4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVVRPX1ZBTElEQVRJT04gPSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkFVVE9fQlVJTEQ7IC8vIEF1dG9tYXRpYyBpbnZvY2F0aW9uIG9mIGFuIGluY3JlbWVudGFsIGJ1aWxkIHRoYXQgdHJpZ2dlcnMgYW4gaW5jcmVtZW50YWwgdmFsaWRhdGlvbi4gVmFsaWRhdG9ycyBjYW4sIGJ1dCBhcmUgbm90IHJlcXVpcmVkIHRvLCBzdXBwb3J0IHRoaXMgdHlwZSBvZiB2YWxpZGF0aW9uLgotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTl9WQUxJREFUSU9OX05BTUUgPSAiUlVOX1ZBTElEQVRJT04iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNZTkNfTkFNRSA9ICJBU1lOQyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNSRU1FTlRBTF9WQUxJREFUSU9OX05BTUUgPSAiSU5DUkVNRU5UQUxfQlVJTEQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTF9WQUxJREFUSU9OX05BTUUgPSAiRlVMTF9CVUlMRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX1ZBTElEQVRJT05fTkFNRSA9ICJBVVRPX0JVSUxEIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L0JWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZTJlM2YuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LklPcGVyYXRpb25SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JSW1wb3J0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLQotLyoqCi0gKiBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgaXMgYSBzaW5nbGV0b24gd2hvIHJlYWRzIHRoZSBwbHVnaW4gcmVnaXN0cnkKLSAqIGZvciBWYWxpZGF0b3IgZXh0ZW5zaW9ucy4gVGhlIHJlYWQgaXMgZG9uZSBvbmNlIChpbiB0aGUgY29uc3RydWN0b3IpLiAKLSAqIAotICogCi0gKiA8ZXh0ZW5zaW9uCi0gKgkJcG9pbnQgPSAiY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5mdnQudGVzdCIKLSAqCQlpZCA9ICJWYWxpZGF0b3JGVlQiCi0gKgkJbmFtZSA9ICJWYWxpZGF0b3IgRlZUIFRlc3QiPgotICoJCQk8dGVzdCBwcm9qZWN0PSJwcm9qZWN0TmFtZSIgCi0gKiAJCQkJICB2YWxpZGF0b3I9ImNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uZWpiLkVKQlZhbGlkYXRvciIKLSAqIAkJCQkgIHZlcnNpb249IjEuMSI+Ci0gKgkJCQk8bWVzc2FnZSBpZD0iQ0hLSjI4MTYiIHJlc291cmNlPSJlamItamFyLnhtbCIgbG9jYXRpb249IjIxNiIvPgotICoJCQkJPG1lc3NhZ2UgaWQ9IkNIS0oyODE2IiByZXNvdXJjZT0iZWpiLWphci54bWwiIGxvY2F0aW9uPSIyMzciLz4KLSAqCQkJCTxtZXNzYWdlIGlkPSJDSEtKMjgxNiIgcmVzb3VyY2U9ImVqYi1qYXIueG1sIiBsb2NhdGlvbj0iMjU4Ii8+Ci0gKgkJCQk8bWVzc2FnZSBpZD0iQ0hLSjI4MTYiIHJlc291cmNlPSJlamItamFyLnhtbCIgbG9jYXRpb249IjI3OSIvPgotICoJCQkJPG1lc3NhZ2UgaWQ9IkNIS0oyODE2IiByZXNvdXJjZT0iZWpiLWphci54bWwiIGxvY2F0aW9uPSIzMDAiLz4KLSAqCQkJPC90ZXN0PgotICogCQkJLi4uIGFzIG1hbnkgPHRlc3Q+IGFzIG5lZWRlZAotICogPC9leHRlbnNpb24+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgaW1wbGVtZW50cyBSZWdpc3RyeUNvbnN0YW50cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyIGluc3QgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIE9wZXJhdGlvblRlc3RSZWFkZXIgX29wUmVhZGVyID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBUZXN0U2V0dXBSZWFkZXIgX3NldHVwUmVhZGVyID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBWYWxpZGF0aW9uVGVzdFJlYWRlciBfdmFsUmVhZGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSByZWdpc3RyeSBpcyByZWFkIG9uY2UgLSB3aGVuIHRoaXMgY2xhc3MgaXMgaW5zdGFudGlhdGVkLgotCSAqLwotCXByaXZhdGUgQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdmlzaWJsZSB0ZXN0IGNhc2VzIGZvciBhbGwgcHJvamVjdHMuCi0JICovCi0JcHVibGljIElUZXN0Y2FzZU1ldGFEYXRhW10gZ2V0VGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVNldCB0ZXN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0JCVZhbGlkYXRvclRlc3RjYXNlW10gdnRzID0gZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgKFN0cmluZyludWxsKTsKLQkJZm9yKGludCBqPTA7IGo8dnRzLmxlbmd0aDsgaisrKSB7Ci0JCQl0ZXN0cy5hZGQodnRzW2pdKTsKLQkJfQotCQkKLQkJT3BlcmF0aW9uVGVzdGNhc2VbXSBvdHMgPSBnZXRPcGVyYXRpb25UZXN0cyhtb25pdG9yLCAoU3RyaW5nKW51bGwpOwotCQlmb3IoaW50IGs9MDsgazxvdHMubGVuZ3RoOyBrKyspIHsKLQkJCXRlc3RzLmFkZChvdHNba10pOwotCQl9Ci0KLQkJSVRlc3RjYXNlTWV0YURhdGFbXSByZXN1bHQgPSBuZXcgSVRlc3RjYXNlTWV0YURhdGFbdGVzdHMuc2l6ZSgpXTsKLQkJdGVzdHMudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIHZpc2libGUgdGVzdCBjYXNlcyBmb3IgYSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBJVGVzdGNhc2VNZXRhRGF0YVtdIGdldFRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3RbXSBwcm9qZWN0cykgewotCQlTZXQgdGVzdHMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB2dHMgPSBnZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCBwcm9qZWN0KTsKLQkJCWZvcihpbnQgaj0wOyBqPHZ0cy5sZW5ndGg7IGorKykgewotCQkJCXRlc3RzLmFkZCh2dHNbal0pOwotCQkJfQotCQkJCi0JCQlPcGVyYXRpb25UZXN0Y2FzZVtdIG90cyA9IGdldE9wZXJhdGlvblRlc3RzKG1vbml0b3IsIHByb2plY3QpOwotCQkJZm9yKGludCBrPTA7IGs8b3RzLmxlbmd0aDsgaysrKSB7Ci0JCQkJdGVzdHMuYWRkKG90c1trXSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlUZXN0Y2FzZU1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IElUZXN0Y2FzZU1ldGFEYXRhW3Rlc3RzLnNpemUoKV07Ci0JCXRlc3RzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHZhbGlkYXRvciB0ZXN0cyBmb3IgYSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldEFsbFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCVZhbGlkYXRpb25UZXN0UmVhZGVyIHJlYWRlciA9IGdldFZhbGlkYXRpb25UZXN0UmVhZGVyKCk7Ci0JCXJldHVybiByZWFkZXIuZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgcHJvamVjdC5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGVzdCBjYXNlcyBvZiB0aGUgbmFtZWQgdmFsaWRhdG9ycyBvbiB0aGUgZ2l2ZW4gcHJvamVjdC4KLQkgKi8JCi0JcHVibGljIFZhbGlkYXRvclRlc3RjYXNlW10gZ2V0QWxsVmFsaWRhdG9yVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmdbXSB2YWxpZGF0b3JOYW1lcykgewotCQlTZXQgdGVzdFNldCA9IG5ldyBIYXNoU2V0KCk7CQkKLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB0ZXN0cyA9IGdldEFsbFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIHByb2plY3QpOwotCQlmb3IoaW50IGk9MDsgaTx2YWxpZGF0b3JOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHZhbGlkYXRvciA9IHZhbGlkYXRvck5hbWVzW2ldOwotCQkJZm9yKGludCBqPTA7IGo8dGVzdHMubGVuZ3RoOyBqKyspIHsKLQkJCQlWYWxpZGF0b3JUZXN0Y2FzZSB0bWQgPSB0ZXN0c1tqXTsKLQkJCQlpZih0bWQuZ2V0VmFsaWRhdG9yQ2xhc3MoKS5lcXVhbHModmFsaWRhdG9yKSkgewotCQkJCQl0ZXN0U2V0LmFkZCh0bWQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCVZhbGlkYXRvclRlc3RjYXNlW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlW3Rlc3RTZXQuc2l6ZSgpXTsKLQkJdGVzdFNldC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbGwgb2YgdGhlIHZpc2libGUgdGVzdCBjYXNlcyB0aGF0IHJlZ2lzdGVyIG1lc3NhZ2VzIGFnYWluc3QgdGhpcyBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCBwcm9qZWN0LmdldE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBWYWxpZGF0aW9uVGVzdFJlYWRlciBnZXRWYWxpZGF0aW9uVGVzdFJlYWRlcigpIHsKLQkJaWYoX3ZhbFJlYWRlciA9PSBudWxsKSB7Ci0JCQlfdmFsUmVhZGVyID0gbmV3IFZhbGlkYXRpb25UZXN0UmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIF92YWxSZWFkZXI7Ci0JfQotCQotCXByaXZhdGUgT3BlcmF0aW9uVGVzdFJlYWRlciBnZXRPcGVyYXRpb25UZXN0UmVhZGVyKCkgewotCQlpZihfb3BSZWFkZXIgPT0gbnVsbCkgewotCQkJX29wUmVhZGVyID0gbmV3IE9wZXJhdGlvblRlc3RSZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gX29wUmVhZGVyOwotCX0KLQkKLQlwcml2YXRlIFRlc3RTZXR1cFJlYWRlciBnZXRUZXN0U2V0dXBSZWFkZXIoKSB7Ci0JCWlmIChfc2V0dXBSZWFkZXIgPT0gbnVsbCkgewotCQkJX3NldHVwUmVhZGVyID0gbmV3IFRlc3RTZXR1cFJlYWRlcigpOwotCQl9Ci0JCXJldHVybiBfc2V0dXBSZWFkZXI7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGVzdCBjYXNlcyBuYW1lZCB0ZXN0TmFtZSwgb3IgaWYgdGVzdE5hbWUgaXMgbnVsbCwgcmV0dXJuIGFsbCB0ZXN0IGNhc2VzLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIHRlc3ROYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFZhbGlkYXRpb25UZXN0UmVhZGVyKCkuZ2V0VmlzaWJsZVZhbGlkYXRvclRlc3RzKG1vbml0b3IsIHRlc3ROYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXN0IGNhc2VzIHRoYXQgcmVnaXN0ZXIgbWVzc2FnZXMgYWdhaW5zdCB0aGlzIHByb2plY3QuCi0JICovCi0JcHVibGljIE9wZXJhdGlvblRlc3RjYXNlW10gZ2V0T3BlcmF0aW9uVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldE9wZXJhdGlvblRlc3RzKG1vbml0b3IsIHByb2plY3QuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlc3QgY2FzZXMgbmFtZWQgdGVzdE5hbWUsIG9yIGlmIHRlc3ROYW1lIGlzIG51bGwsIHJldHVybiBhbGwgdGVzdCBjYXNlcy4KLQkgKi8KLQlwdWJsaWMgT3BlcmF0aW9uVGVzdGNhc2VbXSBnZXRPcGVyYXRpb25UZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRPcGVyYXRpb25UZXN0UmVhZGVyKCkuZ2V0T3BlcmF0aW9uVGVzdHMobW9uaXRvciwgdGVzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIElmIGZpbGVzIG5lZWQgdG8gYmUgaW1wb3J0ZWQsIGltcG9ydCB0aGVtIG5vdyAoaW50byBwcm9qZWN0cyB0aGF0IGFyZSBuYW1lZAotCSAqIHRoZSBzYW1lIGFzIHRoZSBmaWxlcy4pCi0JICogCi0JICogSWYgSVRlc3RjYXNlTWV0YURhdGEgaXMgbm90IG51bGwsIHJldHVybiB0aGUgVGVzdFNldHVwSW1wb3J0IGZvciB0aGF0IHBhcnRpY3VsYXIgdGVzdC4KLQkgKiBJZiBJVGVzdGNhc2VNZXRhRGF0YSBpcyBudWxsLCByZXR1cm4gYWxsIFRlc3RTZXR1cEltcG9ydC4KLQkgKi8KLQlwdWJsaWMgVGVzdFNldHVwSW1wb3J0W10gZ2V0VGVzdFNldHVwKElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgZGlyLCBJVGVzdGNhc2VNZXRhRGF0YSB0bWQsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlyZXR1cm4gZ2V0VGVzdFNldHVwUmVhZGVyKCkuZ2V0VGVzdFNldHVwKGJ1ZmZlciwgZGlyLCB0bWQsIHZlcmJvc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBWYWxpZGF0aW9uVFZUUmVnaXN0cnlSZWFkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgZ2V0UmVhZGVyKCkgewotCQlpZiAoaW5zdCA9PSBudWxsKSB7Ci0JCQlpbnN0ID0gbmV3IEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0OwotCX0KLQotCXByaXZhdGUgY2xhc3MgVmFsaWRhdGlvblRlc3RSZWFkZXIgewotCQlwcml2YXRlIE1hcCBfdmFsaWRhdG9yVGVzdHMgPSBudWxsOwotCQkKLQkJVmFsaWRhdGlvblRlc3RSZWFkZXIoKSB7Ci0JCX0KLQkJCi0JCXB1YmxpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldFZpc2libGVWYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFN0cmluZyB0ZXN0TmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHZ0cyA9IGdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIHRlc3ROYW1lKTsKLQkJCVZhbGlkYXRvclRlc3RjYXNlW10gdGVtcCA9IG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVt2dHMubGVuZ3RoXTsKLQkJCWludCBjb3VudCA9IDA7Ci0JCQlmb3IoaW50IGk9MDsgaTx2dHMubGVuZ3RoOyBpKyspIHsKLQkJCQlWYWxpZGF0b3JUZXN0Y2FzZSB2dCA9IHZ0c1tpXTsKLQkJCQlpZih2dC5pc1Zpc2libGUoKSkgewotCQkJCQl0ZW1wW2NvdW50KytdID0gdnQ7Ci0JCQkJfQotCQkJfQotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yVGVzdGNhc2VbY291bnRdOwotCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIHRlc3ROYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJCWlmIChfdmFsaWRhdG9yVGVzdHMgPT0gbnVsbCkgewotCQkJCV92YWxpZGF0b3JUZXN0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJcmVhZFRlc3RjYXNlUmVnaXN0cnkobW9uaXRvcik7Ci0JCQl9Ci0JCi0JCQlDb2xsZWN0aW9uIHRtZHMgPSBudWxsOwotCQkJaWYgKHRlc3ROYW1lID09IG51bGwpIHsKLQkJCQl0bWRzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IF92YWxpZGF0b3JUZXN0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJdG1kcy5hZGRBbGwoKENvbGxlY3Rpb24pIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdG1kcyA9IChDb2xsZWN0aW9uKSBfdmFsaWRhdG9yVGVzdHMuZ2V0KHRlc3ROYW1lKTsKLQkJCX0KLQkJCWlmICgodG1kcyA9PSBudWxsKSB8fCAodG1kcy5zaXplKCkgPT0gMCkpIHsKLQkJCQlyZXR1cm4gbmV3IFZhbGlkYXRvclRlc3RjYXNlWzBdOwotCQkJfQotCQkJVmFsaWRhdG9yVGVzdGNhc2VbXSByZXN1bHQgPSBuZXcgVmFsaWRhdG9yVGVzdGNhc2VbdG1kcy5zaXplKCldOwotCQkJdG1kcy50b0FycmF5KHJlc3VsdCk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlIGlmIGl0IGV4aXN0cy4gT3RoZXJ3aXNlLCByZXR1cm4gbnVsbC4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGdldFByb2plY3QoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QUk9KRUNUKTsKLQkJfQotCi0JCXByaXZhdGUgTWVzc2FnZU1ldGFEYXRhW10gZ2V0TWVzc2FnZXMoVmFsaWRhdG9yVGVzdGNhc2UgdG1kLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgdGVzdEVsZW1lbnQpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG1lc3NhZ2VzID0gdGVzdEVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX01FU1NBR0UpOwotCQkJaWYgKChtZXNzYWdlcyA9PSBudWxsKSB8fCAobWVzc2FnZXMubGVuZ3RoID09IDApKSB7Ci0JCQkJLy8gTm8gbWVzc2FnZXMgYXJlIGV4cGVjdGVkLgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlNZXNzYWdlTWV0YURhdGFbXSBtbWRMaXN0ID0gbmV3IE1lc3NhZ2VNZXRhRGF0YVttZXNzYWdlcy5sZW5ndGhdOwotCQkJaW50IGNvdW50ID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgbWVzc2FnZSA9IG1lc3NhZ2VzW2ldOwotCQkJCVN0cmluZyBwcmVmaXggPSBtZXNzYWdlLmdldEF0dHJpYnV0ZShBVFRfUFJFRklYKTsKLQkJCQlpZiAocHJlZml4ID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkV2ZXJ5IDxtZXNzYWdlPiBtdXN0IGhhdmUgYSBwcmVmaXguIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvLyBUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIG9wdGlvbmFsLgkJCQotCQkJCVN0cmluZyByZXNvdXJjZU5hbWUgPSBtZXNzYWdlLmdldEF0dHJpYnV0ZShBVFRfUkVTT1VSQ0UpOwotCQkJCVN0cmluZyBsb2NhdGlvbiA9IG1lc3NhZ2UuZ2V0QXR0cmlidXRlKEFUVF9MT0NBVElPTik7Ci0JCQkJU3RyaW5nIHRleHQgPSBtZXNzYWdlLmdldEF0dHJpYnV0ZShBVFRfVEVYVCk7Ci0JCQkJaW50IGxpbmVOdW1iZXIgPSAtMTsKLQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gbnVsbDsKLQkJCQlpZiAoKGxvY2F0aW9uICE9IG51bGwpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsaW5lTnVtYmVyID0gSW50ZWdlci5wYXJzZUludChsb2NhdGlvbik7Ci0JCQkJCQltbWQgPSBuZXcgTWVzc2FnZU1ldGFEYXRhKHRtZCwgcHJlZml4LCByZXNvdXJjZU5hbWUsIGxpbmVOdW1iZXIsIHRleHQpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJCQkvLyBEb24ndCBuZWVkIHRvIGxvZyAtIHRoZSBsb2NhdGlvbiBqdXN0IGlzbid0IGEgbnVtYmVyLgotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKG1tZCA9PSBudWxsKSB7Ci0JCQkJCW1tZCA9IG5ldyBNZXNzYWdlTWV0YURhdGEodG1kLCBwcmVmaXgsIHJlc291cmNlTmFtZSwgbG9jYXRpb24sIHRleHQpOwotCQkJCX0KLQotCQkJCW1tZExpc3RbY291bnQrK10gPSBtbWQ7Ci0JCQl9Ci0KLQkJCWlmIChjb3VudCA9PSBtbWRMaXN0Lmxlbmd0aCkgewotCQkJCXJldHVybiBtbWRMaXN0OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhW10gcmVzdWx0ID0gbmV3IE1lc3NhZ2VNZXRhRGF0YVtjb3VudF07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShtbWRMaXN0LCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZFRlc3QoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJRXh0ZW5zaW9uIGV4dGVuc2lvbiwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gdGVzdEVsZW1lbnRzKSB7Ci0JCQltb25pdG9yLnN1YlRhc2soIlJlYWRpbmcgdGVzdCBjYXNlczsgcGxlYXNlIHdhaXQuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHBsdWdpbklkID0gZXh0ZW5zaW9uLmdldE5hbWVzcGFjZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0RWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQltb25pdG9yLnN1YlRhc2soIlJlYWRpbmcgdGVzdCBjYXNlICIgKyAoaSArIDEpICsgIiBvZiAiICsgdGVzdEVsZW1lbnRzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCB0ZXN0ID0gdGVzdEVsZW1lbnRzW2ldOwotCi0JCQkJU3RyaW5nIHByb2plY3ROYW1lID0gZ2V0UHJvamVjdCh0ZXN0KTsKLQkJCQlpZiAocHJvamVjdE5hbWUgPT0gbnVsbCkgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiRXZlcnkgdGVzdCBtdXN0IG5hbWUgdGhlIHByb2plY3QgdGhhdCBpdCB2ZXJpZmllcy4gIiArIHRlc3QudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBnZXRWYWxpZGF0b3JNZXRhRGF0YSh0ZXN0KTsKLQkJCQlpZiAodm1kID09IG51bGwpIHsKLQkJCQkJLy8gYWxyZWFkeSBsb2dnZWQsIHNvIGp1c3QgcmVhZCB0aGUgbmV4dCB0ZXN0IGNhc2UuCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCVN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ2V0SW5wdXRGaWxlTmFtZSh0ZXN0KTsKLQkJCQlpZiAoaW5wdXRGaWxlTmFtZSA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJFdmVyeSB0ZXN0IG11c3QgbmFtZSB0aGUgZmlsZSB0byBiZSBpbXBvcnRlZCBhbmQgdGhlbiB0ZXN0ZWQuIiArIHRlc3QudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlib29sZWFuIHZpc2libGUgPSBnZXRWaXNpYmxlKHRlc3QpOwotCi0JCQkJVmFsaWRhdG9yVGVzdGNhc2UgdG1kID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlKHBsdWdpbklkLCBwcm9qZWN0TmFtZSwgdm1kLCBpbnB1dEZpbGVOYW1lLCB2aXNpYmxlKTsKLQkJCQl0bWQuc2V0TWVzc2FnZXMoZ2V0TWVzc2FnZXModG1kLCB0ZXN0KSk7Ci0KLQkJCQkvLyBOb3cgYWRkIHRoZSB0ZXN0IGNhc2UgdG8gdGhlIE1hcCwgd2l0aCB0aGUgcHJvamVjdCBuYW1lIGFzIHRoZSBrZXkgaW50byAKLQkJCQkvLyB0aGUgbWFwLgotCQkJCVNldCBwcmpUbWQgPSAoU2V0KSBfdmFsaWRhdG9yVGVzdHMuZ2V0KHByb2plY3ROYW1lKTsKLQkJCQlpZiAocHJqVG1kID09IG51bGwpIHsKLQkJCQkJcHJqVG1kID0gbmV3IEhhc2hTZXQoKTsKLQkJCQl9Ci0JCQkJcHJqVG1kLmFkZCh0bWQpOwotCQkJCV92YWxpZGF0b3JUZXN0cy5wdXQocHJvamVjdE5hbWUsIHByalRtZCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0cmlldmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgotCQkgKiBJZiBubyBzdWNoIGNsYXNzIGNhbiBiZSBmb3VuZCwgcmV0dXJuIG51bGwuCi0JCSAqLwotCQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIGdldFZhbGlkYXRvck1ldGFEYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlTdHJpbmcgdmFsaWRhdG9yQ2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVkFMSURBVE9SKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHZhbGlkYXRvckNsYXNzID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkNhbm5vdCBsb2NhdGUgdmFsaWRhdG9yIGF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvckNsYXNzKTsKLQkJCQlpZiAodm1kID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkNvdWxkIG5vdCBmaW5kIHZhbGlkYXRvciAiICsgdmFsaWRhdG9yQ2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHZtZDsKLQkJCX0KLQkJCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJUaHJvd2FibGUgY2F1Z2h0IHdoaWxlIHJldHJpZXZpbmcgSVZhbGlkYXRvciAiICsgdmFsaWRhdG9yQ2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlYWRzIHRoZSByZWdpc3RyeSB0byBmaW5kIHRoZSB0ZXN0IGNhc2VzIHRoYXQgaGF2ZSBiZWVuIGltcGxlbWVudGVkLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHJlYWRUZXN0Y2FzZVJlZ2lzdHJ5KElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJLy8gR2V0IHRoZSBleHRlbnNpb25zIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuCi0JCQlJRXh0ZW5zaW9uUG9pbnQgdmFsaWRhdG9yRVAgPSBnZXRUZXN0Y2FzZUV4dGVuc2lvblBvaW50KCk7Ci0JCQlpZiAodmFsaWRhdG9yRVAgPT0gbnVsbCkgewotCQkJCS8vIGVycm9yIGxvZ2dlZCBpbiBnZXRWYWxpZGF0b3JUVlRFeHRlbnNpb25Qb2ludAotCQkJCXJldHVybjsKLQkJCX0KLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gdmFsaWRhdG9yRVAuZ2V0RXh0ZW5zaW9ucygpOwotCi0JCQkvLyBmaW5kIGFsbCBydW50aW1lIGltcGxlbWVudGF0aW9ucwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcmVhZFRlc3RjYXNlRXh0ZW5zaW9uKG1vbml0b3IsIGV4dGVuc2lvbnNbaV0pOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlYWRzIG9uZSBleHRlbnNpb24gYnkgbG9vcGluZyB0aHJvdWdoIGl0cyBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHJlYWRUZXN0Y2FzZUV4dGVuc2lvbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWlmICgoZWxlbWVudHMgPT0gbnVsbCkgfHwgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiTm8gdGVzdHMgZm91bmQgZm9yICIgKyBleHRlbnNpb24uZ2V0TGFiZWwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJYWRkVGVzdChtb25pdG9yLCBleHRlbnNpb24sIGVsZW1lbnRzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBvcGVyYXRpb24gZXh0ZW5zaW9uIHBvaW50Ci0JCSAqLwotCQlwcml2YXRlIElFeHRlbnNpb25Qb2ludCBnZXRUZXN0Y2FzZUV4dGVuc2lvblBvaW50KCkgewotCQkJSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgVkFMSURBVE9SX1RFU1RDQVNFX0VYVF9QVF9JRCk7Ci0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgPT0gbnVsbCkgewotCQkJCS8vIElmIHRoaXMgaGFwcGVucyBpdCBtZWFucyB0aGF0IHNvbWVvbmUgcmVtb3ZlZCB0aGUgInZhbGlkYXRvciIgZXh0ZW5zaW9uIHBvaW50IGRlY2xhcmF0aW9uIAotCQkJCS8vIGZyb20gb3VyIHBsdWdpbi54bWwgZmlsZS4KLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgUExVR0lOX0lEICsgIi4iICsgVkFMSURBVE9SX1RFU1RDQVNFX0VYVF9QVF9JRCArICIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB2YWxpZGF0aW9uIFRWVCBwbHVnaW4ueG1sIGZpbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGV4dGVuc2lvblBvaW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCB3aGljaCBtdXN0IGJlIGltcG9ydGVkIGJlZm9yZSB0aGUgdGVzdCBjYXNlIGNhbiBiZSBydW4uCi0JCSAqIFJldHVybiBudWxsIGlmIG5vIGlucHV0IG5hbWUgaXMgc2V0LgotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIGdldFZpc2libGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgImdldFZpc2libGU6OklDb25maWd1cmF0aW9uRWxlbWVudCBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlTdHJpbmcgYXR0cmliID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1ZJU0lCTEUpOwotCQkJaWYgKGF0dHJpYiA9PSBudWxsKSB7Ci0JCQkJLy8gZGVmYXVsdCBpcyB2aXNpYmxlCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoYXR0cmliKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgd2hpY2ggbXVzdCBiZSBpbXBvcnRlZCBiZWZvcmUgdGhlIHRlc3QgY2FzZSBjYW4gYmUgcnVuLgotCQkgKiBSZXR1cm4gbnVsbCBpZiBubyBpbnB1dCBuYW1lIGlzIHNldC4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIGdldElucHV0RmlsZU5hbWUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgImdldElucHV0RmlsZU5hbWU6OklDb25maWd1cmF0aW9uRWxlbWVudCBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSU5QVVQpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIE9wZXJhdGlvblRlc3RSZWFkZXIgewotCQlwcml2YXRlIE1hcCBfb3BlcmF0aW9uVGVzdHMgPSBudWxsOwotCi0JCU9wZXJhdGlvblRlc3RSZWFkZXIoKSB7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHRlc3QgY2FzZXMgbmFtZWQgdGVzdE5hbWUsIG9yIGlmIHRlc3ROYW1lIGlzIG51bGwsIHJldHVybiBhbGwgdGVzdCBjYXNlcy4KLQkJICovCi0JCXB1YmxpYyBPcGVyYXRpb25UZXN0Y2FzZVtdIGdldE9wZXJhdGlvblRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIHRlc3ROYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJCWlmIChfb3BlcmF0aW9uVGVzdHMgPT0gbnVsbCkgewotCQkJCV9vcGVyYXRpb25UZXN0cyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJcmVhZE9wZXJhdGlvblRlc3RjYXNlUmVnaXN0cnkobW9uaXRvcik7Ci0JCQl9Ci0KLQkJCUNvbGxlY3Rpb24gdG1kcyA9IG51bGw7Ci0JCQlpZiAodGVzdE5hbWUgPT0gbnVsbCkgewotCQkJCXRtZHMgPSBuZXcgSGFzaFNldCgpOwotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX29wZXJhdGlvblRlc3RzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQl0bWRzLmFkZEFsbCgoQ29sbGVjdGlvbikgaXRlcmF0b3IubmV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0bWRzID0gKENvbGxlY3Rpb24pIF9vcGVyYXRpb25UZXN0cy5nZXQodGVzdE5hbWUpOwotCQkJfQotCQkJaWYgKCh0bWRzID09IG51bGwpIHx8ICh0bWRzLnNpemUoKSA9PSAwKSkgewotCQkJCXJldHVybiBuZXcgT3BlcmF0aW9uVGVzdGNhc2VbMF07Ci0JCQl9Ci0JCQlPcGVyYXRpb25UZXN0Y2FzZVtdIHJlc3VsdCA9IG5ldyBPcGVyYXRpb25UZXN0Y2FzZVt0bWRzLnNpemUoKV07Ci0JCQl0bWRzLnRvQXJyYXkocmVzdWx0KTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIGlucHV0IHdoaWNoIG11c3QgYmUgaW1wb3J0ZWQgYmVmb3JlIHRoZSB0ZXN0IGNhc2UgY2FuIGJlIHJ1bi4KLQkJICogUmV0dXJuIG51bGwgaWYgbm8gaW5wdXQgbmFtZSBpcyBzZXQuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBnZXRJbnB1dEZpbGVOYW1lKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJnZXRJbnB1dEZpbGVOYW1lOjpJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lOUFVUKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRPcGVyYXRpb25UZXN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUV4dGVuc2lvbiBleHRlbnNpb24sIElDb25maWd1cmF0aW9uRWxlbWVudFtdIHRlc3RFbGVtZW50cykgewotCQkJbW9uaXRvci5zdWJUYXNrKCJSZWFkaW5nIHRlc3QgY2FzZXM7IHBsZWFzZSB3YWl0Li4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGVzdEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKCJSZWFkaW5nIHRlc3QgY2FzZSAiICsgKGkgKyAxKSArICIgb2YgIiArIHRlc3RFbGVtZW50cy5sZW5ndGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgdGVzdCA9IHRlc3RFbGVtZW50c1tpXTsKLQotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IGdldFByb2plY3QodGVzdCk7Ci0JCQkJaWYgKHByb2plY3ROYW1lID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkV2ZXJ5IHRlc3QgbXVzdCBuYW1lIHRoZSBwcm9qZWN0IHRoYXQgaXQgdmVyaWZpZXMuICIgKyB0ZXN0LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJSU9wZXJhdGlvblJ1bm5hYmxlIG9wID0gZ2V0T3BlcmF0aW9uKHRlc3QpOwotCQkJCWlmIChvcCA9PSBudWxsKSB7Ci0JCQkJCS8vIGFscmVhZHkgbG9nZ2VkLCBzbyBqdXN0IHJlYWQgdGhlIG5leHQgdGVzdCBjYXNlLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdldElucHV0RmlsZU5hbWUodGVzdCk7Ci0JCQkJaWYgKGlucHV0RmlsZU5hbWUgPT0gbnVsbCkgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiRXZlcnkgdGVzdCBtdXN0IG5hbWUgdGhlIGZpbGUgdG8gYmUgaW1wb3J0ZWQgYW5kIHRoZW4gdGVzdGVkLiIgKyB0ZXN0LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJU3RyaW5nIGlkID0gZXh0ZW5zaW9uLmdldExhYmVsKCk7Ci0KLQkJCQlPcGVyYXRpb25UZXN0Y2FzZSB0bWQgPSBuZXcgT3BlcmF0aW9uVGVzdGNhc2UocGx1Z2luSWQsIHByb2plY3ROYW1lLCBpZCwgaW5wdXRGaWxlTmFtZSwgb3ApOwotCi0JCQkJLy8gTm93IGFkZCB0aGUgdGVzdCBjYXNlIHRvIHRoZSBNYXAsIHdpdGggdGhlIHByb2plY3QgbmFtZSBhcyB0aGUga2V5IGludG8gCi0JCQkJLy8gdGhlIG1hcC4KLQkJCQlTZXQgcHJqVG1kID0gKFNldCkgX29wZXJhdGlvblRlc3RzLmdldChwcm9qZWN0TmFtZSk7Ci0JCQkJaWYgKHByalRtZCA9PSBudWxsKSB7Ci0JCQkJCXByalRtZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJfQotCQkJCXByalRtZC5hZGQodG1kKTsKLQkJCQlfb3BlcmF0aW9uVGVzdHMucHV0KHByb2plY3ROYW1lLCBwcmpUbWQpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlYWRzIG9uZSBleHRlbnNpb24gYnkgbG9vcGluZyB0aHJvdWdoIGl0cyBjb25maWd1cmF0aW9uIGVsZW1lbnRzLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHJlYWRPcGVyYXRpb25UZXN0Y2FzZUV4dGVuc2lvbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWlmICgoZWxlbWVudHMgPT0gbnVsbCkgfHwgKGVsZW1lbnRzLmxlbmd0aCA9PSAwKSkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiTm8gdGVzdHMgZm91bmQgZm9yICIgKyBleHRlbnNpb24uZ2V0TGFiZWwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJYWRkT3BlcmF0aW9uVGVzdChtb25pdG9yLCBleHRlbnNpb24sIGVsZW1lbnRzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZWFkcyB0aGUgcmVnaXN0cnkgdG8gZmluZCB0aGUgdGVzdCBjYXNlcyB0aGF0IGhhdmUgYmVlbiBpbXBsZW1lbnRlZC4KLQkJICovCi0JCXByaXZhdGUgdm9pZCByZWFkT3BlcmF0aW9uVGVzdGNhc2VSZWdpc3RyeShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCS8vIEdldCB0aGUgZXh0ZW5zaW9ucyB0aGF0IGhhdmUgYmVlbiByZWdpc3RlcmVkLgotCQkJSUV4dGVuc2lvblBvaW50IG9wRVAgPSBnZXRPcGVyYXRpb25UZXN0Y2FzZUV4dGVuc2lvblBvaW50KCk7Ci0JCQlpZiAob3BFUCA9PSBudWxsKSB7Ci0JCQkJLy8gZXJyb3IgbG9nZ2VkIGluIGdldFZhbGlkYXRvclRWVEV4dGVuc2lvblBvaW50Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBvcEVQLmdldEV4dGVuc2lvbnMoKTsKLQotCQkJLy8gZmluZCBhbGwgcnVudGltZSBpbXBsZW1lbnRhdGlvbnMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCXJlYWRPcGVyYXRpb25UZXN0Y2FzZUV4dGVuc2lvbihtb25pdG9yLCBleHRlbnNpb25zW2ldKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZSBpZiBpdCBleGlzdHMuIE90aGVyd2lzZSwgcmV0dXJuIG51bGwuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBnZXRQcm9qZWN0KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXJldHVybiBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJPSkVDVCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgVGVzdENhc2UgZXh0ZW5zaW9uIHBvaW50Ci0JCSAqLwotCQlwcml2YXRlIElFeHRlbnNpb25Qb2ludCBnZXRPcGVyYXRpb25UZXN0Y2FzZUV4dGVuc2lvblBvaW50KCkgewotCQkJSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgVkFMSURBVE9SX09QRVJBVElPTl9URVNUQ0FTRV9FWFRfUFRfSUQpOwotCQkJaWYgKGV4dGVuc2lvblBvaW50ID09IG51bGwpIHsKLQkJCQkvLyBJZiB0aGlzIGhhcHBlbnMgaXQgbWVhbnMgdGhhdCBzb21lb25lIHJlbW92ZWQgdGhlICJvcHRlc3QiIGV4dGVuc2lvbiBwb2ludCBkZWNsYXJhdGlvbiAKLQkJCQkvLyBmcm9tIG91ciBwbHVnaW4ueG1sIGZpbGUuCi0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIFBMVUdJTl9JRCArICIuIiArIFZBTElEQVRPUl9PUEVSQVRJT05fVEVTVENBU0VfRVhUX1BUX0lEICsgIiBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHZhbGlkYXRpb24gVFZUIHBsdWdpbi54bWwgZmlsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZXh0ZW5zaW9uUG9pbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0cmlldmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHdpdGggdGhlIGdpdmVuIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgotCQkgKiBJZiBubyBzdWNoIGNsYXNzIGNhbiBiZSBmb3VuZCwgcmV0dXJuIG51bGwuCi0JCSAqLwotCQlwcml2YXRlIElPcGVyYXRpb25SdW5uYWJsZSBnZXRPcGVyYXRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIklDb25maWd1cmF0aW9uRWxlbWVudCBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCVN0cmluZyBvcENsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX09QRVJBVElPTik7Ci0JCQl0cnkgewotCQkJCWlmIChvcENsYXNzID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkNhbm5vdCBsb2NhdGUgb3BlcmF0aW9uIGF0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlJT3BlcmF0aW9uUnVubmFibGUgb3AgPSAoSU9wZXJhdGlvblJ1bm5hYmxlKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX09QRVJBVElPTik7Ci0JCQkJaWYgKG9wID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkNvdWxkIG5vdCBmaW5kIG9wZXJhdGlvbiAiICsgb3BDbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gb3A7Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiVGhyb3dhYmxlIGNhdWdodCB3aGlsZSByZXRyaWV2aW5nIElWYWxpZGF0b3IgIiArIG9wQ2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRlc3RTZXR1cFJlYWRlciB7Ci0JCXByaXZhdGUgVGVzdFNldHVwSW1wb3J0W10gX3Rlc3RTZXR1cCA9IG51bGw7Ci0KLQkJVGVzdFNldHVwUmVhZGVyKCkgewotCQl9Ci0JCQotCQkvKioKLQkJICogUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIGlucHV0IHdoaWNoIG11c3QgYmUgaW1wb3J0ZWQgYmVmb3JlIHRoZSB0ZXN0IGNhc2UgY2FuIGJlIHJ1bi4KLQkJICogUmV0dXJuIG51bGwgaWYgbm8gaW5wdXQgbmFtZSBpcyBzZXQuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBnZXRJbnB1dEZpbGVOYW1lKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsICJnZXRJbnB1dEZpbGVOYW1lOjpJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlyZXR1cm4gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lOUFVUKTsKLQkJfQotCi0JCS8qKgotCQkgKiBJZiBmaWxlcyBuZWVkIHRvIGJlIGltcG9ydGVkLCBpbXBvcnQgdGhlbSBub3cgKGludG8gcHJvamVjdHMgdGhhdCBhcmUgbmFtZWQKLQkJICogdGhlIHNhbWUgYXMgdGhlIGZpbGVzLikKLQkJICogCi0JCSAqIElmIElUZXN0Y2FzZU1ldGFEYXRhIGlzIG5vdCBudWxsLCByZXR1cm4gdGhlIFRlc3RTZXR1cEltcG9ydCBmb3IgdGhhdCBwYXJ0aWN1bGFyIHRlc3QuCi0JCSAqIElmIElUZXN0Y2FzZU1ldGFEYXRhIGlzIG51bGwsIHJldHVybiBhbGwgVGVzdFNldHVwSW1wb3J0LgotCQkgKi8KLQkJcHVibGljIFRlc3RTZXR1cEltcG9ydFtdIGdldFRlc3RTZXR1cChJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIGRpciwgSVRlc3RjYXNlTWV0YURhdGEgdG1kLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJCWlmIChfdGVzdFNldHVwID09IG51bGwpIHsKLQkJCQlyZWFkU2V0dXBSZWdpc3RyeShidWZmZXIsIHZlcmJvc2UpOwotCQkJfQotCQkJaWYgKHRtZCAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBfdGVzdFNldHVwLmxlbmd0aDsgaisrKSB7Ci0JCQkJCVRlc3RTZXR1cEltcG9ydCB0c2kgPSBfdGVzdFNldHVwW2pdOwotCQkJCQlpZiAodHNpLmdldEZpbGVOYW1lKCkuZW5kc1dpdGgodG1kLmdldElucHV0RmlsZU5hbWUoKSkpIHsKLQkJCQkJCXJldHVybiBuZXcgVGVzdFNldHVwSW1wb3J0W10geyB0c2kgfTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gbmV3IFRlc3RTZXR1cEltcG9ydFswXTsKLQkJCX0KLQkJCXJldHVybiBfdGVzdFNldHVwOwotCQl9Ci0JCi0JCXByaXZhdGUgdm9pZCBhZGRTZXR1cChJQnVmZmVyIGJ1ZmZlciwgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gaW1wb3J0RWxlbWVudHMsIGJvb2xlYW4gdmVyYm9zZSkgewotCQkJaWYgKChpbXBvcnRFbGVtZW50cyA9PSBudWxsKSB8fCAoaW1wb3J0RWxlbWVudHMubGVuZ3RoID09IDApKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gIk5vIHRlc3Qgc2V0dXAgZm91bmQiOyAvLyROT04tTkxTLTEkCi0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIG1lc3NhZ2UpOwotCQkJCQlidWZmZXIud3JpdGUobWVzc2FnZSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJVGVzdFNldHVwSW1wb3J0W10gdGVtcCA9IG5ldyBUZXN0U2V0dXBJbXBvcnRbaW1wb3J0RWxlbWVudHMubGVuZ3RoXTsKLQkJCWludCBjb3VudCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGltcG9ydEVsZW1lbnQgPSBpbXBvcnRFbGVtZW50c1tpXTsKLQkJCQlTdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdldElucHV0RmlsZU5hbWUoaW1wb3J0RWxlbWVudCk7Ci0JCQkJaWYgKGlucHV0RmlsZU5hbWUgPT0gbnVsbCkgewotCQkJCQkvLyBBbHJlYWR5IGxvZ2dlZCBpbiBnZXRJbnB1dEZpbGVOYW1lCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCUlJbXBvcnRPcGVyYXRpb24gb3AgPSBnZXRJbXBvcnRPcGVyYXRpb24oYnVmZmVyLCBpbXBvcnRFbGVtZW50KTsKLQkJCQlpZiAob3AgPT0gbnVsbCkgewotCQkJCQlidWZmZXIud3JpdGUoIkltcG9ydCBvcGVyYXRpb24gY2Fubm90IGJlIGZvdW5kLiBJZ25vcmluZyBpbXBvcnQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCVRlc3RTZXR1cEltcG9ydCB0cyA9IG5ldyBUZXN0U2V0dXBJbXBvcnQob3AsIGlucHV0RmlsZU5hbWUpOwotCQkJCXRlbXBbY291bnQrK10gPSB0czsKLQkJCX0KLQotCQkJaWYgKF90ZXN0U2V0dXAgPT0gbnVsbCkgewotCQkJCWlmIChjb3VudCA9PSB0ZW1wLmxlbmd0aCkgewotCQkJCQlfdGVzdFNldHVwID0gdGVtcDsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCV90ZXN0U2V0dXAgPSBuZXcgVGVzdFNldHVwSW1wb3J0W2NvdW50XTsKLQkJCQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBfdGVzdFNldHVwLCAwLCBjb3VudCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJVGVzdFNldHVwSW1wb3J0W10gbmV3VGVzdFNldHVwID0gbmV3IFRlc3RTZXR1cEltcG9ydFtfdGVzdFNldHVwLmxlbmd0aCArIGNvdW50XTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KF90ZXN0U2V0dXAsIDAsIG5ld1Rlc3RTZXR1cCwgMCwgX3Rlc3RTZXR1cC5sZW5ndGgpOwotCQkJCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgbmV3VGVzdFNldHVwLCBfdGVzdFNldHVwLmxlbmd0aCwgY291bnQpOwotCQkJCV90ZXN0U2V0dXAgPSBuZXdUZXN0U2V0dXA7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmVhZHMgb25lIGV4dGVuc2lvbiBieSBsb29waW5nIHRocm91Z2ggaXRzIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgcmVhZFNldHVwRXh0ZW5zaW9uKElCdWZmZXIgYnVmZmVyLCBJRXh0ZW5zaW9uIGV4dGVuc2lvbiwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWFkZFNldHVwKGJ1ZmZlciwgZWxlbWVudHMsIHZlcmJvc2UpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIFRlc3RDYXNlU2V0dXAgZXh0ZW5zaW9uIHBvaW50Ci0JCSAqLwotCQlwcml2YXRlIElFeHRlbnNpb25Qb2ludCBnZXRTZXR1cEV4dGVuc2lvblBvaW50KCkgewotCQkJSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0UGx1Z2luUmVnaXN0cnkoKTsKLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgVkFMSURBVE9SX1NFVFVQX0VYVF9QVF9JRCk7Ci0JCQlpZiAoZXh0ZW5zaW9uUG9pbnQgPT0gbnVsbCkgewotCQkJCS8vIElmIHRoaXMgaGFwcGVucyBpdCBtZWFucyB0aGF0IHNvbWVvbmUgcmVtb3ZlZCB0aGUgInZhbGlkYXRvciIgZXh0ZW5zaW9uIHBvaW50IGRlY2xhcmF0aW9uIAotCQkJCS8vIGZyb20gb3VyIHBsdWdpbi54bWwgZmlsZS4KLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgUExVR0lOX0lEICsgIi4iICsgVkFMSURBVE9SX1NFVFVQX0VYVF9QVF9JRCArICIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB2YWxpZGF0aW9uIFRWVCBwbHVnaW4ueG1sIGZpbGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGV4dGVuc2lvblBvaW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlYWRzIHRoZSByZWdpc3RyeSB0byBmaW5kIHRoZSB0ZXN0IHNldHVwIHRoYXQgbXVzdCBiZSBwZXJmb3JtZWQuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgcmVhZFNldHVwUmVnaXN0cnkoSUJ1ZmZlciBidWZmZXIsIGJvb2xlYW4gdmVyYm9zZSkgewotCQkJLy8gR2V0IHRoZSBleHRlbnNpb25zIHRoYXQgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuCi0JCQlJRXh0ZW5zaW9uUG9pbnQgdmFsaWRhdG9yRVAgPSBnZXRTZXR1cEV4dGVuc2lvblBvaW50KCk7Ci0JCQlpZiAodmFsaWRhdG9yRVAgPT0gbnVsbCkgewotCQkJCS8vIGVycm9yIGxvZ2dlZCBpbiBnZXRWYWxpZGF0b3JUVlRFeHRlbnNpb25Qb2ludAotCQkJCWJ1ZmZlci53cml0ZSgiRXh0ZW5zaW9uIHBvaW50IGlzIG1pc3NpbmcuIENhbm5vdCBpbXBvcnQgdGVzdCBjYXNlcy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gdmFsaWRhdG9yRVAuZ2V0RXh0ZW5zaW9ucygpOwotCQkJaWYgKGV4dGVuc2lvbnMubGVuZ3RoID09IDApIHsKLQkJCQlidWZmZXIud3JpdGUoIk5vIGV4dGVuc2lvbnMgZm91bmQuIENhbm5vdCBpbXBvcnQgdGVzdCBjYXNlcy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gZmluZCBhbGwgcnVudGltZSBpbXBsZW1lbnRhdGlvbnMKLQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJSZWFkaW5nIHNldHVwIDxpbXBvcnQ+IGV4dGVuc2lvbnM7IHBsZWFzZSB3YWl0Li4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJSZWFkaW5nIHNldHVwIDxpbXBvcnQ+ICIgKyAoaSArIDEpICsgIiBvZiAiICsgZXh0ZW5zaW9ucy5sZW5ndGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZWFkU2V0dXBFeHRlbnNpb24oYnVmZmVyLCBleHRlbnNpb25zW2ldLCB2ZXJib3NlKTsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIG9wZXJhdGlvbiB3aGljaCBpcyB1c2VkIHRvIGltcG9ydCB0aGUgaW5wdXQuCi0JCSAqLwotCQlwcml2YXRlIElJbXBvcnRPcGVyYXRpb24gZ2V0SW1wb3J0T3BlcmF0aW9uKElCdWZmZXIgYnVmZmVyLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJJQ29uZmlndXJhdGlvbkVsZW1lbnQgaXMgbnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgbWVzc2FnZSk7Ci0JCQkJCWJ1ZmZlci53cml0ZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVN0cmluZyBvcENsYXNzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX09QRVJBVElPTik7Ci0JCQl0cnkgewotCQkJCWlmIChvcENsYXNzID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiQmVjYXVzZSB0aGVyZSBpcyBubyBvcGVyYXRpb24gYXR0cmlidXRlLCBhc3N1bWluZyB0aGF0IHRoZSBpbnB1dCBpcyBhIHdvcmtzcGFjZS4iOyAvLyROT04tTkxTLTEkCi0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBtZXNzYWdlKTsKLQkJCQkJCWJ1ZmZlci53cml0ZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlPYmplY3QgdGVtcCA9IGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfT1BFUkFUSU9OKTsKLQkJCQlpZiAodGVtcCA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0gIm9wZXJhdGlvbiAiICsgb3BDbGFzcyArICIgY2Fubm90IGJlIGNyZWF0ZWQuIElnbm9yaW5nIHRoZSB0ZXN0IGNhc2UuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBtZXNzYWdlKTsKLQkJCQkJCWJ1ZmZlci53cml0ZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodGVtcCBpbnN0YW5jZW9mIElJbXBvcnRPcGVyYXRpb24pIHsKLQkJCQkJcmV0dXJuIChJSW1wb3J0T3BlcmF0aW9uKSB0ZW1wOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAib3BlcmF0aW9uIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgSUltcG9ydE9wZXJhdGlvbi4gSWdub3JpbmcgdGhlIHRlc3QgY2FzZS4iOyAvLyROT04tTkxTLTEkCi0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBtZXNzYWdlKTsKLQkJCQkJCWJ1ZmZlci53cml0ZShtZXNzYWdlKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVGhyb3dhYmxlIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJUaHJvd2FibGUgY2F1Z2h0IHdoaWxlIHJldHJpZXZpbmcgSUltcG9ydE9wZXJhdGlvbiAiICsgb3BDbGFzcyArICIgSWdub3JpbmcgdGhlIHRlc3QgY2FzZS4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgbWVzc2FnZSk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJCWJ1ZmZlci53cml0ZShtZXNzYWdlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9CdWlsZEluZm8uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L0J1aWxkSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTRhN2E2Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L0J1aWxkSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnk7Ci1wdWJsaWMgY2xhc3MgQnVpbGRJbmZvIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIkxpY2Vuc2VkIE1hdGVyaWFscyAtLSBQcm9wZXJ0eSBvZiBJQk1cbihjKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiwgMjAwMSwyMDAzXG5VUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGZnQnVpbGRMZXZlbCA9ICIyMDAzMTExMl8xOTE1LVdCMjEyLUFELVY1MTFELVc1IjsKLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgbGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0V1NBQnVpbGRMZXZlbCgpIHsgcmV0dXJuIGZnQnVpbGRMZXZlbDsgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvSVRlc3RjYXNlTWV0YURhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L0lUZXN0Y2FzZU1ldGFEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NTg0NjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvSVRlc3RjYXNlTWV0YURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlcjsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSB0ZXN0IGNhc2UgdGhhdCBlaXRoZXIgc2hvdWxkIGJlIHJ1bgotICogYXMgcGFydCBvZiB0aGUgVmFsaWRhdGlvbiBCVlQgU3VpdGUsIG9yIHRoYXQgaXMgcGFydCBvZiBhIHRlc3QKLSAqIGNhc2UgdGhhdCBpcyBydW4gYnkgdGhlIFZhbGlkYXRpb24gQlZUIFN1aXRlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUZXN0Y2FzZU1ldGFEYXRhIHsKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHRlc3QgY2FzZSBzaG91bGQgYmUgc2hvd24gYXMgYSB0ZXN0IG9uIAotCSAqIHRoZSB0ZXN0IGNvbGxlY3RvciBtZW51LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvamVjdCB0aGF0IHRoaXMgdGVzdCBjYXNlIGlzIGRlc2lnbmVkIHRvIHJ1biBvbi4KLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aGF0IHRoaXMgdGVzdCBjYXNlIGlzIGRlc2lnbmVkIAotCSAqIHRvIHJ1biBvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpZCBvZiB0aGUgcGx1Z2luIHRoYXQgZGVjbGFyZWQgdGhpcyB0ZXN0IGNhc2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWNsYXJpbmdQbHVnaW5JZCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHRlc3QgY2FzZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBtdXN0IGJlIGltcG9ydGVkIGZvciB0aGlzIHRlc3QgY2FzZQotCSAqIHRvIHJ1biBvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElucHV0RmlsZU5hbWUoKTsKLQkKLQkvKioKLQkgKiBJbXBvcnQgdGhlIGZpbGUsIGlmIG5lY2Vzc2FyeSwgYW5kIHJ1biB0aGlzIHRlc3QuIFRoZSB0ZXN0IGNhc2UKLQkgKiByZXBvcnRzIHdoZXRoZXIgb3Igbm90IHRoZSB0ZXN0IHBhc3NlcyB0byB0aGUgSVRlc3RCdWZmZXIuCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0KTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L01lc3NhZ2VNZXRhRGF0YS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvTWVzc2FnZU1ldGFEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2M2JiYWUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvTWVzc2FnZU1ldGFEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLQotCi0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlTWV0YURhdGEgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJTkVOT19VTlNFVCA9IC0xOwotCXByaXZhdGUgU3RyaW5nIF9tZXNzYWdlUHJlZml4ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfcmVzb3VyY2UgPSBudWxsOwotCXByaXZhdGUgaW50IF9saW5lTnVtYmVyID0gTElORU5PX1VOU0VUOwotCXByaXZhdGUgU3RyaW5nIF9sb2NhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX3RleHQgPSBudWxsOyAvLyBXaGVuIHRoaXMgdGVzdCBjYXNlIHdhcyBnZW5lcmF0ZWQsIHdoYXQgd2FzIHRoZSB0ZXh0IG9mIHRoZSBtYXJrZXI/IFRoaXMgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHdoZW4gbWVzc2FnZSBwcmVmaXhlcyBjaGFuZ2U7IHRoZSB0ZXN0IGNhc2Ugd2lsbCBmYWlsIGJlY2F1c2UgdGhlIHByZWZpeCBkb2Vzbid0IG1hdGNoLCBidXQgaXQncyBlYXN5IHRvIHNlZSB0aGF0IHRoZSBvbGQgcHJlZml4IHRlc3RlZCB0aGUgc2FtZSB0aGluZyBhcyB0aGUgbmV3IHByZWZpeC4KLQlwcml2YXRlIFZhbGlkYXRvclRlc3RjYXNlIF90bWQgPSBudWxsOyAvLyBwb2ludGVyIGJhY2sgdG8gdGhlIHRlc3RjYXNlIHBhcmVudAotCQotCXB1YmxpYyBNZXNzYWdlTWV0YURhdGEoVmFsaWRhdG9yVGVzdGNhc2UgdG1kLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgcmVzb3VyY2UsIGludCBsaW5lTnVtYmVyLCBTdHJpbmcgdGV4dCkgewotCQl0aGlzKHRtZCwgcHJlZml4LCByZXNvdXJjZSwgdGV4dCk7Ci0JCV9saW5lTnVtYmVyID0gbGluZU51bWJlcjsKLQl9Ci0JCi0JcHVibGljIE1lc3NhZ2VNZXRhRGF0YShWYWxpZGF0b3JUZXN0Y2FzZSB0bWQsIFN0cmluZyBwcmVmaXgsIFN0cmluZyByZXNvdXJjZSwgU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgdGV4dCkgewotCQl0aGlzKHRtZCwgcHJlZml4LCByZXNvdXJjZSwgdGV4dCk7Ci0JCV9sb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQkKLQlwdWJsaWMgTWVzc2FnZU1ldGFEYXRhKFZhbGlkYXRvclRlc3RjYXNlIHRtZCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHJlc291cmNlLCBTdHJpbmcgdGV4dCkgewotCQlfdG1kID0gdG1kOwotCQlfbWVzc2FnZVByZWZpeCA9IHByZWZpeDsKLQkJX3Jlc291cmNlID0gcmVzb3VyY2U7Ci0JCV90ZXh0ID0gKHRleHQgPT0gbnVsbCkgPyAiIiA6IHRleHQ7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIFZhbGlkYXRvclRlc3RjYXNlIGdldFZhbGlkYXRvclRlc3RjYXNlKCkgewotCQlyZXR1cm4gX3RtZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlUHJlZml4KCkgewotCQlyZXR1cm4gX21lc3NhZ2VQcmVmaXg7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiBfcmVzb3VyY2U7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIF9saW5lTnVtYmVyOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gX2xvY2F0aW9uOwotCX0KLQkKLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGEgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gZ2V0VmFsaWRhdG9yVGVzdGNhc2UoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBfdGV4dDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNTZXRMaW5lTnVtYmVyKCkgewotCQlyZXR1cm4gKF9saW5lTnVtYmVyICE9IExJTkVOT19VTlNFVCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBpc1NldChfbG9jYXRpb24pOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NldFJlc291cmNlKCkgewotCQlyZXR1cm4gaXNTZXQoX3Jlc291cmNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzU2V0KFN0cmluZyB2YWx1ZSkgewotCQlpZih2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmKHZhbHVlLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L01lc3NhZ2VVdGlsaXR5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9NZXNzYWdlVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmVhZWVhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L01lc3NhZ2VVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi5zYW1wbGUucGFyc2VyLlByb3BlcnR5TGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5JQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZVV0aWxpdHkgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfVEVTVENBU0VfTUVTU0FHRV9URU1QTEFURV8gPSAiPG1lc3NhZ2UgcHJlZml4PVwiezB9XCIgcmVzb3VyY2U9XCJ7MX1cIiBsb2NhdGlvbj1cInsyfVwiIHRleHQ9XCJ7M31cIi8+IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfVEVTVENBU0VfTUFSS0VSX1RFTVBMQVRFXyA9ICAiPG1hcmtlciBwcmVmaXg9XCJ7MH1cIiByZXNvdXJjZT1cInsxfVwiIGxvY2F0aW9uPVwiezJ9XCIgdGV4dD1cInszfVwiLz4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZUNvbXBhcmF0b3IgX21lc3NhZ2VDb21wYXJhdG9yID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBNZXNzYWdlSWRDb21wYXJhdG9yIF9tZXNzYWdlSWRDb21wYXJhdG9yID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBNZXNzYWdlUHJlZml4Q29tcGFyYXRvciBfbWVzc2FnZVByZWZpeENvbXBhcmF0b3IgPSBudWxsOwotCQotCXByaXZhdGUgTWVzc2FnZVV0aWxpdHkoKSB7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKE1lc3NhZ2VNZXRhRGF0YSBtbWQpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gKG1tZC5pc1NldExpbmVOdW1iZXIoKSkgPyBTdHJpbmcudmFsdWVPZihtbWQuZ2V0TGluZU51bWJlcigpKSA6IG1tZC5nZXRMb2NhdGlvbigpOwotCQlyZXR1cm4gdG9TdHJpbmcobW1kLmdldE1lc3NhZ2VQcmVmaXgoKSwgbW1kLmdldFJlc291cmNlKCksIGxvY2F0aW9uLCBtbWQuZ2V0VGV4dCgpLCBfVEVTVENBU0VfTUVTU0FHRV9URU1QTEFURV8pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhJTWFya2VyIG1hcmtlcikgewotCQlJbnRlZ2VyIGxpbmVOdW1iZXIgPSBNZXNzYWdlVXRpbGl0eS5nZXRMaW5lTnVtYmVyKG1hcmtlcik7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IChsaW5lTnVtYmVyID09IG51bGwpID8gKGxvY2F0aW9uID0gTWVzc2FnZVV0aWxpdHkuZ2V0TG9jYXRpb24obWFya2VyKSkgOiAobG9jYXRpb24gPSBsaW5lTnVtYmVyLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gdG9TdHJpbmcoZ2V0TWVzc2FnZVByZWZpeChtYXJrZXIpLCBnZXRSZXNvdXJjZShtYXJrZXIpLCBsb2NhdGlvbiwgZ2V0TWVzc2FnZShtYXJrZXIpLCBfVEVTVENBU0VfTUFSS0VSX1RFTVBMQVRFXyk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgZm1zc2dQcmVmaXgsIFN0cmluZyBmcmVzb3VyY2UsIFN0cmluZyBmbG9jYXRpb24sIFN0cmluZyBmdGV4dCwgU3RyaW5nIHRlbXBsYXRlKSB7Ci0JCVN0cmluZyBtc3NnUHJlZml4ID0gKGZtc3NnUHJlZml4ID09IG51bGwpID8gIiIgOiBmbXNzZ1ByZWZpeDsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVzb3VyY2UgPSAoZnJlc291cmNlID09IG51bGwpID8gIiIgOiBmcmVzb3VyY2U7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGxvY2F0aW9uID0gKGZsb2NhdGlvbiA9PSBudWxsKSA/ICIiIDogZmxvY2F0aW9uOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0ZXh0ID0gKGZ0ZXh0ID09IG51bGwpID8gIiIgOiBmdGV4dDsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQodGVtcGxhdGUsIG5ldyBTdHJpbmdbXXttc3NnUHJlZml4LCByZXNvdXJjZSwgbG9jYXRpb24sIHRleHR9KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvamVjdChJTWFya2VyIG1hcmtlcikgewotCQlyZXR1cm4gbWFya2VyLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQl9Ci0JCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZShJTWFya2VyIG1hcmtlcikgewotCQlyZXR1cm4gbWFya2VyLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCk7Ci0JfQotCQotCi0JLy8gQmFzZWQgb24gdGhlIGxhc3QgbGV0dGVyIG9mIHRoZSBtZXNzYWdlIHByZWZpeCwgd2hhdCBzZXZlcml0eQotCS8vIHNob3VsZCB0aGlzIG1hcmtlciBiZT8KLQlwdWJsaWMgc3RhdGljIEludGVnZXIgZ2V0U2V2ZXJpdHkoSU1hcmtlciBtYXJrZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSAoU3RyaW5nKW1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKTsKLQkJaWYobWVzc2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJU3RyaW5nW10gdG9rZW5zID0gcGFyc2UobWVzc2FnZSk7Ci0JCVN0cmluZyBzZXZlcml0eSA9IHRva2Vuc1sxXTsKLQkJSW50ZWdlciByZXN1bHQ7Ci0JCWlmKHNldmVyaXR5LmVxdWFscygiRSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCA9IG5ldyBJbnRlZ2VyKElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOwotCQl9Ci0JCWVsc2UgaWYoc2V2ZXJpdHkuZXF1YWxzKCJXIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ID0gbmV3IEludGVnZXIoSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HKTsKLQkJfQotCQllbHNlIGlmKHNldmVyaXR5LmVxdWFscygiSSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdCA9IG5ldyBJbnRlZ2VyKElNYXJrZXIuU0VWRVJJVFlfSU5GTyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2UoSU1hcmtlciBtYXJrZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU3RyaW5nKW1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1lc3NhZ2VQcmVmaXgoSU1hcmtlciBtYXJrZXIpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBnZXRNZXNzYWdlKG1hcmtlcik7Ci0JCWlmKG1lc3NhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIHRva2VucyA9IHBhcnNlKG1lc3NhZ2UpOwotCQlyZXR1cm4gdG9rZW5zWzBdOwotCX0KLQkKLQkvLyBUaGlzIG1ldGhvZCBpcyBuZWVkZWQgZm9yIHRoZSBmdXp6eSBjb21wYXJlLiBOZWVkIHRvIAotCS8vIHN0cmlwIHRoZSAiLmphdmEiIG9yICIuY2xhc3MiIGV4dGVuc2lvbiBvZmYgb2YgdGhlIHJlc291cmNlCi0JLy8gbmFtZSBzbyB0aGF0IHRoZSBjbGFzcyBuYW1lIGNhbiBiZSBzZWFyY2hlZCBmb3IgaW4gdGhlIG1hcmtlcidzCi0JLy8gbG9jYXRpb24gdGV4dC4KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZShNZXNzYWdlTWV0YURhdGEgbW1kKSB7Ci0JCVN0cmluZyByZXNvdXJjZSA9IG1tZC5nZXRSZXNvdXJjZSgpOwotCQlpbnQgaW5kZXggPSByZXNvdXJjZS5pbmRleE9mKCIuamF2YSIpOyAvLyROT04tTkxTLTEkCi0JCWlmKGluZGV4ID4gLTEpIHsKLQkJCXJldHVybiByZXNvdXJjZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9Ci0JCQotCQlpbmRleCA9IHJlc291cmNlLmluZGV4T2YoIi5jbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCWlmKGluZGV4ID4gLTEpIHsKLQkJCXJldHVybiByZXNvdXJjZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yTWV0YURhdGEgZ2V0VmFsaWRhdG9yKElNYXJrZXIgbWFya2VyKSB7Ci0JCVN0cmluZyB2YWxpZGF0b3JDbGFzcyA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRWYWxpZGF0b3IobWFya2VyKTsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvckNsYXNzKTsKLQkJcmV0dXJuIHZtZDsKLQl9Ci0JCi0JLyoqCi0JICogUGFyc2UgdGhlIG1lc3NhZ2UgdmFsdWUsIHRvIGV4dHJhY3QgdGhlIHVuaXF1ZSBlcnJvciBpZCwgaWYgYW55LgotCSAqIFN0cmluZ1swXSBpcyB0aGUgbWVzc2FnZSBwcmVmaXgsIFN0cmluZyBbMV0gaXMgdGhlIGVycm9yIGNoYXIsIFN0cmluZ1syXSBpcyB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIGFmdGVyIHRoZSAnOicKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHBhcnNlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nW117IiIsICIiLCAiIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihtZXNzYWdlKTsKLQkJaW50IG51bVRva2VucyA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQlpZiAobnVtVG9rZW5zID09IDApIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nW117IiIsICIiLCBtZXNzYWdlfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZXJyb3JJZCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWJvb2xlYW4gaXNFcnJvckluZGV4ID0gZmFsc2U7Ci0KLQkJCWludCBlcnJvcklkSW5kZXggPSBlcnJvcklkLmluZGV4T2YoJzonKTsKLQkJCWlmIChlcnJvcklkSW5kZXggPiAwKSB7Ci0JCQkJU3RyaW5nIHRlbXBTdHJpbmcgPSBlcnJvcklkLnN1YnN0cmluZygwLCBlcnJvcklkSW5kZXgpOwotCQkJCWNoYXJbXSB0ZW1wID0gdGVtcFN0cmluZy50b0NoYXJBcnJheSgpOwotCQkJCWlmICh0ZW1wLmxlbmd0aCA9PSA5KSB7IC8vIE11c3QgYmUgb2YgdGhlIGZvcm0gQUJDRDEyMzRFLCB3aGljaCBpcyA5IGNoYXIgbG9uZwotCi0JCQkJCWlzRXJyb3JJbmRleCA9IENoYXJhY3Rlci5pc0xldHRlcih0ZW1wWzBdKTsKLQkJCQkJaXNFcnJvckluZGV4ID0gaXNFcnJvckluZGV4ICYmIENoYXJhY3Rlci5pc0xldHRlcih0ZW1wWzFdKTsKLQkJCQkJaXNFcnJvckluZGV4ID0gaXNFcnJvckluZGV4ICYmIENoYXJhY3Rlci5pc0xldHRlcih0ZW1wWzJdKTsKLQkJCQkJaXNFcnJvckluZGV4ID0gaXNFcnJvckluZGV4ICYmIENoYXJhY3Rlci5pc0xldHRlcih0ZW1wWzNdKTsKLQkJCQkJaXNFcnJvckluZGV4ID0gaXNFcnJvckluZGV4ICYmIENoYXJhY3Rlci5pc0RpZ2l0KHRlbXBbNF0pOwotCQkJCQlpc0Vycm9ySW5kZXggPSBpc0Vycm9ySW5kZXggJiYgQ2hhcmFjdGVyLmlzRGlnaXQodGVtcFs1XSk7Ci0JCQkJCWlzRXJyb3JJbmRleCA9IGlzRXJyb3JJbmRleCAmJiBDaGFyYWN0ZXIuaXNEaWdpdCh0ZW1wWzZdKTsKLQkJCQkJaXNFcnJvckluZGV4ID0gaXNFcnJvckluZGV4ICYmIENoYXJhY3Rlci5pc0RpZ2l0KHRlbXBbN10pOwotCQkJCQlpc0Vycm9ySW5kZXggPSBpc0Vycm9ySW5kZXggJiYgQ2hhcmFjdGVyLmlzTGV0dGVyKHRlbXBbOF0pOwotCi0JCQkJCWlmIChpc0Vycm9ySW5kZXgpIHsKLQkJCQkJCVN0cmluZyBzaG9ydE1lc3NhZ2U7Ci0JCQkJCQlpZiAobnVtVG9rZW5zID4gMSkgewotCQkJCQkJCXNob3J0TWVzc2FnZSA9IG1lc3NhZ2Uuc3Vic3RyaW5nKGVycm9ySWRJbmRleCArIDEsIG1lc3NhZ2UubGVuZ3RoKCkpLmludGVybigpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJc2hvcnRNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBuZXcgU3RyaW5nW117dGVtcFN0cmluZy5zdWJzdHJpbmcoMCwgOCksIG5ldyBTdHJpbmcobmV3IGNoYXJbXXt0ZW1wWzhdfSksIHNob3J0TWVzc2FnZX07Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghaXNFcnJvckluZGV4KSB7Ci0JCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiIiwgIiIsIG1lc3NhZ2V9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXsiIiwgIiIsIG1lc3NhZ2V9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEludGVnZXIgZ2V0TGluZU51bWJlcihJTWFya2VyIG1hcmtlcikgewotCQl0cnkgewotCQkJcmV0dXJuIChJbnRlZ2VyKW1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5MSU5FX05VTUJFUik7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3QoSU1hcmtlciBtYXJrZXIpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyB0YXJnZXRPYmplY3QgPSAoU3RyaW5nKW1hcmtlci5nZXRBdHRyaWJ1dGUoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5WQUxJREFUSU9OX01BUktFUl9UQVJHRVRPQkpFQ1QpOwotCQkJaWYoKHRhcmdldE9iamVjdCAhPSBudWxsKSAmJiAodGFyZ2V0T2JqZWN0LmVxdWFscygiIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBFbXB0eSBzdHJpbmcgbWVhbnMgdGhhdCB0aGVyZSB3YXMgbm8gdGFyZ2V0IG9iamVjdC4KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiB0YXJnZXRPYmplY3Q7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTb3J0IGZpcnN0IG9uIHZhbGlkYXRvciwgCi0JICogdGhlbiBwcm9qZWN0LCAKLQkgKiB0aGVuIG1lc3NhZ2UgcHJlZml4LAotCSAqIHRoZW4gbG9jYXRpb24sCi0JICogdGhlbiByZXNvdXJjZS4gKFRoZSByZXNvdXJjZSBtYXkgYmUgZGlmZmVyZW50IGluIGJhdGNoIGFuZCBVSSwgc28gY29tcGFyZSBsb2NhdGlvbiAmIHJlc291cmNlIGF0IHRoZSBzYW1lIHRpbWUuKQotCSAqIAotCSAqIEBwYXJhbSB2ZXJib3NlIElmIHRydWUsIHZlcmJvc2Ugb3V0cHV0IHdoaWxlIGNvbXBhcmluZyBsaXN0cy4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIGdldE1lc3NhZ2VDb21wYXJhdG9yKGZpbmFsIElCdWZmZXIgYnVmZmVyLCBmaW5hbCBib29sZWFuIHZlcmJvc2UpIHsKLQkJaWYoX21lc3NhZ2VDb21wYXJhdG9yID09IG51bGwpIHsKLQkJCV9tZXNzYWdlQ29tcGFyYXRvciA9IG5ldyBNZXNzYWdlVXRpbGl0eSgpLiBuZXcgTWVzc2FnZUNvbXBhcmF0b3IoKTsKLQkJfQotCQlfbWVzc2FnZUNvbXBhcmF0b3Iuc2V0VmVyYm9zZSh2ZXJib3NlKTsKLQkJX21lc3NhZ2VDb21wYXJhdG9yLnNldEJ1ZmZlcihidWZmZXIpOwotCQlyZXR1cm4gX21lc3NhZ2VDb21wYXJhdG9yOwotCX0KLQkKLQkvKioKLQkgKiBTb3J0IGZpcnN0IG9uIHRoZSB2ZXJzaW9uLCB0aGVuIG9uIHRoZSBtZXNzYWdlIHByZWZpeC4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBDb21wYXJhdG9yIGdldE1lc3NhZ2VJZENvbXBhcmF0b3IoZmluYWwgSUJ1ZmZlciBidWZmZXIsIGZpbmFsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlpZihfbWVzc2FnZUlkQ29tcGFyYXRvciA9PSBudWxsKSB7Ci0JCQlfbWVzc2FnZUlkQ29tcGFyYXRvciA9IG5ldyBNZXNzYWdlVXRpbGl0eSgpLiBuZXcgTWVzc2FnZUlkQ29tcGFyYXRvcigpOwotCQl9Ci0JCV9tZXNzYWdlSWRDb21wYXJhdG9yLnNldFZlcmJvc2UodmVyYm9zZSk7Ci0JCV9tZXNzYWdlSWRDb21wYXJhdG9yLnNldEJ1ZmZlcihidWZmZXIpOwotCQlyZXR1cm4gX21lc3NhZ2VJZENvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYXRpb24oSU1hcmtlciBtYXJrZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU3RyaW5nKW1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTik7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgTWVzc2FnZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQkJcHJpdmF0ZSBib29sZWFuIF92ZXJib3NlID0gZmFsc2U7Ci0JCXByaXZhdGUgSUJ1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzVmVyYm9zZSgpIHsKLQkJCXJldHVybiBfdmVyYm9zZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0VmVyYm9zZShib29sZWFuIHYpIHsKLQkJCV92ZXJib3NlID0gdjsKLQkJfQotCQkKLQkJcHVibGljIElCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQkJcmV0dXJuIF9idWZmZXI7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldEJ1ZmZlcihJQnVmZmVyIGIpIHsKLQkJCV9idWZmZXIgPSBiOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlpZigoYSA9PSBudWxsKSAmJiAoYiA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJCi0JCQkKLQkJCS8vIFNvcnQgZmlyc3Qgb24gdGhlIG1lc3NhZ2UgcHJlZml4LCB0aGVuIG9uIHRoZSBsb2NhdGlvbiwgdGhlbiBwcm9qZWN0LCB0aGVuIHJlc291cmNlCi0JCQlpZigoYSBpbnN0YW5jZW9mIFN0cmluZykgJiYgKGIgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJcmV0dXJuIGNvbXBhcmUoKFN0cmluZylhLCAoU3RyaW5nKWIpOwotCQkJfQotCQkJZWxzZSBpZiAoKGEgaW5zdGFuY2VvZiBJTWFya2VyKSAmJiAoYiBpbnN0YW5jZW9mIElNYXJrZXIpKSB7Ci0JCQkJSU1hcmtlciBhTSA9IChJTWFya2VyKWE7Ci0JCQkJSU1hcmtlciBiTSA9IChJTWFya2VyKWI7Ci0JCQkJaW50IHJlc3VsdCA9IGNvbXBhcmUoYU0sIGJNKTsKLQkJCQlpZihpc1ZlcmJvc2UoKSkgewotCQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiY29tcGFyZSgiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcoYU0pICsgIiwgIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKGJNKSArICIgPSAiICsgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJCWVsc2UgaWYgKChhIGluc3RhbmNlb2YgSU1hcmtlcikgJiYgKGIgaW5zdGFuY2VvZiBNZXNzYWdlTWV0YURhdGEpKSB7Ci0JCQkJSU1hcmtlciBhTSA9IChJTWFya2VyKWE7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IChNZXNzYWdlTWV0YURhdGEpYjsKLQkJCQlpbnQgcmVzdWx0ID0gY29tcGFyZShhTSwgbW1kKTsKLQkJCQlpZihpc1ZlcmJvc2UoKSkgewotCQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiY29tcGFyZSgiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcoYU0pICsgIiwgIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1tZCkgKyAiID0gIiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQllbHNlIGlmKChhIGluc3RhbmNlb2YgTWVzc2FnZU1ldGFEYXRhKSAmJiAoYiBpbnN0YW5jZW9mIElNYXJrZXIpKSB7Ci0JCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IChNZXNzYWdlTWV0YURhdGEpYTsKLQkJCQlJTWFya2VyIGJNID0gKElNYXJrZXIpYjsKLQkJCQlpbnQgcmVzdWx0ID0gY29tcGFyZShtbWQsIGJNKTsKLQkJCQlpZihpc1ZlcmJvc2UoKSkgewotCQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiY29tcGFyZSgiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcobW1kKSArICIsICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhiTSkgKyAiID0gIiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQkJCQkJCQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQllbHNlIGlmKChhIGluc3RhbmNlb2YgTWVzc2FnZU1ldGFEYXRhKSAmJiAoYiBpbnN0YW5jZW9mIE1lc3NhZ2VNZXRhRGF0YSkpIHsKLQkJCQlNZXNzYWdlTWV0YURhdGEgYU1NRCA9IChNZXNzYWdlTWV0YURhdGEpYTsKLQkJCQlNZXNzYWdlTWV0YURhdGEgYk1NRCA9IChNZXNzYWdlTWV0YURhdGEpYjsKLQkJCQlpbnQgcmVzdWx0ID0gY29tcGFyZShhTU1ELCBiTU1EKTsKLQkJCQlpZihpc1ZlcmJvc2UoKSkgewotCQkJCQlnZXRCdWZmZXIoKS53cml0ZSgiY29tcGFyZSgiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcoYU1NRCkgKyAiLCAiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcoYk1NRCkgKyAiID0gIiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCQkKLQkJCS8vIGVsc2UgcHV0IGl0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QKLQkJCXJldHVybiAxOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIGFTdHIsIFN0cmluZyBiU3RyKSB7Ci0JCQlpZigoYVN0ciA9PSBudWxsKSAmJiAoYlN0ciA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhU3RyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCWVsc2UgaWYoYlN0ciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJcmV0dXJuIGFTdHIuY29tcGFyZVRvKGJTdHIpOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoaW50IGFJbnQsIGludCBiSW50KSB7Ci0JCQlyZXR1cm4gYUludCAtIGJJbnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZShWYWxpZGF0b3JNZXRhRGF0YSBhVk1ELCBWYWxpZGF0b3JNZXRhRGF0YSBiVk1EKSB7Ci0JCQlpZigoYVZNRCA9PSBudWxsKSAmJiAoYlZNRCA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhVk1EID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCWVsc2UgaWYoYlZNRCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJcmV0dXJuIGNvbXBhcmUoYVZNRC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCksIGJWTUQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZShJTWFya2VyIGFNYXJrZXIsIElNYXJrZXIgYk1hcmtlcikgewotCQkJaWYoKGFNYXJrZXIgPT0gbnVsbCkgJiYgKGJNYXJrZXIgPT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWVsc2UgaWYoYU1hcmtlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKGJNYXJrZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiAtMTsKLQkJCX0KLQkJCQotCQkJaW50IHZhbENtcCA9IGNvbXBhcmUoZ2V0VmFsaWRhdG9yKGFNYXJrZXIpLCBnZXRWYWxpZGF0b3IoYk1hcmtlcikpOwotCQkJaWYodmFsQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gdmFsQ21wOwotCQkJfQotCi0JCQlpbnQgcHJqQ21wID0gY29tcGFyZShnZXRQcm9qZWN0KGFNYXJrZXIpLCBnZXRQcm9qZWN0KGJNYXJrZXIpKTsKLQkJCWlmKHByakNtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHByakNtcDsKLQkJCX0KLQkJCQotCQkJaW50IGlkQ21wID0gY29tcGFyZShnZXRNZXNzYWdlUHJlZml4KGFNYXJrZXIpLCBnZXRNZXNzYWdlUHJlZml4KGJNYXJrZXIpKTsKLQkJCWlmKGlkQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gaWRDbXA7Ci0JCQl9Ci0KLQkJCWludCBjbXAgPSBjb21wYXJlUmVzb3VyY2VBbmRMb2NhdGlvbihhTWFya2VyLCBiTWFya2VyKTsKLQkJCXJldHVybiBjbXA7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZShJTWFya2VyIG1hcmtlciwgTWVzc2FnZU1ldGFEYXRhIG1tZCkgewotCQkJaWYoKG1hcmtlciA9PSBudWxsKSAmJiAobW1kID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKG1hcmtlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKG1tZCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQlpbnQgdmFsQ21wID0gY29tcGFyZShnZXRWYWxpZGF0b3IobWFya2VyKSwgbW1kLmdldFZhbGlkYXRvcigpKTsKLQkJCWlmKHZhbENtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHZhbENtcDsKLQkJCX0KLQotCQkJaW50IHByakNtcCA9IGNvbXBhcmUoZ2V0UHJvamVjdChtYXJrZXIpLCBtbWQuZ2V0VmFsaWRhdG9yVGVzdGNhc2UoKS5nZXRQcm9qZWN0TmFtZSgpKTsKLQkJCWlmKHByakNtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHByakNtcDsKLQkJCX0KLQkJCQotCQkJaW50IGlkQ21wID0gY29tcGFyZShnZXRNZXNzYWdlUHJlZml4KG1hcmtlciksIG1tZC5nZXRNZXNzYWdlUHJlZml4KCkpOwotCQkJaWYoaWRDbXAgIT0gMCkgewotCQkJCXJldHVybiBpZENtcDsKLQkJCX0KLQotCQkJaW50IGNtcCA9IGNvbXBhcmVSZXNvdXJjZUFuZExvY2F0aW9uKG1hcmtlciwgbW1kKTsKLQkJCXJldHVybiBjbXA7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZShNZXNzYWdlTWV0YURhdGEgbW1kLCBJTWFya2VyIG1hcmtlcikgewotCQkJaWYoKG1tZCA9PSBudWxsKSAmJiAobWFya2VyID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKG1tZCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCQllbHNlIGlmKG1hcmtlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCi0JCQlpbnQgdmFsQ21wID0gY29tcGFyZShtbWQuZ2V0VmFsaWRhdG9yKCksIGdldFZhbGlkYXRvcihtYXJrZXIpKTsKLQkJCWlmKHZhbENtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHZhbENtcDsKLQkJCX0KLQotCQkJaW50IHByakNtcCA9IGNvbXBhcmUobW1kLmdldFZhbGlkYXRvclRlc3RjYXNlKCkuZ2V0UHJvamVjdE5hbWUoKSwgZ2V0UHJvamVjdChtYXJrZXIpKTsKLQkJCWlmKHByakNtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHByakNtcDsKLQkJCX0KLQotCQkJaW50IGlkQ21wID0gY29tcGFyZShtbWQuZ2V0TWVzc2FnZVByZWZpeCgpLCBnZXRNZXNzYWdlUHJlZml4KG1hcmtlcikpOwotCQkJaWYoaWRDbXAgIT0gMCkgewotCQkJCXJldHVybiBpZENtcDsKLQkJCX0KLQotCQkJaW50IGNtcCA9IGNvbXBhcmVSZXNvdXJjZUFuZExvY2F0aW9uKG1tZCwgbWFya2VyKTsKLQkJCXJldHVybiBjbXA7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZShNZXNzYWdlTWV0YURhdGEgYU1NRCwgTWVzc2FnZU1ldGFEYXRhIGJNTUQpIHsKLQkJCWlmKChhTU1EID09IG51bGwpICYmIChiTU1EID09IG51bGwpKSB7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCQllbHNlIGlmKGFNTUQgPT0gbnVsbCkgewotCQkJCXJldHVybiAxOwotCQkJfQotCQkJZWxzZSBpZihiTU1EID09IG51bGwpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCQkKLQkJCWludCB2YWxDbXAgPSBjb21wYXJlKGFNTUQuZ2V0VmFsaWRhdG9yKCksIGJNTUQuZ2V0VmFsaWRhdG9yKCkpOwotCQkJaWYodmFsQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gdmFsQ21wOwotCQkJfQotCi0JCQlpbnQgcHJqQ21wID0gY29tcGFyZShhTU1ELmdldFZhbGlkYXRvclRlc3RjYXNlKCkuZ2V0UHJvamVjdE5hbWUoKSwgYk1NRC5nZXRWYWxpZGF0b3JUZXN0Y2FzZSgpLmdldFByb2plY3ROYW1lKCkpOwotCQkJaWYocHJqQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gcHJqQ21wOwotCQkJfQotCQkJCi0JCQlpbnQgaWRDbXAgPSBjb21wYXJlKGFNTUQuZ2V0TWVzc2FnZVByZWZpeCgpLCBiTU1ELmdldE1lc3NhZ2VQcmVmaXgoKSk7Ci0JCQlpZihpZENtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIGlkQ21wOwotCQkJfQotCi0JCQlpbnQgY21wID0gY29tcGFyZVJlc291cmNlQW5kTG9jYXRpb24oYU1NRCwgYk1NRCk7Ci0JCQlyZXR1cm4gY21wOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmVSZXNvdXJjZUFuZExvY2F0aW9uKElNYXJrZXIgYU1hcmtlciwgSU1hcmtlciBiTWFya2VyKSB7Ci0JCQlpbnQgcmVzQ21wID0gY29tcGFyZShnZXRSZXNvdXJjZShhTWFya2VyKSwgZ2V0UmVzb3VyY2UoYk1hcmtlcikpOwotCQkJaWYocmVzQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gcmVzQ21wOwotCQkJfQotCQkJCi0JCQlJbnRlZ2VyIGFMaW5lTm8gPSBnZXRMaW5lTnVtYmVyKGFNYXJrZXIpOwotCQkJSW50ZWdlciBiTGluZU5vID0gZ2V0TGluZU51bWJlcihiTWFya2VyKTsKLQkJCWlmKChhTGluZU5vICE9IG51bGwpICYmIChiTGluZU5vIT0gbnVsbCkpIHsKLQkJCQlyZXR1cm4gY29tcGFyZShhTGluZU5vLCBiTGluZU5vKTsKLQkJCX0KLQkJCQotCQkJU3RyaW5nIGFMb2NhdGlvbiA9IGdldExvY2F0aW9uKGFNYXJrZXIpOwotCQkJU3RyaW5nIGJMb2NhdGlvbiA9IGdldExvY2F0aW9uKGJNYXJrZXIpOwotCQkJaWYoKGFMb2NhdGlvbiAhPSBudWxsKSAmJiAoYkxvY2F0aW9uICE9IG51bGwpKSB7Ci0JCQkJcmV0dXJuIGNvbXBhcmUoYUxvY2F0aW9uLCBiTG9jYXRpb24pOwotCQkJfQotCQkJCi0JCQkvLyBJZiBvbmUgaGFzIGEgbGluZSBudW1iZXIgYW5kIHRoZSBvdGhlciBoYXMgYSB0ZXh0IGxvY2F0aW9uLCBjYW4ndCBjb21wYXJlCi0JCQkvLyB0aGUgbG9jYXRpb24sIHNvIGp1c3QgYXNzdW1lIHRoYXQgdGhleSdyZSBlcXVhbC4KLQkJCXJldHVybiByZXNDbXA7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZVJlc291cmNlQW5kTG9jYXRpb24oSU1hcmtlciBtYXJrZXIsIE1lc3NhZ2VNZXRhRGF0YSBtbWQpIHsKLQkJCWludCByZXNDbXAgPSBjb21wYXJlKGdldFJlc291cmNlKG1hcmtlciksIG1tZC5nZXRSZXNvdXJjZSgpKTsKLQkJCWlmKHJlc0NtcCAhPSAwKSB7Ci0JCQkJcmV0dXJuIHJlc0NtcDsKLQkJCX0KLQkJCQotCQkJaWYobW1kLmlzU2V0TGluZU51bWJlcigpKSB7Ci0JCQkJSW50ZWdlciBhTGluZU5vID0gZ2V0TGluZU51bWJlcihtYXJrZXIpOwotCQkJCWludCBiTGluZU5vID0gbW1kLmdldExpbmVOdW1iZXIoKTsKLQkJCQlpZihhTGluZU5vICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGNvbXBhcmUoYUxpbmVOby5pbnRWYWx1ZSgpLCBiTGluZU5vKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmKG1tZC5pc1NldExvY2F0aW9uKCkpIHsKLQkJCQlTdHJpbmcgYUxvY2F0aW9uID0gZ2V0TG9jYXRpb24obWFya2VyKTsKLQkJCQlTdHJpbmcgYkxvY2F0aW9uID0gbW1kLmdldExvY2F0aW9uKCk7Ci0JCQkJaWYoKGFMb2NhdGlvbiAhPSBudWxsKSAmJiAoYkxvY2F0aW9uICE9IG51bGwpKSB7Ci0JCQkJCXJldHVybiBjb21wYXJlKGFMb2NhdGlvbiwgYkxvY2F0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIElmIG9uZSBoYXMgYSBsaW5lIG51bWJlciBhbmQgdGhlIG90aGVyIGhhcyBhIHRleHQgbG9jYXRpb24sIGNhbid0IGNvbXBhcmUKLQkJCS8vIHRoZSBsb2NhdGlvbiwgc28ganVzdCBhc3N1bWUgdGhhdCB0aGV5J3JlIGVxdWFsLgotCQkJcmV0dXJuIHJlc0NtcDsKLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlUmVzb3VyY2VBbmRMb2NhdGlvbihNZXNzYWdlTWV0YURhdGEgbW1kLCBJTWFya2VyIG1hcmtlcikgewotCQkJaW50IHJlc0NtcCA9IGNvbXBhcmUobW1kLmdldFJlc291cmNlKCksIGdldFJlc291cmNlKG1hcmtlcikpOwotCQkJaWYocmVzQ21wICE9IDApIHsKLQkJCQlyZXR1cm4gcmVzQ21wOwotCQkJfQotCi0JCQlpZihtbWQuaXNTZXRMaW5lTnVtYmVyKCkpIHsKLQkJCQlpbnQgYUxpbmVObyA9IG1tZC5nZXRMaW5lTnVtYmVyKCk7Ci0JCQkJSW50ZWdlciBiTGluZU5vID0gZ2V0TGluZU51bWJlcihtYXJrZXIpOwotCQkJCWlmKGJMaW5lTm8hPSBudWxsKSB7Ci0JCQkJCXJldHVybiBjb21wYXJlKGFMaW5lTm8sIGJMaW5lTm8uaW50VmFsdWUoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZihtbWQuaXNTZXRMb2NhdGlvbigpKSB7Ci0JCQkJU3RyaW5nIGFMb2NhdGlvbiA9IG1tZC5nZXRMb2NhdGlvbigpOwotCQkJCVN0cmluZyBiTG9jYXRpb24gPSBnZXRMb2NhdGlvbihtYXJrZXIpOwotCQkJCWlmKChhTG9jYXRpb24gIT0gbnVsbCkgJiYgKGJMb2NhdGlvbiAhPSBudWxsKSkgewotCQkJCQlyZXR1cm4gY29tcGFyZShhTG9jYXRpb24sIGJMb2NhdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBJZiBvbmUgaGFzIGEgbGluZSBudW1iZXIgYW5kIHRoZSBvdGhlciBoYXMgYSB0ZXh0IGxvY2F0aW9uLCBjYW4ndCBjb21wYXJlCi0JCQkvLyB0aGUgbG9jYXRpb24sIHNvIGp1c3QgYXNzdW1lIHRoYXQgdGhleSdyZSBlcXVhbC4KLQkJCXJldHVybiByZXNDbXA7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgY29tcGFyZVJlc291cmNlQW5kTG9jYXRpb24oTWVzc2FnZU1ldGFEYXRhIGFNTUQsIE1lc3NhZ2VNZXRhRGF0YSBiTU1EKSB7Ci0JCQlpbnQgcmVzQ21wID0gY29tcGFyZShhTU1ELmdldFJlc291cmNlKCksIGJNTUQuZ2V0UmVzb3VyY2UoKSk7Ci0JCQlpZihyZXNDbXAgIT0gMCkgewotCQkJCXJldHVybiByZXNDbXA7Ci0JCQl9Ci0KLQkJCWlmKGFNTUQuaXNTZXRMaW5lTnVtYmVyKCkgJiYgYk1NRC5pc1NldExpbmVOdW1iZXIoKSkgewotCQkJCWludCBhTGluZU5vID0gYU1NRC5nZXRMaW5lTnVtYmVyKCk7Ci0JCQkJaW50IGJMaW5lTm8gPSBiTU1ELmdldExpbmVOdW1iZXIoKTsKLQkJCQlyZXR1cm4gY29tcGFyZShhTGluZU5vLCBiTGluZU5vKTsKLQkJCX0KLQotCQkJaWYoYU1NRC5pc1NldExvY2F0aW9uKCkgJiYgYk1NRC5pc1NldExvY2F0aW9uKCkpIHsKLQkJCQlTdHJpbmcgYUxvY2F0aW9uID0gYU1NRC5nZXRMb2NhdGlvbigpOwotCQkJCVN0cmluZyBiTG9jYXRpb24gPSBiTU1ELmdldExvY2F0aW9uKCk7Ci0JCQkJaWYoKGFMb2NhdGlvbiAhPSBudWxsKSAmJiAoYkxvY2F0aW9uICE9IG51bGwpKSB7Ci0JCQkJCXJldHVybiBjb21wYXJlKGFMb2NhdGlvbiwgYkxvY2F0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIElmIG9uZSBoYXMgYSBsaW5lIG51bWJlciBhbmQgdGhlIG90aGVyIGhhcyBhIHRleHQgbG9jYXRpb24sIGNhbid0IGNvbXBhcmUKLQkJCS8vIHRoZSBsb2NhdGlvbiwgc28ganVzdCBhc3N1bWUgdGhhdCB0aGV5J3JlIGVxdWFsLgotCQkJcmV0dXJuIHJlc0NtcDsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yIGdldE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yKCkgewotCQlpZihfbWVzc2FnZVByZWZpeENvbXBhcmF0b3IgPT0gbnVsbCkgewotCQkJX21lc3NhZ2VQcmVmaXhDb21wYXJhdG9yID0gbmV3IE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIF9tZXNzYWdlUHJlZml4Q29tcGFyYXRvcjsKLQl9Ci0JCi0Jc3RhdGljIGNsYXNzIE1lc3NhZ2VQcmVmaXhDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLQkJCVN0cmluZyBhUHJlZml4ID0gbnVsbDsKLQkJCVN0cmluZyBiUHJlZml4ID0gbnVsbDsKLQkJCWlmKGEgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpIHsKLQkJCQlhUHJlZml4ID0gKChQcm9wZXJ0eUxpbmUpYSkuZ2V0TWVzc2FnZVByZWZpeCgpOwotCQkJfQotCQkJZWxzZSBpZihhIGluc3RhbmNlb2YgTWVzc2FnZU1ldGFEYXRhKSB7Ci0JCQkJYVByZWZpeCA9ICgoTWVzc2FnZU1ldGFEYXRhKWEpLmdldE1lc3NhZ2VQcmVmaXgoKTsKLQkJCX0KLQkJCQotCQkJaWYoYiBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkgewotCQkJCWJQcmVmaXggPSAoKFByb3BlcnR5TGluZSliKS5nZXRNZXNzYWdlUHJlZml4KCk7Ci0JCQl9Ci0JCQllbHNlIGlmKGIgaW5zdGFuY2VvZiBNZXNzYWdlTWV0YURhdGEpIHsKLQkJCQliUHJlZml4ID0gKChNZXNzYWdlTWV0YURhdGEpYikuZ2V0TWVzc2FnZVByZWZpeCgpOwotCQkJfQotCi0JCQlpZihhUHJlZml4Lmxlbmd0aCgpID09IDkpIHsKLQkJCQlhUHJlZml4ID0gYVByZWZpeC5zdWJzdHJpbmcoMCwgOSk7Ci0JCQl9Ci0JCQkKLQkJCWlmKGJQcmVmaXgubGVuZ3RoKCkgPT0gOSkgewotCQkJCWJQcmVmaXggPSBiUHJlZml4LnN1YnN0cmluZygwLCA5KTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGFQcmVmaXguY29tcGFyZVRvKGJQcmVmaXgpOwotCQl9Ci0JfQotCQkKLQljbGFzcyBNZXNzYWdlSWRDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBfdmVyYm9zZSA9IGZhbHNlOwotCQlwcml2YXRlIElCdWZmZXIgX2J1ZmZlciA9IG51bGw7Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc1ZlcmJvc2UoKSB7Ci0JCQlyZXR1cm4gX3ZlcmJvc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2KSB7Ci0JCQlfdmVyYm9zZSA9IHY7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJQnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJCXJldHVybiBfYnVmZmVyOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRCdWZmZXIoSUJ1ZmZlciBiKSB7Ci0JCQlfYnVmZmVyID0gYjsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlSWQoSU1hcmtlciBtYXJrZXIpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIChTdHJpbmcpbWFya2VyLmdldEF0dHJpYnV0ZShDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZBTElEQVRJT05fTUFSS0VSX01FU1NBR0VJRCk7Ci0JCQl9Ci0JCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIGFTdHIsIFN0cmluZyBiU3RyKSB7Ci0JCQlpZigoYVN0ciA9PSBudWxsKSAmJiAoYlN0ciA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhU3RyID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCWVsc2UgaWYoYlN0ciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJcmV0dXJuIGFTdHIuY29tcGFyZVRvKGJTdHIpOwotCQl9Ci0JCQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JCQlpZigoYSA9PSBudWxsKSAmJiAoYiA9PSBudWxsKSkgewotCQkJCXJldHVybiAwOwotCQkJfQotCQkJZWxzZSBpZihhID09IG51bGwpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQkJCWVsc2UgaWYoYiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJCi0JCQkKLQkJCS8vIFNvcnQgZmlyc3Qgb24gdGhlIHZlcnNpb24sIHRoZW4gb24gdGhlIG1lc3NhZ2UgcHJlZml4Ci0JCQlpZigoYSBpbnN0YW5jZW9mIFN0cmluZykgJiYgKGIgaW5zdGFuY2VvZiBTdHJpbmcpKSB7Ci0JCQkJU3RyaW5nIGFTdHIgPSAoU3RyaW5nKWE7Ci0JCQkJU3RyaW5nIGJTdHIgPSAoU3RyaW5nKWI7Ci0JCQkJcmV0dXJuIGNvbXBhcmUoYVN0ciwgYlN0cik7Ci0JCQl9Ci0JCQllbHNlIGlmICgoYSBpbnN0YW5jZW9mIFByb3BlcnR5TGluZSkgJiYgKGIgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpKSB7Ci0JCQkJUHJvcGVydHlMaW5lIGFNID0gKFByb3BlcnR5TGluZSlhOwotCQkJCVByb3BlcnR5TGluZSBiTSA9IChQcm9wZXJ0eUxpbmUpYjsKLQkJCQkKLQkJCQlyZXR1cm4gY29tcGFyZShhTS5nZXRNZXNzYWdlSWQoKSwgYk0uZ2V0TWVzc2FnZUlkKCkpOwotCQkJfQotCQkJZWxzZSBpZiAoKGEgaW5zdGFuY2VvZiBQcm9wZXJ0eUxpbmUpICYmIChiIGluc3RhbmNlb2YgSU1hcmtlcikpIHsKLQkJCQlQcm9wZXJ0eUxpbmUgYU0gPSAoUHJvcGVydHlMaW5lKWE7Ci0JCQkJSU1hcmtlciBiTSA9IChJTWFya2VyKWI7Ci0JCQkJCi0JCQkJcmV0dXJuIGNvbXBhcmUoYU0uZ2V0TWVzc2FnZUlkKCksIGdldE1lc3NhZ2VJZChiTSkpOwotCQkJfQotCQkJZWxzZSBpZigoYSBpbnN0YW5jZW9mIElNYXJrZXIpICYmIChiIGluc3RhbmNlb2YgUHJvcGVydHlMaW5lKSkgewotCQkJCUlNYXJrZXIgYU0gPSAoSU1hcmtlcilhOwotCQkJCVByb3BlcnR5TGluZSBiTSA9IChQcm9wZXJ0eUxpbmUpYjsKLQkJCQkKLQkJCQlyZXR1cm4gY29tcGFyZShnZXRNZXNzYWdlSWQoYU0pLCBiTS5nZXRNZXNzYWdlSWQoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmKChhIGluc3RhbmNlb2YgSU1hcmtlcikgJiYgKGIgaW5zdGFuY2VvZiBJTWFya2VyKSkgewotCQkJCUlNYXJrZXIgYU0gPSAoSU1hcmtlcilhOwotCQkJCUlNYXJrZXIgYk0gPSAoSU1hcmtlciliOwotCi0JCQkJcmV0dXJuIGNvbXBhcmUoZ2V0TWVzc2FnZUlkKGFNKSwgZ2V0TWVzc2FnZUlkKGJNKSk7Ci0JCQl9Ci0JCQkKLQkJCS8vIGVsc2UgcHV0IGl0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QKLQkJCXJldHVybiAxOwotCQl9Ci0JfTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L09wZXJhdGlvblRlc3RjYXNlLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9PcGVyYXRpb25UZXN0Y2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWNjNDRhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L09wZXJhdGlvblRlc3RjYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LklPcGVyYXRpb25SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci0KLS8qKgotICogSW5zdGVhZCBvZiB0ZXN0aW5nIGEgdmFsaWRhdG9yLCBhbiBvcGVyYXRpb24gdGVzdCBjYXNlIHRlc3RzIHRoZSAKLSAqIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uVGVzdGNhc2UgaW1wbGVtZW50cyBJVGVzdGNhc2VNZXRhRGF0YSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX3BsdWdpbklkID0gbnVsbDsgLy8gVGhlIHBsdWdpbiBpZCB0aGF0IGhhcyBjb250cmlidXRlZCB0aGlzIHRlc3QgY2FzZS4KLQlwcml2YXRlIFN0cmluZyBfcHJvamVjdE5hbWUgPSBudWxsOyAvLyB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aGF0IHRoaXMgdGVzdCBjYXNlIHRlc3RzCi0JcHJpdmF0ZSBTdHJpbmcgX2lucHV0RmlsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9vcE5hbWUgPSBudWxsOyAvLyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0JcHJpdmF0ZSBJT3BlcmF0aW9uUnVubmFibGUgX3J1bm5hYmxlID0gbnVsbDsKLQotCXB1YmxpYyBPcGVyYXRpb25UZXN0Y2FzZShTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBwcm9qZWN0TmFtZSwgU3RyaW5nIG9wTmFtZSwgU3RyaW5nIGlucHV0RmlsZU5hbWUsIElPcGVyYXRpb25SdW5uYWJsZSBydW5uYWJsZSkgewotCQlfcGx1Z2luSWQgPSBwbHVnaW5JZDsKLQkJX3Byb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0JCV9pbnB1dEZpbGVOYW1lID0gaW5wdXRGaWxlTmFtZTsKLQkJX29wTmFtZSA9IG9wTmFtZTsKLQkJX3J1bm5hYmxlID0gcnVubmFibGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIF9vcE5hbWU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7IC8vIGZyYW1ld29yayB0ZXN0IGNhc2VzIGFyZSBhbHdheXMgdmlzaWJsZSBvbiB0aGUgdGVzdCBjb2xsZWN0b3IgbWVudQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlY2xhcmluZ1BsdWdpbklkKCkgewotCQlyZXR1cm4gX3BsdWdpbklkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gX3Byb2plY3ROYW1lOwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFRlc3RjYXNlVXRpbGl0eS5maW5kUHJvamVjdCh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEZpbGVOYW1lKCkgewotCQlyZXR1cm4gX2lucHV0RmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBJT3BlcmF0aW9uUnVubmFibGUgZ2V0UnVubmFibGUoKSB7Ci0JCXJldHVybiBfcnVubmFibGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuSVRlc3RjYXNlTWV0YURhdGEjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXIsIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJZ2V0UnVubmFibGUoKS5zZXRCdWZmZXIoYnVmZmVyKTsKLQkJCWdldFJ1bm5hYmxlKCkuc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJCWdldFJ1bm5hYmxlKCkuc2V0TmFtZShnZXROYW1lKCkpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihnZXRSdW5uYWJsZSgpLCBidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9SZWdpc3RyeUNvbnN0YW50cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvUmVnaXN0cnlDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM0MDMyZS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9SZWdpc3RyeUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5OwotCi0vKioKLSAqIFZhbGlkYXRpb24gY29uc3RhbnRzIG5lZWRlZCB0byBkZWNsYXJlIGFuIGV4dGVuc2lvbiBwb2ludCwgYW5kCi0gKiB0byBpbXBsZW1lbnQgYW4gZXh0ZW5zaW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlZ2lzdHJ5Q29uc3RhbnRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW4uUExVR0lOX0lEOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9URVNUQ0FTRV9FWFRfUFRfSUQgPSAidGVzdCI7IC8vIGV4dGVuc2lvbiBwb2ludCBkZWNsYXJhdGlvbiBvZiB0aGUgdmFsaWRhdG9yIHRlc3QgY2FzZSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX1NFVFVQX0VYVF9QVF9JRCA9ICJ0ZXN0U2V0dXAiOyAvLyBleHRlbnNpb24gcG9pbnQgZGVjbGFyYXRpb24gb2YgdGhlIHRlc3QgY2FzZSBzZXR1cCBtZWNoYW5pc20gKGkuZS4sIGltcG9ydCB0aGUgRUFSIG9yIEpBUikgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9PUEVSQVRJT05fVEVTVENBU0VfRVhUX1BUX0lEID0gIm9wVGVzdCI7IC8vIGV4dGVuc2lvbiBwb2ludCBkZWNsYXJhdGlvbiBvZiB0aGUgb3BlcmF0aW9uIHRlc3QgY2FzZSAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEb3VibGUgRUpCMjAgPSBuZXcgRG91YmxlKDIuMCk7IC8vIEVKQiAyLjAgaW5wdXQgb3IgMS4zIEVBUgotCXB1YmxpYyBzdGF0aWMgZmluYWwgRG91YmxlIEVKQjExID0gbmV3IERvdWJsZSgxLjEpOyAvLyBFSkIgMS4xIGlucHV0IG9yIDEuMiBFQVIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERvdWJsZSBFSkIgPSBudWxsOyAvLyBjb21tb24gRUpCIGxldmVsLCBzdWNoIGFzIHJlZmxlY3Rpb24gZXJyb3JzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUpCMjBfTVNTRyA9ICJlamIyMCI7IC8vIGluIGEgLnByb3BlcnRpZXMgbGluZSwgaWYgdGhlIG1lc3NhZ2UgaWQgY29udGFpbnMgdGhpcyBzdHJpbmcsIGl0J3MgYW4gRUpCIDIuMCBydWxlIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkIxMV9NU1NHID0gImVqYjExIjsgLy8gaW4gYSAucHJvcGVydGllcyBsaW5lLCBpZiB0aGUgbWVzc2FnZSBpZCBjb250YWlucyB0aGlzIHN0cmluZywgaXQncyBhbiBFSkIgMS4xIHJ1bGUgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9NU1NHID0gbnVsbDsgLy8gaW4gYSAucHJvcGVydGllcyBmaWxlLCBpZiB0aGUgbWVzc2FnZSBpcyBuZWl0aGVyIEVKQjIwIG5vciBFSkIxMSwgdGhlIHJ1bGUgaXMgY3Jvc3Mtc3BlY3MuIChlLmcuIHJlZmxlY3Rpb24gZXJyb3JzKSAvLyROT04tTkxTLTEkCi0JCi0KLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9WQUxJREFUT1IgPSAidmFsaWRhdG9yIjsgLy8gdGhlIHZhbGlkYXRvciAgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1BMVUdJTiA9ICJwbHVnaW4iOyAvLyBpZGVudGlmaWVzIHRoZSBwbHVnaW4gd2hpY2ggaGFzIHRoZSBjbGFzcyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVEVTVCA9ICJ0ZXN0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lNUE9SVCA9ICJpbXBvcnQiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfT1BFUkFUSU9OID0gIm9wZXJhdGlvbiI7IC8vIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgSUltcG9ydE9wZXJhdGlvbiB3aGljaCBpcyB1c2VkIHRvIGltcG9ydCB0aGUgaW5wdXQgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lOUFVUID0gImlucHV0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vIHRoZSB2ZXJzaW9uIG9mIHRoZSBpbnB1dCwgZS5nLiBFSkIgMS4xIHZzLiBFSkIgMi4wIC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19NRVNTQUdFID0gIm1lc3NhZ2UiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUFJFRklYID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9TRVZFUklUWSA9ICJzZXZlcml0eSI7IC8vJE5PTi1OTFMtMSQKLQkvKnBhY2thZ2UqLyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QUk9KRUNUID0gInByb2plY3QiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUkVTT1VSQ0UgPSAicmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTE9DQVRJT04gPSAibG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JLypwYWNrYWdlKi8gc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVEVYVCA9ICJ0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCS8qcGFja2FnZSovIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1ZJU0lCTEUgPSAidmlzaWJsZSI7IC8vIElzIHRoaXMgdGVzdCB2aXNpYmxlIG9uIHRoZSBUZXN0IENvbGxlY3RvciBtZW51PyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9UZXN0U2V0dXBJbXBvcnQuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1Rlc3RTZXR1cEltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjA1YTllLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1Rlc3RTZXR1cEltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUltcG9ydE9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wbHVnaW4uVmFsaWRhdGlvblBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhvbGRzIHRoZSBtZXRhZGF0YSBuZWVkZWQgdG8gaW1wb3J0IGFuIC5lYXIgb3IKLSAqIGEgLmphciBmaWxlIHRvIHNldCB1cCBhIHRlc3QgY2FzZSBpbiBiYXRjaCBtb2RlLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdFNldHVwSW1wb3J0IHsKLQlwcml2YXRlIFN0cmluZyBfZmlsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgSUltcG9ydE9wZXJhdGlvbiBfaW1wb3J0T3BlcmF0aW9uID0gbnVsbDsKLQotCXB1YmxpYyBUZXN0U2V0dXBJbXBvcnQoSUltcG9ydE9wZXJhdGlvbiBvcCwgU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCV9pbXBvcnRPcGVyYXRpb24gPSBvcDsKLQkJX2ZpbGVOYW1lID0gZmlsZU5hbWU7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0SW5wdXRGaWxlKFN0cmluZyBkaXIpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGlyLCBnZXRGaWxlTmFtZSgpKTsKLQkJaWYoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCAiRmlsZSAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgbXVzdCBleGlzdCBhbmQgaGF2ZSByZWFkIGFjY2Vzcy4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBfZmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBJSW1wb3J0T3BlcmF0aW9uIGdldE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIF9pbXBvcnRPcGVyYXRpb247Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBmaWxlIHdhcyBmb3VuZCBhbmQgaW1wb3J0ZWQgc3VjY2Vzc2Z1bGx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGltcG9ydEZpbGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBTdHJpbmcgZGlyKSB7Ci0JCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQlpbnQgZXhlY3V0aW9uTWFwID0gMHgwOwotCQlib29sZWFuIGltcG9ydGVkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCUZpbGUgZmlsZSA9IGdldElucHV0RmlsZShkaXIpOwotCQkJZXhlY3V0aW9uTWFwIHw9IDB4MTsKLQkJCXRyeSB7Ci0JCQkJSUltcG9ydE9wZXJhdGlvbiBvcCA9IGdldE9wZXJhdGlvbigpOwotCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDI7Ci0JCQkJaW1wb3J0ZWQgPSBvcC5ydW4obW9uaXRvciwgZmlsZSk7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4NDsKLQkJCX0KLQkJCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleGMpIHsKLQkJCQlleGVjdXRpb25NYXAgfD0gMHg4OwotCQkJCWltcG9ydGVkID0gZmFsc2U7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4MTA7Ci0JCQkJaW1wb3J0ZWQgPSBmYWxzZTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkJZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCQlleGVjdXRpb25NYXAgfD0gMHgyMDsKLQkJCQlpbXBvcnRlZCA9IGZhbHNlOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRUYXJnZXRFeGNlcHRpb24oZXhjKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKCFpbXBvcnRlZCkgewotCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCWVudHJ5LnNldEV4ZWN1dGlvbk1hcChleGVjdXRpb25NYXApOwotCQkJCWVudHJ5LnNldFRleHQoIlRlc3RTZXR1cCBmb3IgIiArIGRpciArICIgd2FzIHVuc3VjY2Vzc2Z1bC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQkJCi0JCX0KLQkJcmV0dXJuIGltcG9ydGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1Rlc3RjYXNlTWV0YURhdGEuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3JlZ2lzdHJ5L1Rlc3RjYXNlTWV0YURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRmMmM1Ni4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9UZXN0Y2FzZU1ldGFEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YTsKLQotcHVibGljIGNsYXNzIFRlc3RjYXNlTWV0YURhdGEgewotCXByaXZhdGUgU3RyaW5nIF9wbHVnaW5JZCA9IG51bGw7IC8vIFRoZSBwbHVnaW4gaWQgdGhhdCBoYXMgY29udHJpYnV0ZWQgdGhpcyB0ZXN0IGNhc2UuCi0JcHJpdmF0ZSBWYWxpZGF0b3JNZXRhRGF0YSBfdm1kID0gbnVsbDsKLQlwcml2YXRlIE1lc3NhZ2VNZXRhRGF0YVtdIF9tZXNzYWdlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX3Byb2plY3QgPSBudWxsOyAvLyB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aGF0IHRoaXMgdGVzdCBjYXNlIHRlc3RzCi0JcHJpdmF0ZSBTdHJpbmdbXSBfcmVzb3VyY2VOYW1lcyA9IG51bGw7IC8vIHRoZSByZXNvdXJjZXMgbGlzdGVkIGluIHRoZSBNZXNzYWdlTWV0YURhdGEgb2YgdGhpcyB0ZXN0IGNhc2UuCi0JcHJpdmF0ZSBTdHJpbmcgX2lucHV0RmlsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9uYW1lID0gbnVsbDsgLy8gdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotCQotCXB1YmxpYyBUZXN0Y2FzZU1ldGFEYXRhKFN0cmluZyBwbHVnaW5OYW1lLCBTdHJpbmcgcHJvamVjdCwgVmFsaWRhdG9yTWV0YURhdGEgdm1kLCBTdHJpbmcgaW5wdXRGaWxlTmFtZSkgewotCQlfcGx1Z2luSWQgPSBwbHVnaW5OYW1lOwotCQlfcHJvamVjdCA9IHByb2plY3Q7Ci0JCV92bWQgPSB2bWQ7Ci0JCV9pbnB1dEZpbGVOYW1lID0gaW5wdXRGaWxlTmFtZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWNsYXJpbmdQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIF9wbHVnaW5JZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gX3Byb2plY3Q7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdCBmaW5kUHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChfcHJvamVjdCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5wdXRGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIF9pbnB1dEZpbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldE51bU1lc3NhZ2VzKCkgewotCQlyZXR1cm4gZ2V0TWVzc2FnZXMoKS5zaXplKCk7Ci0JfQotCQotCS8vIFRoZSBtZXNzYWdlcyBuZWVkIHRvIGJlIHN0b3JlZCBpbiBhIGxpc3QgaW5zdGVhZCBvZiBhbiBhcnJheSBiZWNhdXNlCi0JLy8gdGhlIGxpc3QgaXMgc29ydGVkIGJlZm9yZSBzZWFyY2hpbmcgJiBkaXNwbGF5aW5nLgotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VzKCkgewotCQlMaXN0IGNvcHkgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihpbnQgaT0wOyBpPF9tZXNzYWdlcy5sZW5ndGg7IGkrKykgewotCQkJY29weS5hZGQoX21lc3NhZ2VzW2ldKTsKLQkJfQotCQkKLQkJcmV0dXJuIGNvcHk7Ci0JfQotCQotCS8vIFJldHVybiB0aGUgcmVzb3VyY2VzIGluIHRoaXMgcHJvamVjdCBmb3Igd2hpY2ggdGhlcmUgaXMgYSBtZXNzYWdlIGluIHRoaXMgdGVzdCBjYXNlLgotCS8vIE5vIHJlc291cmNlIGluc3RhbmNlIHdpbGwgYmUgaW4gdGhlIHJlc291cmNlIG1vcmUgdGhhbiBvbmNlLgotCXB1YmxpYyBJUmVzb3VyY2VbXSBnZXRSZXNvdXJjZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlTZXQgdGVtcCA9IG5ldyBIYXNoU2V0KCk7IC8vIHVzZSBhIHNldCBpbiBjYXNlIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgbWVzc2FnZSByZWdpc3RlcmVkIGFnYWluc3QgYSByZXNvdXJjZSAoZG9uJ3Qgd2FudCBkdXBsaWNhdGVzIGluIHRoZSBsaXN0KS4KLQkJU3RyaW5nW10gcmVzb3VyY2VOYW1lcyA9IGdldFJlc291cmNlTmFtZXMoKTsKLQkJZm9yKGludCBpPTA7IGk8cmVzb3VyY2VOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHJlc291cmNlTmFtZSA9IHJlc291cmNlTmFtZXNbaV07Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm9qZWN0LmZpbmRNZW1iZXIocmVzb3VyY2VOYW1lKTsKLQkJCWlmKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkvLyByZXNvdXJjZSBleGlzdHMKLQkJCQl0ZW1wLmFkZChyZXNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUlSZXNvdXJjZVtdIHJlc3VsdCA9IG5ldyBJUmVzb3VyY2VbdGVtcC5zaXplKCldOwotCQl0ZW1wLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZ1tdIGdldFJlc291cmNlTmFtZXMoKSB7Ci0JCWlmKF9yZXNvdXJjZU5hbWVzID09IG51bGwpIHsKLQkJCV9yZXNvdXJjZU5hbWVzID0gbmV3IFN0cmluZ1tfbWVzc2FnZXMubGVuZ3RoXTsKLQkJCWZvcihpbnQgaT0wOyBpPF9tZXNzYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCV9yZXNvdXJjZU5hbWVzW2ldID0gX21lc3NhZ2VzW2ldLmdldFJlc291cmNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIF9yZXNvdXJjZU5hbWVzOwotCX0KLQkKLQkvKioKLQkgKiBXaGVuIGFuIGVtcHR5IFRNRCBpcyB1c2VkIHRvIHRlc3QgYW4gb3BlcmF0aW9uLCBhbmQgdGhlIG9wZXJhdGlvbiBuZWVkcyB0aGUgSVJlc291cmNlW10KLQkgKiBhZmZlY3RlZCBieSB0aGUgVE1EIHRvIGtub3cgd2hldGhlciBvciBub3QgdGhlIG9wZXJhdGlvbiBwYXNzZXMgKGkuZS4sIG9uZSBvZiB0aGUgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uCi0JICogY29uc3RydWN0b3JzIHRha2VzIGFuIElSZXNvdXJjZVtdLCBhbmQgdGhlIElSZXNvdXJjZVtdIG11c3Qgbm90IGJlIGVtcHR5IG9yIG51bGwpLCB0aGVuCi0JICogdGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZXQgdGhlICJyZXNvdXJjZXMiIGFmZmVjdGVkIGJ5IHRoZSB0ZXN0IGNhc2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VOYW1lcyhTdHJpbmdbXSByZXNvdXJjZU5hbWVzKSB7Ci0JCV9yZXNvdXJjZU5hbWVzID0gcmVzb3VyY2VOYW1lczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZXMoTWVzc2FnZU1ldGFEYXRhW10gbWVzc2FnZXMpIHsKLQkJLy8gSWYgbWVzc2FnZXMgYXJlIG51bGwsIHRoYXQgbWVhbnMgdGhhdCB0aGUgdGVzdCBjYXNlIGV4cGVjdHMgbm8gdmFsaWRhdGlvbiBlcnJvcnMuCi0JCV9tZXNzYWdlcyA9ICgobWVzc2FnZXMgPT0gbnVsbCkgPyBuZXcgTWVzc2FnZU1ldGFEYXRhWzBdIDogbWVzc2FnZXMpOwotCX0KLQkKLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGEgZ2V0VmFsaWRhdG9yTWV0YURhdGEoKSB7Ci0JCXJldHVybiBfdm1kOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbGlkYXRvckNsYXNzKCkgewotCQlyZXR1cm4gZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlpZihfbmFtZSA9PSBudWxsKSB7Ci0JCQlfbmFtZSA9IF92bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSArICI6OiIgKyBnZXRQcm9qZWN0KCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gX25hbWU7Ci0JfQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldElucHV0RGlyKCkgewotCQkvLyBJZiB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSB0ZXN0Y2FzZSBpbnB1dCBpc24ndCBzcGVjaWZpZWQsIAotCQkvLyBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgaXMgaW4gYSBzdWJkaXJlY3RvcnksIG5hbWVkICJ0ZXN0SW5wdXQiLAotCQkvLyBvZiB0aGUgdGVzdGNhc2UncyBwbHVnaW4uCi0JCUlQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0JCUlQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXRQbHVnaW5EZXNjcmlwdG9yKGdldERlY2xhcmluZ1BsdWdpbklkKCkpOwotCQlpZihkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCS8vIEJlY2F1c2UgUGxhdGZvcm0uYXNMb2NhbFVSTCB0aHJvd3MgYW4gSU9FeGNlcHRpb24gaWYgdGhlIFVSTCByZXNvbHZlcwotCQkJLy8gdG8gYSBkaXJlY3RvcnksIGZpbmQgdGhlIHBsdWdpbi54bWwgZmlsZSBhbmQgdGhlbiBzdHJpcCBvZmYgdGhlIGZpbGUgbmFtZSAKLQkJCS8vIHRvIGZpbmQgdGhlIHRlc3RJbnB1dCBkaXJlY3RvcnkuCi0JCQl0cnkgewotCQkJCVN0cmluZyBwbHVnaW5YbWxQYXRoID0gUGxhdGZvcm0uYXNMb2NhbFVSTChuZXcgVVJMKGRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpLCAicGx1Z2luLnhtbCIpKS5nZXRQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlGaWxlIHBsdWdpblhtbCA9IG5ldyBGaWxlKHBsdWdpblhtbFBhdGgpOwotCQkJCWlmKHBsdWdpblhtbC5leGlzdHMoKSkgewotCQkJCQlGaWxlIGlucHV0RGlyID0gbmV3IEZpbGUocGx1Z2luWG1sLmdldFBhcmVudCgpLCAidGVzdElucHV0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGlucHV0RGlyLmV4aXN0cygpICYmIGlucHV0RGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJCXJldHVybiBpbnB1dERpci5nZXRQYXRoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGV4YykgewotCQkJICAgIExvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5nZXRMZXZlbCgpID09IExldmVsLlNFVkVSRSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJLy8gU2hvdWxkIG5ldmVyIGdldCBoZXJlLCBidXQgaWYgd2UgZG8sIGFzc3VtZSB0aGF0IHRoZSBpbnB1dCAKLQkJLy8gZGlyZWN0b3J5IGlzIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVGVzdGNhc2VVdGlsaXR5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9UZXN0Y2FzZVV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJkNThlMy4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9UZXN0Y2FzZVV0aWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdGhhdCBjb250YWlucyBjb252ZW5pZW5jZSBtZXRob2RzIGZvciB0ZXN0IGNhc2VzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVzdGNhc2VVdGlsaXR5IHsKLQkvKioKLQkgKiBMb2FkIHRoZSBwcm9qZWN0IHRoYXQgdGhpcyB0ZXN0IGNhc2UgaXMgc3VwcG9zZWQgdG8gcnVuIG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2plY3QgZmluZFByb2plY3QoSVRlc3RjYXNlTWV0YURhdGEgdG1kKSB7Ci0JCWlmKHRtZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCh0bWQuZ2V0UHJvamVjdE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGlucHV0IGZvciB0aGlzIHRlc3QgY2FzZSBjYW4gYmUgbG9jYXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRJbnB1dERpcihJVGVzdGNhc2VNZXRhRGF0YSB0bWQpIHsKLQkJLy8gSWYgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgdGVzdGNhc2UgaW5wdXQgaXNuJ3Qgc3BlY2lmaWVkLCAKLQkJLy8gYXNzdW1lIHRoYXQgdGhlIGlucHV0IGlzIGluIGEgc3ViZGlyZWN0b3J5LCBuYW1lZCAidGVzdElucHV0IiwKLQkJLy8gb2YgdGhlIHRlc3RjYXNlJ3MgcGx1Z2luLgotCQlJUGx1Z2luUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpOwotCQlJUGx1Z2luRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gcmVnaXN0cnkuZ2V0UGx1Z2luRGVzY3JpcHRvcih0bWQuZ2V0RGVjbGFyaW5nUGx1Z2luSWQoKSk7Ci0JCWlmKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJLy8gQmVjYXVzZSBQbGF0Zm9ybS5hc0xvY2FsVVJMIHRocm93cyBhbiBJT0V4Y2VwdGlvbiBpZiB0aGUgVVJMIHJlc29sdmVzCi0JCQkvLyB0byBhIGRpcmVjdG9yeSwgZmluZCB0aGUgcGx1Z2luLnhtbCBmaWxlIGFuZCB0aGVuIHN0cmlwIG9mZiB0aGUgZmlsZSBuYW1lIAotCQkJLy8gdG8gZmluZCB0aGUgdGVzdElucHV0IGRpcmVjdG9yeS4KLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHBsdWdpblhtbFBhdGggPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKG5ldyBVUkwoZGVzY3JpcHRvci5nZXRJbnN0YWxsVVJMKCksICJwbHVnaW4ueG1sIikpLmdldFBhdGgoKTsgLy8kTk9OLU5MUy0xJAotCQkJCUZpbGUgcGx1Z2luWG1sID0gbmV3IEZpbGUocGx1Z2luWG1sUGF0aCk7Ci0JCQkJaWYocGx1Z2luWG1sLmV4aXN0cygpKSB7Ci0JCQkJCUZpbGUgaW5wdXREaXIgPSBuZXcgRmlsZShwbHVnaW5YbWwuZ2V0UGFyZW50KCksICJ0ZXN0SW5wdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoaW5wdXREaXIuZXhpc3RzKCkgJiYgaW5wdXREaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJCQkJcmV0dXJuIGlucHV0RGlyLmdldFBhdGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZXhjKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIFNob3VsZCBuZXZlciBnZXQgaGVyZSwgYnV0IGlmIHdlIGRvLCBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgCi0JCS8vIGRpcmVjdG9yeSBpcyB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBsb2dGaWxlTmFtZSBtdXN0IHBvaW50IHRvIGEgZnVsbHktcXVhbGlmaWVkIGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZsdXNoKFN0cmluZyBsb2dGaWxlTmFtZSwgU3RyaW5nIGJ1ZmZlciwgYm9vbGVhbiBhcHBlbmQpIHsKLQkJdHJ5IHsKLQkJCUZpbGVXcml0ZXIgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIobG9nRmlsZU5hbWUsIGFwcGVuZCk7Ci0JCQl3cml0ZXIud3JpdGUoYnVmZmVyKTsgLy8gV3JpdGUgdGhlIGVudGlyZSByZXBvcnQgdG8gdGhlIHN0YXRlIGxvZy4KLQkJCXdyaXRlci5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoKElPRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9WYWxpZGF0b3JUZXN0Y2FzZS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvcmVnaXN0cnkvVmFsaWRhdG9yVGVzdGNhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyYWMxNC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC9yZWdpc3RyeS9WYWxpZGF0b3JUZXN0Y2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5WYWxpZGF0aW9uVHlwZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuR2xvYmFsQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UYXNrTGlzdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVlRocmVhZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5JRmlsZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yVGVzdGNhc2UgaW1wbGVtZW50cyBJVGVzdGNhc2VNZXRhRGF0YSB7Ci0JcHJpdmF0ZSBTdHJpbmcgX3BsdWdpbklkID0gbnVsbDsgLy8gVGhlIHBsdWdpbiBpZCB0aGF0IGhhcyBjb250cmlidXRlZCB0aGlzIHRlc3QgY2FzZS4KLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIF92bWQgPSBudWxsOwotCXByaXZhdGUgTWVzc2FnZU1ldGFEYXRhW10gX21lc3NhZ2VzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfcHJvamVjdE5hbWUgPSBudWxsOyAvLyB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdCB0aGF0IHRoaXMgdGVzdCBjYXNlIHRlc3RzCi0JcHJpdmF0ZSBTdHJpbmdbXSBfcmVzb3VyY2VOYW1lcyA9IG51bGw7IC8vIHRoZSByZXNvdXJjZXMgbGlzdGVkIGluIHRoZSBNZXNzYWdlTWV0YURhdGEgb2YgdGhpcyB0ZXN0IGNhc2UuCi0JcHJpdmF0ZSBTdHJpbmcgX2lucHV0RmlsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9uYW1lID0gbnVsbDsgLy8gdGhlIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotCXByaXZhdGUgYm9vbGVhbiBfdmlzaWJsZSA9IHRydWU7IC8vIElzIHRoaXMgdGVzdCBjYXNlIHZpc2libGUgb24gdGhlIFRlc3QgQ29sbGVjdG9yIG1lbnUKLQkKLQlwdWJsaWMgVmFsaWRhdG9yVGVzdGNhc2UoU3RyaW5nIHBsdWdpbk5hbWUsIFN0cmluZyBwcm9qZWN0LCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQsIFN0cmluZyBpbnB1dEZpbGVOYW1lLCBib29sZWFuIHZpc2libGUpIHsKLQkJX3BsdWdpbklkID0gcGx1Z2luTmFtZTsKLQkJX3Byb2plY3ROYW1lID0gcHJvamVjdDsKLQkJX3ZtZCA9IHZtZDsKLQkJX2lucHV0RmlsZU5hbWUgPSBpbnB1dEZpbGVOYW1lOwotCQlfdmlzaWJsZSA9IHZpc2libGU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLQkJcmV0dXJuIF92aXNpYmxlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlY2xhcmluZ1BsdWdpbklkKCkgewotCQlyZXR1cm4gX3BsdWdpbklkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gX3Byb2plY3ROYW1lOwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFRlc3RjYXNlVXRpbGl0eS5maW5kUHJvamVjdCh0aGlzKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEZpbGVOYW1lKCkgewotCQlyZXR1cm4gX2lucHV0RmlsZU5hbWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIG1lc3NhZ2VzCi0JICovCi0JcHVibGljIGludCBnZXROdW1NZXNzYWdlcygpIHsKLQkJcmV0dXJuIGdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTikuc2l6ZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCBzaG91bGQgYmUgcmVwb3J0ZWQgZm9yIHRoZSBnaXZlbiBidWlsZAotCSAqIHR5cGUuIChlLmcuIGlmIHRoZSB2YWxpZGF0b3IgZG9lcyBub3Qgc3VwcG9ydCBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLAotCSAqIHRoZW4gaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlIGxpc3Qgb2YgZXhwZWN0ZWQgbWVzc2FnZXMsIHJldHVybiBhbiBlbXB0eSAKLQkgKiBsaXN0LikKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZXNzYWdlcyhpbnQgYnVpbGRUeXBlKSB7Ci0JCS8vIFRoZSBtZXNzYWdlcyBuZWVkIHRvIGJlIHN0b3JlZCBpbiBhIGxpc3QgaW5zdGVhZCBvZiBhbiBhcnJheSBiZWNhdXNlCi0JCS8vIHRoZSBsaXN0IGlzIHNvcnRlZCBiZWZvcmUgc2VhcmNoaW5nICYgZGlzcGxheWluZy4KLQkJc3dpdGNoKGJ1aWxkVHlwZSkgewotCQkJY2FzZShWYWxpZGF0aW9uVHlwZUVudW0uQVVUT19WQUxJREFUSU9OKToKLQkJCWNhc2UoVmFsaWRhdGlvblR5cGVFbnVtLklOQ1JFTUVOVEFMX1ZBTElEQVRJT04pOiB7Ci0JCQkJaWYoIWdldFZhbGlkYXRvck1ldGFEYXRhKCkuaXNJbmNyZW1lbnRhbCgpKSB7Ci0JCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJCX0KLQkJCQkvLyBPdGhlcndpc2UsIHJldHVybiB0aGUgZGVmYXVsdCBjb3B5IGJlbG93LgotCQkJCWJyZWFrOwotCQkJfQotCi0JCQljYXNlKFZhbGlkYXRpb25UeXBlRW51bS5GVUxMX1ZBTElEQVRJT04pOiB7Ci0JCQkJaWYoIWdldFZhbGlkYXRvck1ldGFEYXRhKCkuaXNGdWxsQnVpbGQoKSkgewotCQkJCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJCQl9Ci0JCQkJLy8gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGRlZmF1bHQgY29weSBiZWxvdy4KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJY2FzZShWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT04pOgotCQkJZGVmYXVsdDogewotCQkJCS8vIFJldHVybiB0aGUgZGVmYXVsdCBjb3B5IGJlbG93LgotCQkJfQotCQkJCi0JCX0KLQkJCi0JCUxpc3QgY29weSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yKGludCBpPTA7IGk8X21lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQljb3B5LmFkZChfbWVzc2FnZXNbaV0pOwotCQl9Ci0JCQotCQlyZXR1cm4gY29weTsKLQl9Ci0JCi0JLy8gUmV0dXJuIHRoZSByZXNvdXJjZXMgaW4gdGhpcyBwcm9qZWN0IGZvciB3aGljaCB0aGVyZSBpcyBhIG1lc3NhZ2UgaW4gdGhpcyB0ZXN0IGNhc2UuCi0JLy8gTm8gcmVzb3VyY2UgaW5zdGFuY2Ugd2lsbCBiZSBpbiB0aGUgcmVzb3VyY2UgbW9yZSB0aGFuIG9uY2UuCi0JcHVibGljIElSZXNvdXJjZVtdIGdldFJlc291cmNlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVNldCB0ZW1wID0gbmV3IEhhc2hTZXQoKTsgLy8gdXNlIGEgc2V0IGluIGNhc2UgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBtZXNzYWdlIHJlZ2lzdGVyZWQgYWdhaW5zdCBhIHJlc291cmNlIChkb24ndCB3YW50IGR1cGxpY2F0ZXMgaW4gdGhlIGxpc3QpLgotCQlTdHJpbmdbXSByZXNvdXJjZU5hbWVzID0gZ2V0UmVzb3VyY2VOYW1lcygpOwotCQlmb3IoaW50IGk9MDsgaTxyZXNvdXJjZU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lc1tpXTsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHByb2plY3QuZmluZE1lbWJlcihyZXNvdXJjZU5hbWUpOwotCQkJaWYocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCS8vIHJlc291cmNlIGV4aXN0cwotCQkJCXRlbXAuYWRkKHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQkKLQkJSVJlc291cmNlW10gcmVzdWx0ID0gbmV3IElSZXNvdXJjZVt0ZW1wLnNpemUoKV07Ci0JCXRlbXAudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0UmVzb3VyY2VOYW1lcygpIHsKLQkJaWYoX3Jlc291cmNlTmFtZXMgPT0gbnVsbCkgewotCQkJX3Jlc291cmNlTmFtZXMgPSBuZXcgU3RyaW5nW19tZXNzYWdlcy5sZW5ndGhdOwotCQkJZm9yKGludCBpPTA7IGk8X21lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJX3Jlc291cmNlTmFtZXNbaV0gPSBfbWVzc2FnZXNbaV0uZ2V0UmVzb3VyY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gX3Jlc291cmNlTmFtZXM7Ci0JfQotCQotCS8qKgotCSAqIFdoZW4gYW4gZW1wdHkgVE1EIGlzIHVzZWQgdG8gdGVzdCBhbiBvcGVyYXRpb24sIGFuZCB0aGUgb3BlcmF0aW9uIG5lZWRzIHRoZSBJUmVzb3VyY2VbXQotCSAqIGFmZmVjdGVkIGJ5IHRoZSBUTUQgdG8ga25vdyB3aGV0aGVyIG9yIG5vdCB0aGUgb3BlcmF0aW9uIHBhc3NlcyAoaS5lLiwgb25lIG9mIHRoZSBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24KLQkgKiBjb25zdHJ1Y3RvcnMgdGFrZXMgYW4gSVJlc291cmNlW10sIGFuZCB0aGUgSVJlc291cmNlW10gbXVzdCBub3QgYmUgZW1wdHkgb3IgbnVsbCksIHRoZW4KLQkgKiB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCB0aGUgInJlc291cmNlcyIgYWZmZWN0ZWQgYnkgdGhlIHRlc3QgY2FzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZU5hbWVzKFN0cmluZ1tdIHJlc291cmNlTmFtZXMpIHsKLQkJX3Jlc291cmNlTmFtZXMgPSByZXNvdXJjZU5hbWVzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlcyhNZXNzYWdlTWV0YURhdGFbXSBtZXNzYWdlcykgewotCQkvLyBJZiBtZXNzYWdlcyBhcmUgbnVsbCwgdGhhdCBtZWFucyB0aGF0IHRoZSB0ZXN0IGNhc2UgZXhwZWN0cyBubyB2YWxpZGF0aW9uIGVycm9ycy4KLQkJX21lc3NhZ2VzID0gKChtZXNzYWdlcyA9PSBudWxsKSA/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+IjsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayhzdGF0dXMpOwotCQkJYnVmZmVyLndyaXRlKHN0YXR1cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBCeSBkZWZhdWx0LCAicGFzcyIgdGhlIGFzeW5jaHJvdXMgdGVzdHMgb2YgYW55IHZhbGlkYXRvciB0aGF0IGNhbm5vdCBydW4gYXN5bmNocm9ub3VzIHRlc3RzLgotCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksIFZhbGlkYXRpb25UeXBlRW51bS5BU1lOQ19OQU1FLCB0cnVlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGUoSUJ1ZmZlciBidWZmZXIsIElQcm9qZWN0IHByb2plY3QsIGludCB2YWxpZGF0aW9uVHlwZUVudW0sIFN0cmluZyB0YXNrTmFtZSkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWJvb2xlYW4gcGFzc2VkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXBhc3NlZCA9IEJWVFJ1bm5lci5zaW5nbGV0b24oKS50ZXN0KGJ1ZmZlciwgcHJvamVjdCwgdGhpcywgdmFsaWRhdGlvblR5cGVFbnVtKTsKLQkJfQotCQljYXRjaChCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJYnVmZmVyLmFkZEVsYXBzZWRUaW1lKHRhc2tOYW1lLCAoZW5kIC0gc3RhcnQpKTsKLQkJCWJ1ZmZlci53cml0ZSgiVG90YWwgdGltZSBmb3IgdmFsaWRhdG9yICIgKyBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkgKyAiIG9mIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIiBpbiAiICsgdGFza05hbWUgKyAiIG1vZGUgd2FzICIgKyAoZW5kIC0gc3RhcnQpICsgIiBtaWxsaXNlY29uZHMuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQl9Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBhc3luY1ZhbGlkYXRlKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgc3ViVGFza05hbWUpIHsKLQkJYm9vbGVhbiBwYXNzZWQgPSB0cnVlOwotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWxvbmcgZW5kID0gMDsKLQkJdHJ5IHsKLQkJCUdsb2JhbENvbmZpZ3VyYXRpb24gZ2NvbmYgPSBDb25maWd1cmF0aW9uTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0R2xvYmFsQ29uZmlndXJhdGlvbigpOwotCQkJLy9ib29sZWFuIGRpc2FibGVWYWxpZGF0aW9uID0gZ2NvbmYubnVtYmVyT2ZFbmFibGVkVmFsaWRhdG9ycygpPT0wOwotCQkJLy9ib29sZWFuIGF1dG9WYWxpZGF0ZSA9IGdjb25mLmlzQXV0b1ZhbGlkYXRlKCk7Ci0JCQkvL2Jvb2xlYW4gYnVpbGRWYWxpZGF0ZSA9IGdjb25mLmlzQnVpbGRWYWxpZGF0ZSgpOwotCQkJdHJ5IHsKLQkJCQkvL2djb25mLnNldEF1dG9WYWxpZGF0ZShmYWxzZSk7Ci0JCQkJLy8gVHVybiBvZmYgYXV0by12YWxpZGF0ZSBzbyB0aGF0IHRoZSBwcm9qZWN0IGlzbid0IHZhbGlkYXRlZCBhdXRvbWF0aWNhbGx5LgotCQkJCS8vZ2NvbmYuc2V0QXV0b1ZhbGlkYXRlKGZhbHNlKTsKLQkJCQkvL2djb25mLnNldEJ1aWxkVmFsaWRhdGUoZmFsc2UpOwotCQkJCWdjb25mLnBhc3NpdmF0ZSgpOwotCQkJCQotCQkJCS8vIFR3byB0ZXN0czogCi0JCQkJLy8gICAxLiBSdW4gdmFsaWRhdGlvbiBvbiBjb3BpZXMgb2YgdGhlIG9yaWdpbmFsIHByb2plY3Q6ICJwcm9qZWN0TmFtZS5mb3JrIiBhbmQgInByb2plY3ROYW1lLm5vRm9yayIKLQkJCQkvLyAgICAgIENvbXBhcmUgdGhlIG1hcmtlcnMgb2YgdGhlIGNvcGllcyB0byB0aGUgRlZUIFRlc3RjYXNlTWV0YURhdGEsIGFuZCB0aGUgdmFsaWRhdG9yIHBhc3NlcyBpZiB0aGUgCi0JCQkJLy8JCXJlc3VsdHMgb2YgZWFjaCBjb3B5IG1hdGNoZXMgdGhlIFRlc3RjYXNlTWV0YURhdGEuCi0JCQkJLy8gICAyLiBSdW4gdmFsaWRhdGlvbiBvbiBjb3BpZXMsIGJ1dCB0aGlzIHRpbWUgaW50cm9kdWNlIGNoYW5nZXMgZHVyaW5nIHRoZSB2YWxpZGF0aW9uLgotCQkJCS8vCQlFeHRyYWN0IHRoZSBuYW1lcyBvZiByZXNvdXJjZXMgZnJvbSB0aGUgdGVzdGNhc2UgbWV0YWRhdGEsIGZpbmQgdGhvc2UgcmVzb3VyY2VzLCBhbmQKLQkJCQkvLwkJYWRkL2RlbGV0ZS9yZW5hbWUvbW92ZS9jbG9zZS9jaGFuZ2UgdGhlbS4KLQkJCQkKLQkJCQlib29sZWFuIHBhc3MxID0gdmFsaWRhdGVBbmRDb21wYXJlKGJ1ZmZlciwgcHJvamVjdCwgc3ViVGFza05hbWUpOwotCQkJCWJvb2xlYW4gcGFzczIgPSB2YWxpZGF0ZUNoYW5nZUFuZENvbXBhcmUoYnVmZmVyLCBwcm9qZWN0LCBJRmlsZURlbHRhLkNIQU5HRUQsIHN1YlRhc2tOYW1lKTsKLQkJCQlib29sZWFuIHBhc3MzID0gdmFsaWRhdGVDaGFuZ2VBbmRDb21wYXJlKGJ1ZmZlciwgcHJvamVjdCwgSUZpbGVEZWx0YS5ERUxFVEVELCBzdWJUYXNrTmFtZSk7Ci0JCQkJcGFzc2VkID0gKHBhc3MxICYmIHBhc3MyICYmIHBhc3MzKTsKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJLy8gQ291bGRuJ3QgY3JlYXRlIGNvcHkuSnVzdCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IHRlc3QuCi0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaChCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy9nY29uZi5zZXRBdXRvVmFsaWRhdGUoYXV0b1ZhbGlkYXRlKTsKLQkJCQkvL2djb25mLnNldEJ1aWxkVmFsaWRhdGUoYnVpbGRWYWxpZGF0ZSk7Ci0JCQkJZ2NvbmYucGFzc2l2YXRlKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlidWZmZXIuYWRkRWxhcHNlZFRpbWUoVmFsaWRhdGlvblR5cGVFbnVtLkFTWU5DX05BTUUsIChlbmQgLSBzdGFydCkpOwotCQkJYnVmZmVyLndyaXRlKCJUb3RhbCB0aW1lIGZvciB2YWxpZGF0b3IgIiArIGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSArICIgb2YgcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiIGluIGFzeW5jaHJvbm91cyBtb2RlIHdhcyAiICsgKGVuZCAtIHN0YXJ0KSArICIgbWlsbGlzZWNvbmRzLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkKLQkJfQotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQotCS8qKgotCSAqIFJ1biB2YWxpZGF0aW9uLCB1c2luZyBzZXZlcmFsIG9wZXJhdGlvbnMgKGJvdGggZm9ya2VkIGFuZCBub3QgZm9ya2VkKSwgb24gdGhlIElQcm9qZWN0LgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSByZXN1bHQsIGFmdGVyIHRoZSBsYXN0IG9wZXJhdGlvbiBpcyBjb21wbGV0ZSwgaXMgdGhlIGV4cGVjdGVkIHJlc3VsdC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVBbmRDb21wYXJlKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgc3ViVGFza05hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJLy8gTm93IGNvbXBhcmUgdGhlIElQcm9qZWN0J3MgcmVzdWx0IHRvIHRoZSBleHBlY3RlZCBUZXN0Y2FzZU1ldGFEYXRhIHJlc3VsdC4KLQkJLy8gVmFsaWRhdGUKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG5vRm9ya09wID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB0cnVlLCBmYWxzZSk7Ci0JCW5vRm9ya09wLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJbm9Gb3JrT3AucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB0cnVlLCB0cnVlKTsKLQkJZm9ya09wLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJZm9ya09wLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG5vRm9ya09wMiA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdHJ1ZSwgZmFsc2UpOwotCQlub0ZvcmtPcDIuc2V0VmFsaWRhdG9ycyhnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvck5hbWVzKCkpOwotCQlub0ZvcmtPcDIucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIGZvcmtPcDIgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHRydWUsIHRydWUpOwotCQlmb3JrT3AyLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJZm9ya09wMi5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBmb3JrT3AzID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB0cnVlLCB0cnVlKTsKLQkJZm9ya09wMy5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCWZvcmtPcDMucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQkvLyBXYWl0IHVudGlsIGFsbCBvZiB0aGUgdGhyZWFkcyBoYXZlIGNvbXBsZXRlLgotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiV2FpdGluZyBmb3IgYWxsIGZvcmtlZCB0aHJlYWRzIHRvIGZpbmlzaC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlKCFWVGhyZWFkTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNEb25lKCkgJiYgIWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHt9Ci0JCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJBbGwgdGhyZWFkcyBhcmUgY29tcGxldGUuIEJlZ2lubmluZyB0aGUgY29tcGFyaXNvbi4iKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gQ29tcGFyZQotCQlJTWFya2VyW10gbWFya2VycyA9IFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwgZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gQlZUUnVubmVyLnNpbmdsZXRvbigpLnZlcmlmeShidWZmZXIsIGdldE5hbWUoKSwgc3ViVGFza05hbWUsIHByb2plY3QsIGdldE1lc3NhZ2VzKFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTiksIG1hcmtlcnMpOyAKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVDaGFuZ2VBbmRDb21wYXJlKElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdCBwcm9qZWN0LCBpbnQgaWZpbGVEZWx0YVR5cGUsIFN0cmluZyBzdWJUYXNrTmFtZSkgdGhyb3dzIEJWVFZhbGlkYXRpb25FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlib29sZWFuIHBhc3NlZCA9IHRydWU7Ci0JCQotCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMgPSBuZXcgVmFsaWRhdG9yTWV0YURhdGFbXXtnZXRWYWxpZGF0b3JNZXRhRGF0YSgpfTsKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBub0ZvcmtPcE9yaWcgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHRydWUsIGZhbHNlKTsKLQkJbm9Gb3JrT3BPcmlnLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJbm9Gb3JrT3BPcmlnLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBub0ZvcmtPcENoYW5nZWQgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHZtZHMsIGdldFJlc291cmNlcyhwcm9qZWN0KSwgaWZpbGVEZWx0YVR5cGUsIGZhbHNlLCBmYWxzZSk7IC8vIGZhbHNlID0gZG8gbm90IGZvcmNlIGlmIHRoZXJlJ3Mgbm8gZGVsdGFzIHRvIHZhbGlkYXRlCi0JCW5vRm9ya09wQ2hhbmdlZC5ydW4oYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wT3JpZyA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWZvcmtPcE9yaWcuc2V0VmFsaWRhdG9ycyhnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvck5hbWVzKCkpOwotCQlmb3JrT3BPcmlnLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBmb3JrT3BDaGFuZ2VkID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihwcm9qZWN0LCB2bWRzLCAgZ2V0UmVzb3VyY2VzKHByb2plY3QpLCBpZmlsZURlbHRhVHlwZSwgZmFsc2UsIHRydWUpOyAvLyBmYWxzZSA9IGRvIG5vdCBmb3JjZSBpZiB0aGVyZSdzIG5vIGRlbHRhcyB0byB2YWxpZGF0ZQotCQlmb3JrT3BDaGFuZ2VkLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG5vRm9ya09wMk9yaWcgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHRydWUsIGZhbHNlKTsKLQkJbm9Gb3JrT3AyT3JpZy5zZXRWYWxpZGF0b3JzKGdldFZhbGlkYXRvck1ldGFEYXRhKCkuZ2V0VmFsaWRhdG9yTmFtZXMoKSk7Ci0JCW5vRm9ya09wMk9yaWcucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJaWYoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG5vRm9ya09wMkNoYW5nZWQgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHZtZHMsICBnZXRSZXNvdXJjZXMocHJvamVjdCksIGlmaWxlRGVsdGFUeXBlLCBmYWxzZSwgZmFsc2UpOyAvLyBmYWxzZSA9IGRvIG5vdCBmb3JjZSBpZiB0aGVyZSdzIG5vIGRlbHRhcyB0byB2YWxpZGF0ZQotCQlub0ZvcmtPcDJDaGFuZ2VkLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBmb3JrT3AyT3JpZyA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWZvcmtPcDJPcmlnLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJZm9ya09wMk9yaWcucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wMkNoYW5nZWQgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHZtZHMsICBnZXRSZXNvdXJjZXMocHJvamVjdCksIGlmaWxlRGVsdGFUeXBlLCBmYWxzZSwgdHJ1ZSk7IC8vIGZhbHNlID0gZG8gbm90IGZvcmNlIGlmIHRoZXJlJ3Mgbm8gZGVsdGFzIHRvIHZhbGlkYXRlCi0JCWZvcmtPcDJDaGFuZ2VkLnJ1bihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBmb3JrT3AzT3JpZyA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24ocHJvamVjdCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWZvcmtPcDNPcmlnLnNldFZhbGlkYXRvcnMoZ2V0VmFsaWRhdG9yTWV0YURhdGEoKS5nZXRWYWxpZGF0b3JOYW1lcygpKTsKLQkJZm9ya09wM09yaWcucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlpZihidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gZm9ya09wM0NoYW5nZWQgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKHByb2plY3QsIHZtZHMsIGdldFJlc291cmNlcyhwcm9qZWN0KSwgaWZpbGVEZWx0YVR5cGUsIGZhbHNlLCB0cnVlKTsgLy8gZmFsc2UgPSBkbyBub3QgZm9yY2UgaWYgdGhlcmUncyBubyBkZWx0YXMgdG8gdmFsaWRhdGUKLQkJZm9ya09wM0NoYW5nZWQucnVuKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQkvLyBXYWl0IHVudGlsIGFsbCBvZiB0aGUgdGhyZWFkcyBoYXZlIGNvbXBsZXRlLgotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiV2FpdGluZyBmb3IgYWxsIGZvcmtlZCB0aHJlYWRzIHRvIGZpbmlzaC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlKCFWVGhyZWFkTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNEb25lKCkgJiYgIWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHt9Ci0JCWlmKGJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJDb21wYXJpc29uIGNhbmNlbGxlZC4gUGVyZm9ybWluZyBjbGVhbnVwLiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soIkFsbCB0aHJlYWRzIGFyZSBjb21wbGV0ZS4gQmVnaW5uaW5nIHRoZSBjb21wYXJpc29uLiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBDb21wYXJlCi0JCUlNYXJrZXJbXSBtYXJrZXJzID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBnZXRWYWxpZGF0b3JNZXRhRGF0YSgpLmdldFZhbGlkYXRvck5hbWVzKCkpOwotCi0JCS8vIE5vdyBjb21wYXJlIHRoZSBJUHJvamVjdCdzIHJlc3VsdCB0byB0aGUgZXhwZWN0ZWQgVGVzdGNhc2VNZXRhRGF0YSByZXN1bHQuCi0JCS8vIERvbid0IHdyaXRlIF9wYXNzZWQgPSBfcGFzc2VkICYmIGdldC4uLgotCQkvLyBXaGVuIHRoZSBfcGFzc2VkID09IGZhbHNlLCB0aGVuIGphdmEgZGlkbid0IGJvdGhlciBydW5uaW5nIHRoZSB0ZXN0LgotCQlwYXNzZWQgPSBCVlRSdW5uZXIuc2luZ2xldG9uKCkudmVyaWZ5KGJ1ZmZlciwgZ2V0TmFtZSgpLCBzdWJUYXNrTmFtZSwgcHJvamVjdCwgZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLlJVTl9WQUxJREFUSU9OKSwgbWFya2Vycyk7Ci0JCQotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZGVsZXRlTWFya2VycyhtYXJrZXJzKTsKLQkKLQkJcmV0dXJuIHBhc3NlZDsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9CVlRSdW5uZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2ludGVybmFsL3V0aWwvQlZUUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Mzk2M2QuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9CVlRSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLkxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LlZhbGlkYXRpb25UeXBlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LkJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LklUZXN0Y2FzZU1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuTWVzc2FnZU1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuTWVzc2FnZVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5PcGVyYXRpb25UZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlRlc3RTZXR1cEltcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlRlc3RjYXNlVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlZhbGlkYXRvclRlc3RjYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklUZXN0U3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkludGVybmFsVmFsaWRhdG9yTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5UYXNrTGlzdFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVlRocmVhZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5PbmVWYWxpZGF0b3JPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0vKioKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJWVFJ1bm5lciB7Ci0JcHJpdmF0ZSBzdGF0aWMgQlZUUnVubmVyIF9pbnN0ID0gbnVsbDsKLQlwcml2YXRlIExpc3QgX2V4dHJhID0gbnVsbDsgLy8gVGhlIGV4dHJhIG1hcmtlcnMgcmVwb3J0ZWQgKHN0b3JlZCBpbiBhIGxpc3QgdG8gbWFrZSByZWFkaW5nIGVhc2llcikuCi0JcHJpdmF0ZSBMaXN0IF9taXNzaW5nID0gbnVsbDsgLy8gVGhlIG1pc3NpbmcgTU1EIHRoYXQgd2VyZSBzdXBwb3NlZCB0byBiZSByZXBvcnRlZCAoc3RvcmVkIGluIGEgbGlzdCB0byBtYWtlIHJlYWRpbmcgZWFzaWVyKS4KLQotCXB1YmxpYyBzdGF0aWMgQlZUUnVubmVyIHNpbmdsZXRvbigpIHsKLQkJaWYoX2luc3QgPT0gbnVsbCkgewotCQkJX2luc3QgPSBuZXcgQlZUUnVubmVyKCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0OwotCX0KLQkKLQlwcml2YXRlIEJWVFJ1bm5lcigpIHsKLQkJc3VwZXIoKTsKLQkJX2V4dHJhID0gbmV3IEFycmF5TGlzdCgpOwotCQlfbWlzc2luZyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGlzVmVyYm9zZSgpIHsKLQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5GSU5FU1QpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBjaGFyIGdldFNldmVyaXR5Q2hhcihJbnRlZ2VyIHNldmVyaXR5KSB7Ci0JCWlmKHNldmVyaXR5ID09IG51bGwpIHsKLQkJCXJldHVybiAnPyc7Ci0JCX0KLQkJCi0JCXN3aXRjaChzZXZlcml0eS5pbnRWYWx1ZSgpKSB7Ci0JCQljYXNlKElNYXJrZXIuU0VWRVJJVFlfRVJST1IpOiB7Ci0JCQkJcmV0dXJuICdFJzsKLQkJCX0KLQkJCQotCQkJY2FzZShJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcpOiB7Ci0JCQkJcmV0dXJuICdXJzsKLQkJCX0KLQkJCQotCQkJY2FzZShJTWFya2VyLlNFVkVSSVRZX0lORk8pOiB7Ci0JCQkJcmV0dXJuICdJJzsKLQkJCX0KLQkJCQotCQkJZGVmYXVsdDogewotCQkJCXJldHVybiAnPyc7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXROYW1lcyhJUHJvamVjdFtdIHByb2plY3RzKSB7Ci0JCWlmKHByb2plY3RzID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQl9Ci0JCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1twcm9qZWN0cy5sZW5ndGhdOwotCQlmb3IoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJbmFtZXNbaV0gPSBwcm9qZWN0LmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlYnVnKElCdWZmZXIgYnVmZmVyLCBJTWFya2VyW10gbWVzc2FnZXMpIHsKLQkJaWYobWVzc2FnZXMgPT0gbnVsbCkgewotCQkJYnVmZmVyLndyaXRlKCJOb3RoaW5nIHRvIGRlYnVnIGJlY2F1c2Ugbm90aGluZyB3YXMgcmVwb3J0ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlmb3IoaW50IGk9MDsgaTxtZXNzYWdlcy5sZW5ndGg7IGkrKykgewotCQkJSU1hcmtlciBtYXJrZXIgPSBtZXNzYWdlc1tpXTsKLQkJCWJ1ZmZlci53cml0ZShNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtYXJrZXIpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGdldERlYnVnTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYoaXNWZXJib3NlKCkpIHsKLQkJCXJldHVybiBtb25pdG9yOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7IC8vIGlmIHZlcmJvc2UgaXMgdHJ1ZSwgc2hvdyBwcm9ncmVzcyBtZXNzYWdlcyBmb3IgdGhlIGNyZWF0aW9uICYgdmFsaWRhdGlvbiBvZiB0aGUgcHJvamVjdC4gT3RoZXJ3aXNlIHNob3cgb25seSB0aGUgQlZUIHN0YXR1cy4KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBXaGVuIGludm9raW5nIHRoZSB0ZXN0IGZyb20gdGhlIFVJLCB0aGUgaW5wdXQgaGFzIGFscmVhZHkgYmVlbiBpbXBvcnRlZCwgc28ganVzdCB0ZXN0IGl0LgotCSAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0IGlzIGRlcml2ZWQgZnJvbSB0aGUgbmFtZSBvZiB0aGUgcHJvamVjdC4KLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiB0ZXN0cyB0aGF0IHBhc3NlZC4KLQkgKi8JCi0JcHVibGljIGludCB0ZXN0KElCdWZmZXIgYnVmZmVyLCBJUHJvamVjdFtdIHByb2plY3RzKSB0aHJvd3MgQlZUVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CQotCQlTdHJpbmdbXSB0ZXN0TmFtZXMgPSBnZXROYW1lcyhwcm9qZWN0cyk7Ci0JCUJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciByZWFkZXIgPSBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCk7Ci0JCQotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuYmVnaW5UYXNrKCJSdW5uaW5nIEJWVCB0ZXN0cyIsIHByb2plY3RzLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJaW50IHRvdGFsVGVzdHMgPSAwOwotCQlpbnQgdG90YWxQYXNzZWQgPSAwOwotCQlmb3IoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soIlRlc3RpbmcgcHJvamVjdCAiICsgKGkrMSkgKyAiIG9mICIgKyBwcm9qZWN0cy5sZW5ndGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCVZhbGlkYXRvclRlc3RjYXNlW10gdGVzdHMgPSByZWFkZXIuZ2V0VmFsaWRhdG9yVGVzdHMoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLCB0ZXN0TmFtZXNbaV0pOwotCQkJaWYoKHRlc3RzID09IG51bGwpIHx8ICh0ZXN0cy5sZW5ndGggPT0gMCkpIHsKLQkJCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzaygiVGhlcmUgYXJlIG5vIHRlc3RzIHRvIHJ1bi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJCi0JCQlpbnQgbnVtVGVzdHNQYXNzZWQgPSAwOwotCQkJZm9yKGludCBqPTA7IGo8dGVzdHMubGVuZ3RoOyBqKyspIHsKLQkJCQlWYWxpZGF0b3JUZXN0Y2FzZSB0bWQgPSB0ZXN0c1tqXTsKLQkJCQlpZih0ZXN0KGJ1ZmZlciwgcHJvamVjdCwgdG1kLCBWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT04pKSB7Ci0JCQkJCW51bVRlc3RzUGFzc2VkKys7Ci0JCQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5zdWJUYXNrKCJUZXN0ICIgKyAoaisxKSArICIgb2YgIiArIHRlc3RzLmxlbmd0aCArICIgcGFzc2VkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soIlRlc3QgIiArIChqKzEpICsgIiBvZiAiICsgdGVzdHMubGVuZ3RoICsgIiBmYWlsZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS53b3JrZWQoMSk7Ci0JCQl9Ci0JCQkKLQkJCXRvdGFsVGVzdHMgKz0gdGVzdHMubGVuZ3RoOwotCQkJdG90YWxQYXNzZWQgKz0gbnVtVGVzdHNQYXNzZWQ7Ci0JCQkKLQkJCWJ1ZmZlci53cml0ZShudW1UZXN0c1Bhc3NlZCArICIgb2YgIiArIHRlc3RzLmxlbmd0aCArICIgdGVzdHMgcGFzc2VkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlidWZmZXIud3JpdGUoIlxuPj4+Pj4+Pj4+PlRFU1QgUkVTVUxUUz4+Pj4+Pj4+Pj4iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIud3JpdGUodG90YWxQYXNzZWQgKyAiIG9mICIgKyB0b3RhbFRlc3RzICsgIiB0ZXN0cyBwYXNzZWQuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuZG9uZSgpOwotCQkKLQkJcmV0dXJuIHRvdGFsUGFzc2VkOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBWYWxpZGF0aW9uT3BlcmF0aW9uIG9uIHRoZSBJUHJvamVjdCwgaW52b2tlIHRoZSBvcGVyYXRpb24sIGFuZCB2ZXJpZnkgdGhhdCB0aGUKLQkgKiByZXN1bHRpbmcgSU1hcmtlcnMgbWF0Y2ggdGhlIGV4cGVjdGVkIG1lc3NhZ2VzIGluIHRoZSB0bWQuCi0JICovCQotCXB1YmxpYyBib29sZWFuIHRlc3QoSUJ1ZmZlciBidWZmZXIsIElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRvclRlc3RjYXNlIHRtZCwgaW50IHZhbGlkYXRpb25FbnVtVHlwZSkgdGhyb3dzIEJWVFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlzd2l0Y2godmFsaWRhdGlvbkVudW1UeXBlKSB7Ci0JCQljYXNlKFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTik6IHsKLQkJCQlyZXR1cm4gdGVzdChidWZmZXIsIHRtZC5nZXROYW1lKCksIFZhbGlkYXRpb25UeXBlRW51bS5SVU5fVkFMSURBVElPTl9OQU1FLCB0bWQuZ2V0TWVzc2FnZXModmFsaWRhdGlvbkVudW1UeXBlKSwgbmV3IE9uZVZhbGlkYXRvck9wZXJhdGlvbihwcm9qZWN0LCB0bWQuZ2V0VmFsaWRhdG9yQ2xhc3MoKSwgdHJ1ZSwgZmFsc2UpLCBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFZhbGlkYXRvck5hbWVzKG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtde3RtZC5nZXRWYWxpZGF0b3JNZXRhRGF0YSgpfSkpOyAvLyB0cnVlPWZvcmNlLCBmYWxzZT1ubyBmb3IKLQkJCX0KLQkJCQotCQkJY2FzZShWYWxpZGF0aW9uVHlwZUVudW0uRlVMTF9WQUxJREFUSU9OKTogewotCQkJCXJldHVybiBidWlsZChidWZmZXIsIHByb2plY3QsIHRtZCwgdmFsaWRhdGlvbkVudW1UeXBlLCBWYWxpZGF0aW9uVHlwZUVudW0uRlVMTF9WQUxJREFUSU9OX05BTUUpOwotCQkJfQotCQkJCi0JCQljYXNlKFZhbGlkYXRpb25UeXBlRW51bS5JTkNSRU1FTlRBTF9WQUxJREFUSU9OKTogewotCQkJCXJldHVybiBidWlsZChidWZmZXIsIHByb2plY3QsIHRtZCwgdmFsaWRhdGlvbkVudW1UeXBlLCBWYWxpZGF0aW9uVHlwZUVudW0uSU5DUkVNRU5UQUxfVkFMSURBVElPTl9OQU1FKTsKLQkJCX0KLQkJCQotCQkJY2FzZShWYWxpZGF0aW9uVHlwZUVudW0uQVVUT19WQUxJREFUSU9OKTogewotCQkJCXJldHVybiBidWlsZChidWZmZXIsIHByb2plY3QsIHRtZCwgdmFsaWRhdGlvbkVudW1UeXBlLCBWYWxpZGF0aW9uVHlwZUVudW0uQVVUT19WQUxJREFUSU9OX05BTUUpOwotCQkJfQotCQkJCi0JCQlkZWZhdWx0OiB7Ci0JCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyh0bWQuZ2V0TmFtZSgpLCBudWxsLCBJVGVzdFN0YXR1cy5GQUlMLCBidWZmZXIsICJVbnJlY29nbml6ZWQgdmFsaWRhdGlvbiBvcHRpb246IiArIHZhbGlkYXRpb25FbnVtVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkKElCdWZmZXIgYnVmZmVyLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBWYWxpZGF0b3JUZXN0Y2FzZSB0bWQsIGZpbmFsIGludCB2YWxpZGF0aW9uRW51bVR5cGUsIFN0cmluZyBzdWJUYXNrTmFtZSkgdGhyb3dzIEJWVFZhbGlkYXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJSVByb2dyZXNzTW9uaXRvciBudWxsTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKAotCQkJbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpewotCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IHRtZC5nZXRSZXNvdXJjZXMocHJvamVjdCk7Ci0JCQkJCQlmb3IoaW50IGk9MDsgaTxyZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlJUmVzb3VyY2UgcmVzID0gcmVzb3VyY2VzW2ldOwotCQkJCQkJCXJlcy50b3VjaChtb25pdG9yKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJCWxvZ2dlci53cml0ZShleGMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSwgbnVsbE1vbml0b3IpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKGV4Yyk7Ci0JCQl9Ci0JCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKHRtZC5nZXROYW1lKCksIHN1YlRhc2tOYW1lLCBJVGVzdFN0YXR1cy5GQUlMLCBidWZmZXIsICJDb3JlRXhjZXB0aW9uIGNhdWdodDsgc3RhY2sgdHJhY2UgaW4gTG9nZ2luZ1V0aWwubG9nIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQkvLyBEbyBub3QgYnVpbGQgdXNpbmcgb25seSB0aGUgdmFsaWRhdGlvbiBidWlsZGVyIGJlY2F1c2Ugc29tZSB2YWxpZGF0b3JzCi0JCQkvLyAoaS5lLiwgdGhlIEVKQiBWYWxpZGF0b3IpIGRlcGVuZCBvbiB0aGUgb3V0cHV0IG9mIG90aGVyIGJ1aWxkZXJzIAotCQkJLy8gKGkuZS4sIHRoZSBKYXZhIEJ1aWxkZXIpLgotCQkJcHJvamVjdC5idWlsZCh2YWxpZGF0aW9uRW51bVR5cGUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKGV4Yyk7Ci0JCQl9Ci0JCQlidWZmZXIud3JpdGUoIkNvcmVFeGNlcHRpb24gY2F1Z2h0OyBzdGFjayB0cmFjZSBpbiBMb2dnaW5nVXRpbC5sb2ciKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJSU1hcmtlcltdIG1lc3NhZ2VzID0gVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhwcm9qZWN0LCBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFZhbGlkYXRvck5hbWVzKG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtde3RtZC5nZXRWYWxpZGF0b3JNZXRhRGF0YSgpfSkpOwotCQlyZXR1cm4gdmVyaWZ5KGJ1ZmZlciwgdG1kLmdldE5hbWUoKSwgc3ViVGFza05hbWUsIHByb2plY3QsIHRtZC5nZXRNZXNzYWdlcyh2YWxpZGF0aW9uRW51bVR5cGUpLCBtZXNzYWdlcyk7Ci0JfQotCQotCS8qKgotCSAqIFJ1biB0aGUgZ2l2ZW4gVmFsaWRhdGlvbk9wZXJhdGlvbiBhbmQgZW5zdXJlIHRoYXQgdGhlIHJlc3VsdHMgbWF0Y2ggdGhlIHJlc3VsdHMgb2YgdGhlIGdpdmVuIHRlc3QgY2FzZS4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzdWx0cyBtYXRjaCBhbmQgZmFsc2UgaWYgdGhleSBkb24ndC4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBwdWJsaWMgYmVjYXVzZSBpdCdzIG5lZWRlZCBmb3IgdGhlIFRlc3RPcENvbnN0ciBvcGVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gdGVzdChJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHRlc3ROYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIExpc3QgZXhwZWN0ZWRNZXNzYWdlcywgVmFsaWRhdGlvbk9wZXJhdGlvbiBvcCwgU3RyaW5nW10gdmFsaWRhdG9yTmFtZXMpIHRocm93cyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJSVByb2dyZXNzTW9uaXRvciBkZWJ1Z01vbml0b3IgPSBnZXREZWJ1Z01vbml0b3IoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYm9vbGVhbiBwYXNzZWQgPSB0cnVlOwotCQl0cnkgewotCQkJCi0JCQlpZihvcCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLldBUk5JTkcpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5XQVJOSU5HLCAiQ2Fubm90IHJ1biB0ZXN0cyBiZWNhdXNlIHRoZSBPcGVyYXRpb24gaXMgbnVsbC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRyeSB7Ci0JCQkJCQkvL1ZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLnNldE5vTWVzc2FnZUxpbWl0KG9wLmdldFByb2plY3QoKSk7Ci0JCQkJCQotCQkJCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihvcCwgZGVidWdNb25pdG9yKTsgCi0JCQkJCQkKLQkJCQkJCWlmKG9wLmlzRm9yaygpKSB7Ci0JCQkJCQkJLy8gV2FpdCB1bnRpbCBhbGwgZm9ya2VkIHRocmVhZHMgYXJlIGNvbXBsZXRlCi0JCQkJCQkJd2hpbGUoIVZUaHJlYWRNYW5hZ2VyLmdldE1hbmFnZXIoKS5pc0RvbmUoKSl7fTsKLQkJCQkJCX0KLQkJCQotCQkJCQkJLy8gTG9hZCB0aGUgZW5hYmxlZCB2YWxpZGF0b3JzIGZyb20gdGhlIHRlc3QsIG5vdCB0aGUgb3BlcmF0aW9uLAotCQkJCQkJLy8gYmVjYXVzZSB0aGUgdGVzdCBoYXMgdGhlIG1lc3NhZ2VzIGZvciBhIHNpbmdsZSB2YWxpZGF0b3IsIGFuZAotCQkJCQkJLy8gaWYgdGhlIG1lc3NhZ2VzIGZyb20gYWxsIGVuYWJsZWQgdmFsaWRhdG9ycyBhcmUgcmV0cmlldmVkLAotCQkJCQkJLy8gdGhlbiAiZXh0cmEiIG1lc3NhZ2VzLCByZXBvcnRlZCBieSB2YWxpZGF0b3JzIHdob3NlIG1lc3NhZ2VzCi0JCQkJCQkvLyBhcmVuJ3QgZXhwZWN0ZWQgYnkgdGhlIHRlc3QsIGZhaWwgdGhlIHRlc3QgY2FzZS4gCi0JCQkJCQlJTWFya2VyW10gbWVzc2FnZXMgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKG9wLmdldFByb2plY3QoKSwgdmFsaWRhdG9yTmFtZXMpOwotCQkJCQkJcGFzc2VkID0gdmVyaWZ5KGJ1ZmZlciwgdGVzdE5hbWUsIHN1YlRhc2tOYW1lLCBvcC5nZXRQcm9qZWN0KCksIGV4cGVjdGVkTWVzc2FnZXMsIG1lc3NhZ2VzKTsKLQkJCQl9Ci0JCQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJCX0KLQkJCQkJcGFzc2VkID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJcGFzc2VkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHBhc3NlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXR1cFRlc3RzKElCdWZmZXIgYnVmZmVyLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSB2dHMgPSBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yVGVzdHMoYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLCAoU3RyaW5nKW51bGwpOwotCQlPcGVyYXRpb25UZXN0Y2FzZVtdIG90cyA9IEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRPcGVyYXRpb25UZXN0cyhidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCksIChTdHJpbmcpbnVsbCk7Ci0JCWJvb2xlYW4gc3VjY2Vzc2Z1bCA9IHRydWU7Ci0JCWZvcihpbnQgaT0wOyBpPHZ0cy5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yVGVzdGNhc2UgdnRlc3QgPSB2dHNbaV07Ci0JCQlzdWNjZXNzZnVsID0gc2V0dXBUZXN0cyhidWZmZXIsIHZ0ZXN0LCBmYWxzZSkgJiYgc3VjY2Vzc2Z1bDsKLQkJfQotCQkKLQkJZm9yKGludCBqPTA7IGo8b3RzLmxlbmd0aDsgaisrKSB7Ci0JCQlPcGVyYXRpb25UZXN0Y2FzZSBvdGVzdCA9IG90c1tqXTsKLQkJCXN1Y2Nlc3NmdWwgPSBzZXR1cFRlc3RzKGJ1ZmZlciwgb3Rlc3QsIGZhbHNlKSAmJiBzdWNjZXNzZnVsOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VjY2Vzc2Z1bDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWxsIG9mIHRoZSB0ZXN0IGNhc2VzJyBpbnB1dCB3ZXJlIGZvdW5kIGFuZCBpbXBvcnRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZXR1cFRlc3RzKElCdWZmZXIgYnVmZmVyLCBJVGVzdGNhc2VNZXRhRGF0YSB0bWQsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlpbnQgZXhlY3V0aW9uTWFwID0gMHgwOwotCQlib29sZWFuIGltcG9ydGVkID0gdHJ1ZTsKLQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCXRyeSB7Ci0JCQlCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpOwotCQotCQkJLy8gRWFjaCBpbXBvcnQgb3BlcmF0aW9uIGRlbGV0ZXMgYW55IHByb2plY3QgYmVmb3JlIGl0IHJlLWltcG9ydHMgaXQuCi0JCQlTdHJpbmcgZGlyID0gVGVzdGNhc2VVdGlsaXR5LmdldElucHV0RGlyKHRtZCk7Ci0JCQlUZXN0U2V0dXBJbXBvcnRbXSBzZXR1cCA9IHJlYWRlci5nZXRUZXN0U2V0dXAoYnVmZmVyLCBkaXIsIHRtZCwgdmVyYm9zZSk7Ci0JCQlpZigoc2V0dXAgPT0gbnVsbCkgfHwgKHNldHVwLmxlbmd0aCA9PSAwKSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gIkNhbm5vdCBpbXBvcnQgaW5wdXQgdGhhdCBkb2VzIG5vdCBleGlzdC4gQ2hlY2sgdGhhdCBkaXJlY3RvcnkgIiArIGRpciArICIgZXhpc3RzLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJCQlidWZmZXIud3JpdGUobWVzc2FnZSk7Ci0JCQkJZXhlY3V0aW9uTWFwIHw9IDB4MTsKLQkJCQlpbXBvcnRlZCA9IGZhbHNlOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQllbnRyeS5zZXRFeGVjdXRpb25NYXAoZXhlY3V0aW9uTWFwKTsKLQkJCQkJZW50cnkuc2V0VGV4dChtZXNzYWdlKTsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWJ1ZmZlci5nZXRQcm9ncmVzc01vbml0b3IoKS5iZWdpblRhc2soIkltcG9ydGluZyBmaWxlczsgcGxlYXNlIHdhaXQuLi4iLCBzZXR1cC5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yKGludCBpPTA7IGk8c2V0dXAubGVuZ3RoOyBpKyspIHsKLQkJCQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLnN1YlRhc2soIkltcG9ydGluZyBmaWxlICIgKyAoaSsxKSArICIgb2YgIiArIHNldHVwLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpZighc2V0dXBbaV0uaW1wb3J0RmlsZShidWZmZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCksIGRpcikpIHsKLQkJCQkJCS8vIE9uZSBvZiB0aGUgaW5wdXQgZmlsZXMgY291bGRuJ3QgYmUgaW1wb3J0ZWQuCi0JCQkJCQlleGVjdXRpb25NYXAgfD0gMHgyOwotCQkJCQkJaW1wb3J0ZWQgPSBmYWxzZTsKLQkJCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQkJZW50cnkuc2V0RXhlY3V0aW9uTWFwKGV4ZWN1dGlvbk1hcCk7Ci0JCQkJCQkJZW50cnkuc2V0VGV4dCgiSW1wb3J0IGZhaWxlZCBmb3IgZGlyICIgKyBkaXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCQkJfQotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmdldFByb2dyZXNzTW9uaXRvcigpLmRvbmUoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKCFpbXBvcnRlZCkgewotCQkJCVN0cmluZyB0bWROYW1lID0gKHRtZCA9PSBudWxsKSA/ICI/IiA6IHRtZC5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRFeGVjdXRpb25NYXAoZXhlY3V0aW9uTWFwKTsKLQkJCQllbnRyeS5zZXRUZXh0KCJUZXN0IHNldHVwIGZvciAiICsgdG1kTmFtZSArICIgd2FzIHVuc3VjY2Vzc2Z1bC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbXBvcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXhwZWN0ZWQgbWVzc2FnZXMgKHRtZE1tZExpc3QpIG1hdGNoZXMgdGhlIHJlcG9ydGVkIG1lc3NhZ2VzIChtbDIpLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbXBhcmUoSUJ1ZmZlciBidWZmZXIsIFN0cmluZyB0ZXN0TmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBMaXN0IHRtZE1tZExpc3QsIElNYXJrZXJbXSBtbDIpIHsKLQkJLy8gQ29udmVydCBvbmUgb2YgdGhlIGFycmF5cyBpbnRvIGEgbGlzdCBzbyB0aGF0IGl0IGNhbiBiZSBzb3J0ZWQuCi0JCWludCBudW1NYXRjaGVkID0gMDsKLQkJTGlzdCBtbWRMaXN0ID0gbmV3IEFycmF5TGlzdCh0bWRNbWRMaXN0KTsgLy8gY3JlYXRlIGEgY29weSBvZiB0aGUgdG1kJ3MgZXhwZWN0ZWQgb3V0cHV0IHNvIHRoYXQgdGhlIHRtZCdzIG91dHB1dCByZW1haW5zIGludGFjdAotCQlpbnQgbnVtRXhwZWN0ZWQgPSBtbWRMaXN0LnNpemUoKTsKLQkJaW50IG51bVJlcG9ydGVkID0gbWwyLmxlbmd0aDsKLQkJYm9vbGVhbiBwYXNzZWQgPSB0cnVlOwotCQotCi0JCXRyeSB7CQkKLQkJCUNvbGxlY3Rpb25zLnNvcnQobW1kTGlzdCwgTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZUNvbXBhcmF0b3IoYnVmZmVyLCBpc1ZlcmJvc2UoKSkpOwotCQotCQkJdHJ5IHsKLQkJCQlmb3IoaW50IGk9MDsgaTxtbDIubGVuZ3RoOyBpKyspIHsKLQkJCQkJSU1hcmtlciBtYXJrZXIgPSBtbDJbaV07Ci0JCQkJCU1lc3NhZ2VNZXRhRGF0YSBtYXRjaGluZyA9IGdldE1hdGNoaW5nTWV0YURhdGEoYnVmZmVyLCBtbWRMaXN0LCBtYXJrZXIpOwotCQkJCQlpZihtYXRjaGluZyA9PSBudWxsKSB7Ci0JCQkJCQlfZXh0cmEuYWRkKG1hcmtlcik7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIEV2ZXJ5IHRpbWUgYSBtbWQgaXMgbWF0Y2hlZCB0byBhIG1hcmtlciwgcmVtb3ZlIHRoZSBtbWQKLQkJCQkJCS8vIGZyb20gdGhlIGxpc3Qgc28gdGhhdCBtbWRzIHdpdGhvdXQgYSBtYXJrZXIgY2FuIGJlIGZsYWdnZWQuCi0JCQkJCQltbWRMaXN0LnJlbW92ZShtYXRjaGluZyk7Ci0JCQkJCQludW1NYXRjaGVkKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCi0JCQkJaWYobW1kTGlzdC5zaXplKCkgIT0gMCkgewotCQkJCQlfbWlzc2luZy5hZGRBbGwobW1kTGlzdCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJcGFzc2VkID0gcGFzc2VkICYmICgoX21pc3Npbmcuc2l6ZSgpID09IDApICYmIChfZXh0cmEuc2l6ZSgpID09IDApKTsKLQkJCQkKLQkJCQkvLyBSZXBvcnQgdGhlIG1pc3NpbmcgbWFya2VycyBhZnRlciB0aGUgTU1EIGxpc3QgaXMgc29ydGVkCi0JCQkJQ29sbGVjdGlvbnMuc29ydChfbWlzc2luZywgTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZUNvbXBhcmF0b3IoYnVmZmVyLCBpc1ZlcmJvc2UoKSkpOwotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX21pc3NpbmcuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJTWVzc2FnZU1ldGFEYXRhIG1tZCA9IChNZXNzYWdlTWV0YURhdGEpaXRlcmF0b3IubmV4dCgpOwotCQkJCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgSVRlc3RTdGF0dXMuRkFJTCwgYnVmZmVyLCAiRVJST1JbbWlzc2luZyBtZXNzYWdlXTogIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1tZCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCQotCQkJCS8vIFJlcG9ydCB0aGUgZXh0cmEgbWFya2VycyBhZnRlciB0aGV5J3JlIHNvcnRlZC4KLQkJCQlDb2xsZWN0aW9ucy5zb3J0KF9leHRyYSwgTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZUNvbXBhcmF0b3IoYnVmZmVyLCBpc1ZlcmJvc2UoKSkpOwotCQkJCWl0ZXJhdG9yID0gX2V4dHJhLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgSVRlc3RTdGF0dXMuRkFJTCwgYnVmZmVyLCAiRVJST1JbZXh0cmEgbWVzc2FnZV06ICIgKyBNZXNzYWdlVXRpbGl0eS50b1N0cmluZyhtYXJrZXIpICsgIiwgVGV4dCBpczogXCIiICsgTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZShtYXJrZXIpICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkKLQkJCQlpZihudW1FeHBlY3RlZCAhPSBudW1SZXBvcnRlZCkgewotCQkJCQlidWZmZXIud3JpdGUoIldyb25nIG51bWJlciBvZiBtZXNzYWdlcyByZXBvcnRlZC4gRXhwZWN0ZWQgIiArIG51bUV4cGVjdGVkICsgIiBhbmQgZ290ICIgKyBudW1SZXBvcnRlZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkKLQkJCQlidWZmZXIud3JpdGUoIk51bWJlciBvZiBleHRyYSBtZXNzYWdlczogIiArIF9leHRyYS5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVmZmVyLndyaXRlKCJOdW1iZXIgb2YgbWlzc2luZyBtZXNzYWdlczogIiArIF9taXNzaW5nLnNpemUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIud3JpdGUoIk51bWJlciBvZiBtYXRjaGVkIG1lc3NhZ2VzOiAiICsgbnVtTWF0Y2hlZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1tZExpc3QuY2xlYXIoKTsKLQkJCV9leHRyYS5jbGVhcigpOyAvLyBDbGVhciB0aGUgbGlzdCBvZiBleHRyYSBtYXJrZXJzIChzdG9yZWQgaW4gYSBsaXN0IHRvIG1ha2UgcmVhZGluZyBlYXNpZXIpLgotCQkJX21pc3NpbmcuY2xlYXIoKTsgLy8gQ2xlYXIgdGhlIGxpc3Qgb2YgbWlzc2luZyBtYXJrZXJzIChzdG9yZWQgaW4gYSBsaXN0IHRvIG1ha2UgcmVhZGluZyBlYXNpZXIpLgotCQl9Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHZlcmlmeShJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHRlc3ROYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIElQcm9qZWN0IHByb2plY3QsIExpc3QgbW1kTGlzdE9yaWcsIElNYXJrZXJbXSBtZXNzYWdlcykgewotCQlidWZmZXIud3JpdGUoIlRlc3QgY2FzZTogIiArIHRlc3ROYW1lKTsgLy8kTk9OLU5MUy0xJAotCi0JCWludCBudW1NYXRjaGVkID0gMDsKLQkJaW50IG51bUV4cGVjdGVkID0gMDsKLQkJaW50IG51bVJlcG9ydGVkID0gMDsKLQkJYm9vbGVhbiBwYXNzZWQgPSB0cnVlOwotCQlMaXN0IG1tZExpc3QgPSBuZXcgQXJyYXlMaXN0KG1tZExpc3RPcmlnKTsgLy8gTmVlZCB0byBtb2RpZnkgdGhlIGxpc3QsIGJ1dCBkbyBub3Qgd2FudCB0byBtb2RpZnkgdGhlIG9yaWdpbmFsLCBzbyBjcmVhdGUgYSBjb3B5LgotCQl0cnkgewotCQkJLy8gRmlyc3QsIGNoZWNrIHRoYXQgdGhlIG51bWJlciBvZiBtZXNzYWdlcyBtYXRjaC4KLQkJCWlmKG1lc3NhZ2VzID09IG51bGwpIHsKLQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuSU5GTykpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLklORk8sICJObyBtZXNzYWdlcyB3ZXJlIHJlcG9ydGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBwYXNzZWQ7Ci0JCQl9Ci0JCQkKLQkJCW51bUV4cGVjdGVkID0gbW1kTGlzdC5zaXplKCk7Ci0JCQludW1SZXBvcnRlZCA9IG1lc3NhZ2VzLmxlbmd0aDsKLQkJCQotCQkJQ29sbGVjdGlvbnMuc29ydChtbWRMaXN0LCBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlQ29tcGFyYXRvcihidWZmZXIsIGlzVmVyYm9zZSgpKSk7Ci0KLQkJCWZvcihpbnQgaT0wOyBpPG1lc3NhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSBtZXNzYWdlc1tpXTsKLQkJCQlNZXNzYWdlTWV0YURhdGEgbW1kID0gZ2V0TWF0Y2hpbmdNZXRhRGF0YShidWZmZXIsIG1tZExpc3QsIG1hcmtlcik7Ci0JCi0JCQkJaWYobW1kID09IG51bGwpIHsKLQkJCQkJX2V4dHJhLmFkZChtYXJrZXIpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIEV2ZXJ5IHRpbWUgYSBtbWQgaXMgbWF0Y2hlZCB0byBhIG1hcmtlciwgcmVtb3ZlIHRoZSBtbWQKLQkJCQkJLy8gZnJvbSB0aGUgbGlzdCBzbyB0aGF0IG1tZHMgd2l0aG91dCBhIG1hcmtlciBjYW4gYmUgZmxhZ2dlZC4KLQkJCQkJbW1kTGlzdC5yZW1vdmUobW1kKTsKLQkJCQkJaWYoaXNWZXJib3NlKCkpIHsKLQkJCQkJCWJ1ZmZlci53cml0ZSgibWF0Y2hlZCAiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcobWFya2VyKSArICIgdG8gIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1tZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQludW1NYXRjaGVkKys7Ci0JCQkJfQotCQkJCQotCQkJCS8vIENoZWNrIHNldmVyaXR5Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gRmFpbCBhIHRlc3QgY2FzZSBiYXNlZCBvbiBzZXZlcml0eSBtaXNtYXRjaCBiZWNhdXNlIEVKQiBkZXBsb3kKLQkJCQkJLy8gcmVsaWVzIG9uIHRoZSBzZXZlcml0eSB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgZGVwbG95bWVudAotCQkJCQkvLyBjYW4gY29udGludWU/Ci0JCQkJCXZlcmlmeVNldmVyaXR5KGJ1ZmZlciwgdGVzdE5hbWUsIHN1YlRhc2tOYW1lLCBtbWQsIG1hcmtlcik7Ci0JCQkJfQotCQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlKTsKLQkJCQkJfQotCQkJCQlidWZmZXIud3JpdGUoIkVSUk9SW1Rlc3RjYXNlOjoiICsgdGVzdE5hbWUgKyAiXS4gQ29yZUV4Y2VwdGlvbiBjYXVnaHQgd2hpbGUgdmVyaWZ5aW5nIHNldmVyaXR5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gQ2hlY2sgcmVzb3VyY2UKLQkJCQl0cnkgewotCQkJCQkvLyBEb24ndCBmYWlsIGEgdGVzdCBjYXNlIGJhc2VkIG9uIHJlc291cmNlLCBiZWNhdXNlIHRoZSAibG9jYXRpb24iIGNvbHVtbiB3aWxsCi0JCQkJCS8vIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZSwgYW55d2F5LiBTaG91bGQgc3RpbGwgbGV0IHRoZSAKLQkJCQkJLy8gdXNlciBrbm93LCB0aG91Z2guCi0JCQkJCXZlcmlmeVJlc291cmNlKGJ1ZmZlciwgdGVzdE5hbWUsIHN1YlRhc2tOYW1lLCBtbWQsIG1hcmtlcik7Ci0JCQkJfQotCQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlwYXNzZWQgPSBmYWxzZTsKLQkJCQkJYnVmZmVyLndyaXRlKCJFUlJPUltUZXN0Y2FzZTo6IiArIHRlc3ROYW1lICsgIl0uIENvcmVFeGNlcHRpb24gY2F1Z2h0IHdoaWxlIHZlcmlmeWluZyByZXNvdXJjZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlKTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJCi0JCQkJLy8gQ2hlY2sgbG9jYXRpb24KLQkJCQl0cnkgewotCQkJCQkvLyBEb24ndCBmYWlsIGEgdGVzdCBjYXNlIGJhc2VkIG9uIGxvY2F0aW9uLCBiZWNhdXNlIHRoZSBsaW5lIG51bWJlciBjYWxjdWxhdGlvbgotCQkJCQkvLyBpcyBkaWZmZXJlbnQgaW4gVUkgJiBiYXRjaCwgYW5kIHRoZSB0ZXN0IGNhc2VzIGFyZSBiYXNlZCBvbiBVSSB0ZXN0IHJlc3VsdHMuCi0JCQkJCS8vIFNob3VsZCBzdGlsbCBhbGVydCB0aGUgdXNlciwgdGhvdWdoLgotCQkJCQl2ZXJpZnlMb2NhdGlvbihidWZmZXIsIHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgIG1tZCwgbWFya2VyKTsKLQkJCQl9Ci0JCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGUpOwotCQkJCQl9Ci0JCQkJCWJ1ZmZlci53cml0ZSgiRVJST1JbVGVzdGNhc2U6OiIgKyB0ZXN0TmFtZSArICJdLiBDb3JlRXhjZXB0aW9uIGNhdWdodCB3aGlsZSB2ZXJpZnlpbmcgbGluZSBudW1iZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYobW1kTGlzdC5zaXplKCkgIT0gMCkgewotCQkJCV9taXNzaW5nLmFkZEFsbChtbWRMaXN0KTsKLQkJCX0KLQkJfQotCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXBhc3NlZCA9IGZhbHNlOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYoISgoX21pc3Npbmcuc2l6ZSgpID09IDApICYmIChfZXh0cmEuc2l6ZSgpID09IDApKSkgewotCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZihwYXNzZWQpIHsKLQkJCQlidWZmZXIud3JpdGUoIlBBU1NbVGVzdGNhc2U6OiIgKyB0ZXN0TmFtZSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXModGVzdE5hbWUsIHN1YlRhc2tOYW1lLCB0cnVlKTsgLy8gSWYgZmFpbCwgd2lsbCBiZSByZXBvcnRlZCBpbiB0aGUgZXh0cmEgJiBtaXNzaW5nIGJlbG93LgotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnVmZmVyLndyaXRlKCJGQUlMW1Rlc3RjYXNlOjoiICsgdGVzdE5hbWUgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCS8vIE5vIHBvaW50IGluIGxpc3RpbmcgdGhlIG1tZExpc3QgYmVjYXVzZSBpdCdzIGVtcHR5IGJ5IHRoZSB0aW1lIHRoZSBmaW5hbGx5IGJsb2NrIGlzIHJlYWNoZWQKLQkJCQlpZihpc1ZlcmJvc2UoKSkgewotCQkJCQlidWZmZXIud3JpdGUoIkxpc3Qgb2YgbWFya2VycyByZXBvcnRlZDoiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZWJ1ZyhidWZmZXIsIG1lc3NhZ2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIFJlcG9ydCB0aGUgbWlzc2luZyBtYXJrZXJzIGFmdGVyIHRoZSBNTUQgbGlzdCBpcyBzb3J0ZWQKLQkJCUNvbGxlY3Rpb25zLnNvcnQoX21pc3NpbmcsIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2VDb21wYXJhdG9yKGJ1ZmZlciwgaXNWZXJib3NlKCkpKTsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gX21pc3NpbmcuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCU1lc3NhZ2VNZXRhRGF0YSBtbWQgPSAoTWVzc2FnZU1ldGFEYXRhKWl0ZXJhdG9yLm5leHQoKTsKLQkJCQlidWZmZXIuYWRkRXhlY3V0aW9uU3RhdHVzKHRlc3ROYW1lLCBzdWJUYXNrTmFtZSwgSVRlc3RTdGF0dXMuRkFJTCwgYnVmZmVyLCAiRVJST1JbbWlzc2luZyBtZXNzYWdlXTogIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1tZCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCS8vIFJlcG9ydCB0aGUgZXh0cmEgbWFya2VycyBhZnRlciB0aGV5J3JlIHNvcnRlZC4KLQkJCUNvbGxlY3Rpb25zLnNvcnQoX2V4dHJhLCBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlQ29tcGFyYXRvcihidWZmZXIsIGlzVmVyYm9zZSgpKSk7Ci0JCQlpdGVyYXRvciA9IF9leHRyYS5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0TmFtZSwgc3ViVGFza05hbWUsIElUZXN0U3RhdHVzLkZBSUwsIGJ1ZmZlciwgIkVSUk9SW2V4dHJhIG1lc3NhZ2VdOiAiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcobWFya2VyKSArICIsIFRleHQgaXM6IFwiIiArIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2UobWFya2VyKSArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQotCQkJaWYobnVtRXhwZWN0ZWQgIT0gbnVtUmVwb3J0ZWQpIHsKLQkJCQlidWZmZXIud3JpdGUoIldyb25nIG51bWJlciBvZiBtZXNzYWdlcyByZXBvcnRlZC4gRXhwZWN0ZWQgIiArIG51bUV4cGVjdGVkICsgIiBhbmQgZ290ICIgKyBudW1SZXBvcnRlZCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQlidWZmZXIud3JpdGUoIk51bWJlciBvZiBleHRyYSBtZXNzYWdlczogIiArIF9leHRyYS5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIud3JpdGUoIk51bWJlciBvZiBtaXNzaW5nIG1lc3NhZ2VzOiAiICsgX21pc3Npbmcuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLndyaXRlKCJOdW1iZXIgb2YgbWF0Y2hlZCBtZXNzYWdlczogIiArIG51bU1hdGNoZWQpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIud3JpdGUoIkVuZCBvZiB0ZXN0IGNhc2U6ICIgKyB0ZXN0TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCV9leHRyYS5jbGVhcigpOyAvLyBDbGVhciB0aGUgbGlzdCBvZiBleHRyYSBtYXJrZXJzIChzdG9yZWQgaW4gYSBsaXN0IHRvIG1ha2UgcmVhZGluZyBlYXNpZXIpLgotCQkJX21pc3NpbmcuY2xlYXIoKTsgLy8gQ2xlYXIgdGhlIGxpc3Qgb2YgbWlzc2luZyBtYXJrZXJzIChzdG9yZWQgaW4gYSBsaXN0IHRvIG1ha2UgcmVhZGluZyBlYXNpZXIpLgotCQl9Ci0JCXJldHVybiBwYXNzZWQ7Ci0JfQotCQotCXByaXZhdGUgaW50IHZlcmlmeVNldmVyaXR5KElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgdGVzdE5hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgTWVzc2FnZU1ldGFEYXRhIG1tZCwgSU1hcmtlciBtYXJrZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gSWYgcHJlZml4U2V2ZXJpdHkgaXMgbnVsbCwgbWFya2VyIGhhcyBubyBwcmVmaXgsIHRoZXJlZm9yZSBpdCBoYXMgbm8gc2V2ZXJpdHkKLQkJSW50ZWdlciBwcmVmaXhTZXZlcml0eSA9IE1lc3NhZ2VVdGlsaXR5LmdldFNldmVyaXR5KG1hcmtlcik7Ci0JCWlmKHByZWZpeFNldmVyaXR5ICE9IG51bGwpIHsKLQkJCUludGVnZXIgc2V2ZXJpdHkgPSAoSW50ZWdlciltYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpOyAvLyBJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsIElNYXJrZXIuU0VWRVJJVFlfSU5GTwotCQkJYm9vbGVhbiBzZXZlcml0eUVxdWFsID0gdHJ1ZTsKLQkJCWlmKChzZXZlcml0eSA9PSBudWxsKSAmJiAocHJlZml4U2V2ZXJpdHkgPT0gbnVsbCkpIHsKLQkJCQlzZXZlcml0eUVxdWFsID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYoc2V2ZXJpdHkgPT0gbnVsbCkgewotCQkJCXNldmVyaXR5RXF1YWwgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYocHJlZml4U2V2ZXJpdHkgPT0gbnVsbCkgewotCQkJCXNldmVyaXR5RXF1YWwgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldmVyaXR5RXF1YWwgPSBzZXZlcml0eS5lcXVhbHMocHJlZml4U2V2ZXJpdHkpOwotCQkJfQotCQkJCi0JCQlpZighc2V2ZXJpdHlFcXVhbCkgewotCQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXModGVzdE5hbWUsIHN1YlRhc2tOYW1lLCBJVGVzdFN0YXR1cy5XQVJOLCBidWZmZXIsICJXQVJOSU5HW21pc21hdGNoaW5nIHNldmVyaXR5XTogZXhwZWN0ZWQgIiArIGdldFNldmVyaXR5Q2hhcihwcmVmaXhTZXZlcml0eSkgKyAiLCBnb3QgIiArIGdldFNldmVyaXR5Q2hhcihzZXZlcml0eSkgKyAiIG9uIG1hcmtlciAiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcobWFya2VyKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJcmV0dXJuIElUZXN0U3RhdHVzLldBUk47Ci0JCQl9Ci0JCX0KLQkJCQotCQlyZXR1cm4gSVRlc3RTdGF0dXMuUEFTUzsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgdmVyaWZ5UmVzb3VyY2UoSUJ1ZmZlciBidWZmZXIsIFN0cmluZyB0ZXN0TmFtZSwgU3RyaW5nIHN1YlRhc2tOYW1lLCBNZXNzYWdlTWV0YURhdGEgbW1kLCBJTWFya2VyIG1hcmtlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgcmVzb3VyY2UgPSBNZXNzYWdlVXRpbGl0eS5nZXRSZXNvdXJjZShtYXJrZXIpOwotCQlpZighcmVzb3VyY2UuZXF1YWxzKG1tZC5nZXRSZXNvdXJjZSgpKSkgewotCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0TmFtZSwgc3ViVGFza05hbWUsIElUZXN0U3RhdHVzLldBUk4sIGJ1ZmZlciwgIklORk9bd3JvbmcgcmVzb3VyY2VdOiBleHBlY3RlZCAiICsgbW1kLmdldFJlc291cmNlKCkgKyAiLCBnb3QgIiArIHJlc291cmNlICsgIiBvbiBtYXJrZXIgIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1hcmtlcikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJcmV0dXJuIElUZXN0U3RhdHVzLldBUk47Ci0JCX0KLQkJcmV0dXJuIElUZXN0U3RhdHVzLlBBU1M7Ci0JfQotCQotCXByaXZhdGUgaW50IHZlcmlmeUxvY2F0aW9uKElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgdGVzdE5hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgTWVzc2FnZU1ldGFEYXRhIG1tZCwgSU1hcmtlciBtYXJrZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gRWl0aGVyIGNvbXBhcmUgdHdvIGxpbmUgbnVtYmVycyBvciB0d28gdGV4dCBsb2NhdGlvbnMsIGJ1dCBub3QgYSBsaW5lIG51bWJlciB0byBhIHRleHQgbG9jYXRpb24uCi0JCWlmKG1tZC5pc1NldExpbmVOdW1iZXIoKSkgewotCQkJSW50ZWdlciBsaW5lTnVtYmVyID0gTWVzc2FnZVV0aWxpdHkuZ2V0TGluZU51bWJlcihtYXJrZXIpOwotCQkJaWYobGluZU51bWJlciA9PSBudWxsKSB7Ci0JCQkJLy8gTWFya2VyIGhhcyBhIHRleHQgbG9jYXRpb24sIG5vdCBhIGxpbmUgbnVtYmVyLgotCQkJCXJldHVybiBJVGVzdFN0YXR1cy5QQVNTOwotCQkJfQotCQkJCi0JCQlpZihsaW5lTnVtYmVyLmludFZhbHVlKCkgIT0gbW1kLmdldExpbmVOdW1iZXIoKSkgewotCQkJCWJ1ZmZlci5hZGRFeGVjdXRpb25TdGF0dXModGVzdE5hbWUsIHN1YlRhc2tOYW1lLCBJVGVzdFN0YXR1cy5XQVJOLCBidWZmZXIsICJJTkZPW3dyb25nIGxvY2F0aW9uXTogZXhwZWN0ZWQgIiArIG1tZC5nZXRMaW5lTnVtYmVyKCkgKyAiLCBnb3QgIiArIGxpbmVOdW1iZXIgKyAiIG9uIG1hcmtlciAiICsgTWVzc2FnZVV0aWxpdHkudG9TdHJpbmcobWFya2VyKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJcmV0dXJuIElUZXN0U3RhdHVzLldBUk47Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZihtbWQuaXNTZXRMb2NhdGlvbigpKSB7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBNZXNzYWdlVXRpbGl0eS5nZXRMb2NhdGlvbihtYXJrZXIpOwotCQkJaWYobG9jYXRpb24gPT0gbnVsbCkgewotCQkJCS8vIG1hcmtlciBoYXMgYSBsaW5lIG51bWJlciwgbm90IGEgdGV4dCBsb2NhdGlvbgotCQkJCXJldHVybiBJVGVzdFN0YXR1cy5QQVNTOwotCQkJfQotCQkJCi0JCQlpZighKG1tZC5nZXRMb2NhdGlvbigpLmVxdWFscyhsb2NhdGlvbikpKSB7Ci0JCQkJYnVmZmVyLmFkZEV4ZWN1dGlvblN0YXR1cyh0ZXN0TmFtZSwgc3ViVGFza05hbWUsIElUZXN0U3RhdHVzLldBUk4sIGJ1ZmZlciwgIklORk9bd3JvbmcgbG9jYXRpb25dOiBleHBlY3RlZCAiICsgbW1kLmdldExvY2F0aW9uKCkgKyAiLCBnb3QgIiArIGxvY2F0aW9uICsgIiBvbiBtYXJrZXIgIiArIE1lc3NhZ2VVdGlsaXR5LnRvU3RyaW5nKG1hcmtlcikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCXJldHVybiBJVGVzdFN0YXR1cy5XQVJOOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gSVRlc3RTdGF0dXMuUEFTUzsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBNZXNzYWdlTWV0YURhdGEgZ2V0TWF0Y2hpbmdNZXRhRGF0YShJQnVmZmVyIGJ1ZmZlciwgTGlzdCBtbWRMaXN0LCBJTWFya2VyIG1hcmtlcikgewotCQlpbnQgcmVzdWx0ID0gQ29sbGVjdGlvbnMuYmluYXJ5U2VhcmNoKG1tZExpc3QsIG1hcmtlciwgTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZUNvbXBhcmF0b3IoYnVmZmVyLCBpc1ZlcmJvc2UoKSkpOwotCQlpZihyZXN1bHQgPCAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKE1lc3NhZ2VNZXRhRGF0YSltbWRMaXN0LmdldChyZXN1bHQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC91dGlsL0JWVFZhbGlkYXRpb25VdGlsaXR5LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC91dGlsL0JWVFZhbGlkYXRpb25VdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZmYwZWQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9CVlRWYWxpZGF0aW9uVXRpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qCi0gKiAoYykgQ29weXJpZ2h0IDIwMDEgTXlDb3Jwb3JhdGlvbi4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuSVRlc3RjYXNlTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5PcGVyYXRpb25UZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlRlc3RjYXNlVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LlZhbGlkYXRvclRlc3RjYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJWVFZhbGlkYXRpb25VdGlsaXR5IHsKLQlwcml2YXRlIEJWVFZhbGlkYXRpb25VdGlsaXR5KCkgewotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvck1ldGFEYXRhIGdldFZhbGlkYXRvck1ldGFEYXRhKElNYXJrZXIgbWFya2VyKSB7Ci0JCVN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUgPSBudWxsOwotCQl0cnkgewotCQkJdmFsaWRhdG9yQ2xhc3NOYW1lID0gbWFya2VyLmdldEF0dHJpYnV0ZShDb25maWd1cmF0aW9uQ29uc3RhbnRzLlZBTElEQVRJT05fTUFSS0VSX09XTkVSKS50b1N0cmluZygpOwotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpLmdldFZhbGlkYXRvck1ldGFEYXRhKHZhbGlkYXRvckNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gdm1kOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQl9Ci0JCXJldHVybiBudWxsOwkJCi0JfQotCQotCXByaXZhdGUgc3RhdGljIElNYXJrZXJbXSBnZXRWYWxpZGF0aW9uVGFza3MoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRyeSB7Ci0JCQlJTWFya2VyW10gYWxsTWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKENvbmZpZ3VyYXRpb25Db25zdGFudHMuVkFMSURBVElPTl9NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpOyAvLyBmYWxzZSBtZWFucyBvbmx5IGNvbnNpZGVyIFBST0JMRU1fTUFSS0VSLCBub3QgdmFyaWFudHMgb2YgUFJPQkxFTV9NQVJLRVIuIFNpbmNlIGFkZFRhc2sgb25seSBhZGRzIFBST0JMRU1fTUFSS0VSLCB3ZSBkb24ndCBuZWVkIHRvIGNvbnNpZGVyIGl0cyBzdWJ0eXBlcy4KLQkJCXJldHVybiBhbGxNYXJrZXJzOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFZhbGlkYXRpb25NYXJrZXJzKCkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IHdvcmtzcGFjZS5nZXRSb290KCk7Ci0JCUlNYXJrZXJbXSBtYXJrZXJzID0gZ2V0VmFsaWRhdGlvblRhc2tzKHJvb3QpOwotCQlpZihtYXJrZXJzICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJd29ya3NwYWNlLmRlbGV0ZU1hcmtlcnMobWFya2Vycyk7Ci0JCQl9Ci0JCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb2plY3ROYW1lKEZpbGUgZmlsZSkgewotCQlTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQkJaW50IGV4dEluZGV4ID0gZmlsZU5hbWUuaW5kZXhPZignLicpOwotCQlpZihleHRJbmRleCA+IDApIHsKLQkJCXJldHVybiBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZXh0SW5kZXgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGZpbGVOYW1lOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTG9nTmFtZShTdHJpbmcgbG9nRmlsZU5hbWUpIHsKLQkJU3RyaW5nIGRpciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJRmlsZSBkaXJXaXRoRmlsZSA9IG5ldyBGaWxlKGRpciwgbG9nRmlsZU5hbWUpOwotCQlyZXR1cm4gZGlyV2l0aEZpbGUudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdFtdIGdldFByb2plY3RzKElUZXN0Y2FzZU1ldGFEYXRhW10gdG1kcykgewotCQlMaXN0IHNvcnRlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihpbnQgaT0wOyBpPHRtZHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHAgPSBUZXN0Y2FzZVV0aWxpdHkuZmluZFByb2plY3QodG1kc1tpXSk7Ci0JCQlpZigocCAhPSBudWxsKSAmJiAocC5leGlzdHMoKSkgJiYgKHAuaXNPcGVuKCkpICYmICFzb3J0ZWRMaXN0LmNvbnRhaW5zKHApKSB7Ci0JCQkJc29ydGVkTGlzdC5hZGQocCk7Ci0JCQl9Ci0JCX0KLQkJQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRMaXN0LCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpewotCQkJCWlmKChhID09IG51bGwpICYmIChiID09IG51bGwpKSB7Ci0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCQllbHNlIGlmKGEgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gMTsKLQkJCQl9Ci0JCQkJZWxzZSBpZihiID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQotCQkJCWlmKChhIGluc3RhbmNlb2YgSVByb2plY3QpICYmIChiIGluc3RhbmNlb2YgSVByb2plY3QpKSB7Ci0JCQkJCXJldHVybiAoKElQcm9qZWN0KWEpLmdldE5hbWUoKS5jb21wYXJlVG8oKChJUHJvamVjdCliKS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQkKLQkJCQlyZXR1cm4gLTE7IC8vIHNob3VsZCBuZXZlciByZWFjaCBoZXJlLi4uYm90aCBPYmplY3RzIHNob3VsZCBhbHdheXMgYmUgSVByb2plY3RzCi0JCQl9Ci0JCX0pOwotCQlJUHJvamVjdFtdIHJlc3VsdCA9IG5ldyBJUHJvamVjdFtzb3J0ZWRMaXN0LnNpemUoKV07Ci0JCXNvcnRlZExpc3QudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVRlc3RjYXNlTWV0YURhdGFbXSBnZXRUZXN0cyhJVGVzdGNhc2VNZXRhRGF0YVtdIHRtZHMsIElQcm9qZWN0IHApIHsKLQkJSVRlc3RjYXNlTWV0YURhdGFbXSB0ZW1wID0gbmV3IElUZXN0Y2FzZU1ldGFEYXRhW3RtZHMubGVuZ3RoXTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yKGludCBpPTA7IGk8dG1kcy5sZW5ndGg7IGkrKykgewotCQkJSVRlc3RjYXNlTWV0YURhdGEgdG1kID0gdG1kc1tpXTsKLQkJCWlmKHRtZC5nZXRQcm9qZWN0TmFtZSgpLmVxdWFscyhwLmdldE5hbWUoKSkpIHsKLQkJCQl0ZW1wW2NvdW50KytdID0gdG1kOwotCQkJfQotCQl9Ci0JCQotCQlJVGVzdGNhc2VNZXRhRGF0YVtdIHJlc3VsdCA9IG5ldyBJVGVzdGNhc2VNZXRhRGF0YVtjb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgdmFsaWRhdG9yIHRlc3RzLgotCSAqLwkKLQlwdWJsaWMgc3RhdGljIGludCBudW1WYWxpZGF0b3JUZXN0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0W10gcHJvamVjdHMpIHRocm93cyBCVlRWYWxpZGF0aW9uRXhjZXB0aW9uIHsJCi0JCUJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlciByZWFkZXIgPSBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCk7Ci0JCQotCQlpbnQgdG90YWxUZXN0cyA9IDA7Ci0JCWZvcihpbnQgaT0wOyBpPHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvamVjdHNbaV07Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRlc3RzID0gcmVhZGVyLmdldFZhbGlkYXRvclRlc3RzKG1vbml0b3IsIHByb2plY3QpOwotCQkJaWYoKHRlc3RzID09IG51bGwpIHx8ICh0ZXN0cy5sZW5ndGggPT0gMCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJdG90YWxUZXN0cyArPSB0ZXN0cy5sZW5ndGg7Ci0JCX0KLQkJCi0JCXJldHVybiB0b3RhbFRlc3RzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIHB1YmxpYyAodmlzaWJsZSkgdGVzdCBjYXNlcyBmb3IgYSBwYXJ0aWN1bGFyIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3RbXSBwcm9qZWN0cykgewotCQlTZXQgdGVzdFNldCA9IG5ldyBIYXNoU2V0KCk7CQkKLQkJZm9yKGludCBpPTA7IGk8cHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCVZhbGlkYXRvclRlc3RjYXNlW10gdGVzdHMgPSBnZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCBwcm9qZWN0KTsKLQkJCWlmKHRlc3RzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQkKLQkJCWZvcihpbnQgaj0wOyBqPHRlc3RzLmxlbmd0aDsgaisrKSB7Ci0JCQkJVmFsaWRhdG9yVGVzdGNhc2UgdnQgPSB0ZXN0c1tqXTsKLQkJCQl0ZXN0U2V0LmFkZCh2dCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCVZhbGlkYXRvclRlc3RjYXNlW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlW3Rlc3RTZXQuc2l6ZSgpXTsKLQkJdGVzdFNldC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB2aXNpYmxlIHZhbGlkYXRvciB0ZXN0IGNhc2VzIGZvciBhIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JUZXN0Y2FzZVtdIGdldFZhbGlkYXRvclRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCkgewotCQlCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpOwotCi0JCVZhbGlkYXRvclRlc3RjYXNlW10gdGVzdHMgPSByZWFkZXIuZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgcHJvamVjdCk7Ci0JCWlmKHRlc3RzID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgVmFsaWRhdG9yVGVzdGNhc2VbMF07Ci0JCX0KLQkJCi0JCXJldHVybiB0ZXN0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIG9mIHRoZSB0ZXN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9wZXJhdGlvblRlc3RjYXNlW10gZ2V0T3BlcmF0aW9uVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0T3BlcmF0aW9uVGVzdHMobW9uaXRvciwgKFN0cmluZyludWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBPcGVyYXRpb25UZXN0Y2FzZVtdIGdldE9wZXJhdGlvblRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCkgewotCQlCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gQlZUVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyLmdldFJlYWRlcigpOwotCi0JCU9wZXJhdGlvblRlc3RjYXNlW10gdGVzdHMgPSByZWFkZXIuZ2V0T3BlcmF0aW9uVGVzdHMobW9uaXRvciwgcHJvamVjdCk7Ci0JCWlmKHRlc3RzID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgT3BlcmF0aW9uVGVzdGNhc2VbMF07Ci0JCX0KLQkJCi0JCXJldHVybiB0ZXN0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIG9mIHRoZSB0ZXN0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvclRlc3RjYXNlW10gZ2V0VmFsaWRhdG9yVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvciwgKFN0cmluZyludWxsKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBvZiB0aGUgdGVzdHMsIHZpc2libGUgYW5kIGludmlzaWJsZSwgb3duZWQgYnkgdGhlIHZhbGlkYXRvciBtZXRhZGF0YS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRvclRlc3RjYXNlW10gZ2V0VmFsaWRhdG9yVGVzdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBWYWxpZGF0b3JNZXRhRGF0YSB2bWQpIHsKLQkJVmFsaWRhdG9yVGVzdGNhc2VbXSBhbGxUZXN0cyA9IEJWVFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCAoU3RyaW5nKW51bGwpOwotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRlbXAgPSBuZXcgVmFsaWRhdG9yVGVzdGNhc2VbYWxsVGVzdHMubGVuZ3RoXTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yKGludCBpPTA7IGk8YWxsVGVzdHMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvclRlc3RjYXNlIHRlc3R2bWQgPSBhbGxUZXN0c1tpXTsKLQkJCWlmKHZtZC5lcXVhbHModGVzdHZtZC5nZXRWYWxpZGF0b3JNZXRhRGF0YSgpKSkgewotCQkJCXRlbXBbY291bnQrK10gPSB0ZXN0dm1kOwotCQkJfQotCQl9Ci0JCVZhbGlkYXRvclRlc3RjYXNlW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlW2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIGNvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBWYWxpZGF0b3JNZXRhRGF0YVtdIGdldFZhbGlkYXRvcnNUaGF0SGF2ZVRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRlc3RzID0gZ2V0VmFsaWRhdG9yVGVzdHMobW9uaXRvcik7Ci0JCVNldCB0ZW1wID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yKGludCBpPTA7IGk8dGVzdHMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvclRlc3RjYXNlIHZ0ID0gdGVzdHNbaV07Ci0JCQl0ZW1wLmFkZCh2dC5nZXRWYWxpZGF0b3JNZXRhRGF0YSgpKTsKLQkJfQotCQkKLQkJVmFsaWRhdG9yTWV0YURhdGFbXSB2bWRzID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhW3RlbXAuc2l6ZSgpXTsKLQkJdGVtcC50b0FycmF5KHZtZHMpOwotCQlyZXR1cm4gdm1kczsKLQl9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC91dGlsL0J1aWxkSW5mby5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9CdWlsZEluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2MTJhYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC91dGlsL0J1aWxkSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwudXRpbDsKLXB1YmxpYyBjbGFzcyBCdWlsZEluZm8gewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiTGljZW5zZWQgTWF0ZXJpYWxzIC0tIFByb3BlcnR5IG9mIElCTVxuKGMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCAyMDAxLDIwMDNcblVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdCdWlsZExldmVsID0gIjIwMDMxMTEyXzE5MTUtV0IyMTItQUQtVjUxMUQtVzUiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBsZXZlbCgpIHsgcmV0dXJuIGZnQnVpbGRMZXZlbDsgfQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0FCdWlsZExldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC91dGlsL1J1blRlc3RzT3BlcmF0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9pbnRlcm5hbC91dGlsL1J1blRlc3RzT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMmIwMzIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvaW50ZXJuYWwvdXRpbC9SdW5UZXN0c09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5LklUZXN0Y2FzZU1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlcjsKLQotCi0vKioKLSAqIFJ1biB0aGUgQlZUIG9mIHRoZSB2YWxpZGF0b3I6IGEgZnVsbCB0ZXN0LCBhbiBpbmNyZW1lbnRhbCB0ZXN0LAotICogYW5kIGFuIGFzeW5jaHJvbm91cyB0ZXN0LCBpZiBhcHBsaWNhYmxlLgotICogCi0gKiBUaGlzIGNsYXNzIG11c3QgTk9UIGJlIHdyYXBwZWQgaW4gYW4gSVdvcmtzcGFjZVJ1bm5hYmxlIG9yIAotICogdGhlcmUgd2lsbCBiZSBkZWFkbG9jayBkdXJpbmcgdGhlIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIHRlc3QhCi0gKiAoUmVhZCB0aGUgY29tbWVudCBhYm92ZSBWVGhyZWFkTWFuYWdlcjo6aXNEb25lKCkgZm9yIGRldGFpbHMuKQotICovCi1wdWJsaWMgY2xhc3MgUnVuVGVzdHNPcGVyYXRpb24gewotCXByaXZhdGUgc3RhdGljIFJ1blRlc3RzT3BlcmF0aW9uIF9pbnN0ID0gbnVsbDsKLQkKLQlwcml2YXRlIFJ1blRlc3RzT3BlcmF0aW9uKCkgewotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJ1blRlc3RzT3BlcmF0aW9uIHNpbmdsZXRvbigpIHsKLQkJaWYoX2luc3QgPT0gbnVsbCkgewotCQkJX2luc3QgPSBuZXcgUnVuVGVzdHNPcGVyYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gX2luc3Q7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlI3J1bihJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJQnVmZmVyIGJ1ZmZlciwgSVRlc3RjYXNlTWV0YURhdGFbXSBhbGxUbWRzKSB7Ci0JCUlQcm9qZWN0W10gcHJvamVjdHMgPSBCVlRWYWxpZGF0aW9uVXRpbGl0eS5nZXRQcm9qZWN0cyhhbGxUbWRzKTsKLQkJZm9yKGludCBpPTA7IGk8cHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBwcm9qZWN0c1tpXTsKLQkJCUlUZXN0Y2FzZU1ldGFEYXRhW10gdG1kcyA9IEJWVFZhbGlkYXRpb25VdGlsaXR5LmdldFRlc3RzKGFsbFRtZHMsIHByb2plY3QpOwotCQkJCi0JCQlmb3IoaW50IGo9MDsgajx0bWRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSVRlc3RjYXNlTWV0YURhdGEgdG1kID0gdG1kc1tqXTsKLQkJCQl0bWQucnVuKGJ1ZmZlciwgcHJvamVjdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0FJbXBvcnRPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0FJbXBvcnRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1MTMyMi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9BSW1wb3J0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5Mb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWwuQlZUVmFsaWRhdGlvblV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnBsdWdpbi5WYWxpZGF0aW9uUGx1Z2luOwotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIHRoYXQgcHJvdmlkZXMgc29tZSBvZiB0aGUgZnVuY3Rpb25hbGl0eSByZXF1aXJlZCB0byBjcmVhdGUKLSAqIGEgcHJvamVjdCBhbmQgcG9wdWxhdGUgaXQgd2l0aCB0aGUgY29udGVudHMgb2YgYSBmaWxlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQUltcG9ydE9wZXJhdGlvbiBpbXBsZW1lbnRzIElJbXBvcnRPcGVyYXRpb24gewotCXByaXZhdGUgdm9pZCBwcmVSdW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLnN1c3BlbmRBbGxWYWxpZGF0aW9uKHRydWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcG9zdFJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuc3VzcGVuZEFsbFZhbGlkYXRpb24oZmFsc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVPbGRQcm9qZWN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCS8vIGRlbGV0ZSBhbnkgZXhpc3RpbmcgcHJvamVjdCBvZiB0aGlzIG5hbWUKLQkJSVByb2plY3QgZXhpc3RpbmdQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJaWYgKGV4aXN0aW5nUHJvamVjdC5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlleGlzdGluZ1Byb2plY3QuZGVsZXRlKHRydWUsIG51bGwpOyAvLyBudWxsPW5vIHByb2dyZXNzIG1vbiAoZG9uJ3Qgc2NhcmUgdXNlcnMpCi0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBGaWxlIGZpbGUpIHsKLQkJYm9vbGVhbiBpbXBvcnRlZCA9IHRydWU7Ci0JCWludCBleGVjdXRpb25NYXAgPSAweDA7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJdHJ5IHsKLQkJCWlmKG1vbml0b3IgPT0gbnVsbCkgewotCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJfQotCQkJCi0JCQlwcmVSdW4obW9uaXRvcik7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHByb2plY3ROYW1lID0gQlZUVmFsaWRhdGlvblV0aWxpdHkuZ2V0UHJvamVjdE5hbWUoZmlsZSk7Ci0JCQkJZGVsZXRlT2xkUHJvamVjdChtb25pdG9yLCBwcm9qZWN0TmFtZSk7Ci0JCQkJcHJvamVjdCA9IGNyZWF0ZU5ld1Byb2plY3QobW9uaXRvciwgcHJvamVjdE5hbWUsIGZpbGUpOwotCQkJCQotCQkJCWlmKChwcm9qZWN0ID09IG51bGwpIHx8ICghcHJvamVjdC5pc0FjY2Vzc2libGUoKSkpIHsKLQkJCQkJZXhlY3V0aW9uTWFwIHw9IDB4MTsKLQkJCQkJaW1wb3J0ZWQgPSBmYWxzZTsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSAiQ2Fubm90IGltcG9ydCBmaWxlIGJlY2F1c2UgSVByb2plY3QgaXMgbnVsbCBvciBub3QgYWNjZXNzaWJsZS4iOyAvLyROT04tTkxTLTEkCi0JCQkJCW1vbml0b3Iuc3ViVGFzayhtZXNzYWdlKTsKLQkJCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCUxvZ0VudHJ5IGVudHJ5ID0gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQkJZW50cnkuc2V0RXhlY3V0aW9uTWFwKGV4ZWN1dGlvbk1hcCk7Ci0JCQkJCQllbnRyeS5zZXRUZXh0KG1lc3NhZ2UpOwotCQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQkJZWxzZSB7CQkJCQotCQkJCQlpbXBvcnRlZCA9IGltcG9ydEZpbGUobW9uaXRvciwgcHJvamVjdCwgZmlsZSk7Ci0JCQkJCWV4ZWN1dGlvbk1hcCB8PSAweDI7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFRocm93YWJsZSBleGMpIHsKLQkJCQlleGVjdXRpb25NYXAgfD0gMHg0OwotCQkJCWltcG9ydGVkID0gZmFsc2U7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCWVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJcG9zdFJ1bihtb25pdG9yKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKCFpbXBvcnRlZCkgewotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IChwcm9qZWN0ID09IG51bGwpID8gZmlsZS5nZXROYW1lKCkgOiBwcm9qZWN0LmdldE5hbWUoKTsKLQkJCQlMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQllbnRyeS5zZXRFeGVjdXRpb25NYXAoZXhlY3V0aW9uTWFwKTsKLQkJCQllbnRyeS5zZXRUZXh0KCJBSW1wb3J0T3BlcmF0aW9uIGZvciAiICsgcHJvamVjdE5hbWUgKyAiIHdhcyB1bnN1Y2Nlc3NmdWwuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1wb3J0ZWQ7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBJUHJvamVjdCBjcmVhdGVOZXdQcm9qZWN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIHByb2plY3ROYW1lLCBGaWxlIGlucHV0RmlsZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgd2FzIGltcG9ydGVkIHN1Y2Nlc3NmdWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpbXBvcnRGaWxlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgRmlsZSBmaWxlKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0J1aWxkSW5mby5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvQnVpbGRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWRjYmUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvQnVpbGRJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cDsKLXB1YmxpYyBjbGFzcyBCdWlsZEluZm8gewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiTGljZW5zZWQgTWF0ZXJpYWxzIC0tIFByb3BlcnR5IG9mIElCTVxuKGMpIENvcHlyaWdodCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uLCAyMDAxLDIwMDNcblVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgcmVzdHJpY3RlZCBieSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZmdCdWlsZExldmVsID0gIjIwMDMxMTEyXzE5MTUtV0IyMTItQUQtVjUxMUQtVzUiOwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBsZXZlbCgpIHsgcmV0dXJuIGZnQnVpbGRMZXZlbDsgfQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXU0FCdWlsZExldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9DaGVja0ZvclVudGVzdGVkUHJvcGVydGllc09wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvQ2hlY2tGb3JVbnRlc3RlZFByb3BlcnRpZXNPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyZWI3Ny4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9DaGVja0ZvclVudGVzdGVkUHJvcGVydGllc09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLnBhcnNlci5Qcm9wZXJ0eUxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24uc2FtcGxlLndvcmtiZW5jaGltcGwuUGx1Z2luUHJvcGVydHlGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LlZhbGlkYXRpb25UeXBlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnJlZ2lzdHJ5Lk1lc3NhZ2VVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVmFsaWRhdG9yVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFZhbGlkYXRpb25VdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotLyoqCi0gKiBHZW5lcmF0ZSBhIEZWVCB0ZXN0IGNhc2UgZm9yIGV2ZXJ5IEVKQiBWYWxpZGF0b3IgdmFsaWRhdGlvbiBtYXJrZXIgb24gZWFjaAotICogc2VsZWN0ZWQgcHJvamVjdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENoZWNrRm9yVW50ZXN0ZWRQcm9wZXJ0aWVzT3BlcmF0aW9uIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlIHsKLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIF92bWQgPSBudWxsOwotCXByaXZhdGUgSUJ1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfcmVzb3VyY2VCdW5kbGVOYW1lID0gbnVsbDsKLQlwdWJsaWMgQ2hlY2tGb3JVbnRlc3RlZFByb3BlcnRpZXNPcGVyYXRpb24oSUJ1ZmZlciBidWZmZXIsIFZhbGlkYXRvck1ldGFEYXRhIHZtZCwgU3RyaW5nIHJlc291cmNlQnVuZGxlTmFtZSkgewotCQlzZXRWYWxpZGF0b3JNZXRhRGF0YSh2bWQpOwotCQlzZXRCdWZmZXIoYnVmZmVyKTsKLQkJc2V0UmVzb3VyY2VCdW5kbGVOYW1lKHJlc291cmNlQnVuZGxlTmFtZSk7Ci0JfQotCXB1YmxpYyBJQnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJcmV0dXJuIF9idWZmZXI7Ci0JfQotCXZvaWQgc2V0QnVmZmVyKElCdWZmZXIgYikgewotCQlfYnVmZmVyID0gYjsKLQl9Ci0JcHVibGljIFZhbGlkYXRvck1ldGFEYXRhIGdldFZhbGlkYXRvck1ldGFEYXRhKCkgewotCQlyZXR1cm4gX3ZtZDsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGx1Z2luSWQoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCXRyeSB7Ci0JCQkvLyBUT0RPIFJlbW92ZSB0aGlzIGhhY2sgb25jZSBhIGdldHRlciBoYXMgYmVlbiBhZGRlZCB0byBWYWxpZGF0b3JNZXRhRGF0YSBmb3IgaXRzIHBsdWdpbklkLgotCQkJaWYgKHZtZCAhPSBudWxsKSB7Ci0JCQkJQ2xhc3NMb2FkZXIgY2wgPSB2bWQuZ2V0VmFsaWRhdG9yKCkuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCQkJCUlQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCk7Ci0JCQkJSVBsdWdpbkRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHJlZ2lzdHJ5LmdldFBsdWdpbkRlc2NyaXB0b3JzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQlJUGx1Z2luRGVzY3JpcHRvciBkZXNjID0gZGVzY3JpcHRvcnNbaV07Ci0JCQkJCWlmIChkZXNjLmdldFBsdWdpbkNsYXNzTG9hZGVyKCkuZXF1YWxzKGNsKSkgewotCQkJCQkJcmV0dXJuIGRlc2MuZ2V0VW5pcXVlSWRlbnRpZmllcigpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQl2b2lkIHNldFZhbGlkYXRvck1ldGFEYXRhKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlfdm1kID0gdm1kOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpIHsKLQkJcmV0dXJuIF9yZXNvdXJjZUJ1bmRsZU5hbWU7Ci0JfQotCXZvaWQgc2V0UmVzb3VyY2VCdW5kbGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCV9yZXNvdXJjZUJ1bmRsZU5hbWUgPSBuYW1lOwotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZSNydW4oSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3QgcExpbmVzID0gbnVsbDsKLQkJTGlzdCB1bnRlc3RlZExpbmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHRlc3RlZExpbmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlUHJlZml4Q29tcGFyYXRvcigpOwotCQkvLyBBc3N1bWUgdGhhdCB0aGUgQlZUIHRlc3RzIHdlcmUgcnVuIG9uIHRoZSBwcm9qZWN0cyBiZWZvcmUgdGhpcyBtZW51Ci0JCS8vIGFjdGlvbiB3YXMgY2xpY2tlZC4KLQkJLy8gTG9hZCBhbmQgcGFyc2UgdGhlIC5wcm9wZXJ0aWVzIGZpbGUgdG8ga25vdyB3aGF0IG1lc3NhZ2UgaWRzIHRvIGxvb2sKLQkJLy8gZm9yLgotCQlTdHJpbmcgcHJvcEZpbGVOYW1lID0gZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCk7Ci0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IGdldFZhbGlkYXRvck1ldGFEYXRhKCk7Ci0JCW1vbml0b3Iuc3ViVGFzaygiQXR0ZW1wdGluZyB0byBsb2FkIGZpbGU6ICIgKyBwcm9wRmlsZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwbHVnaW5JZCA9IGdldFBsdWdpbklkKHZtZCk7Ci0JCWlmIChwbHVnaW5JZCA9PSBudWxsKSB7Ci0JCQltb25pdG9yLnN1YlRhc2soIkNhbm5vdCBsb2FkIHBsdWdpbiBpZCBmb3IgdmFsaWRhdG9yICIgKyB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgIkNhbm5vdCBsb2FkIHBsdWdpbiBpZCBmb3IgdmFsaWRhdG9yICIgKyB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlQbHVnaW5Qcm9wZXJ0eUZpbGUgcEZpbGUgPSBuZXcgUGx1Z2luUHJvcGVydHlGaWxlKHBsdWdpbklkLCBwcm9wRmlsZU5hbWUpOwotCQltb25pdG9yLndvcmtlZCgxKTsKLQkJbW9uaXRvci5zdWJUYXNrKCJQYXJzaW5nLiIpOyAvLyROT04tTkxTLTEkCi0JCXBMaW5lcyA9IHBGaWxlLmdldFByb3BlcnR5TGluZXMoKTsKLQkJQ29sbGVjdGlvbnMuc29ydChwTGluZXMsIGNvbXBhcmF0b3IpOyAvLyBmYWxzZSA9IG5vIHZlcmJvc2Ugb3V0cHV0Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCQltb25pdG9yLnN1YlRhc2soIkxvYWRpbmcgdGVzdCBtZXNzYWdlcy4iKTsgLy8kTk9OLU5MUy0xJAotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRtZHMgPSBCVlRWYWxpZGF0aW9uVXRpbGl0eS5nZXRWYWxpZGF0b3JUZXN0cyhtb25pdG9yLCB2bWQpOwotCQlmb3IgKGludCBrID0gMDsgayA8IHRtZHMubGVuZ3RoOyBrKyspIHsKLQkJCVZhbGlkYXRvclRlc3RjYXNlIHRtZCA9IHRtZHNba107Ci0JCQlMaXN0IG1zc2cgPSB0bWQuZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLlJVTl9WQUxJREFUSU9OKTsKLQkJCXRlc3RlZExpbmVzLmFkZEFsbChtc3NnKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KHRlc3RlZExpbmVzLCBjb21wYXJhdG9yKTsKLQkJbW9uaXRvci5zdWJUYXNrKCJDb21wYXJpbmcuIik7IC8vJE5PTi1OTFMtMSQKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBwTGluZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWludCBpbmRleCA9IENvbGxlY3Rpb25zLmJpbmFyeVNlYXJjaCh0ZXN0ZWRMaW5lcywgbGluZSwgY29tcGFyYXRvcik7Ci0JCQlpZiAoaW5kZXggPCAwKSB7Ci0JCQkJLy8gbm90IGZvdW5kLgotCQkJCXVudGVzdGVkTGluZXMuYWRkKGxpbmUpOwotCQkJfQotCQl9Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCQkvLyBub3cgc2VlIGlmIHRoZSBsaXN0IG9mIHVudGVzdGVkIGxpbmVzIGhhcyBlbnRyaWVzLgotCQlDb2xsZWN0aW9ucy5zb3J0KHVudGVzdGVkTGluZXMsIGNvbXBhcmF0b3IpOwotCQlJdGVyYXRvciB1bnRlc3RlZGl0ZXJhdG9yID0gdW50ZXN0ZWRMaW5lcy5pdGVyYXRvcigpOwotCQlpZiAodW50ZXN0ZWRpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWdldEJ1ZmZlcigpLndyaXRlKCJMaXN0IG9mIG1lc3NhZ2VzIHdoaWNoIGFyZSBub3QgdGVzdGVkICgiICsgdW50ZXN0ZWRMaW5lcy5zaXplKCkgKyAiIG9mICIgKyBwTGluZXMuc2l6ZSgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfSBlbHNlIHsKLQkJCWdldEJ1ZmZlcigpLndyaXRlKCJBbGwgbWVzc2FnZXMgYXJlIHRlc3RlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXdoaWxlICh1bnRlc3RlZGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJUHJvcGVydHlMaW5lIGxpbmUgPSAoUHJvcGVydHlMaW5lKXVudGVzdGVkaXRlcmF0b3IubmV4dCgpOwotCQkJZ2V0QnVmZmVyKCkud3JpdGUobGluZS50b1N0cmluZygpKTsKLQkJfQotCQl1bnRlc3RlZExpbmVzLmNsZWFyKCk7IC8vIGNsZWFyIHRoZSBsaXN0IGZvciB0aGUgbmV4dCBwcm9qZWN0Ci0JCXRlc3RlZExpbmVzLmNsZWFyKCk7Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0lCdWZmZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0lCdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQwYmM4MS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9JQnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBJZiBpbmZvcm1hdGlvbiBuZWVkcyB0byBiZSByZXBvcnRlZCB0byB0aGUgdXNlciwgYnV0IHRoYXQgaW5mb3JtYXRpb24gaXMgbG9uZywKLSAqIGFuZCB0aGUgdXNlciBuZWVkcyB0byBzZWUgaXQgYWxsIGF0IHRoZSBzYW1lIHRpbWUgKGUuZy4sIHRlc3QgY2FzZSByZXN1bHRzKSwKLSAqIHRoZW4gdGhlIGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkIHRvIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzLiAKLSAqIEltcGxlbWVudGF0aW9ucyBjYW4gY2hvb3NlIHRvIHJlcG9ydCB0aGUgaW5mb3JtYXRpb24gaW1tZWRpYXRlbHkgCi0gKiAoZS5nLiwgdG8gU3lzdGVtLm91dCksIG9yIGNhbiBhcHBlbmQgZWFjaCBtZXNzYWdlLCBhbmQgcmVwb3J0IHRoZSBtZXNzYWdlCi0gKiBvbmx5IG9uY2UgZXZlcnl0aGluZyBpcyBjb21wbGV0ZS4gCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJ1ZmZlciBleHRlbmRzIElUZXN0U3RhdHVzIHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb2dyZXNzIG1vbml0b3IgdGhhdCBpcyB1c2VkIGZvciByZXBvcnRpbmcgcHJvZ3Jlc3MKLQkgKiBzdGF0dXMgYXMgdGhlIGxvbmctcnVubmluZyBwcm9jZXNzIGV4ZWN1dGVzLgotCSAqLwotCXB1YmxpYyBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpOwotCQotCS8qKgotCSAqIERpc3BsYXkgdGhlIG1lc3NhZ2UgdG8gdGhlIHVzZXI7IHRoZSBidWZmZXIgaW1wbGVtZW50YXRpb24gbWF5IAotCSAqIGRpc3BsYXkgdGhlIG1lc3NhZ2UgaW1tZWRpYXRlbHksIG9yIG1heSBkaXNwbGF5IHRoZSBtZXNzYWdlIG9ubHkKLQkgKiB3aGVuIHJlcG9ydCgpIGlzIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZShTdHJpbmcgbWVzc2FnZSk7Ci0JCi0JLyoqCi0JICogQmV0d2VlbiBvbmUgdGFzayBhbmQgdGhlIG5leHQsIHVzdWFsbHkgYmV0d2VlbiB0ZXN0IGNhc2VzLCBhZGQgYSBkZWxpbmVhdGluZwotCSAqIG1hcmsgdG8gc2hvdyB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgZWFjaCB0YXNrIGNsZWFybHkuIFRoZSBwYXJhbWV0ZXIgCi0JICogcGFzc2VkIGluLCB0YXNrTmFtZSwgaXMgdGhlIG5hbWUgb2YgdGhlIHRhc2sgdGhhdCBpcyBlbmRpbmcuCi0JICovCi0JcHVibGljIHZvaWQgZGVsaW5lYXRlKFN0cmluZyB0YXNrTmFtZSk7Ci0JCQotCS8qKgotCSAqIElmIGluZm9ybWF0aW9uIHdhcyBub3QgcmVwb3J0ZWQgaW1tZWRpYXRlbHksIGNhbGxpbmcgdGhpcyBtZXRob2QKLQkgKiBmb3JjZXMgdGhlIGJ1ZmZlciB0byBiZSByZXBvcnRlZCB0byB0aGUgdXNlci4gVGhlIGNvbnRlbnRzIG9mIHRoZQotCSAqIGJ1ZmZlciBhcmUgbm90IGNsZWFyZWQ7IGEgc3Vic2VxZW50IGNhbGwgdG8gdGhpcyBtZXRob2Qgd2lsbCAKLQkgKiByZXBlYXQgd2hhdCBoYXMgYmVlbiByZXBvcnRlZCBiZWZvcmUuIEFueSBjYWxscyB0byBlbGFwc2VkVGltZQotCSAqIHdpbGwgYmUgcmVwb3J0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVwb3J0KCk7Ci0JCi0JLyoqCi0JICogQ2xlYXIgYW55IHN0b3JlZCBtZXNzYWdlcyBmcm9tIHRoZSBidWZmZXIsIGJ1dCBub3QgYW55IGVsYXBzZWRUaW1lIAotCSAqIG51bWJlcnMgZnJvbSB0aGUgc3RvcmUuCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBsb2cgZmlsZSwgb3IgbnVsbCBpZiBub25lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9nRmlsZU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0lJbXBvcnRPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0lJbXBvcnRPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFkMGQwNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9JSW1wb3J0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXA7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotCi0vKioKLSAqIEFsbCB2YWxpZGF0aW9uIEZWVCB0ZXN0cyBtdXN0IHByb3ZpZGUgYW4gSUltcG9ydE9wZXJhdGlvbiBpbXBsZW1lbnRhdGlvbgotICogdG8gaW1wb3J0IHRoZSBpbnB1dCBmaWxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbXBvcnRPcGVyYXRpb24gewotCS8qKgotCSAqIFJ1bnMgdGhpcyBvcGVyYXRpb24gd2l0aG91dCBmb3JjaW5nIGEgVUkgZGVwZW5kZW5jeS4gUmV0dXJuIHRydWUgaWYgdGhlIGZpbGUKLQkgKiB3YXMgZm91bmQgYW5kIGltcG9ydGVkIHN1Y2Nlc3NmdWxseS4KLQkgKgotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yIHRvIHVzZSB0byBkaXNwbGF5IHByb2dyZXNzIGFuZCByZWNlaXZlCi0JICogICByZXF1ZXN0cyBmb3IgY2FuY2VsYXRpb24KLQkgKiBAcGFyYW0gaW5wdXRGaWxlIHRoZSBmaWxlIHdoaWNoIG5lZWRzIHRvIGJlIGltcG9ydGVkIGludG8gdGhlIHdvcmtiZW5jaAotCSAqIEBleGNlcHRpb24gSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpZiB0aGUgcnVuIG1ldGhvZCBtdXN0IHByb3BhZ2F0ZSBhIGNoZWNrZWQgZXhjZXB0aW9uLAotCSAqIAlpdCBzaG91bGQgd3JhcCBpdCBpbnNpZGUgYW4gPGNvZGU+SW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjwvY29kZT47IHJ1bnRpbWUgZXhjZXB0aW9ucyBhcmUgYXV0b21hdGljYWxseQotCSAqICB3cmFwcGVkIGluIGFuIDxjb2RlPkludm9jYXRpb25UYXJnZXRFeGNlcHRpb248L2NvZGU+IGJ5IHRoZSBjYWxsaW5nIGNvbnRleHQKLQkgKiBAZXhjZXB0aW9uIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIHRoZSBvcGVyYXRpb24gZGV0ZWN0cyBhIHJlcXVlc3QgdG8gY2FuY2VsLCAKLQkgKiAgdXNpbmcgPGNvZGU+SVByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCk8L2NvZGU+LCBpdCBzaG91bGQgZXhpdCBieSB0aHJvd2luZyAKLQkgKiAgPGNvZGU+SW50ZXJydXB0ZWRFeGNlcHRpb248L2NvZGU+Ci0JICoKLQkgKiBAc2VlIElSdW5uYWJsZVdpdGhQcm9ncmVzcwotCSAqLwotCXB1YmxpYyBib29sZWFuIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIEZpbGUgaW5wdXRGaWxlKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9JVGVzdFN0YXR1cy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvSVRlc3RTdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyYjkzNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9JVGVzdFN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwOwotCi0vKioKLSAqIEluc3RhbmNlcyBvZiB0aGlzIGludGVyZmFjZSB0cmFjayB0aGUgZXhlY3V0aW9uIG9mIGEgdGVzdCBjYXNlLAotICogYW5kIGFyZSB1c2VkIHRvIHJlcG9ydCBhIHN1bW1hcnkgb2YgdGhlIGV4ZWN1dGlvbiBvZiBhbGwgb2YgdGhlCi0gKiB0ZXN0IGNhc2VzIGF0IHRoZSBlbmQgb2YgYSBzZXQgb2YgdGVzdCBydW5zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUZXN0U3RhdHVzIHsKLQlwdWJsaWMgZmluYWwgaW50IFBBU1MgPSAwOwotCXB1YmxpYyBmaW5hbCBpbnQgV0FSTiA9IDE7Ci0JcHVibGljIGZpbmFsIGludCBGQUlMID0gMjsKLQkKLQkvKioKLQkgKiBUbyB0cmFjayBob3cgbG9uZyBhIHRhc2sgdGFrZXMsIGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBhIHVuaXF1ZSBuYW1lCi0JICogb2YgdGhlIHRhc2suIElmIHRoZSB0YXNrIGFscmVhZHkgZXhpc3RzLCB0aGUgZWxhcHNlZFRpbWUgaXMgYWRkZWQKLQkgKiB0byB0aGUgZXhpc3RpbmcgdGltZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbGFwc2VkVGltZShTdHJpbmcgdGFza05hbWUsIGxvbmcgZWxhcHNlZFRpbWUpOwotCQotCS8qKgotCSAqIElmIHBhc3MgaXMgdHJ1ZSwgUEFTUyBpcyB1c2VkOyBpZiBwYXNzIGlzIGZhbHNlLCBGQUlMIGlzIHVzZWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0ZXN0UGFzc05hbWUsIGJvb2xlYW4gcGFzcyk7Ci0JCi0JLyoqCi0JICogSWYgcGFzcyBpcyB0cnVlLCBQQVNTIGlzIHVzZWQ7IGlmIHBhc3MgaXMgZmFsc2UsIEZBSUwgaXMgdXNlZC4KLQkgKiBXaGlsZSBzdGlsbCBjb25zaWRlcmVkIHBhcnQgb2YgdGVzdCBjYXNlICJ0ZXN0UGFzc05hbWUiLCB0aGlzIAotCSAqIHNwbGl0cyB0aGlzIHBhcnQgb2YgdGhlIHRlc3QgY2FzZSBpbnRvIGEgc2VjdGlvbiBuYW1lZCAic3ViVGFza05hbWUiLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEV4ZWN1dGlvblN0YXR1cyhTdHJpbmcgdGVzdFBhc3NOYW1lLCBTdHJpbmcgc3ViVGFza05hbWUsIGJvb2xlYW4gcGFzcyk7Ci0JCi0JLyoqCi0JICogQXMgZWFjaCB0ZXN0IGlzIGV4ZWN1dGVkLCB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIHRyYWNrIGhvdyBtYW55IG9mIHRoYXQKLQkgKiB0eXBlIG9mIHRlc3QgcGFzcyBvciBmYWlsLiBwYXNzT3JGYWlsIGNhbiBiZSBvbmUgb2YgdGhyZWUgdmFsdWVzOiBQQVNTLCBXQVJOLCBvciBGQUlMLgotCSAqIElmIHZhbHVlIGlzIFBBU1MsIHRoZW4gdGhlIHRlc3QgY2FzZSBwYXNzZXMsIGFuZCBubyBtZXNzYWdlIG5lZWRzIHRvIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlci4KLQkgKiBJZiB2YWx1ZSBpcyBXQVJOLCB0aGVuIHRoZSB0ZXN0IGNhc2UgcGFzc2VzLCBhbmQgYSB3YXJuaW5nIG1lc3NhZ2UgbXVzdCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCi0JICogSWYgdmFsdWUgaXMgRkFJTCwgdGhlbiB0aGUgdGVzdCBjYXNlIGZhaWxzLCBhbmQgYSBmYWlsdXJlIG1lc3NhZ2UgbXVzdCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRXhlY3V0aW9uU3RhdHVzKFN0cmluZyB0ZXN0Y2FzZU5hbWUsIFN0cmluZyBzdWJUYXNrTmFtZSwgaW50IHBhc3NPckZhaWwsIElCdWZmZXIgYnVmZmVyLCBTdHJpbmcgbWVzc2FnZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWxsIG9mIHRoZSB0ZXN0IGNhc2VzIHJ1biBzbyBmYXIgaGF2ZSBwYXNzZWQ7IG90aGVyd2lzZQotCSAqIHJldHVybiBmYWxzZS4gSWYgbm8gdGVzdCBjYXNlcyBoYXZlIHJ1biwgcmV0dXJuIHRydWUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYSBwYXJ0aWN1bGFyIHRlc3QgY2FzZSBwYXNzZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdWNjZXNzZnVsKFN0cmluZyB0ZXN0TmFtZSk7Ci0JCi0JLyoqCi0JICogUmVzZXQgYWxsIHZhcmlhYmxlcyB0byB0aGUgZGVmYXVsdCB2YWx1ZSB0byBwcmVwYXJlIHRoaXMgdGVzdCBzdGF0dXMgZm9yIHJldXNlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCk7Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3Qvb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9zZXR1cC9KQVJJbXBvcnRPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0pBUkltcG9ydE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzA4NDAwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL0pBUkltcG9ydE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5sb2dnZXIucHJveHkuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuQlZUVmFsaWRhdGlvblBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvck1hbmFnZXI7Ci0KLS8qKgotICogQ3JlYXRlIGEgSmF2YSBwcm9qZWN0IGJ5IGltcG9ydGluZyBhIEpBUiBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgSkFSSW1wb3J0T3BlcmF0aW9uIGV4dGVuZHMgQUltcG9ydE9wZXJhdGlvbiB7Ci0JLy8gTW9zdCBvZiB0aGUgY29kZSBpbiB0aGlzIGNsYXNzIHdhcyBzdG9sZW4gZnJvbSB0aGUgSkRULiBTZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuYnVpbGRwYXRocy5CdWlsZFBhdGhzQmxvY2suCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVByb2plY3QoSVByb2plY3QgcHJvamVjdCwgSVBhdGggbG9jYXRpb25QYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgewotCQkJbW9uaXRvcj0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJfQkJCQkKLQotCQkvLyBjcmVhdGUgdGhlIHByb2plY3QKLQkJdHJ5IHsKLQkJCWlmICghcHJvamVjdC5leGlzdHMoKSkgewotCQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzYz0gcHJvamVjdC5nZXRXb3Jrc3BhY2UoKS5uZXdQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdC5nZXROYW1lKCkpOwotCQkJCWlmIChQbGF0Zm9ybS5nZXRMb2NhdGlvbigpLmVxdWFscyhsb2NhdGlvblBhdGgpKSB7Ci0JCQkJCWxvY2F0aW9uUGF0aD0gbnVsbDsKLQkJCQl9Ci0JCQkJZGVzYy5zZXRMb2NhdGlvbihsb2NhdGlvblBhdGgpOwotCQkJCXByb2plY3QuY3JlYXRlKGRlc2MsIG1vbml0b3IpOwotCQkJCW1vbml0b3I9IG51bGw7Ci0JCQl9Ci0JCQlpZiAoIXByb2plY3QuaXNPcGVuKCkpIHsKLQkJCQlwcm9qZWN0Lm9wZW4obW9uaXRvcik7Ci0JCQkJbW9uaXRvcj0gbnVsbDsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRKYXZhTmF0dXJlKElQcm9qZWN0IHByb2plY3QsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIXByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpIHsKLQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBwcm9qZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQlTdHJpbmdbXSBwcmV2TmF0dXJlcz0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCQlTdHJpbmdbXSBuZXdOYXR1cmVzPSBuZXcgU3RyaW5nW3ByZXZOYXR1cmVzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShwcmV2TmF0dXJlcywgMCwgbmV3TmF0dXJlcywgMCwgcHJldk5hdHVyZXMubGVuZ3RoKTsKLQkJCW5ld05hdHVyZXNbcHJldk5hdHVyZXMubGVuZ3RoXT0gSmF2YUNvcmUuTkFUVVJFX0lEOwotCQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKG5ld05hdHVyZXMpOwotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbW9uaXRvcik7Ci0JCX0gZWxzZSB7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY29uZmlndXJlUHJvamVjdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCS8vIFNldCB0aGUgY2xhc3NwYXRoIHRvIHRoZSBkZWZhdWx0LgotCQkJSUphdmFQcm9qZWN0IGpwID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJanAuc2V0UmF3Q2xhc3NwYXRoKG51bGwsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgNykpOwkJCi0KLQkJCS8vIE5vdyBhZGQgcnQuamFyIHRvIGl0Ci0JCQlJQ2xhc3NwYXRoRW50cnlbXSBleGlzdGluZ0NsYXNzcGF0aCA9IGpwLmdldFJhd0NsYXNzcGF0aCgpOwotCQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2V4aXN0aW5nQ2xhc3NwYXRoLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShleGlzdGluZ0NsYXNzcGF0aCwgMCwgY2xhc3NwYXRoLCAwLCBleGlzdGluZ0NsYXNzcGF0aC5sZW5ndGgpOwotCQkJSUNsYXNzcGF0aEVudHJ5IHJ0SmFyID0gSmF2YUNvcmUubmV3VmFyaWFibGVFbnRyeShuZXcgUGF0aCgiSlJFX0xJQiIpLCBuZXcgUGF0aCgiSlJFX1NSQyIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQljbGFzc3BhdGhbZXhpc3RpbmdDbGFzc3BhdGgubGVuZ3RoXSA9IHJ0SmFyOwotCQkJanAuc2V0UmF3Q2xhc3NwYXRoKGNsYXNzcGF0aCwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA3KSk7Ci0JCQkKLQkJCS8vIEVuYWJsZSB0aGlzIGphdmEgcHJvamVjdCB3aXRoIHRoZSBWYWxpZGF0aW9uIEJ1aWxkZXIgc28gdGhhdCBhdXRvbWF0aWMgdmFsaWRhdGlvbiAKLQkJCS8vIGNhbiBydW4gb24gaXQuCi0JCQlWYWxpZGF0b3JNYW5hZ2VyLmFkZFByb2plY3RCdWlsZFZhbGlkYXRpb25TdXBwb3J0KHByb2plY3QpOwotCQl9Ci0JCWNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5BSW1wb3J0T3BlcmF0aW9uI2NyZWF0ZU5ld1Byb2plY3QoSVByb2dyZXNzTW9uaXRvciwgU3RyaW5nLCBGaWxlKQotCSAqLwotCXByb3RlY3RlZCBJUHJvamVjdCBjcmVhdGVOZXdQcm9qZWN0KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIHByb2plY3ROYW1lLCBGaWxlIGlucHV0RmlsZSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJdHJ5IHsKLQkJCWNyZWF0ZVByb2plY3QocHJvamVjdCwgbnVsbCwgbW9uaXRvcik7Ci0JCQlhZGRKYXZhTmF0dXJlKHByb2plY3QsIG1vbml0b3IpOwotCQkJY29uZmlndXJlUHJvamVjdChtb25pdG9yLCBwcm9qZWN0KTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvbGRlcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIElQYXRoIHBhdGhuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIocGF0aG5hbWUpOwotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IGZvbGRlci5nZXRQYXJlbnQoKTsKLQkJaWYoIWNvbnRhaW5lci5leGlzdHMoKSkgewotCQkJY3JlYXRlRm9sZGVyKG1vbml0b3IsIHByb2plY3QsIGNvbnRhaW5lci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpOwotCQl9Ci0JCWlmKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCS8vIERvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcy4KLQkJCWZvbGRlci5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbW9uaXRvcik7IC8vIHRydWU9Zm9yY2UsIHRydWU9bG9jYWwKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWxlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgSVBhdGggcGF0aG5hbWUsIElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmlsZSBuZmlsZSA9IHByb2plY3QuZ2V0RmlsZShwYXRobmFtZSk7Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gbmZpbGUuZ2V0UGFyZW50KCk7Ci0JCWlmKCFjb250YWluZXIuZXhpc3RzKCkpIHsKLQkJCWNyZWF0ZUZvbGRlcihtb25pdG9yLCBwcm9qZWN0LCBjb250YWluZXIuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKTsKLQkJfQotCQlpZighbmZpbGUuZXhpc3RzKCkpIHsKLQkJCS8vIERvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcy4KLQkJCW5maWxlLmNyZWF0ZShzdHJlYW0sIHRydWUsIG1vbml0b3IpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5zZXR1cC5BSW1wb3J0T3BlcmF0aW9uI2ltcG9ydEZpbGUoSVByb2dyZXNzTW9uaXRvciwgSVByb2plY3QsIEZpbGUpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW1wb3J0RmlsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIEZpbGUgZmlsZSkgewotCQkvLyBJbXBvcnQgdGhlIGZpbGUgCi0JCXRyeSB7Ci0JCQlaaXBGaWxlIHppcEZpbGUgPSBuZXcgWmlwRmlsZShmaWxlKTsKLQkJCUVudW1lcmF0aW9uIHppcEVudHJpZXMgPSB6aXBGaWxlLmVudHJpZXMoKTsKLQkJCXdoaWxlKHppcEVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlaaXBFbnRyeSB6aXBFbnRyeSA9IChaaXBFbnRyeSl6aXBFbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJSVBhdGggcGF0aG5hbWUgPSBuZXcgUGF0aCh6aXBFbnRyeS5nZXROYW1lKCkpOwotCQkJCWlmKHppcEVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJY3JlYXRlRm9sZGVyKG1vbml0b3IsIHByb2plY3QsIHBhdGhuYW1lKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNyZWF0ZUZpbGUobW9uaXRvciwgcHJvamVjdCwgcGF0aG5hbWUsIHppcEZpbGUuZ2V0SW5wdXRTdHJlYW0oemlwRW50cnkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQljYXRjaChJT0V4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvVGVzdENhc2VHZW5lcmF0b3JPcGVyYXRpb24uamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdC9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L3NldHVwL1Rlc3RDYXNlR2VuZXJhdG9yT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NGUzNGYuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0L29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3Qvc2V0dXAvVGVzdENhc2VHZW5lcmF0b3JPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXA7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmxvZ2dlci5wcm94eS5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuTWVzc2FnZVV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVGFza0xpc3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogR2VuZXJhdGUgYW4gRlZUIHRlc3QgY2FzZSwgZm9yIGEgc2VsZWN0ZWQgSVByb2plY3Qgb3IgSVByb2plY3RzLCB0bwotICogYmUgcGFzdGVkIGludG8gcGx1Z2luLnhtbC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RDYXNlR2VuZXJhdG9yT3BlcmF0aW9uIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgX1RFU1RDQVNFX1RFTVBMQVRFXyA9ICJcdFx0XHQ8dGVzdCBcblx0XHRcdFx0cHJvamVjdD1cInswfVwiXG5cdFx0XHRcdGlucHV0PVwiXCJcblx0XHRcdFx0dmFsaWRhdG9yPVwiezF9XCI+XG57Mn1cdFx0XHQ8L3Rlc3Q+XG4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9URVNUQ0FTRV9NRVNTQUdFX1RFTVBMQVRFXyA9ICJcdFx0XHRcdDxtZXNzYWdlIHByZWZpeD1cInswfVwiIHJlc291cmNlPVwiezF9XCIgbG9jYXRpb249XCJ7Mn1cIiB0ZXh0PVwiezN9XCIvPlxuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgTWFwIF92bWRCdWZmZXIgPSBudWxsOyAvLyBtYXAgd2hlcmUgdGhlIFZhbGlkYXRvck1ldGFEYXRhIGlzIHRoZSBrZXkgYW5kIHRoZSB2YWx1ZSBpcyBhIFN0cmluZ0J1ZmZlcgotCXByaXZhdGUgSVByb2plY3RbXSBfcHJvamVjdHMgPSBudWxsOwotCXByaXZhdGUgSUJ1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQkKLQlwdWJsaWMgVGVzdENhc2VHZW5lcmF0b3JPcGVyYXRpb24oSVByb2plY3RbXSBwcm9qZWN0cywgSUJ1ZmZlciBidWZmZXIpIHsKLQkJc2V0UHJvamVjdHMocHJvamVjdHMpOwotCQlzZXRCdWZmZXIoYnVmZmVyKTsKLQkJX3ZtZEJ1ZmZlciA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgYnVmZmVyIHdoZXJlIHRoZSB0ZXN0IGNhc2UgZ2VuZXJhdGVkIG91dHB1dCB3aWxsIGJlIHNlbnQuCi0JICovCi0JcHVibGljIElCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlyZXR1cm4gX2J1ZmZlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QnVmZmVyKElCdWZmZXIgYikgewotCQlfYnVmZmVyID0gYjsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0W10gZ2V0UHJvamVjdHMoKSB7Ci0JCXJldHVybiBfcHJvamVjdHM7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb2plY3RzKElQcm9qZWN0W10gcHJvamVjdHMpIHsKLQkJX3Byb2plY3RzID0gcHJvamVjdHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGUjcnVuKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgYXJnMCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJZ2VuZXJhdGUoZ2V0UHJvamVjdHMoKSk7Ci0JCX0KLQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCQlnZXRCdWZmZXIoKS53cml0ZSgiQSBUaHJvd2FibGUgd2FzIGNhdWdodDsgY291bGQgbm90IGdlbmVyYXRlIHRoZSB0ZXN0IGNhc2UuIENoZWNrIHRoZSBMb2dnaW5nVXRpbC5sb2cgZmlsZSBmb3IgZGV0YWlscy4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZpbmFsbHkgewotCQkJX3ZtZEJ1ZmZlci5jbGVhcigpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlKElQcm9qZWN0W10gcHJvamVjdHMpIHsKLQkJLy8gRmlyc3QsIGxvYWQgYWxsIG9mIHRoZSB2YWxpZGF0aW9uIG1hcmtlcnMgZnJvbSB0aGUgc2VsZWN0ZWQgcHJvamVjdHMsIAotCQkvLyBhbmQgZ3JvdXAgdGhlbSBieSB0aGUgdmFsaWRhdG9yLgotCQlmb3IoaW50IGk9MDsgaTxwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHByb2plY3RzW2ldOwotCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIElNZXNzYWdlLkFMTF9NRVNTQUdFUyk7Ci0JCQlpZigobWFya2VycyA9PSBudWxsKSB8fCAobWFya2Vycy5sZW5ndGggPT0gMCkpewotCQkJCWdldEJ1ZmZlcigpLndyaXRlKCJDYW5ub3QgZ2VuZXJhdGUgYSB0ZXN0IGNhc2UgZm9yIHByb2plY3QgIiArIHByb2plY3QuZ2V0TmFtZSgpICsgIiB1bnRpbCBcIlJ1biBWYWxpZGF0aW9uXCIgaGFzIGJlZW4gcnVuLiBFbmFibGUgb25seSB0aGUgdmFsaWRhdG9yIHdob3NlIHRlc3QgY2FzZSBpcyB0byBiZSBnZW5lcmF0ZWQsIHJpZ2h0LWNsaWNrLCBhbmQgXCJSdW4gVmFsaWRhdGlvblwiLiBPbmNlIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGhhdmUgYmVlbiByZXBvcnRlZCwgYSB0ZXN0IGNhc2UgY2FuIGJlIGdlbmVyYXRlZCBmcm9tIHRob3NlIG1lc3NhZ2VzLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJLy8gQSB0ZXN0IGNhc2UgPSBvbmUgdmFsaWRhdG9yIG9uIG9uZSBwcm9qZWN0ID0+IHdoYXQgbWFya2VycwotCQkJTGlzdCBtYXJrZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yKGludCBqPTA7IGo8bWFya2Vycy5sZW5ndGg7IGorKykgewotCQkJCW1hcmtlckxpc3QuYWRkKG1hcmtlcnNbal0pOwotCQkJfQotCQkJCi0JCQkvLyBTb3J0IHRoZSBtYXJrZXJzIGJ5IHZhbGlkYXRvciwgcHJvamVjdCwgcHJlZml4LCBsb2NhdGlvbiAmIHJlc291cmNlCi0JCQlDb2xsZWN0aW9ucy5zb3J0KG1hcmtlckxpc3QsIE1lc3NhZ2VVdGlsaXR5LmdldE1lc3NhZ2VDb21wYXJhdG9yKGdldEJ1ZmZlcigpLCBmYWxzZSkpOwotCi0JCQlJdGVyYXRvciBpdGVyYXRvciA9IG1hcmtlckxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwkJCQotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IE1lc3NhZ2VVdGlsaXR5LmdldFZhbGlkYXRvcihtYXJrZXIpOwotCQkJCWlmKHZtZCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZ0J1ZmZlciBtZXNzYWdlQnVmZmVyID0gZ2V0QnVmZmVyKHZtZCk7Ci0JCQkJCVN0cmluZyBtZXNzYWdlSWQgPSBNZXNzYWdlVXRpbGl0eS5nZXRNZXNzYWdlUHJlZml4KG1hcmtlcik7Ci0JCQkJCVN0cmluZyByZXNvdXJjZSA9IE1lc3NhZ2VVdGlsaXR5LmdldFJlc291cmNlKG1hcmtlcik7Ci0JCQkJCUludGVnZXIgbGluZU51bWJlciA9IE1lc3NhZ2VVdGlsaXR5LmdldExpbmVOdW1iZXIobWFya2VyKTsKLQkJCQkJU3RyaW5nIGxvY2F0aW9uID0gKGxpbmVOdW1iZXIgPT0gbnVsbCkgPyAobG9jYXRpb24gPSBNZXNzYWdlVXRpbGl0eS5nZXRMb2NhdGlvbihtYXJrZXIpKSA6IChsb2NhdGlvbiA9IGxpbmVOdW1iZXIudG9TdHJpbmcoKSk7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gTWVzc2FnZVV0aWxpdHkuZ2V0TWVzc2FnZShtYXJrZXIpOyAvLyBFbWl0IHRoZSB0ZXh0IG9mIHRoZSBtZXNzYWdlIHNvIHRoYXQsIGlmIHRoZSBtZXNzYWdlIHByZWZpeGVzIGFyZSBjaGFuZ2VkIGluIHRoZSBmdXR1cmUsIGl0J3MgZWFzeSB0byBzZWUgdGhhdCB0aGUgc2FtZSB0ZXN0IGlzIHJ1biB3aXRoIGEgZGlmZmVyZW50IHByZWZpeCwgYW5kIHRoYXQgdGhlIHRlc3QgZGlkbid0IHJlYWxseSBmYWlsLgotCQkJCQl0ZXh0ID0gdGV4dC5yZXBsYWNlKCc8JywgJ1snKTsgLy8gcmVtb3ZlIHRoZSBYTUwgcmVzZXJ2ZWQgY2hhcmFjdGVycy4KLQkJCQkJdGV4dCA9IHRleHQucmVwbGFjZSgnPicsICddJyk7Ci0JCQkJCXRleHQgPSB0ZXh0LnJlcGxhY2UoJyInLCAnXCcnKTsKLQkJCQkJbWVzc2FnZUJ1ZmZlci5hcHBlbmQoTWVzc2FnZUZvcm1hdC5mb3JtYXQoX1RFU1RDQVNFX01FU1NBR0VfVEVNUExBVEVfLCBuZXcgU3RyaW5nW117bWVzc2FnZUlkLCByZXNvdXJjZSwgbG9jYXRpb24sIHRleHR9KSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpdGVyYXRvciA9IF92bWRCdWZmZXIua2V5U2V0KCkuaXRlcmF0b3IoKTsgLy8gaXRlcmF0ZSBvdmVyIHRoZSB2bWRzCi0JCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpaXRlcmF0b3IubmV4dCgpOwotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSAoU3RyaW5nQnVmZmVyKV92bWRCdWZmZXIuZ2V0KHZtZCk7Ci0JCQkJU3RyaW5nIHRlc3RjYXNlVGVtcGxhdGUgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChfVEVTVENBU0VfVEVNUExBVEVfLCBuZXcgU3RyaW5nW117cHJvamVjdC5nZXROYW1lKCksIHZtZC5nZXRWYWxpZGF0b3JVbmlxdWVOYW1lKCksIGJ1ZmZlci50b1N0cmluZygpfSk7Ci0JCQkJCi0JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdGNhc2VUZW1wbGF0ZSk7Ci0JCQkJCi0JCQkJYnVmZmVyLmRlbGV0ZSgwLCBidWZmZXIubGVuZ3RoKCkpOyAvLyBjbGVhciB0aGUgYnVmZmVyIGZvciB0aGUgbmV4dCBwcm9qZWN0Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZ2V0QnVmZmVyKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gKFN0cmluZ0J1ZmZlcilfdm1kQnVmZmVyLmdldCh2bWQpOwotCQlpZihidWZmZXIgPT0gbnVsbCkgewotCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJX3ZtZEJ1ZmZlci5wdXQodm1kLCBidWZmZXIpOwotCQl9Ci0JCXJldHVybiBidWZmZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svQnVpbGRJbmZvLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svQnVpbGRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NmQyOWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL0J1aWxkSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrOwotcHVibGljIGNsYXNzIEJ1aWxkSW5mbyB7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGNvcHlyaWdodCA9ICJMaWNlbnNlZCBNYXRlcmlhbHMgLS0gUHJvcGVydHkgb2YgSUJNXG4oYykgQ29weXJpZ2h0IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycG9yYXRpb24sIDIwMDEsMjAwM1xuVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBmZ0J1aWxkTGV2ZWwgPSAiMjAwMzExMTJfMTkxNS1XQjIxMi1BRC1WNTExRC1XNSI7Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGxldmVsKCkgeyByZXR1cm4gZmdCdWlsZExldmVsOyB9Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTQUJ1aWxkTGV2ZWwoKSB7IHJldHVybiBmZ0J1aWxkTGV2ZWw7IH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9UZXN0T3BDb25zdHJCdWlsZGVyLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVGVzdE9wQ29uc3RyQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODI1MGEyLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9UZXN0T3BDb25zdHJCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgVGVzdE9wQ29uc3RyQnVpbGRlciBleHRlbmRzIEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxERVJfSUQgPSAib3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2suYnZ0YnVpbGRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElSZXNvdXJjZURlbHRhIF9kZWx0YSA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgVGVzdE9wQ29uc3RyQnVpbGRlciBfaW5zdCA9IG51bGw7Ci0JCi0JcHVibGljIFRlc3RPcENvbnN0ckJ1aWxkZXIoKSB7Ci0JCV9pbnN0ID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuZXZlbnRzLkludGVybmFsQnVpbGRlciNidWlsZChpbnQsIGphdmEudXRpbC5NYXAsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCBJUHJvamVjdFtdIGJ1aWxkKGludCBraW5kLCBNYXAgYXJncywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIE5vdGhpbmcgdG8gZG87IHRoaXMgY2xhc3MgZXhpc3RzIG9ubHkgc28gdGhhdCBhbiBJUmVzb3VyY2VEZWx0YSBjYW4gYmUgY29uc3RydWN0ZWQuCi0JCV9kZWx0YSA9IGdldERlbHRhKGdldFByb2plY3QoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2VEZWx0YSBnZXREZWx0YSgpIHsKLQkJcmV0dXJuIF9kZWx0YTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0T3BDb25zdHJCdWlsZGVyIHNpbmdsZXRvbigpIHsKLQkJcmV0dXJuIF9pbnN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9UZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL1Rlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNzY3YjkuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL1Rlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3azsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yLkpEVFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5WYWxpZGF0b3JUZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb25zdHJ1Y3RzIHRoZSBpbnB1dCBmb3IgdGhlIFRlc3RPcENvbnN0ck9wZXJhdGlvbi4gQmVjYXVzZQotICogVGVzdE9wQ29uc3RyT3BlcmF0aW9uIGlzIG5vdCBpbnZva2VkIGFzIHBhcnQgb2YgYSBidWlsZCwgd2hlbiBpdHMgSVJlc291cmNlcwotICogYXJlIHRvdWNoZWQsIGEgYnVpbGQgaXMgaW52b2tlZCBhZnRlciBlYWNoIHRvdWNoLCBhbmQgdGhhdCBtZWFucyB0aGF0IHRoZQotICogSVJlc291cmNlRGVsdGEgdGhhdCdzIGNvbnN0cnVjdGVkIGhhcyBvbmx5IG9uZSBJUmVzb3VyY2UgaW4gaXQgaW5zdGVhZAotICogb2YgdGhlIGdyb3VwIG9mIGNoYW5nZWQgSVJlc291cmNlIGluc3RhbmNlcy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uIGltcGxlbWVudHMgSVdvcmtzcGFjZVJ1bm5hYmxlIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGV0tfTk9CVUlMRF9URVNUX1ZBTElEQVRPUl9DTEFTUyA9ICJvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3IuRndrTm9CdWlsZFRlc3RWYWxpZGF0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRldLX1RFU1RfVkFMSURBVE9SX0NMQVNTID0gIm9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvci5Gd2tUZXN0VmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfVkFMSURBVE9SX0NMQVNTID0gIm9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnNhbXBsZS5Qcm9wZXJ0aWVzVmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgSVByb2plY3QgX3Byb2plY3QgPSBudWxsOwotCXByaXZhdGUgSUJ1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBJQ29tbWFuZCBfYnVpbGRlckNvbW1hbmQgPSBudWxsOwotCQotCXByaXZhdGUgSVJlc291cmNlRGVsdGEgX2NoYW5nZWREZWx0YSA9IG51bGw7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VEZWx0YSBfZW1wdHlEZWx0YSA9IG51bGw7Ci0JcHJpdmF0ZSBKYXZhSGVscGVyc1tdIF9jaGFuZ2VkQ2xhc3NlcyA9IG51bGw7Ci0JCi0JLyoqCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKi8KLQlwdWJsaWMgVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24oSUJ1ZmZlciBidWZmZXIsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJc2V0QnVmZmVyKGJ1ZmZlcik7Ci0JfQotCi0JcHVibGljIElCdWZmZXIgZ2V0QnVmZmVyKCkgewotCQlyZXR1cm4gX2J1ZmZlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QnVmZmVyKElCdWZmZXIgYikgewotCQlfYnVmZmVyID0gYjsKLQl9Ci0JCQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gX3Byb2plY3Q7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgcCkgewotCQlfcHJvamVjdCA9IHA7Ci0JfQotCi0JLypwYWNrYWdlKi8gc3RhdGljIHZvaWQgZGVidWcoZmluYWwgSUJ1ZmZlciBidWZmZXIsIFN0cmluZyB0aXRsZSwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJdHJ5IHsKLQkJCWJ1ZmZlci53cml0ZSh0aXRsZSk7Ci0JCQlkZWx0YS5hY2NlcHQobmV3IElSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBzdWJkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCQlpZiAoc3ViZGVsdGEgPT0gbnVsbCkKLQkJCQkJCXJldHVybiB0cnVlOwotCi0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHN1YmRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQkJCWJ1ZmZlci53cml0ZSgicmVzb3VyY2UgaXM6ICIgKyByZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdHJ1ZTsgLy8gdmlzaXQgdGhlIHN1YmRlbHRhJ3MgY2hpbGRyZW4KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIElSZXNvdXJjZSB0aGF0IGlzIG5vdCB2YWxpZGF0ZWQgYnkgdGhlIEZ3ayBUZXN0IFZhbGlkYXRvciAodGhpcwotCSAqIHJlc291cmNlIGlzIHVzZWQgZm9yIHRoZSBjYXNlIHdoZXJlIGEgcmVzb3VyY2UgaXMgY2hhbmdlZCwgYW5kIGEgYnVpbGQKLQkgKiBpcyBpbnZva2VkLCBidXQgdGhlIEZ3ayBUZXN0IHZhbGlkYXRvciBkb2VzIG5vdCB2YWxpZGF0ZSB0aGF0IHJlc291cmNlIGFuZAotCSAqIHNob3VsZCBub3QgYmUgbGF1bmNoZWQuKQotCSAqLwkKLQlwdWJsaWMgc3RhdGljIElSZXNvdXJjZVtdIGdldEVtcHR5UmVzb3VyY2VzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyA9IG5ldyBJUmVzb3VyY2VbXXsKLQkJCXByb2plY3QuZ2V0RmlsZSgiLmNsYXNzcGF0aCIpLCAvLyROT04tTkxTLTEkCi0JCX07Ci0JCXJldHVybiBjaGFuZ2VkUmVzb3VyY2VzOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdG91Y2goSVByb2plY3QgcHJvamVjdCwgSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcykgewotCQlmb3IoaW50IGk9MDsgaTxjaGFuZ2VkUmVzb3VyY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUmVzb3VyY2UgcmVzID0gY2hhbmdlZFJlc291cmNlc1tpXTsKLQkJCXRyeSB7Ci0JCQkJcmVzLnRvdWNoKG51bGwpOyAvLyBudWxsIElQcm9ncmVzc01vbml0b3IKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJLy8gT2ggd2VsbC4uLmRpcnR5IHRoZSBuZXh0IGZpbGUuCi0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJUmVzb3VyY2VEZWx0YSBnZXREZWx0YShJUHJvamVjdCBwcm9qZWN0LCBJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzKSB7Ci0JCXRyeSB7Ci0JCQl0b3VjaChwcm9qZWN0LCBjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgVGVzdE9wQ29uc3RyQnVpbGRlci5CVUlMREVSX0lELCBfYnVpbGRlckNvbW1hbmQuZ2V0QXJndW1lbnRzKCksIG51bGwpOyAvLyBudWxsIElQcm9ncmVzc01vbml0b3IKLQkJCXJldHVybiBUZXN0T3BDb25zdHJCdWlsZGVyLnNpbmdsZXRvbigpLmdldERlbHRhKCk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRCdWlsZGVyKElQcm9qZWN0IHByb2plY3QsIGJvb2xlYW4gZG9BZGQpIHsKLQkJaWYoZG9BZGQpIHsKLQkJCS8vIEFkZCB0aGUgYnVpbGRlciB0byB0aGUgcHJvamVjdAotCQkJdHJ5IHsKLQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJCUlDb21tYW5kW10gb2xkQ29tbWFuZHMgPSBkZXNjcmlwdGlvbi5nZXRCdWlsZFNwZWMoKTsKLQkJCQlJQ29tbWFuZFtdIG5ld0NvbW1hbmRzID0gbmV3IElDb21tYW5kW29sZENvbW1hbmRzLmxlbmd0aCArIDFdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkob2xkQ29tbWFuZHMsIDAsIG5ld0NvbW1hbmRzLCAwLCBvbGRDb21tYW5kcy5sZW5ndGgpOwotCQkJCV9idWlsZGVyQ29tbWFuZCA9IGRlc2NyaXB0aW9uLm5ld0NvbW1hbmQoKTsKLQkJCQlfYnVpbGRlckNvbW1hbmQuc2V0QnVpbGRlck5hbWUoVGVzdE9wQ29uc3RyQnVpbGRlci5CVUlMREVSX0lEKTsKLQkJCQluZXdDb21tYW5kc1tvbGRDb21tYW5kcy5sZW5ndGhdID0gX2J1aWxkZXJDb21tYW5kOwotCQkJCWRlc2NyaXB0aW9uLnNldEJ1aWxkU3BlYyhuZXdDb21tYW5kcyk7Ci0KLQkJCQlwcm9qZWN0LnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBSZW1vdmUgdGhlIGJ1aWxkZXIKLQkJCXRyeSB7Ci0JCQkJSVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQlJQ29tbWFuZFtdIG9sZENvbW1hbmRzID0gZGVzY3JpcHRpb24uZ2V0QnVpbGRTcGVjKCk7Ci0JCQkJSUNvbW1hbmRbXSBuZXdDb21tYW5kcyA9IG5ldyBJQ29tbWFuZFtvbGRDb21tYW5kcy5sZW5ndGggLSAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KG9sZENvbW1hbmRzLCAwLCBuZXdDb21tYW5kcywgMCwgbmV3Q29tbWFuZHMubGVuZ3RoKTsKLQkJCQlkZXNjcmlwdGlvbi5zZXRCdWlsZFNwZWMobmV3Q29tbWFuZHMpOwotCQkJCXByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWFkZEJ1aWxkZXIoZ2V0UHJvamVjdCgpLCB0cnVlKTsKLQkJCQotCQkJLy8gRmlyc3QsIGJ1aWxkIHRoZSBwcm9qZWN0IHNvIHRoYXQgdGhlIHN1YnNlcXVlbnQgYnVpbGRzIGFyZW4ndCBzdGFydGVkIHdpdGggYSBudWxsIGRlbHRhLgotCQkJZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuSU5DUkVNRU5UQUxfQlVJTEQsIFRlc3RPcENvbnN0ckJ1aWxkZXIuQlVJTERFUl9JRCwgX2J1aWxkZXJDb21tYW5kLmdldEFyZ3VtZW50cygpLCBudWxsKTsgLy8gbnVsbCBJUHJvZ3Jlc3NNb25pdG9yCi0JCQkKLQkJCVZhbGlkYXRvclRlc3RjYXNlW10gdG1kcyA9IEpEVFV0aWxpdHkuZ2V0VkZUZXN0cyhtb25pdG9yLCBnZXRQcm9qZWN0KCkpOwotCQkJaWYoKHRtZHMgPT0gbnVsbCkgfHwgKHRtZHMubGVuZ3RoID09IDApKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBUaGVuIGNhbGN1bGF0ZSB0aGUgZGVsdGFzCi0JCQlJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzID0gZ2V0Q2hhbmdlZFJlc291cmNlcyhnZXRQcm9qZWN0KCksIHRtZHMpOwotCQkJX2VtcHR5RGVsdGEgPSBnZXREZWx0YShnZXRQcm9qZWN0KCksIGdldEVtcHR5UmVzb3VyY2VzKGdldFByb2plY3QoKSkpOwotCQkJX2NoYW5nZWREZWx0YSA9IGdldERlbHRhKGdldFByb2plY3QoKSwgY2hhbmdlZFJlc291cmNlcyk7Ci0JCQkKLQkJCS8vIFRoZW4gcmVzdG9yZSB0aGUgcHJvamVjdCdzIGJ1aWxkIGNvbW1hbmRzIGJhY2sgdG8gd2hhdCB0aGV5IHdlcmUuCi0JCQlhZGRCdWlsZGVyKGdldFByb2plY3QoKSwgZmFsc2UpOwotCi0JCQlfY2hhbmdlZENsYXNzZXMgPSBnZXRDaGFuZ2VkQ2xhc3NlcyhjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJfQotCQljYXRjaChUaHJvd2FibGUgZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSVJlc291cmNlRGVsdGEgZ2V0Q2hhbmdlZERlbHRhKCkgewotCQlyZXR1cm4gX2NoYW5nZWREZWx0YTsKLQl9Ci0JCi0JcHVibGljIElSZXNvdXJjZURlbHRhIGdldEVtcHR5RGVsdGEoKSB7Ci0JCXJldHVybiBfZW1wdHlEZWx0YTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2VbXSBnZXRDaGFuZ2VkUmVzb3VyY2VzKElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRvclRlc3RjYXNlW10gdG1kcykgewotCQlTZXQgdGVtcCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvcihpbnQgaT0wOyBpPHRtZHMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvclRlc3RjYXNlIHRtZCA9IHRtZHNbaV07Ci0JCQlJUmVzb3VyY2VbXSByZXMgPSB0bWQuZ2V0UmVzb3VyY2VzKHByb2plY3QpOwotCQkJZm9yKGludCBqPTA7IGo8cmVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJdGVtcC5hZGQocmVzW2pdKTsKLQkJCX0KLQkJfQotCQlJUmVzb3VyY2VbXSByZXN1bHQgPSBuZXcgSVJlc291cmNlW3RlbXAuc2l6ZSgpXTsKLQkJdGVtcC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBKYXZhSGVscGVyc1tdIGdldENoYW5nZWRDbGFzc2VzKElSZXNvdXJjZVtdIHJlc291cmNlcykgewotCQlpZihfY2hhbmdlZENsYXNzZXMgPT0gbnVsbCkgewotCQkJaWYocmVzb3VyY2VzID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IEphdmFIZWxwZXJzWzBdOwotCQkJfQotCQkJCi0JCQlKYXZhSGVscGVyc1tdIHJlc3VsdCA9IG5ldyBKYXZhSGVscGVyc1tyZXNvdXJjZXMubGVuZ3RoXTsKLQkJCWludCBjb3VudCA9IDA7Ci0JCQlmb3IoaW50IGk9MDsgaTxyZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZXNbaV07Ci0JCQkJaWYoKHJlc291cmNlIGluc3RhbmNlb2YgSUZpbGUpICYmIChyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJqYXZhIikgfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscygiY2xhc3MiKSkpIHsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCQlKYXZhSGVscGVycyBoID0gSkRUVXRpbGl0eS5nZXRKYXZhSGVscGVycygoSUZpbGUpcmVzb3VyY2UpOwotCQkJCQlpZihoICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdFtjb3VudCsrXSA9IGg7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmKGNvdW50ICE9IHJlc291cmNlcy5sZW5ndGgpIHsKLQkJCQlKYXZhSGVscGVyc1tdIHRlbXAgPSBuZXcgSmF2YUhlbHBlcnNbY291bnRdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkocmVzdWx0LCAwLCB0ZW1wLCAwLCBjb3VudCk7Ci0JCQkJcmV0dXJuIHRlbXA7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBfY2hhbmdlZENsYXNzZXM7Ci0JfQotfQotCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVGVzdE9wQ29uc3RyT3BlcmF0aW9uLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svVGVzdE9wQ29uc3RyT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOTNkMzguLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL1Rlc3RPcENvbnN0ck9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2s7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5CVlRWYWxpZGF0aW9uUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuSU9wZXJhdGlvblJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuVmFsaWRhdGlvblR5cGVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvci5KRFRVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuaW50ZXJuYWwucmVnaXN0cnkuVmFsaWRhdG9yVGVzdGNhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC51dGlsLkJWVFJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LnNldHVwLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuR2xvYmFsQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5JbnRlcm5hbFZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVGFza0xpc3RVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuQWxsVmFsaWRhdG9yc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLkVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5FbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklSdWxlR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5PbmVWYWxpZGF0b3JPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgdGVzdHMgZXZlcnkgY29uc3RydWN0b3IgYXZhaWxhYmxlIGluIHRoZSBWYWxpZGF0aW9uT3BlcmF0aW9uCi0gKiBoaWVyYXJjaHkgYW5kIGVuc3VyZXMgdGhhdCBhbiBvcGVyYXRpb24sIGNyZWF0ZWQgd2l0aCB0aGF0IGNvbnN0cnVjdG9yLCAKLSAqIHJlc3VsdHMgaW4gdGhlIGV4cGVjdGVkIHZhbGlkYXRpb24gSU1hcmtlcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0T3BDb25zdHJPcGVyYXRpb24gaW1wbGVtZW50cyBJT3BlcmF0aW9uUnVubmFibGUgewotCXByaXZhdGUgSVByb2plY3QgX3Byb2plY3QgPSBudWxsOwotCXByaXZhdGUgSUJ1ZmZlciBfYnVmZmVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfdGVzdENhc2VOYW1lID0gbnVsbDsKLQkKLQkvKioKLQkgKiBNdXN0IGhhdmUgYSBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3RvciBpbiBvcmRlciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uLgotCSAqIE1VU1QgY2FsbCBzZXRCdWZmZXIsIHNldFByb2plY3QsIGFuZCBzZXROYW1lIGJlZm9yZSB1c2luZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBUZXN0T3BDb25zdHJPcGVyYXRpb24oKSB7Ci0JfQotCQotCS8qKgotCSAqIElQcm9qZWN0IG11c3QgZXhpc3QgYW5kIGJlIG9wZW4uCi0JICovCi0JcHVibGljIFRlc3RPcENvbnN0ck9wZXJhdGlvbihJQnVmZmVyIGJ1ZmZlciwgSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHRlc3RDYXNlTmFtZSkgewotCQlzZXRCdWZmZXIoYnVmZmVyKTsKLQkJc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJc2V0TmFtZSh0ZXN0Q2FzZU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgSUJ1ZmZlciBnZXRCdWZmZXIoKSB7Ci0JCXJldHVybiBfYnVmZmVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRCdWZmZXIoSUJ1ZmZlciBiKSB7Ci0JCV9idWZmZXIgPSBiOwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIF9wcm9qZWN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHApIHsKLQkJX3Byb2plY3QgPSBwOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBfdGVzdENhc2VOYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCV90ZXN0Q2FzZU5hbWUgPSBuYW1lOwotCX0JCi0KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlHbG9iYWxDb25maWd1cmF0aW9uIGdjb25mID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJCUdsb2JhbENvbmZpZ3VyYXRpb24gb3JpZ0djb25mID0gbmV3IEdsb2JhbENvbmZpZ3VyYXRpb24oZ2NvbmYpOwotCQkJYm9vbGVhbiBhdXRvQnVpbGRFbmFibGVkID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmlzQXV0b0J1aWxkaW5nKCk7Ci0JCQl0cnkgewotCQkJCS8vIEluIG9yZGVyIGZvciB0aGUgb3BlcmF0aW9ucyB0byB3b3JrIGNvcnJlY3RseSwgc2V0IHRoZSBlbmFibGVkIHZhbGlkYXRvcnMgdG8KLQkJCQkvLyB0aGUgdmFsaWRhdG9ycyBmb3Igd2hpY2ggdGVzdHMgZXhpc3QsIGFuZCB0dXJuIG9mZiBhdXRvLWJ1aWxkIHNvIHRoYXQgYQotCQkJCS8vIHZhbGlkYXRpb24gaXMgZm9yY2VkLgotCQkJCWdjb25mLnNldENhblByb2plY3RzT3ZlcnJpZGUoZmFsc2UpOwotCQkJCS8vZ2NvbmYuc2V0QXV0b1ZhbGlkYXRlKGZhbHNlKTsKLQkJCQkvL2djb25mLnNldEF1dG9WYWxpZGF0ZSh0cnVlKTsKLQkJCQkvL2djb25mLnNldEJ1aWxkVmFsaWRhdGUodHJ1ZSk7Ci0JCQkJLy9nY29uZi5zZXRNYXhpbXVtTnVtYmVyT2ZNZXNzYWdlcyhXb3JrYmVuY2hSZXBvcnRlci5OT19NRVNTQUdFX0xJTUlUKTsKLQkJCQlnY29uZi5wYXNzaXZhdGUoKTsKLQkJCQkKLQkJCQlKRFRVdGlsaXR5LnNldEF1dG9CdWlsZChmYWxzZSk7Ci0JCQkJCi0JCQkJbW9uaXRvci5zdWJUYXNrKCJMb2FkaW5nIG9wZXJhdGlvbnM7IHBsZWFzZSB3YWl0Li4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlUZXN0V3JhcHBlcltdIHRlc3RDYXNlQW5kT3BlcmF0aW9ucyA9IGdldE9wZXJhdGlvbnMobW9uaXRvciwgZ2NvbmYpOwotCQkJCWlmKHRlc3RDYXNlQW5kT3BlcmF0aW9ucyA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlID0gIlRlc3QgY2FzZSBmYWlsZWQ7IGNhbm5vdCB0ZXN0IG51bGwgb3BlcmF0aW9ucy4iOyAvLyROT04tTkxTLTEkCi0JCQkJCWdldEJ1ZmZlcigpLndyaXRlKG1lc3NhZ2UpOwotCQkJCQltb25pdG9yLnN1YlRhc2sobWVzc2FnZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCi0JCQkJaW50IG51bVBhc3NlZCA9IDA7Ci0JCQkJZm9yKGludCBpPTA7IGk8dGVzdENhc2VBbmRPcGVyYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVRlc3RXcmFwcGVyIHRlc3RXcmFwcGVyID0gdGVzdENhc2VBbmRPcGVyYXRpb25zW2ldOwotCQkJCQlWYWxpZGF0aW9uT3BlcmF0aW9uIG9wZXJhdGlvbiA9IHRlc3RXcmFwcGVyLmdldE9wZXJhdGlvbigpOwotCQkJCQlib29sZWFuIHRwYXNzZWQgPSBmYWxzZTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQltb25pdG9yLnN1YlRhc2soIlRlc3RpbmcgIiArIChpKzEpICsgIiBvZiAiICsgdGVzdENhc2VBbmRPcGVyYXRpb25zLmxlbmd0aCArICIgY29uc3RydWN0b3JzLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJcHJlVGVzdCh0ZXN0V3JhcHBlcik7Ci0JCQkJCQlpZih0ZXN0KG1vbml0b3IsIHRlc3RXcmFwcGVyKSkgewotCQkJCQkJCW51bVBhc3NlZCsrOwotCQkJCQkJCXRwYXNzZWQgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCQkJCWdldEJ1ZmZlcigpLndyaXRlKCJUaHJvd2FibGUgY2F1Z2h0IHdoaWxlIHRlc3RpbmcgIyIgKyAoaSsxKSArICIgIiArIG9wZXJhdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlTdHJpbmcgbWVzc2FnZSA9ICJUZXN0ICMiICsgKGkrMSkgKyAiIG9mICIgKyB0ZXN0Q2FzZUFuZE9wZXJhdGlvbnMubGVuZ3RoICsgKCh0cGFzc2VkKSA/ICIgcGFzc2VkLiIgOiAiIGZhaWxlZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQkJbW9uaXRvci5zdWJUYXNrKG1lc3NhZ2UpOwotCQkJCQkJZ2V0QnVmZmVyKCkud3JpdGUobWVzc2FnZSk7Ci0JCQkJCQlnZXRCdWZmZXIoKS5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCB0ZXN0V3JhcHBlci5nZXROYW1lKCksIHRwYXNzZWQpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQkJU3RyaW5nIHN0YXR1cyA9IG51bVBhc3NlZCArICIgb2YgIiArIHRlc3RDYXNlQW5kT3BlcmF0aW9ucy5sZW5ndGggKyAiIHRlc3RzIHBhc3NlZC4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQltb25pdG9yLnN1YlRhc2soc3RhdHVzKTsKLQkJCQlnZXRCdWZmZXIoKS53cml0ZShzdGF0dXMpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8gU2V0IHRoZSBwcm9qZWN0J3Mgc2V0dGluZ3MgYmFjayB0byB3aGF0IHRoZXkgd2VyZS4KLQkJCQlnY29uZiA9IG9yaWdHY29uZjsKLQkJCQlnY29uZi5wYXNzaXZhdGUoKTsKLQkJCQkKLQkJCQlKRFRVdGlsaXR5LnNldEF1dG9CdWlsZChhdXRvQnVpbGRFbmFibGVkKTsKLQkJCX0KLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHByZVRlc3QoVGVzdFdyYXBwZXIgd3JhcHBlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBGaXJzdCwgcmVtb3ZlIGFsbCBvZiB0aGUgbWFya2Vycy4gQ2FuJ3QgcmVseSBvbiB0aGUgb3BlcmF0aW9uIHRvIHJlbW92ZSB0aGUgbWFya2VycyBiZXR3ZWVuCi0JCS8vIG9uZSBpbnZvY2F0aW9uIGFuZCB0aGUgbmV4dCBiZWNhdXNlIHNvbWV0aW1lcyB0aGUgdmFsaWRhdGlvbiBpcyBub3Qgc3VwcG9zZWQgdG8gcnVuLgotCQlUYXNrTGlzdFV0aWxpdHkucmVtb3ZlQWxsVGFza3MoZ2V0UHJvamVjdCgpLCB3cmFwcGVyLmdldFZhbGlkYXRvck5hbWVzKCkpOyAvLyBudWxsPWRlbGV0ZSBtYXJrZXJzIG9uIGFsbCBvYmplY3RzCi0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB0ZXN0IHBhc3NlcywgYW5kIGZhbHNlIGlmIGl0IGZhaWxlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gdGVzdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIFRlc3RXcmFwcGVyIHRlc3RXcmFwcGVyKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IEJWVFJ1bm5lci5zaW5nbGV0b24oKS50ZXN0KGdldEJ1ZmZlcigpLCBnZXROYW1lKCksIHRlc3RXcmFwcGVyLmdldE5hbWUoKSwgdGVzdFdyYXBwZXIuZ2V0RXhwZWN0ZWRNZXNzYWdlcygpLCB0ZXN0V3JhcHBlci5nZXRPcGVyYXRpb24oKSwgdGVzdFdyYXBwZXIuZ2V0VmFsaWRhdG9yTmFtZXMoKSkgJiYgcmVzdWx0OwotCQl9Ci0JCWNhdGNoKEJWVFZhbGlkYXRpb25FeGNlcHRpb24gZXhjKSB7Ci0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJCWlmKGV4Yy5nZXRUYXJnZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpLCBleGMuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXksIHdpdGggdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBhcnJheSB0aGUgVmFsaWRhdG9yVGVzdGNhc2UgdGhhdCAKLQkgKiBob2xkcyB0aGUgZXhwZWN0ZWQgcmVzdWx0cywgYW5kIHRoZSBzZWNvbmQgZW50cnkgb2YgdGhlIGFycmF5IGEgVmFsaWRhdGlvbk9wZXJhdGlvbltdCi0JICogY29udGFpbmluZyB0aGUgb3BlcmF0aW9ucyB0byBiZSB0ZXN0ZWQuCi0JICovCi0JcHJpdmF0ZSBUZXN0V3JhcHBlcltdIGdldE9wZXJhdGlvbnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB2Y29uZikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIGFsbFRtZHMgPSBKRFRVdGlsaXR5LmdldFZGVGVzdHMobW9uaXRvciwgZ2V0UHJvamVjdCgpKTsKLQkJaWYoKGFsbFRtZHMgPT0gbnVsbCkgfHwgKGFsbFRtZHMubGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIFNvbWUgb2YgdGhlIG9wZXJhdGlvbiBjb25zdHJ1Y3RvcnMgcmVxdWlyZSBmaWxlIGV4dGVuc2lvbnMuIAotCQlTdHJpbmcgZmlsZUV4dGVuc2lvbiA9ICIuamF2YSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGRlZmF1bHRFeHRlbnNpb24gPSBudWxsOwotCQlJRmlsZSBqYXZhRmlsZSA9IGdldFByb2plY3QoKS5nZXRGaWxlKCJmb28uamF2YSIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gU29tZSBvZiB0aGUgb3BlcmF0aW9ucyBiZWxvdyBwYXNzIGlmIHRoZXkgZG9uJ3QgcHJvZHVjZSBhbnkgcmVzdWx0cy4KLQkJLy8gQ3JlYXRlIGEgdGVzdCBjYXNlIHRoYXQgcGFzc2VzIHRoZSBvcGVyYXRpb24gaWYgdGhlIG9wZXJhdGlvbiBkb2VzIG5vdGhpbmcuCi0JCUxpc3QgdG1kRW1wdHkgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIGV4cGVjdGVkIG1lc3NhZ2VzID09IG5vbmUKLQkJTGlzdCB0bWRJbmMgPSBuZXcgQXJyYXlMaXN0KCk7IC8vIGV4cGVjdGVkIG1lc3NhZ2VzIHdoZW4gaW5jcmVtZW50YWwgdmFsaWRhdG9ycyByYW4KLQkJTGlzdCB0bWRFbmFibGVkID0gbmV3IEFycmF5TGlzdCgpOyAvLyBleHBlY3RlZCBtZXNzYWdlcyB3aGVuIGVuYWJsZWQgdmFsaWRhdG9ycyByYW4KLQkJTGlzdCB0bWRKYXZhID0gbmV3IEFycmF5TGlzdCgpOyAvLyBleHBlY3RlZCBtZXNzYWdlcyB3aGVuIHZhbGlkYXRvcnMgdGhhdCB2YWxpZGF0ZSAuamF2YSBmaWxlcyBhcmUgcnVuCi0JCUxpc3QgdG1kRnVsbCA9IG5ldyBBcnJheUxpc3QoKTsgLy8gZXhwZWN0ZWQgbWVzc2FnZXMgd2hlbiB2YWxpZGF0b3JzIHRoYXQgc3VwcG9ydCBvbmx5ICJSdW4gVmFsaWRhdGlvbiIgYXJlIHJ1bgotCQlTZXQgZW5hYmxlZFZhbGlkYXRvcnMgPSBuZXcgSGFzaFNldCgpOyAvLyBlbmFibGVkIHZhbGlkYXRvcnMgPT0gRldLIFZhbCwgRldLIE5vQnVpbGQgVmFsLCBQcm9wZXJ0aWVzIFZhbAotCQlTZXQgZW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyA9IG5ldyBIYXNoU2V0KCk7IC8vIGVuYWJsZWQgaW5jcmVtZW50YWwgPT0gRldLIFZhbCwgUHJvcGVydGllcyBWYWwgKHN1cHBvcnQgaW5jcmVtZW50YWwgdmFsaWRhdGlvbikKLQkJU2V0IGphdmFWYWxpZGF0b3JzID0gbmV3IEhhc2hTZXQoKTsgLy8gamF2YSB2YWwgPT0gRldLIFZhbCwgRldLIE5vQnVpbGQgVmFsICh2YWxpZGF0ZSAuamF2YSBmaWxlcykKLQkJU2V0IGZ1bGxWYWxpZGF0b3JzID0gbmV3IEhhc2hTZXQoKTsgLy8gZnVsbCB2YWwgPT0gRldLIE5vQnVpbGQgVmFsIChydW5zIG9ubHkgd2hlbiAiUnVuIFZhbGlkYXRpb24iIGNsaWNrZWQpCi0JCVZhbGlkYXRvck1ldGFEYXRhW10gZW5hYmxlZFZtZCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YVthbGxUbWRzLmxlbmd0aF07Ci0JCWZvcihpbnQgaT0wOyBpPGFsbFRtZHMubGVuZ3RoOyBpKyspIHsKLQkJCVZhbGlkYXRvclRlc3RjYXNlIHZ0ID0gYWxsVG1kc1tpXTsKLQkJCQotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gdnQuZ2V0VmFsaWRhdG9yTWV0YURhdGEoKTsKLQkJCWVuYWJsZWRWYWxpZGF0b3JzLmFkZCh2bWQpOwotCQkJZW5hYmxlZFZtZFtpXSA9IHZtZDsKLQkJCWlmKHZtZC5pc0luY3JlbWVudGFsKCkpIHsKLQkJCQllbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzLmFkZCh2bWQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZnVsbFZhbGlkYXRvcnMuYWRkKHZtZCk7Ci0JCQkJdG1kRnVsbC5hZGRBbGwodnQuZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLlJVTl9WQUxJREFUSU9OKSk7Ci0JCQl9Ci0JCQkKLQkJCS8vIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY29kZSB0aGF0IGluc3RhbnRpYXRlcyB0aGUgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uCi0JCQkvLyB0byBlbnN1cmUgdGhhdCB3aGVuIGFuIGFycmF5IG9mIGNoYW5nZWQgcmVzb3VyY2VzIG9yIG9iamVjdHMgaXMgcGFzc2VkIHRvIHRoZSBvcGVyYXRpb24sCi0JCQkvLyB0aGF0IG9ubHkgaW5jcmVtZW50YWwgdmFsaWRhdG9ycyBhcmUgaW52b2tlZCBieSB0aGUgb3BlcmF0aW9uLiBUaGUgZnJhbWV3b3JrIGRvZXMgbm90Ci0JCQkvLyBjaGVjayBpZiB0aGUgdmFsaWRhdG9ycyBhcmUgaW5jcmVtZW50YWwgb3Igbm90OyBpbnN0ZWFkLCB0aGUgbmFtZWQgdmFsaWRhdG9ycyB3aWxsIHJ1biwKLQkJCS8vIGV2ZW4gaWYgdGhleSBwZXJmb3JtIGEgZnVsbCB2YWxpZGF0aW9uIGluc3RlYWQgb2YgdmFsaWRhdGluZyBqdXN0IHRoZSBhcnJheXMuCi0JCQlpZih2bWQuaXNBcHBsaWNhYmxlVG8oamF2YUZpbGUpICYmIHZtZC5pc0luY3JlbWVudGFsKCkpIHsKLQkJCQlqYXZhVmFsaWRhdG9ycy5hZGQodm1kKTsKLQkJCQl0bWRKYXZhLmFkZEFsbCh2dC5nZXRNZXNzYWdlcyhWYWxpZGF0aW9uVHlwZUVudW0uSU5DUkVNRU5UQUxfVkFMSURBVElPTikpOwotCQkJfQotCQkJCi0JCQl0bWRFbmFibGVkLmFkZEFsbCh2dC5nZXRNZXNzYWdlcyhWYWxpZGF0aW9uVHlwZUVudW0uUlVOX1ZBTElEQVRJT04pKTsKLQkJCXRtZEluYy5hZGRBbGwodnQuZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLklOQ1JFTUVOVEFMX1ZBTElEQVRJT04pKTsJCQkKLQkJfQotCQlTdHJpbmdbXSBhbGxWYWxpZGF0b3JOYW1lcyA9IEludGVybmFsVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0VmFsaWRhdG9yTmFtZXMoZW5hYmxlZFZhbGlkYXRvcnMpOwotCQlTdHJpbmdbXSBpbmNWYWxpZGF0b3JOYW1lcyA9IEludGVybmFsVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0VmFsaWRhdG9yTmFtZXMoZW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9ycyk7Ci0JCVN0cmluZ1tdIGphdmFWYWxpZGF0b3JOYW1lcyA9IEludGVybmFsVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0VmFsaWRhdG9yTmFtZXMoamF2YVZhbGlkYXRvcnMpOwotCQlTdHJpbmdbXSBmdWxsVmFsaWRhdG9yTmFtZXMgPSBJbnRlcm5hbFZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFZhbGlkYXRvck5hbWVzKGZ1bGxWYWxpZGF0b3JzKTsKLQkJCi0JCXZjb25mLnNldEVuYWJsZWRWYWxpZGF0b3JzKGVuYWJsZWRWbWQpOwotCQl2Y29uZi5wYXNzaXZhdGUoKTsKLQkJCi0JCS8vIFN0YXJ0IGNvbnN0cnVjdGluZyB0aGUgdGVzdHMKLQkJLy8gRm9yIHRoZSB0ZXN0cyB0aGF0IGRlcGVuZCBvbiB0aGUgdmFsdWUgb2YgdGhlIGF1dG9CdWlsZCBzZXR0aW5nLCBpdCBpcyBhc3N1bWVkIHRoYXQKLQkJLy8gYXV0b0J1aWxkIGlzIG9uLiBUaGUgdGVzdHMgd2lsbCBmYWlsIGlmIGF1dG9CdWlsZCBpcyBkaXNhYmxlZC4KLQkJLy8KLQkJLy8gVW5saWtlIHRoZSBzdWJzZXF1ZW50IG9wZXJhdGlvbnMsIHRoZXNlIGZpcnN0IHR3byBjYW5ub3QgdXNlIHRoZSBhbGxUbWRzIFRNRCBiZWNhdXNlCi0JCS8vIG1vcmUgdGhhbiBvbmUgdmFsaWRhdG9yIHJ1bnMuIFRoZSBhbGxUbWRGdWxsIFRNRCBjb250YWlucyBhbGwgdG1kIG9mIHZhbGlkYXRvcnMgdGhhdAotCQkvLyB3aWxsIHJ1bi4gCi0JCUFsbFZhbGlkYXRvcnNPcGVyYXRpb24gb3AxID0gbmV3IEFsbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDEgPSBuZXcgVGVzdFdyYXBwZXIob3AxLCB0bWRFbmFibGVkLCAib3AxIiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlBbGxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMiA9IG5ldyBBbGxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmFsc2UpOyAvLyBkb24ndCBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QyID0gbmV3IFRlc3RXcmFwcGVyKG9wMiwgdG1kRW5hYmxlZCwgIm9wMiIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIENvbnN0cnVjdCB0aGUgaW5wdXQgZm9yIHRoZSByZXN0IG9mIHRoZSBvcGVyYXRpb25zIHVzaW5nIHRoZSBWRiBUZXN0IHZhbGlkYXRvcnMuCi0JCVRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uIGlucHV0T3AgPSBuZXcgVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24oZ2V0QnVmZmVyKCksIGdldFByb2plY3QoKSk7Ci0JCXRyeSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKGlucHV0T3AsIG1vbml0b3IpOwotCQl9Ci0JCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBUZXN0V3JhcHBlclswXTsKLQkJfQotCQkKLQkJSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyA9IFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLmdldENoYW5nZWRSZXNvdXJjZXMoZ2V0UHJvamVjdCgpLCBhbGxUbWRzKTsKLQkJSVJlc291cmNlW10gZW1wdHlSZXNvdXJjZXMgPSBUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5nZXRFbXB0eVJlc291cmNlcyhnZXRQcm9qZWN0KCkpOwotCQlKYXZhSGVscGVyc1tdIGNoYW5nZWRDbGFzc2VzID0gaW5wdXRPcC5nZXRDaGFuZ2VkQ2xhc3NlcyhjaGFuZ2VkUmVzb3VyY2VzKTsKLQkJSVJlc291cmNlRGVsdGEgZW1wdHlEZWx0YSA9IGlucHV0T3AuZ2V0RW1wdHlEZWx0YSgpOwotCQlJUmVzb3VyY2VEZWx0YSBjaGFuZ2VkRGVsdGEgPSBpbnB1dE9wLmdldENoYW5nZWREZWx0YSgpOwotCQkvLyBlbmQgY29uc3RydWN0IGlucHV0Ci0KLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDMgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIG51bGwsdHJ1ZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3QzID0gbmV3IFRlc3RXcmFwcGVyKG9wMywgdG1kSW5jLCAib3AzIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wNCA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgY2hhbmdlZERlbHRhLGZhbHNlKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDQgPSBuZXcgVGVzdFdyYXBwZXIob3A0LCB0bWRJbmMsICJvcDQiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3A1ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbXB0eURlbHRhLGZhbHNlKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDUgPSBuZXcgVGVzdFdyYXBwZXIob3A1LCB0bWRFbXB0eSwgIm9wNSIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDYgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIG51bGwsIElSdWxlR3JvdXAuUEFTU19GQVNULGZhbHNlKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDYgPSBuZXcgVGVzdFdyYXBwZXIob3A2LCB0bWRJbmMsICJvcDYiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3A3ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNULGZhbHNlKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDcgPSBuZXcgVGVzdFdyYXBwZXIob3A3LCB0bWRJbmMsICJvcDciLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3A4ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbXB0eURlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCxmYWxzZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q4ID0gbmV3IFRlc3RXcmFwcGVyKG9wOCwgdG1kRW1wdHksICJvcDgiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3A5ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzLCBudWxsLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q5ID0gbmV3IFRlc3RXcmFwcGVyKG9wOSwgdG1kSW5jLCAib3A5IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMTAgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnMsIGNoYW5nZWREZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QpOwotCQlUZXN0V3JhcHBlciB0ZXN0MTAgPSBuZXcgVGVzdFdyYXBwZXIob3AxMCwgdG1kSW5jLCAib3AxMCIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDExID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzLCBlbXB0eURlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCk7Ci0JCVRlc3RXcmFwcGVyIHRlc3QxMSA9IG5ldyBUZXN0V3JhcHBlcihvcDExLCB0bWRFbXB0eSwgIm9wMTEiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3AxMiA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgbnVsbCwgZmFsc2UpOyAvLyBmdWxsIHZhbGlkYXRlLCBkb24ndCBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QxMiA9IG5ldyBUZXN0V3JhcHBlcihvcDEyLCB0bWRJbmMsICJvcDEyIiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMTMgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSwgZmFsc2UpOyAvLyBkZWx0YSB2YWxpZGF0ZSwgZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MTMgPSBuZXcgVGVzdFdyYXBwZXIob3AxMywgdG1kSW5jLCAib3AxMyIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDE0ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbXB0eURlbHRhLCBmYWxzZSk7IC8vIGVtcHR5IGRlbHRhIHZhbGlkYXRlLCBkb24ndCBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QxNCA9IG5ldyBUZXN0V3JhcHBlcihvcDE0LCB0bWRFbXB0eSwgIm9wMTQiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24gb3AxNSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgbnVsbCwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIGZhbHNlKTsgLy8gZnVsbCB2YWxpZGF0ZSwgZG9uJ3QgZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MTUgPSBuZXcgVGVzdFdyYXBwZXIob3AxNSwgdG1kSW5jLCAib3AxNSIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbiBvcDE2ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBjaGFuZ2VkRGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNULCBmYWxzZSk7IC8vIGRlbHRhIHZhbGlkYXRlLCBkb24ndCBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QxNiA9IG5ldyBUZXN0V3JhcHBlcihvcDE2LCB0bWRJbmMsICJvcDE2IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMTcgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVtcHR5RGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNULCBmYWxzZSk7IC8vIGVtcHR5IGRlbHRhIHZhbGlkYXRlLCBkb24ndCBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QxNyA9IG5ldyBUZXN0V3JhcHBlcihvcDE3LCB0bWRFbXB0eSwgIm9wMTciLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMTggPSBuZXcgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDE4PSBuZXcgVGVzdFdyYXBwZXIob3AxOCwgdG1kRW5hYmxlZCwgIm9wMTgiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMTkgPSBuZXcgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmYWxzZSk7IC8vIGRvbid0IGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDE5ID0gbmV3IFRlc3RXcmFwcGVyKG9wMTksIHRtZEVuYWJsZWQsICJvcDE5IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDIwID0gbmV3IEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QpOwotCQlUZXN0V3JhcHBlciB0ZXN0MjAgPSBuZXcgVGVzdFdyYXBwZXIob3AyMCwgdG1kRW5hYmxlZCwgIm9wMjAiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMjEgPSBuZXcgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCwgdHJ1ZSxmYWxzZSk7IC8vIGZvcmNlIHZhbGlkYXRpb24gaWYgaXQgZG9lc24ndCBuZWVkIHRvIHJ1bgotCQlUZXN0V3JhcHBlciB0ZXN0MjEgPSBuZXcgVGVzdFdyYXBwZXIob3AyMSwgdG1kRW5hYmxlZCwgIm9wMjEiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMjIgPSBuZXcgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCwgZmFsc2UsZmFsc2UpOyAvLyBubyBmb3JjZSB2YWxpZGF0aW9uIGlmIGl0IGRvZXNuJ3QgbmVlZCB0byBydW4KLQkJVGVzdFdyYXBwZXIgdGVzdDIyID0gbmV3IFRlc3RXcmFwcGVyKG9wMjIsIHRtZEVuYWJsZWQsICJvcDIyIiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDIzID0gbmV3IEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIHRydWUsIGZhbHNlKTsgLy8gZm9yY2UsIGRvbid0IGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDIzID0gbmV3IFRlc3RXcmFwcGVyKG9wMjMsIHRtZEVuYWJsZWQsICJvcDIzIiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiBvcDI0ID0gbmV3IEVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsIGZhbHNlLCBmYWxzZSk7IC8vIG5vIGZvcmNlLCBkb24ndCBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QyNCA9IG5ldyBUZXN0V3JhcHBlcihvcDI0LCB0bWRFbmFibGVkLCAib3AyNCIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AyNSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgbnVsbCx0cnVlKTsgCi0JCVRlc3RXcmFwcGVyIHRlc3QyNSA9IG5ldyBUZXN0V3JhcHBlcihvcDI1LCB0bWRFbmFibGVkLCAib3AyNSIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AyNiA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgY2hhbmdlZERlbHRhLHRydWUpOwotCQlUZXN0V3JhcHBlciB0ZXN0MjYgPSBuZXcgVGVzdFdyYXBwZXIob3AyNiwgdG1kSW5jLCAib3AyNiIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AyNyA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSx0cnVlKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDI3ID0gbmV3IFRlc3RXcmFwcGVyKG9wMjcsIHRtZEVtcHR5LCAib3AyNyIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AyOCA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgbnVsbCwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsdHJ1ZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3QyOCA9IG5ldyBUZXN0V3JhcHBlcihvcDI4LCB0bWRFbmFibGVkLCAib3AyOCIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24gb3AyOSA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgY2hhbmdlZERlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCx0cnVlKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDI5ID0gbmV3IFRlc3RXcmFwcGVyKG9wMjksIHRtZEluYywgIm9wMjkiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIG9wMzAgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVtcHR5RGVsdGEsIElSdWxlR3JvdXAuUEFTU19GQVNULHRydWUpOyAKLQkJVGVzdFdyYXBwZXIgdGVzdDMwID0gbmV3IFRlc3RXcmFwcGVyKG9wMzAsIHRtZEVtcHR5LCAib3AzMCIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCi0JCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IGFsbFRtZHNbMF0uZ2V0VmFsaWRhdG9yTWV0YURhdGEoKTsKLQkJU3RyaW5nIHZhbGlkYXRvck5hbWUgPSB2bWQuZ2V0VmFsaWRhdG9yVW5pcXVlTmFtZSgpOwotCQlTdHJpbmdbXSB2bWROYW1lcyA9IEludGVybmFsVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuZ2V0VmFsaWRhdG9yTmFtZXMobmV3IFZhbGlkYXRvck1ldGFEYXRhW117dm1kfSk7Ci0JCUxpc3QgZXhwZWN0ZWRNZXNzYWdlcyA9IGFsbFRtZHNbMF0uZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLlJVTl9WQUxJREFUSU9OKTsKLQkJT25lVmFsaWRhdG9yT3BlcmF0aW9uIG9wMzEgPSBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKGdldFByb2plY3QoKSwgdmFsaWRhdG9yTmFtZSk7Ci0JCVRlc3RXcmFwcGVyIHRlc3QzMSA9IG5ldyBUZXN0V3JhcHBlcihvcDMxLCBleHBlY3RlZE1lc3NhZ2VzLCAib3AzMSIsIHZtZE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJT25lVmFsaWRhdG9yT3BlcmF0aW9uIG9wMzIgPSBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKGdldFByb2plY3QoKSwgdmFsaWRhdG9yTmFtZSwgdHJ1ZSk7IC8vIGZvcmNlIGlmIG5lY2Vzc2FyeQotCQlUZXN0V3JhcHBlciB0ZXN0MzIgPSBuZXcgVGVzdFdyYXBwZXIob3AzMiwgZXhwZWN0ZWRNZXNzYWdlcywgIm9wMzIiLCB2bWROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCU9uZVZhbGlkYXRvck9wZXJhdGlvbiBvcDMzID0gbmV3IE9uZVZhbGlkYXRvck9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHZhbGlkYXRvck5hbWUsIGZhbHNlKTsgLy8gbm8gZm9yY2UKLQkJVGVzdFdyYXBwZXIgdGVzdDMzID0gbmV3IFRlc3RXcmFwcGVyKG9wMzMsIGV4cGVjdGVkTWVzc2FnZXMsICJvcDMzIiwgdm1kTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlPbmVWYWxpZGF0b3JPcGVyYXRpb24gb3AzNCA9IG5ldyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB2YWxpZGF0b3JOYW1lLCB0cnVlLCBmYWxzZSk7IC8vIGZvcmNlLCBubyBmb3JrCi0JCVRlc3RXcmFwcGVyIHRlc3QzNCA9IG5ldyBUZXN0V3JhcHBlcihvcDM0LCBleHBlY3RlZE1lc3NhZ2VzLCAib3AzNCIsIHZtZE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJT25lVmFsaWRhdG9yT3BlcmF0aW9uIG9wMzUgPSBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKGdldFByb2plY3QoKSwgdmFsaWRhdG9yTmFtZSwgZmFsc2UsIGZhbHNlKTsgLy8gbm8gZm9yY2UsIG5vIGZvcmsKLQkJVGVzdFdyYXBwZXIgdGVzdDM1ID0gbmV3IFRlc3RXcmFwcGVyKG9wMzUsIGV4cGVjdGVkTWVzc2FnZXMsICJvcDM1Iiwgdm1kTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlPbmVWYWxpZGF0b3JPcGVyYXRpb24gb3AzNiA9IG5ldyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB2YWxpZGF0b3JOYW1lLCB0cnVlLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCk7IC8vIGZvcmNlCi0JCVRlc3RXcmFwcGVyIHRlc3QzNiA9IG5ldyBUZXN0V3JhcHBlcihvcDM2LCBleHBlY3RlZE1lc3NhZ2VzLCAib3AzNiIsIHZtZE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJT25lVmFsaWRhdG9yT3BlcmF0aW9uIG9wMzcgPSBuZXcgT25lVmFsaWRhdG9yT3BlcmF0aW9uKGdldFByb2plY3QoKSwgdmFsaWRhdG9yTmFtZSwgZmFsc2UsIElSdWxlR3JvdXAuUEFTU19GQVNUKTsgLy8gbm8gZm9yY2UKLQkJVGVzdFdyYXBwZXIgdGVzdDM3ID0gbmV3IFRlc3RXcmFwcGVyKG9wMzcsIGV4cGVjdGVkTWVzc2FnZXMsICJvcDM3Iiwgdm1kTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlPbmVWYWxpZGF0b3JPcGVyYXRpb24gb3AzOCA9IG5ldyBPbmVWYWxpZGF0b3JPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB2YWxpZGF0b3JOYW1lLCB0cnVlLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCwgZmFsc2UpOyAvLyBmb3JjZSwgbm8gZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MzggPSBuZXcgVGVzdFdyYXBwZXIob3AzOCwgZXhwZWN0ZWRNZXNzYWdlcywgIm9wMzgiLCB2bWROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCU9uZVZhbGlkYXRvck9wZXJhdGlvbiBvcDM5ID0gbmV3IE9uZVZhbGlkYXRvck9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHZhbGlkYXRvck5hbWUsIGZhbHNlLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCwgZmFsc2UpOyAvLyBubyBmb3JjZSwgbm8gZm9yawotCQlUZXN0V3JhcHBlciB0ZXN0MzkgPSBuZXcgVGVzdFdyYXBwZXIob3AzOSwgZXhwZWN0ZWRNZXNzYWdlcywgIm9wMzkiLCB2bWROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A0MCA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLHRydWUsZmFsc2UpOwotCQlvcDQwLnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NDAgPSBuZXcgVGVzdFdyYXBwZXIob3A0MCwgdG1kRW5hYmxlZCwgIm9wNDAiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDQxID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIHRydWUsZmFsc2UpOyAvLyBmb3JjZQotCQlvcDQxLnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NDEgPSBuZXcgVGVzdFdyYXBwZXIob3A0MSwgdG1kRW5hYmxlZCwgIm9wNDEiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDQyID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZhbHNlLGZhbHNlKTsgLy8gbm8gZm9yY2UKLQkJb3A0Mi5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDQyID0gbmV3IFRlc3RXcmFwcGVyKG9wNDIsIHRtZEVuYWJsZWQsICJvcDQyIiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A0MyA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB0cnVlLCBmYWxzZSk7IC8vIGZvcmNlLCBubyBmb3JrCi0JCW9wNDMuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0MyA9IG5ldyBUZXN0V3JhcHBlcihvcDQzLCB0bWRFbmFibGVkLCAib3A0MyIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNDQgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmFsc2UsIGZhbHNlKTsgLy8gbm8gZm9yY2UsIG5vIGZvcmsKLQkJb3A0NC5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDQ0ID0gbmV3IFRlc3RXcmFwcGVyKG9wNDQsIHRtZEVuYWJsZWQsICJvcDQ0IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A0NSA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB0cnVlLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCxmYWxzZSk7IC8vIGZvcmNlCi0JCW9wNDUuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q0NSA9IG5ldyBUZXN0V3JhcHBlcihvcDQ1LCB0bWRFbmFibGVkLCAib3A0NSIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNDYgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmFsc2UsIElSdWxlR3JvdXAuUEFTU19GQVNULGZhbHNlKTsgLy8gbm8gZm9yY2UKLQkJb3A0Ni5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDQ2ID0gbmV3IFRlc3RXcmFwcGVyKG9wNDYsIHRtZEVuYWJsZWQsICJvcDQ2IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A0NyA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCB0cnVlLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCwgZmFsc2UpOyAvLyBmb3JjZSwgbm8gZm9yawotCQlvcDQ3LnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NDcgPSBuZXcgVGVzdFdyYXBwZXIob3A0NywgdG1kRW5hYmxlZCwgIm9wNDciLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDQ4ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZhbHNlLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCwgZmFsc2UpOyAvLyBubyBmb3JjZSwgbm8gZm9yawotCQlvcDQ4LnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NDggPSBuZXcgVGVzdFdyYXBwZXIob3A0OCwgdG1kRW5hYmxlZCwgIm9wNDgiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDQ5ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBudWxsLGZhbHNlKTsKLQkJb3A0OS5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDQ5ID0gbmV3IFRlc3RXcmFwcGVyKG9wNDksIHRtZEVuYWJsZWQsICJvcDQ5IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A1MCA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgY2hhbmdlZERlbHRhLGZhbHNlKTsKLQkJb3A1MC5zZXRWYWxpZGF0b3JzKGluY1ZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDUwID0gbmV3IFRlc3RXcmFwcGVyKG9wNTAsIHRtZEluYywgIm9wNTAiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDUxID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbXB0eURlbHRhLGZhbHNlKTsKLQkJb3A1MS5zZXRWYWxpZGF0b3JzKGluY1ZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDUxID0gbmV3IFRlc3RXcmFwcGVyKG9wNTEsIHRtZEVtcHR5LCAib3A1MSIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNTIgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIG51bGwsIGZhbHNlKTsgLy8gZmFsc2U9YXV0b0J1aWxkIGRpc2FibGVkCi0JCW9wNTIuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1MiA9IG5ldyBUZXN0V3JhcHBlcihvcDUyLCB0bWRFbmFibGVkLCAib3A1MiIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNTMgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIG51bGwsIHRydWUpOyAvLyB0cnVlPWF1dG9CdWlsZCBlbmFibGVkCi0JCW9wNTMuc2V0VmFsaWRhdG9ycyhmdWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NTMgPSBuZXcgVGVzdFdyYXBwZXIob3A1MywgdG1kRnVsbCwgIm9wNTMiLCBmdWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A1NCA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgY2hhbmdlZERlbHRhLCBmYWxzZSk7IC8vIGZhbHNlPWF1dG9CdWlsZCBkaXNhYmxlZAotCQlvcDU0LnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NTQgPSBuZXcgVGVzdFdyYXBwZXIob3A1NCwgdG1kSW5jLCAib3A1NCIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNTUgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSwgdHJ1ZSk7IC8vIHRydWU9YXV0b0J1aWxkIGVuYWJsZWQKLQkJb3A1NS5zZXRWYWxpZGF0b3JzKGluY1ZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDU1ID0gbmV3IFRlc3RXcmFwcGVyKG9wNTUsIHRtZEVtcHR5LCAib3A1NSIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNTYgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGVtcHR5RGVsdGEsIGZhbHNlKTsgLy8gZmFsc2U9YXV0b0J1aWxkIGRpc2FibGVkCi0JCW9wNTYuc2V0VmFsaWRhdG9ycyhpbmNWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q1NiA9IG5ldyBUZXN0V3JhcHBlcihvcDU2LCB0bWRFbXB0eSwgIm9wNTYiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDU3ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbXB0eURlbHRhLCB0cnVlKTsgLy8gdHJ1ZT1hdXRvQnVpbGQgZW5hYmxlZAotCQlvcDU3LnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NTcgPSBuZXcgVGVzdFdyYXBwZXIob3A1NywgdG1kRW1wdHksICJvcDU3IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A1OCA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSxudWxsLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCxmYWxzZSk7IC8vIGZhbHNlPWF1dG9CdWlsZCBkaXNhYmxlZAotCQlvcDU4LnNldFZhbGlkYXRvcnMoYWxsVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NTggPSBuZXcgVGVzdFdyYXBwZXIob3A1OCwgdG1kRW5hYmxlZCwgIm9wNTgiLCBhbGxWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDU5ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBudWxsLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCxmYWxzZSk7IC8vIHRydWU9YXV0b0J1aWxkIGVuYWJsZWQKLQkJb3A1OS5zZXRWYWxpZGF0b3JzKGFsbFZhbGlkYXRvck5hbWVzKTsKLQkJVGVzdFdyYXBwZXIgdGVzdDU5ID0gbmV3IFRlc3RXcmFwcGVyKG9wNTksIHRtZEZ1bGwsICJvcDU5IiwgYWxsVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A2MCA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgY2hhbmdlZERlbHRhLCBJUnVsZUdyb3VwLlBBU1NfRkFTVCxmYWxzZSk7IC8vIGZhbHNlPWF1dG9CdWlsZCBkaXNhYmxlZAotCQlvcDYwLnNldFZhbGlkYXRvcnMoaW5jVmFsaWRhdG9yTmFtZXMpOwotCQlUZXN0V3JhcHBlciB0ZXN0NjAgPSBuZXcgVGVzdFdyYXBwZXIob3A2MCwgdG1kSW5jLCAib3A2MCIsIGluY1ZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNjEgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsZmFsc2UpOyAvLyB0cnVlPWF1dG9CdWlsZCBlbmFibGVkCi0JCW9wNjEuc2V0VmFsaWRhdG9ycyhpbmNWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q2MSA9IG5ldyBUZXN0V3JhcHBlcihvcDYxLCB0bWRFbXB0eSwgIm9wNjEiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDYyID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbXB0eURlbHRhLElSdWxlR3JvdXAuUEFTU19GQVNULGZhbHNlKTsgLy8gZmFsc2U9YXV0b0J1aWxkIGRpc2FibGVkCi0JCW9wNjIuc2V0VmFsaWRhdG9ycyhpbmNWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q2MiA9IG5ldyBUZXN0V3JhcHBlcihvcDYyLCB0bWRFbXB0eSwgIm9wNjIiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDYzID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBlbXB0eURlbHRhLElSdWxlR3JvdXAuUEFTU19GQVNULHRydWUpOyAvLyB0cnVlPWF1dG9CdWlsZCBlbmFibGVkCi0JCW9wNjMuc2V0VmFsaWRhdG9ycyhpbmNWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q2MyA9IG5ldyBUZXN0V3JhcHBlcihvcDYzLCB0bWRFbXB0eSwgIm9wNjMiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDY0ID0gbmV3IEVuYWJsZWRJbmNyZW1lbnRhbFZhbGlkYXRvcnNPcGVyYXRpb24oZ2V0UHJvamVjdCgpLG51bGwsSVJ1bGVHcm91cC5QQVNTX0ZBU1QsdHJ1ZSk7Ci0JCW9wNjQuc2V0VmFsaWRhdG9ycyhhbGxWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q2NCA9IG5ldyBUZXN0V3JhcHBlcihvcDY0LCB0bWRFbmFibGVkLCAib3A2NCIsIGFsbFZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNjUgPSBuZXcgRW5hYmxlZEluY3JlbWVudGFsVmFsaWRhdG9yc09wZXJhdGlvbihnZXRQcm9qZWN0KCksIGNoYW5nZWREZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsdHJ1ZSk7Ci0JCW9wNjUuc2V0VmFsaWRhdG9ycyhpbmNWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q2NSA9IG5ldyBUZXN0V3JhcHBlcihvcDY1LCB0bWRJbmMsICJvcDY1IiwgaW5jVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQotCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A2NiA9IG5ldyBFbmFibGVkSW5jcmVtZW50YWxWYWxpZGF0b3JzT3BlcmF0aW9uKGdldFByb2plY3QoKSwgZW1wdHlEZWx0YSwgSVJ1bGVHcm91cC5QQVNTX0ZBU1QsdHJ1ZSk7Ci0JCW9wNjYuc2V0VmFsaWRhdG9ycyhpbmNWYWxpZGF0b3JOYW1lcyk7Ci0JCVRlc3RXcmFwcGVyIHRlc3Q2NiA9IG5ldyBUZXN0V3JhcHBlcihvcDY2LCB0bWRFbXB0eSwgIm9wNjYiLCBpbmNWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZihjaGFuZ2VkQ2xhc3NlcyAhPSBudWxsKSB7Ci0JCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A2NyA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmaWxlRXh0ZW5zaW9uLCBjaGFuZ2VkUmVzb3VyY2VzLGZhbHNlKTsKLQkJCW9wNjcuc2V0VmFsaWRhdG9ycyhqYXZhVmFsaWRhdG9yTmFtZXMpOwotCQkJVGVzdFdyYXBwZXIgdGVzdDY3ID0gbmV3IFRlc3RXcmFwcGVyKG9wNjcsIHRtZEphdmEsICJvcDY3IiwgamF2YVZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A2OCA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmaWxlRXh0ZW5zaW9uLCBjaGFuZ2VkUmVzb3VyY2VzLCBmYWxzZSk7IC8vIG5vIGZvcmsKLQkJCW9wNjguc2V0VmFsaWRhdG9ycyhqYXZhVmFsaWRhdG9yTmFtZXMpOwotCQkJVGVzdFdyYXBwZXIgdGVzdDY4ID0gbmV3IFRlc3RXcmFwcGVyKG9wNjgsIHRtZEphdmEsICJvcDY4IiwgamF2YVZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A2OSA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmaWxlRXh0ZW5zaW9uLCBkZWZhdWx0RXh0ZW5zaW9uLCBjaGFuZ2VkUmVzb3VyY2VzLGZhbHNlKTsKLQkJCW9wNjkuc2V0VmFsaWRhdG9ycyhqYXZhVmFsaWRhdG9yTmFtZXMpOwotCQkJVGVzdFdyYXBwZXIgdGVzdDY5ID0gbmV3IFRlc3RXcmFwcGVyKG9wNjksIHRtZEphdmEsICJvcDY5IiwgamF2YVZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A3MCA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmaWxlRXh0ZW5zaW9uLCBkZWZhdWx0RXh0ZW5zaW9uLCBjaGFuZ2VkUmVzb3VyY2VzLCBmYWxzZSk7IC8vIG5vIGZvcmsKLQkJCW9wNzAuc2V0VmFsaWRhdG9ycyhqYXZhVmFsaWRhdG9yTmFtZXMpOwotCQkJVGVzdFdyYXBwZXIgdGVzdDcwID0gbmV3IFRlc3RXcmFwcGVyKG9wNzAsIHRtZEphdmEsICJvcDcwIiwgamF2YVZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A3MSA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmaWxlRXh0ZW5zaW9uLCBlbXB0eVJlc291cmNlcyxmYWxzZSk7Ci0JCQlvcDcxLnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q3MSA9IG5ldyBUZXN0V3JhcHBlcihvcDcxLCB0bWRFbXB0eSwgIm9wNzEiLCBqYXZhVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDcyID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZpbGVFeHRlbnNpb24sIGVtcHR5UmVzb3VyY2VzLCBmYWxzZSk7IC8vIG5vIGZvcmsKLQkJCW9wNzIuc2V0VmFsaWRhdG9ycyhqYXZhVmFsaWRhdG9yTmFtZXMpOwotCQkJVGVzdFdyYXBwZXIgdGVzdDcyID0gbmV3IFRlc3RXcmFwcGVyKG9wNzIsIHRtZEVtcHR5LCAib3A3MiIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNzMgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgZGVmYXVsdEV4dGVuc2lvbiwgZW1wdHlSZXNvdXJjZXMsZmFsc2UpOwotCQkJb3A3My5zZXRWYWxpZGF0b3JzKGphdmFWYWxpZGF0b3JOYW1lcyk7Ci0JCQlUZXN0V3JhcHBlciB0ZXN0NzMgPSBuZXcgVGVzdFdyYXBwZXIob3A3MywgdG1kRW1wdHksICJvcDczIiwgamF2YVZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A3NCA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmaWxlRXh0ZW5zaW9uLCBkZWZhdWx0RXh0ZW5zaW9uLCBlbXB0eVJlc291cmNlcywgZmFsc2UpOyAvLyBubyBmb3JrCi0JCQlvcDc0LnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q3NCA9IG5ldyBUZXN0V3JhcHBlcihvcDc0LCB0bWRFbXB0eSwgIm9wNzQiLCBqYXZhVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDc1ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZpbGVFeHRlbnNpb24sIGNoYW5nZWRDbGFzc2VzLGZhbHNlKTsKLQkJCW9wNzUuc2V0VmFsaWRhdG9ycyhqYXZhVmFsaWRhdG9yTmFtZXMpOwotCQkJVGVzdFdyYXBwZXIgdGVzdDc1ID0gbmV3IFRlc3RXcmFwcGVyKG9wNzUsIHRtZEphdmEsICJvcDc1IiwgamF2YVZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24gb3A3NiA9IG5ldyBWYWxpZGF0b3JTdWJzZXRPcGVyYXRpb24oZ2V0UHJvamVjdCgpLCBmaWxlRXh0ZW5zaW9uLCBjaGFuZ2VkQ2xhc3NlcywgZmFsc2UpOyAvLyBubyBmb3JrCi0JCQlvcDc2LnNldFZhbGlkYXRvcnMoamF2YVZhbGlkYXRvck5hbWVzKTsKLQkJCVRlc3RXcmFwcGVyIHRlc3Q3NiA9IG5ldyBUZXN0V3JhcHBlcihvcDc2LCB0bWRKYXZhLCAib3A3NiIsIGphdmFWYWxpZGF0b3JOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uIG9wNzcgPSBuZXcgVmFsaWRhdG9yU3Vic2V0T3BlcmF0aW9uKGdldFByb2plY3QoKSwgZmlsZUV4dGVuc2lvbiwgZGVmYXVsdEV4dGVuc2lvbiwgY2hhbmdlZENsYXNzZXMsZmFsc2UpOwotCQkJb3A3Ny5zZXRWYWxpZGF0b3JzKGphdmFWYWxpZGF0b3JOYW1lcyk7Ci0JCQlUZXN0V3JhcHBlciB0ZXN0NzcgPSBuZXcgVGVzdFdyYXBwZXIob3A3NywgdG1kSmF2YSwgIm9wNzciLCBqYXZhVmFsaWRhdG9yTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVZhbGlkYXRvclN1YnNldE9wZXJhdGlvbiBvcDc4ID0gbmV3IFZhbGlkYXRvclN1YnNldE9wZXJhdGlvbihnZXRQcm9qZWN0KCksIGZpbGVFeHRlbnNpb24sIGRlZmF1bHRFeHRlbnNpb24sIGNoYW5nZWRDbGFzc2VzLCBmYWxzZSk7IC8vIG5vIGZvcmsKLQkJCW9wNzguc2V0VmFsaWRhdG9ycyhqYXZhVmFsaWRhdG9yTmFtZXMpOwotCQkJVGVzdFdyYXBwZXIgdGVzdDc4ID0gbmV3IFRlc3RXcmFwcGVyKG9wNzgsIHRtZEphdmEsICJvcDc4IiwgamF2YVZhbGlkYXRvck5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQlUZXN0V3JhcHBlcltdIHJlc3VsdCA9IG5ldyBUZXN0V3JhcHBlcltdIHsKLQkJCQl0ZXN0MSwgdGVzdDIsIHRlc3QzLCB0ZXN0NCwgdGVzdDUsIHRlc3Q2LCB0ZXN0NywgdGVzdDgsIHRlc3Q5LAotCQkJCXRlc3QxMCwgdGVzdDExLCB0ZXN0MTIsIHRlc3QxMywgdGVzdDE0LCB0ZXN0MTUsIHRlc3QxNiwgdGVzdDE3LCB0ZXN0MTgsIHRlc3QxOSwKLQkJCQl0ZXN0MjAsIHRlc3QyMSwgdGVzdDIyLCB0ZXN0MjMsIHRlc3QyNCwgdGVzdDI1LCB0ZXN0MjYsIHRlc3QyNywgdGVzdDI4LCB0ZXN0MjksCi0JCQkJdGVzdDMwLCB0ZXN0MzEsIHRlc3QzMiwgdGVzdDMzLCB0ZXN0MzQsIHRlc3QzNSwgdGVzdDM2LCB0ZXN0MzcsIHRlc3QzOCwgdGVzdDM5LAotCQkJCXRlc3Q0MCwgdGVzdDQxLCB0ZXN0NDIsIHRlc3Q0MywgdGVzdDQ0LCB0ZXN0NDUsIHRlc3Q0NiwgdGVzdDQ3LCB0ZXN0NDgsIHRlc3Q0OSwKLQkJCQl0ZXN0NTAsIHRlc3Q1MSwgdGVzdDUyLCB0ZXN0NTMsIHRlc3Q1NCwgdGVzdDU1LCB0ZXN0NTYsIHRlc3Q1NywgdGVzdDU4LCB0ZXN0NTksCi0JCQkJdGVzdDYwLCB0ZXN0NjEsIHRlc3Q2MiwgdGVzdDYzLCB0ZXN0NjQsIHRlc3Q2NSwgdGVzdDY2LCB0ZXN0NjcsIHRlc3Q2OCwgdGVzdDY5LAotCQkJCXRlc3Q3MCwgdGVzdDcxLCB0ZXN0NzIsIHRlc3Q3MywgdGVzdDc0LCB0ZXN0NzUsIHRlc3Q3NiwgdGVzdDc3LCB0ZXN0NzgKLQkJCX07Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWVsc2UgewotCQkJVGVzdFdyYXBwZXJbXSByZXN1bHQgPSBuZXcgVGVzdFdyYXBwZXJbXSB7Ci0JCQkJdGVzdDEsIHRlc3QyLCB0ZXN0MywgdGVzdDQsIHRlc3Q1LCB0ZXN0NiwgdGVzdDcsIHRlc3Q4LCB0ZXN0OSwKLQkJCQl0ZXN0MTAsIHRlc3QxMSwgdGVzdDEyLCB0ZXN0MTMsIHRlc3QxNCwgdGVzdDE1LCB0ZXN0MTYsIHRlc3QxNywgdGVzdDE4LCB0ZXN0MTksCi0JCQkJdGVzdDIwLCB0ZXN0MjEsIHRlc3QyMiwgdGVzdDIzLCB0ZXN0MjQsIHRlc3QyNSwgdGVzdDI2LCB0ZXN0MjcsIHRlc3QyOCwgdGVzdDI5LAotCQkJCXRlc3QzMCwgdGVzdDMxLCB0ZXN0MzIsIHRlc3QzMywgdGVzdDM0LCB0ZXN0MzUsIHRlc3QzNiwgdGVzdDM3LCB0ZXN0MzgsIHRlc3QzOSwKLQkJCQl0ZXN0NDAsIHRlc3Q0MSwgdGVzdDQyLCB0ZXN0NDMsIHRlc3Q0NCwgdGVzdDQ1LCB0ZXN0NDYsIHRlc3Q0NywgdGVzdDQ4LCB0ZXN0NDksCi0JCQkJdGVzdDUwLCB0ZXN0NTEsIHRlc3Q1MiwgdGVzdDUzLCB0ZXN0NTQsIHRlc3Q1NSwgdGVzdDU2LCB0ZXN0NTcsIHRlc3Q1OCwgdGVzdDU5LAotCQkJCXRlc3Q2MCwgdGVzdDYxLCB0ZXN0NjIsIHRlc3Q2MywgdGVzdDY0LCB0ZXN0NjUsIHRlc3Q2NgotCQkJfTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0JCQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGVzdFdyYXBwZXIgewotCQlwcml2YXRlIExpc3QgX21lc3NhZ2VzID0gbnVsbDsKLQkJcHJpdmF0ZSBWYWxpZGF0aW9uT3BlcmF0aW9uIF9vcGVyYXRpb24gPSBudWxsOwotCQlwcml2YXRlIFN0cmluZyBfdGVzdE5hbWUgPSBudWxsOwotCQlwcml2YXRlIFN0cmluZ1tdIF92YWxpZGF0b3JOYW1lcyA9IG51bGw7Ci0JCQotCQlUZXN0V3JhcHBlcihWYWxpZGF0aW9uT3BlcmF0aW9uIG9wLCBMaXN0IGV4cGVjdGVkTWVzc2FnZXMsIFN0cmluZyB0ZXN0TmFtZSwgU3RyaW5nW10gdmFsaWRhdG9yTmFtZXMpIHsKLQkJCV9tZXNzYWdlcyA9IGV4cGVjdGVkTWVzc2FnZXM7Ci0JCQlfb3BlcmF0aW9uID0gb3A7Ci0JCQlfdGVzdE5hbWUgPSB0ZXN0TmFtZTsKLQkJCV92YWxpZGF0b3JOYW1lcyA9IHZhbGlkYXRvck5hbWVzOwotCQl9Ci0JCQotCQlwdWJsaWMgTGlzdCBnZXRFeHBlY3RlZE1lc3NhZ2VzKCkgewotCQkJcmV0dXJuIF9tZXNzYWdlczsKLQkJfQotCQkKLQkJcHVibGljIFZhbGlkYXRpb25PcGVyYXRpb24gZ2V0T3BlcmF0aW9uKCkgewotCQkJcmV0dXJuIF9vcGVyYXRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBfdGVzdE5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRWYWxpZGF0b3JOYW1lcygpIHsKLQkJCXJldHVybiBfdmFsaWRhdG9yTmFtZXM7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay9WQUxGV0swMk9wZXJhdGlvbi5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL1ZBTEZXSzAyT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczZTEyYjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL1ZBTEZXSzAyT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3azsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5JT3BlcmF0aW9uUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5WYWxpZGF0aW9uVHlwZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yLkpEVFV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5WYWxpZGF0b3JUZXN0Y2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmludGVybmFsLnV0aWwuQlZUUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3Quc2V0dXAuSUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5Db25maWd1cmF0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5HbG9iYWxDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlByb2plY3RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlRhc2tMaXN0VXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdG9yTWV0YURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5FbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLlZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucGx1Z2luLlZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJ1bnMgdGhlIFZBTEZXSzAyIHRlc3QuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWQUxGV0swMk9wZXJhdGlvbiBpbXBsZW1lbnRzIElPcGVyYXRpb25SdW5uYWJsZSB7Ci0JcHJpdmF0ZSBJUHJvamVjdCBfcHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBJQnVmZmVyIF9idWZmZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF90ZXN0Q2FzZU5hbWUgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5FV0xJTkUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBNdXN0IGhhdmUgYSBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3RvciBpbiBvcmRlciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uLgotCSAqIE1VU1QgY2FsbCBzZXRCdWZmZXIsIHNldFByb2plY3QsIGFuZCBzZXROYW1lIGJlZm9yZSB1c2luZyB0aGUgb3BlcmF0aW9uLgotCSAqLwotCXB1YmxpYyBWQUxGV0swMk9wZXJhdGlvbigpIHsKLQl9Ci0JCi0JLyoqCi0JICogSVByb2plY3QgbXVzdCBleGlzdCBhbmQgYmUgb3Blbi4KLQkgKi8KLQlwdWJsaWMgVkFMRldLMDJPcGVyYXRpb24oSUJ1ZmZlciBidWZmZXIsIElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB0ZXN0Q2FzZU5hbWUpIHsKLQkJc2V0UHJvamVjdChwcm9qZWN0KTsKLQkJc2V0QnVmZmVyKGJ1ZmZlcik7Ci0JCXNldE5hbWUodGVzdENhc2VOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSUJ1ZmZlciBnZXRCdWZmZXIoKSB7IAotCQlyZXR1cm4gX2J1ZmZlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0QnVmZmVyKElCdWZmZXIgYikgewotCQlfYnVmZmVyID0gYjsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBfcHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwKSB7Ci0JCV9wcm9qZWN0ID0gcDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBfdGVzdENhc2VOYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCV90ZXN0Q2FzZU5hbWUgPSBuYW1lOwotCX0JCi0KLQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCWlmKHByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUnVuIFZBTEZXSzAyIG9uIGFuIGV4aXN0aW5nIG9wZW4gSVByb2plY3QuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJLy8gRmlyc3QsIGFkZCB0aGUgVmFsaWRhdGlvbkJ1aWxkZXIgdG8gdGhlIEphdmEgUHJvamVjdAotCQlWYWxpZGF0b3JNYW5hZ2VyLmFkZFByb2plY3RCdWlsZFZhbGlkYXRpb25TdXBwb3J0KHByb2plY3QpOwotCi0JCS8vIFNhdmUgdGhlIG9sZCB1c2VyIGNvbmZpZ3VyYXRpb24gYW5kIHJlc3RvcmUgaXQgaW4gdGhlIGZpbmFsbHkgYmxvY2suCi0JCXRyeSB7Ci0JCQlHbG9iYWxDb25maWd1cmF0aW9uIGdjb25mID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldEdsb2JhbENvbmZpZ3VyYXRpb24oKTsKLQkJCVByb2plY3RDb25maWd1cmF0aW9uIHBjb25mID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJR2xvYmFsQ29uZmlndXJhdGlvbiBvcmlnR2NvbmYgPSBuZXcgR2xvYmFsQ29uZmlndXJhdGlvbihnY29uZik7IC8vIGNvcHkgdGhlIG9yaWdpbmFsIHZhbHVlcyBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlc3RvcmVkIGluIHRoZSBmaW5hbGx5IGJsb2NrCi0JCQlQcm9qZWN0Q29uZmlndXJhdGlvbiBvcmlnUGNvbmYgPSBuZXcgUHJvamVjdENvbmZpZ3VyYXRpb24ocGNvbmYpOyAvLyBjb3B5IHRoZSBvcmlnaW5hbCB2YWx1c2Ugc28gdGhhdCB0aGV5IGNhbiBiZSByZXN0b3JlZCBpbiB0aGUgZmluYWxseSBibG9jawotCQkJTGV2ZWwgbGV2ZWwgPSBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLmdldExldmVsKCk7Ci0JCQlib29sZWFuIGF1dG9CdWlsZEVuYWJsZWQgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuaXNBdXRvQnVpbGRpbmcoKTsKLQkJCQkKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gY29uZmlndXJlZFZhbGlkYXRvcnMgPSBwY29uZi5nZXRWYWxpZGF0b3JzKCk7Ci0JCQlpZihjb25maWd1cmVkVmFsaWRhdG9ycy5sZW5ndGggPCAyKSB7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKCJSdW4gVkFMRldLMDIgb24gYW4gZXhpc3Rpbmcgb3BlbiBwcm9qZWN0IHRoYXQgaGFzIGF0IGxlYXN0IHR3byB2YWxpZGF0b3JzIGNvbmZpZ3VyZWQ6IG9uZSB0byBlbmFibGUsIGFuZCBvbmUgdG8gZGlzYWJsZS4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gRGlzYWJsZSBhdCBsZWFzdCBvbmUgdmFsaWRhdG9yIGZvciB0aGlzIHRlc3QuCi0JCQkvLyBSZW1vdmUgdGhlIGZpcnN0IGVuYWJsZWQgdmFsaWRhdG9yIGZyb20gdGhlIFByb3BlcnRpZXMsIGFuZCB0aGUgc2Vjb25kIGVuYWJsZWQgdmFsaWRhdG9yIGZyb20gdGhlCi0JCQkvLyBQcmVmZXJlbmNlcy4gKEl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHZhbGlkYXRvciBpcyByZW1vdmVkOyBpdCBvbmx5IG1hdHRlcnMgdGhhdCB0aGUgUHJvcGVydGllcyBhbmQKLQkJCS8vIHRoZSBQcmVmZXJlbmNlcyBoYXZlIGRpZmZlcmVudCB2YWxpZGF0b3JzLikKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZmVGVzdFZhbGlkYXRvciA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YShUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5GV0tfTk9CVUlMRF9URVNUX1ZBTElEQVRPUl9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJCVZhbGlkYXRvck1ldGFEYXRhIHZmTm9CdWlsZFRlc3RWYWxpZGF0b3IgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uRldLX1RFU1RfVkFMSURBVE9SX0NMQVNTKTsgLy8kTk9OLU5MUy0xJAotCQkJVmFsaWRhdG9yTWV0YURhdGEgcHJvcGVydGllc1ZhbGlkYXRvciA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YShUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5QUk9QRVJUSUVTX1ZBTElEQVRPUl9DTEFTUyk7IC8vJE5PTi1OTFMtMSQKLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gZW5hYmxlZFByb3BWYWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhWzJdOwotCQkJZW5hYmxlZFByb3BWYWxpZGF0b3JzWzBdID0gdmZUZXN0VmFsaWRhdG9yOwotCQkJZW5hYmxlZFByb3BWYWxpZGF0b3JzWzFdID0gdmZOb0J1aWxkVGVzdFZhbGlkYXRvcjsKLQkJCXBjb25mLnNldEVuYWJsZWRWYWxpZGF0b3JzKGVuYWJsZWRQcm9wVmFsaWRhdG9ycyk7Ci0JCQkvL3Bjb25mLnNldE1heGltdW1OdW1iZXJPZk1lc3NhZ2VzKDEpOwotCQkJcGNvbmYucGFzc2l2YXRlKCk7Ci0KLQkJCVZhbGlkYXRvck1ldGFEYXRhW10gZW5hYmxlZFByZWZWYWxpZGF0b3JzID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhWzFdOwotCQkJZW5hYmxlZFByZWZWYWxpZGF0b3JzWzBdID0gcHJvcGVydGllc1ZhbGlkYXRvcjsKLQkJCWdjb25mLnNldEVuYWJsZWRWYWxpZGF0b3JzKGVuYWJsZWRQcmVmVmFsaWRhdG9ycyk7Ci0JCQkvL2djb25mLnNldE1heGltdW1OdW1iZXJPZk1lc3NhZ2VzKDEwKTsKLQkJCWdjb25mLnBhc3NpdmF0ZSgpOwotCQkJCi0JCQkKLQkJCVZhbGlkYXRvclRlc3RjYXNlW10gdG1kcyA9IEpEVFV0aWxpdHkuZ2V0VkZUZXN0cyhtb25pdG9yLCBnZXRQcm9qZWN0KCkpOwotCQkJaWYoKHRtZHMgPT0gbnVsbCkgfHwgKHRtZHMubGVuZ3RoID09IDApKSB7Ci0JCQkJbW9uaXRvci5zdWJUYXNrKCJDYW5ub3QgcnVuIFZBTEZXSzAyIGJlY2F1c2UgdGhlcmUgYXJlIG5vIHRlc3QgY2FzZXMgcmVnaXN0ZXJlZCBmb3IgSmF2YVByb2plY3QuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCVZhbGlkYXRvclRlc3RjYXNlIGZ3a05vYnVpbGRUZXN0VE1EID0gbnVsbDsKLQkJCVZhbGlkYXRvclRlc3RjYXNlIGZ3a1Rlc3RUTUQgPSBudWxsOwotCQkJVmFsaWRhdG9yVGVzdGNhc2UgcHJvcFRNRCA9IG51bGw7Ci0JCQlmb3IoaW50IGk9MDsgaTx0bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVmFsaWRhdG9yVGVzdGNhc2UgdG1kID0gdG1kc1tpXTsKLQkJCQlpZih0bWQuZ2V0VmFsaWRhdG9yQ2xhc3MoKS5lcXVhbHMoVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uRldLX1RFU1RfVkFMSURBVE9SX0NMQVNTKSkgewotCQkJCQlmd2tUZXN0VE1EID0gdG1kOwotCQkJCX0KLQkJCQllbHNlIGlmKHRtZC5nZXRWYWxpZGF0b3JDbGFzcygpLmVxdWFscyhUZXN0T3BDb25zdHJJbnB1dE9wZXJhdGlvbi5QUk9QRVJUSUVTX1ZBTElEQVRPUl9DTEFTUykpIHsKLQkJCQkJcHJvcFRNRCA9IHRtZDsKLQkJCQl9Ci0JCQkJZWxzZSBpZih0bWQuZ2V0VmFsaWRhdG9yQ2xhc3MoKS5lcXVhbHMoVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uRldLX05PQlVJTERfVEVTVF9WQUxJREFUT1JfQ0xBU1MpKSB7Ci0JCQkJCWZ3a05vYnVpbGRUZXN0VE1EID0gdG1kOwotCQkJCX0KLQkJCQkKLQkJCQlpZigoZndrVGVzdFRNRCAhPSBudWxsKSAmJiAocHJvcFRNRCAhPSBudWxsKSAmJiAoZndrTm9idWlsZFRlc3RUTUQgIT0gbnVsbCkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlpZigoZndrVGVzdFRNRCA9PSBudWxsKSB8fCAocHJvcFRNRCA9PSBudWxsKSB8fCAoZndrTm9idWlsZFRlc3RUTUQgPT0gbnVsbCkpIHsKLQkJCQkvLyBDYW4ndCBydW4gdGhlIHRlc3RzCi0JCQkJbW9uaXRvci5zdWJUYXNrKCJDYW5ub3QgcnVuIFZBTEZXSzAyIGJlY2F1c2UgdGhlIHRlc3QgY2FzZSBpcyBtaXNzaW5nIGZvciBlaXRoZXIgdGhlIFZGIFRlc3QgVmFsaWRhdG9yLCBQcm9wZXJ0aWVzIFZhbGlkYXRvciwgb3IgYm90aC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJdHJ5IHsKLQkJCQkvLyBTZXQgbGV2ZWwgdG8gRklORVNUIHNvIHRoYXQgdGhlIGxhdW5jaCB2YWxpZGF0b3JzIGFyZSBhY2N1bXVsYXRlZCBpbiBWYWxpZGF0aW9uT3BlcmF0aW9uLgotCQkJCS8vIChTZWUgVmFsaWRhdGlvbk9wZXJhdGlvbjo6Z2V0TGF1bmNoZWRWYWxpZGF0b3JzKCkpCi0JCQkJVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS5zZXRMZXZlbChMZXZlbC5GSU5FU1QpOyAKLQkJCQkKLQkJCQlnZXRCdWZmZXIoKS53cml0ZSgidGVzdFByb3BOb3RPdmVycmlkZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IGFsbG93UGFzcyA9IHRlc3RQcm9wTm90T3ZlcnJpZGUobW9uaXRvciwgcHJvamVjdCwgZ2NvbmYsIHBjb25mLCBwcm9wVE1EKTsKLQkJCQlnZXRCdWZmZXIoKS53cml0ZShORVdMSU5FKTsgLy8kTk9OLU5MUy0xJAotCQkJCWdldEJ1ZmZlcigpLndyaXRlKCJ0ZXN0UHJvcE92ZXJyaWRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgcHJvcFBhc3MgPSB0ZXN0UHJvcE92ZXJyaWRlKG1vbml0b3IsIHByb2plY3QsIGdjb25mLCBwY29uZiwgZndrVGVzdFRNRCk7Ci0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoTkVXTElORSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRCdWZmZXIoKS53cml0ZSgidGVzdFByZWZOb3RBbGxvd092ZXJyaWRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgbm90QWxsb3dQYXNzID0gdGVzdFByZWZOb3RBbGxvd092ZXJyaWRlKG1vbml0b3IsIHByb2plY3QsIGdjb25mLCBwY29uZiwgcHJvcFRNRCk7Ci0JCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoTkVXTElORSk7Ci0JCQkJcmVzdWx0LmFwcGVuZCgiUHJvcGVydGllcyBEb2Vzbid0IE92ZXJyaWRlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hcHBlbmQoYWxsb3dQYXNzKTsKLQkJCQlyZXN1bHQuYXBwZW5kKCIgb2YgNyBwYXNzLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZChORVdMSU5FKTsKLQkJCQlyZXN1bHQuYXBwZW5kKCJQcm9wZXJpdGVzIE92ZXJyaWRlczogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKHByb3BQYXNzKTsKLQkJCQlyZXN1bHQuYXBwZW5kKCIgb2YgNyBwYXNzLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZChORVdMSU5FKTsKLQkJCQlyZXN1bHQuYXBwZW5kKCJQcmVmZXJlbmNlIERvZXNuJ3QgQWxsb3cgT3ZlcnJpZGU6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZChub3RBbGxvd1Bhc3MpOwotCQkJCXJlc3VsdC5hcHBlbmQoIiBvZiA3IHBhc3MuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYXBwZW5kKE5FV0xJTkUpOwotCQkJCW1vbml0b3Iuc3ViVGFzayhyZXN1bHQudG9TdHJpbmcoKSk7Ci0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoTkVXTElORSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRCdWZmZXIoKS53cml0ZShyZXN1bHQudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlnY29uZiA9IG9yaWdHY29uZjsKLQkJCQlnY29uZi5wYXNzaXZhdGUoKTsKLQkJCQkKLQkJCQlwY29uZiA9IG9yaWdQY29uZjsKLQkJCQlwY29uZi5wYXNzaXZhdGUoKTsKLQkJCQkKLQkJCQlKRFRVdGlsaXR5LnNldEF1dG9CdWlsZChhdXRvQnVpbGRFbmFibGVkKTsKLQkKLQkJCQlWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLnNldExldmVsKGxldmVsKTsKLQkJCX0KLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWJ1ZyhJQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHRpdGxlLCBWYWxpZGF0b3JNZXRhRGF0YVtdIGVuYWJsZWRWYWxpZGF0b3JzKSB7Ci0JCWJ1ZmZlci53cml0ZSgiQ29udGVudHMgb2YgIiArIHRpdGxlKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IoaW50IGk9MDsgaTxlbmFibGVkVmFsaWRhdG9ycy5sZW5ndGg7IGkrKykgewotCQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gZW5hYmxlZFZhbGlkYXRvcnNbaV07Ci0JCQlidWZmZXIud3JpdGUoIlx0IiArIHZtZC5nZXRWYWxpZGF0b3JEaXNwbGF5TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJ1ZmZlci53cml0ZSgiRW5kIGNvbnRlbnRzIG9mICIgKyB0aXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLndyaXRlKE5FV0xJTkUpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCXByaXZhdGUgaW50IHRlc3RQcm9wTm90T3ZlcnJpZGUoZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0LCBHbG9iYWxDb25maWd1cmF0aW9uIGdjb25mLCBQcm9qZWN0Q29uZmlndXJhdGlvbiBwY29uZiwgVmFsaWRhdG9yVGVzdGNhc2UgdG1kKSB7Ci0JCWludCBudW1QYXNzID0gMDsKLQkJdHJ5IHsKLQkJCS8vIFNldCB1cCB0aGUgdXNlciBjb25maWd1cmF0aW9uIGZvciB0aGUgdGVzdC4gVGhlIHJ1bihJUHJvZ3Jlc3NNb25pdG9yKSBtZXRob2QKLQkJCS8vIHdpbGwgc2V0IHRoZSB2YWx1ZXMgYmFjayB0byB3aGF0IHRoZXkgd2VyZSBiZWZvcmUgdGhlIHRlc3QuCQkKLQkJCWdjb25mLnNldENhblByb2plY3RzT3ZlcnJpZGUodHJ1ZSk7Ci0JCQlnY29uZi5wYXNzaXZhdGUoKTsKLQkJCXBjb25mLnNldERvZXNQcm9qZWN0T3ZlcnJpZGUoZmFsc2UpOwotCQkJcGNvbmYucGFzc2l2YXRlKCk7Ci0JCQkKLQkJCVZhbGlkYXRvck1hbmFnZXIuZ2V0TWFuYWdlcigpLnVwZGF0ZVRhc2tMaXN0KHByb2plY3QpOyAvLyBVcGRhdGUgdGhlIHRhc2sgbGlzdCBiZWNhdXNlIHRoZSBwcmVmZXJlbmNlIGFuZCBwcm9wZXJ0aWVzIHBhZ2UgZG8sIHNvIHRoZSBjb25maWd1cmF0aW9uIGNsYXNzZXMgZG9uJ3QuCi0JCQkKLQkJCWRlYnVnKGdldEJ1ZmZlcigpLCAiRW5hYmxlZCBQcm9wZXJ0aWVzIFZhbGlkYXRvcnMiLCBwY29uZi5nZXRFbmFibGVkVmFsaWRhdG9ycygpKTsgLy8kTk9OLU5MUy0xJAotCQkJZGVidWcoZ2V0QnVmZmVyKCksICJFbmFibGVkIFByZWZlcmVuY2UgVmFsaWRhdG9ycyIsIGdjb25mLmdldEVuYWJsZWRWYWxpZGF0b3JzKCkpOyAvLyROT04tTkxTLTEkCi0JCi0JCQludW1QYXNzID0gdmFsaWRhdGUobW9uaXRvciwgcHJvamVjdCwgZ2NvbmYsIHRtZCwgInRlc3RQcm9wTm90T3ZlcnJpZGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJCW51bVBhc3MgPSAwOwotCQl9Ci0JCWNhdGNoKFRocm93YWJsZSBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJbnVtUGFzcyA9IDA7Ci0JCX0KLQkJCi0JCQlyZXR1cm4gbnVtUGFzczsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBpbnQgdGVzdFByb3BPdmVycmlkZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIEdsb2JhbENvbmZpZ3VyYXRpb24gZ2NvbmYsIFByb2plY3RDb25maWd1cmF0aW9uIHBjb25mLCBWYWxpZGF0b3JUZXN0Y2FzZSB0bWQpIHsKLQkJaW50IG51bVBhc3MgPSAwOwotCQl0cnkgewotCQkJLy8gU2V0IHVwIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0ZXN0LiBUaGUgcnVuKElQcm9ncmVzc01vbml0b3IpIG1ldGhvZAotCQkJLy8gd2lsbCBzZXQgdGhlIHZhbHVlcyBiYWNrIHRvIHdoYXQgdGhleSB3ZXJlIGJlZm9yZSB0aGUgdGVzdC4JCQotCQkJZ2NvbmYuc2V0Q2FuUHJvamVjdHNPdmVycmlkZSh0cnVlKTsKLQkJCWdjb25mLnBhc3NpdmF0ZSgpOwotCQkJcGNvbmYuc2V0RG9lc1Byb2plY3RPdmVycmlkZSh0cnVlKTsKLQkJCXBjb25mLnBhc3NpdmF0ZSgpOwotCi0JCQlWYWxpZGF0b3JNYW5hZ2VyLmdldE1hbmFnZXIoKS51cGRhdGVUYXNrTGlzdChwcm9qZWN0KTsgLy8gVXBkYXRlIHRoZSB0YXNrIGxpc3QgYmVjYXVzZSB0aGUgcHJlZmVyZW5jZSBhbmQgcHJvcGVydGllcyBwYWdlIGRvLCBzbyB0aGUgY29uZmlndXJhdGlvbiBjbGFzc2VzIGRvbid0LgotCQkJCi0JCQlkZWJ1ZyhnZXRCdWZmZXIoKSwgIkVuYWJsZWQgUHJvcGVydGllcyBWYWxpZGF0b3JzIiwgcGNvbmYuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRlYnVnKGdldEJ1ZmZlcigpLCAiRW5hYmxlZCBQcmVmZXJlbmNlIFZhbGlkYXRvcnMiLCBnY29uZi5nZXRFbmFibGVkVmFsaWRhdG9ycygpKTsgLy8kTk9OLU5MUy0xJAotCQotCQkJbnVtUGFzcyA9IHZhbGlkYXRlKG1vbml0b3IsIHByb2plY3QsIHBjb25mLCB0bWQsICJ0ZXN0UHJvcE92ZXJyaWRlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bVBhc3M7Ci0JfQotCQotCXByaXZhdGUgaW50IHRlc3RQcmVmTm90QWxsb3dPdmVycmlkZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGZpbmFsIElQcm9qZWN0IHByb2plY3QsIEdsb2JhbENvbmZpZ3VyYXRpb24gZ2NvbmYsIFByb2plY3RDb25maWd1cmF0aW9uIHBjb25mLCBWYWxpZGF0b3JUZXN0Y2FzZSB0bWQpIHsKLQkJaW50IG51bVBhc3MgPSAwOwotCQl0cnkgewotCQkJLy8gU2V0IHVwIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0ZXN0LiBUaGUgcnVuKElQcm9ncmVzc01vbml0b3IpIG1ldGhvZAotCQkJLy8gd2lsbCBzZXQgdGhlIHZhbHVlcyBiYWNrIHRvIHdoYXQgdGhleSB3ZXJlIGJlZm9yZSB0aGUgdGVzdC4JCQotCQkJZ2NvbmYuc2V0Q2FuUHJvamVjdHNPdmVycmlkZShmYWxzZSk7Ci0JCQlnY29uZi5wYXNzaXZhdGUoKTsKLQkJCXBjb25mLnNldERvZXNQcm9qZWN0T3ZlcnJpZGUodHJ1ZSk7Ci0JCQlwY29uZi5wYXNzaXZhdGUoKTsKLQotCQkJVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkudXBkYXRlVGFza0xpc3QocHJvamVjdCk7IC8vIFVwZGF0ZSB0aGUgdGFzayBsaXN0IGJlY2F1c2UgdGhlIHByZWZlcmVuY2UgYW5kIHByb3BlcnRpZXMgcGFnZSBkbywgc28gdGhlIGNvbmZpZ3VyYXRpb24gY2xhc3NlcyBkb24ndC4KLQkJCQotCQkJZGVidWcoZ2V0QnVmZmVyKCksICJFbmFibGVkIFByb3BlcnRpZXMgVmFsaWRhdG9ycyIsIHBjb25mLmdldEVuYWJsZWRWYWxpZGF0b3JzKCkpOyAvLyROT04tTkxTLTEkCi0JCQlkZWJ1ZyhnZXRCdWZmZXIoKSwgIkVuYWJsZWQgUHJlZmVyZW5jZSBWYWxpZGF0b3JzIiwgZ2NvbmYuZ2V0RW5hYmxlZFZhbGlkYXRvcnMoKSk7IC8vJE5PTi1OTFMtMSQKLQkKLQkJCW51bVBhc3MgPSB2YWxpZGF0ZShtb25pdG9yLCBwcm9qZWN0LCBnY29uZiwgdG1kLCAidGVzdFByZWZOb3RBbGxvd092ZXJyaWRlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2goVGhyb3dhYmxlIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bVBhc3M7Ci0JfQotCQotCXByaXZhdGUgaW50IHZhbGlkYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmNvbmYsIFZhbGlkYXRvclRlc3RjYXNlIHRtZCwgU3RyaW5nIHRlc3ROYW1lKSB7Ci0JCWludCBudW1QYXNzID0gMDsKLQkJYm9vbGVhbiBzdWNjZXNzZnVsID0gdHJ1ZTsgLy8gQXNzdW1lIHRoYXQgYWxsIG9mIHRoZSB0ZXN0IGNhc2VzIHdpbGwgcGFzcy4KLQkJdHJ5IHsKLQkJCS8vIEZvciB0aGUgZmlyc3QgZm91ciB0ZXN0cywgbmVlZCBhbGwgb2YgdGhlIG1lc3NhZ2VzIHRvIGJlIHJlcG9ydGVkCi0JCQkvL2ludCBvcmlnaW5hbExpbWl0ID0gdmNvbmYuZ2V0TWF4aW11bU51bWJlck9mTWVzc2FnZXMoKTsKLQkJCS8vdmNvbmYuc2V0TWF4aW11bU51bWJlck9mTWVzc2FnZXMoV29ya2JlbmNoUmVwb3J0ZXIuTk9fTUVTU0FHRV9MSU1JVCk7Ci0JCQl2Y29uZi5wYXNzaXZhdGUoKTsKLQkJCQotCQkJYm9vbGVhbiBwYXNzID0gcnVuVmFsaWRhdGlvbihtb25pdG9yLCBwcm9qZWN0LCB2Y29uZik7Ci0JCQlpZighcGFzcykgewotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjpydW5WYWxpZGF0aW9uIGZhaWxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJc3VjY2Vzc2Z1bCA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbnVtUGFzcysrOwotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjpydW5WYWxpZGF0aW9uIHBhc3NlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlnZXRCdWZmZXIoKS5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCAiOjoiICsgdGVzdE5hbWUgKyAicnVuVmFsaWRhdGlvbiIsIHBhc3MpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQotCQkJcGFzcyA9IGZ1bGxCdWlsZFZhbGlkYXRlKG1vbml0b3IsIHByb2plY3QsIHZjb25mLCB0bWQpOwotCQkJaWYoIXBhc3MpIHsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6ZnVsbEJ1aWxkVmFsaWRhdGlvbiBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3NmdWwgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW51bVBhc3MrKzsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6ZnVsbEJ1aWxkVmFsaWRhdGlvbiBwYXNzZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZ2V0QnVmZmVyKCkuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgIjo6IiArIHRlc3ROYW1lICsgImZ1bGxCdWlsZFZhbGlkYXRpb24iLCBwYXNzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkKLQkJCXBhc3MgPSBhdXRvVmFsaWRhdGVFbmFibGVkKG1vbml0b3IsIHByb2plY3QsIHZjb25mLCB0bWQpOwotCQkJaWYoIXBhc3MpIHsKLQkJCQlzdWNjZXNzZnVsID0gZmFsc2U7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmF1dG9WYWxpZGF0ZUVuYWJsZWQgZmFpbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCW51bVBhc3MrKzsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6YXV0b1ZhbGlkYXRlRW5hYmxlZCBwYXNzZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZ2V0QnVmZmVyKCkuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgIjo6IiArIHRlc3ROYW1lICsgImF1dG9WYWxpZGF0ZUVuYWJsZWQiLCBwYXNzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkKLQkJCXBhc3MgPSBhdXRvVmFsaWRhdGVEaXNhYmxlZChtb25pdG9yLCBwcm9qZWN0LCB2Y29uZiwgdG1kKTsKLQkJCWlmKCFwYXNzKSB7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmF1dG9WYWxpZGF0ZURpc2FibGVkIGZhaWxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJc3VjY2Vzc2Z1bCA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbnVtUGFzcysrOwotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjphdXRvVmFsaWRhdGVEaXNhYmxlZCBwYXNzZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZ2V0QnVmZmVyKCkuYWRkRXhlY3V0aW9uU3RhdHVzKGdldE5hbWUoKSwgIjo6IiArIHRlc3ROYW1lICsgImF1dG9WYWxpZGF0ZURpc2FibGVkIiwgcGFzcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQlwYXNzID0gYnVpbGRWYWxpZGF0ZUVuYWJsZWQobW9uaXRvciwgcHJvamVjdCwgdmNvbmYsIHRtZCk7Ci0JCQlpZighcGFzcykgewotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjpidWlsZFZhbGlkYXRlRW5hYmxlZCBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3NmdWwgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW51bVBhc3MrKzsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6YnVpbGRWYWxpZGF0ZUVuYWJsZWQgcGFzc2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWdldEJ1ZmZlcigpLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksICI6OiIgKyB0ZXN0TmFtZSArICJidWlsZFZhbGlkYXRlRW5hYmxlZCIsIHBhc3MpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJcGFzcyA9IGJ1aWxkVmFsaWRhdGVEaXNhYmxlZChtb25pdG9yLCBwcm9qZWN0LCB2Y29uZiwgdG1kKTsKLQkJCWlmKCFwYXNzKSB7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6OmJ1aWxkVmFsaWRhdGVEaXNhYmxlZCBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN1Y2Nlc3NmdWwgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW51bVBhc3MrKzsKLS8vCQkJCWdldEJ1ZmZlcigpLndyaXRlKHRlc3ROYW1lICsgIjo6YnVpbGRWYWxpZGF0ZURpc2FibGVkIHBhc3NlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlnZXRCdWZmZXIoKS5hZGRFeGVjdXRpb25TdGF0dXMoZ2V0TmFtZSgpLCAiOjoiICsgdGVzdE5hbWUgKyAiYnVpbGRWYWxpZGF0ZURpc2FibGVkIiwgcGFzcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkvLyBBbmQgZm9yIHRoaXMgdGVzdCwgdGhlIG9yaWdpbmFsIGxpbWl0IG5lZWRzIHRvIGJlIGVuZm9yY2VkCi0JCQkvL3Zjb25mLnNldE1heGltdW1OdW1iZXJPZk1lc3NhZ2VzKG9yaWdpbmFsTGltaXQpOwotCQkJdmNvbmYucGFzc2l2YXRlKCk7Ci0KLQkJCXBhc3MgPSBtYXhNZXNzYWdlc1JlcG9ydGVkKG1vbml0b3IsIHByb2plY3QsIHZjb25mKTsKLQkJCWlmKCFwYXNzKSB7Ci0JCQkJc3VjY2Vzc2Z1bCA9IGZhbHNlOwotLy8JCQkJZ2V0QnVmZmVyKCkud3JpdGUodGVzdE5hbWUgKyAiOjptYXhNZXNzYWdlc1JlcG9ydGVkIGZhaWxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQludW1QYXNzKys7Ci0vLwkJCQlnZXRCdWZmZXIoKS53cml0ZSh0ZXN0TmFtZSArICI6Om1heE1lc3NhZ2VzUmVwb3J0ZWQgcGFzc2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWdldEJ1ZmZlcigpLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksICI6OiIgKyB0ZXN0TmFtZSArICJtYXhNZXNzYWdlc1JlcG9ydGVkIiwgcGFzcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlzdWNjZXNzZnVsID0gZmFsc2U7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWdldEJ1ZmZlcigpLmFkZEV4ZWN1dGlvblN0YXR1cyhnZXROYW1lKCksIHRlc3ROYW1lLCBzdWNjZXNzZnVsKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudW1QYXNzOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gcnVuVmFsaWRhdGlvbihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHZjb25mKSB7Ci0JCWJvb2xlYW4gcGFzc2VkID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCS8vIFVubGlrZSB0aGUgb3RoZXIgdmFsaWRhdGlvbnMsIHdoaWNoIHJlbHkgb24gYSBidWlsZCwgdGhpcyBtZXRob2QgaGFzIGFjY2VzcyB0byB0aGUKLQkJCS8vIG9wZXJhdGlvbiBhbmQgY2FuIHF1ZXJ5IGl0IGZvciB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzIHRoYXQgd2VyZSBsYXVuY2hlZC4gVGhpcyB0ZWNobmlxdWUKLQkJCS8vIGlzIGJldHRlciBiZWNhdXNlIGl0IGRvZXNuJ3QgcmVseSBvbiB0aGUgdmFsaWRhdG9yIHByb2R1Y2luZyB0aGUgY29ycmVjdCBvdXRwdXQgKG1hcmtlcnMpLgotCQkJLy8gVkFMRldLMDIganVzdCB3YW50cyB0byBjaGVjayB0aGF0IHRoZSBjb3JyZWN0IHZhbGlkYXRvcnMgd2VyZSBsYXVuY2hlZDsgdGhlIFRlc3RPcENvbnN0cgotCQkJLy8gdGVzdCB3YW50cyB0byBjaGVjayB0aGUgcmVzdWx0IGdpdmVuIGRpZmZlcmVudCBvdXRwdXQgYW5kIGNvbnN0cnVjdG9yIG9mIHRoZSBPcGVyYXRpb24uCi0JCQkKLQkJCUVuYWJsZWRWYWxpZGF0b3JzT3BlcmF0aW9uIHZhbGlkT3AgPSBuZXcgRW5hYmxlZFZhbGlkYXRvcnNPcGVyYXRpb24ocHJvamVjdCxmYWxzZSk7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHZhbGlkT3AsIG1vbml0b3IpOwotCQkJLy8gTGF1bmNoZWQgdmFsaWRhdG9ycyBzaG91bGQgYmUgY29uZmlndXJlZCwgZW5hYmxlZCwgYW5kIGhhZCBmaWxlcyB0byB2YWxpZGF0ZSBvbiB0aGUgcHJvamVjdC4KLQkJCVNldCBsYXVuY2hlZFZhbGlkYXRvcnMgPSB2YWxpZE9wLmdldExhdW5jaGVkVmFsaWRhdG9ycygpOwotCQkJCi0JCQkvLyBTaW5jZSBhIGZ1bGwgdmFsaWRhdGlvbiB3YXMgcnVuLCB0aGUgbGF1bmNoZWQgdmFsaWRhdG9ycyBzaG91bGQgYmUgZXF1aXZhbGVudAotCQkJLy8gdG8gdGhlIGNvbmZpZ3VyZWQgZW5hYmxlZCB2YWxkaWF0b3JzLgotCQkJVmFsaWRhdG9yTWV0YURhdGFbXSBlbmFibGVkVmFsaWRhdG9ycyA9IHZjb25mLmdldEVuYWJsZWRWYWxpZGF0b3JzKCk7Ci0JCQlmb3IoaW50IGk9MDsgaTxlbmFibGVkVmFsaWRhdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IGVuYWJsZWRWYWxpZGF0b3JzW2ldOwotCQkJCQotCQkJCS8vIElmIGl0J3MgY29uZmlndXJlZCBvbiB0aGUgcHJvamVjdCwgZW5zdXJlIHRoYXQgdGhlIGVuYWJsZWQgdmFsaWRhdG9yIHdhcyBsYXVuY2hlZC4KLQkJCQkvLyAoTWF5IG5vdCBiZSBjb25maWd1cmVkIGlmIHRoZSBlbmFibGVkIHZhbGlkYXRvcnMgaXMgdGhlIGxpc3Qgb2YgUHJlZmVyZW5jZSBlbmFibGVkCi0JCQkJLy8gdmFsaWRhdG9ycy4pCi0JCQkJaWYoIWxhdW5jaGVkVmFsaWRhdG9ycy5jb250YWlucyh2bWQpKSB7Ci0JCQkJCWdldEJ1ZmZlcigpLndyaXRlKCJFUlJPUjogRXhwZWN0ZWQgdmFsaWRhdG9yICIgKyB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSArICIgd2FzIG5vdCBydW4gb24gcHJvamVjdCAiICsgcHJvamVjdC5nZXROYW1lKCkgKyAiLiBGYWlsaW5nIHRlc3QuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCXBhc3NlZCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZ2V0QnVmZmVyKCkud3JpdGUoIklORk86IEV4cGVjdGVkIHZhbGlkYXRvciAiICsgdm1kLmdldFZhbGlkYXRvckRpc3BsYXlOYW1lKCkgKyAiIHJhbiBhcyBleHBlY3RlZCBvbiBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSArICIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJfQotCQkJCi0JCQlpZihwYXNzZWQgPT0gZmFsc2UpIHsKLQkJCQlnZXRCdWZmZXIoKS53cml0ZSgibGF1bmNoZWQgdmFsaWRhdG9ycyBhcmUgdGhlIGZvbGxvd2luZzoiKTsgLy8kTk9OLU5MUy0xJAotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGF1bmNoZWRWYWxpZGF0b3JzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCVZhbGlkYXRvck1ldGFEYXRhIHZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSlpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCWdldEJ1ZmZlcigpLndyaXRlKCJcdCIgKyB2bWQuZ2V0VmFsaWRhdG9yRGlzcGxheU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZ2V0QnVmZmVyKCkud3JpdGUoImVuZCBvZiBsYXVuY2hlZCB2YWxpZGF0b3JzIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQl9Ci0JCQlwYXNzZWQgPSBmYWxzZTsKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlyZXR1cm4gcGFzc2VkOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gZnVsbEJ1aWxkVmFsaWRhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB2Y29uZiwgVmFsaWRhdG9yVGVzdGNhc2UgdG1kKSB7Ci0JCXRyeSB7Ci0JCQkvL3Zjb25mLnNldEJ1aWxkVmFsaWRhdGUodHJ1ZSk7Ci0JCQl2Y29uZi5wYXNzaXZhdGUoKTsKLQotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHByb2plY3QpOwotCQkJSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyA9IHRtZC5nZXRSZXNvdXJjZXMocHJvamVjdCk7OwotCQkJVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24udG91Y2gocHJvamVjdCwgY2hhbmdlZFJlc291cmNlcyk7Ci0JCQkKLQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBtb25pdG9yKTsKLQkJCUlNYXJrZXJbXSBtZXNzYWdlc0FmdGVyQnVpbGQgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIElNZXNzYWdlLkFMTF9NRVNTQUdFUyk7Ci0JCQkKLQkJCXJldHVybiBCVlRSdW5uZXIuc2luZ2xldG9uKCkuY29tcGFyZShnZXRCdWZmZXIoKSwgZ2V0TmFtZSgpLCB0bWQuZ2V0TmFtZSgpLCB0bWQuZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLkZVTExfVkFMSURBVElPTiksIG1lc3NhZ2VzQWZ0ZXJCdWlsZCk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYXV0b1ZhbGlkYXRlRW5hYmxlZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHZjb25mLCBWYWxpZGF0b3JUZXN0Y2FzZSB0bWQpIHsKLQkJSkRUVXRpbGl0eS5zZXRBdXRvQnVpbGQodHJ1ZSk7Ci0JCQotCQl0cnkgewotCQkJLy92Y29uZi5zZXRBdXRvVmFsaWRhdGUodHJ1ZSk7Ci0JCQl2Y29uZi5wYXNzaXZhdGUoKTsKLQkJCQotCQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHByb2plY3QpOwotCQkJSVJlc291cmNlW10gY2hhbmdlZFJlc291cmNlcyA9IHRtZC5nZXRSZXNvdXJjZXMocHJvamVjdCk7OwotCQkJVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24udG91Y2gocHJvamVjdCwgY2hhbmdlZFJlc291cmNlcyk7Ci0JCQkKLQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5BVVRPX0JVSUxELCBtb25pdG9yKTsKLQkJCUlNYXJrZXJbXSBtZXNzYWdlc0FmdGVyQnVpbGQgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIElNZXNzYWdlLkFMTF9NRVNTQUdFUyk7Ci0JCQkKLQkJCXJldHVybiBCVlRSdW5uZXIuc2luZ2xldG9uKCkuY29tcGFyZShnZXRCdWZmZXIoKSwgZ2V0TmFtZSgpLCB0bWQuZ2V0TmFtZSgpLCB0bWQuZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLkFVVE9fVkFMSURBVElPTiksIG1lc3NhZ2VzQWZ0ZXJCdWlsZCk7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYXV0b1ZhbGlkYXRlRGlzYWJsZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvamVjdCBwcm9qZWN0LCBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiB2Y29uZiwgVmFsaWRhdG9yVGVzdGNhc2UgdG1kKSB7Ci0JCUpEVFV0aWxpdHkuc2V0QXV0b0J1aWxkKHRydWUpOwotCi0JCXRyeSB7CQkKLQkJCS8vdmNvbmYuc2V0QXV0b1ZhbGlkYXRlKGZhbHNlKTsKLQkJCXZjb25mLnBhc3NpdmF0ZSgpOwotCi0JCQlUYXNrTGlzdFV0aWxpdHkucmVtb3ZlQWxsVGFza3MocHJvamVjdCk7Ci0JCQlJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzID0gdG1kLmdldFJlc291cmNlcyhwcm9qZWN0KTsKLQkJCVRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLnRvdWNoKHByb2plY3QsIGNoYW5nZWRSZXNvdXJjZXMpOwotCQkKLQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5BVVRPX0JVSUxELCBtb25pdG9yKTsKLQkJCUlNYXJrZXJbXSBtZXNzYWdlc0FmdGVyQnVpbGQgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIElNZXNzYWdlLkFMTF9NRVNTQUdFUyk7Ci0JCQkKLQkJCS8vIFBhc3MgaW4gYW4gZW1wdHkgbGlzdCBiZWNhdXNlIHRoZSB2YWxpZGF0aW9uIGlzbid0IHN1cHBvc2VkIHRvIHJ1bi4KLQkJCXJldHVybiBCVlRSdW5uZXIuc2luZ2xldG9uKCkuY29tcGFyZShnZXRCdWZmZXIoKSwgZ2V0TmFtZSgpLCB0bWQuZ2V0TmFtZSgpLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULCBtZXNzYWdlc0FmdGVyQnVpbGQpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4YykgewotCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJaWYoZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpICE9IG51bGwpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkVmFsaWRhdGVFbmFibGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmNvbmYsIFZhbGlkYXRvclRlc3RjYXNlIHRtZCkgewotCQl0cnkgewotCQkJLy92Y29uZi5zZXRCdWlsZFZhbGlkYXRlKHRydWUpOwotCQkJdmNvbmYucGFzc2l2YXRlKCk7Ci0JCQlKRFRVdGlsaXR5LnNldEF1dG9CdWlsZChmYWxzZSk7Ci0JCi0JCQkvLyBDb25zdHJ1Y3QgdGhlIGlucHV0Ci0JCQlUYXNrTGlzdFV0aWxpdHkucmVtb3ZlQWxsVGFza3MocHJvamVjdCk7Ci0JCQlJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzID0gdG1kLmdldFJlc291cmNlcyhwcm9qZWN0KTsKLQkJCVRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLnRvdWNoKHByb2plY3QsIGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJdHJ5IHsJCQotCQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbW9uaXRvcik7Ci0JCQl9Ci0JCQljYXRjaChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCUxvZ2dlciBsb2dnZXIgPSBCVlRWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJCWxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGV4Yyk7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUlNYXJrZXJbXSBtZXNzYWdlc0FmdGVyQnVpbGQgPSBUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKHByb2plY3QsIElNZXNzYWdlLkFMTF9NRVNTQUdFUyk7Ci0JCQkKLQkJCXJldHVybiBCVlRSdW5uZXIuc2luZ2xldG9uKCkuY29tcGFyZShnZXRCdWZmZXIoKSwgZ2V0TmFtZSgpLCB0bWQuZ2V0TmFtZSgpLCB0bWQuZ2V0TWVzc2FnZXMoVmFsaWRhdGlvblR5cGVFbnVtLklOQ1JFTUVOVEFMX1ZBTElEQVRJT04pLCBtZXNzYWdlc0FmdGVyQnVpbGQpOwotCQl9Ci0JCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRWYWxpZGF0ZURpc2FibGVkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCwgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gdmNvbmYsIFZhbGlkYXRvclRlc3RjYXNlIHRtZCkgewotCQl0cnkgewotCQkJLy92Y29uZi5zZXRCdWlsZFZhbGlkYXRlKGZhbHNlKTsKLQkJCXZjb25mLnBhc3NpdmF0ZSgpOwotCQkJSkRUVXRpbGl0eS5zZXRBdXRvQnVpbGQoZmFsc2UpOwotCQkJCi0JCQkvLyBDb25zdHJ1Y3QgdGhlIGlucHV0Ci0JCQlUYXNrTGlzdFV0aWxpdHkucmVtb3ZlQWxsVGFza3MocHJvamVjdCk7Ci0JCQlJUmVzb3VyY2VbXSBjaGFuZ2VkUmVzb3VyY2VzID0gdG1kLmdldFJlc291cmNlcyhwcm9qZWN0KTsKLQkJCVRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLnRvdWNoKHByb2plY3QsIGNoYW5nZWRSZXNvdXJjZXMpOwotCQkJdHJ5IHsJCQotCQkJCXByb2plY3QuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5JTkNSRU1FTlRBTF9CVUlMRCwgbW9uaXRvcik7Ci0JCQkJSU1hcmtlcltdIG1lc3NhZ2VzQWZ0ZXJCdWlsZCA9IFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwgSU1lc3NhZ2UuQUxMX01FU1NBR0VTKTsKLQotCQkJCS8vIFBhc3MgaW4gYW4gZW1wdHkgbGlzdCBiZWNhdXNlIHZhbGlkYXRpb24gaXNuJ3Qgc3VwcG9zZWQgdG8gcnVuLgkJCQkKLQkJCQlyZXR1cm4gQlZUUnVubmVyLnNpbmdsZXRvbigpLmNvbXBhcmUoZ2V0QnVmZmVyKCksIGdldE5hbWUoKSwgdG1kLmdldE5hbWUoKSwgQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgbWVzc2FnZXNBZnRlckJ1aWxkKTsKLQkJCX0KLQkJCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJTG9nZ2VyIGxvZ2dlciA9IEJWVFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJaWYobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWNhdGNoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCQlpZihleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMuZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gbWF4TWVzc2FnZXNSZXBvcnRlZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9qZWN0IHByb2plY3QsIFZhbGlkYXRpb25Db25maWd1cmF0aW9uIHZjb25mKSB7Ci0JCQlFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbiB2YWxpZE9wID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJdmFsaWRPcCA9IG5ldyBFbmFibGVkVmFsaWRhdG9yc09wZXJhdGlvbihwcm9qZWN0LGZhbHNlKTsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHZhbGlkT3AsIG1vbml0b3IpOwotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQlpZihsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQlsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBleGMpOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCUlNYXJrZXJbXSBtZXNzYWdlcyA9IFRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwgSU1lc3NhZ2UuQUxMX01FU1NBR0VTKTsKLQkJCS8vaWYobWVzc2FnZXMubGVuZ3RoIDw9IHZjb25mLmdldE1heGltdW1OdW1iZXJPZk1lc3NhZ2VzKCkrMSkgeyAvLyBhZGQgb25lIGZvciB0aGUgSVdBRDMwMDAgbWVzc2FnZSwgaS5lLiwgIlZhbGlkYXRpb24gd2FzIHRlcm1pbmF0ZWQgYmVjYXVzZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgLi4uIgotCQkJLy8JcmV0dXJuIHRydWU7Ci0JCQkvL30KLQkJCQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotfQotCi0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrTm9CdWlsZFRlc3RIZWxwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrTm9CdWlsZFRlc3RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhlOWIwNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a05vQnVpbGRUZXN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwudmFsaWRhdGlvbi5BV29ya2JlbmNoTU9GSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaEZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgRndrTm9CdWlsZFRlc3RIZWxwZXIgZXh0ZW5kcyBBV29ya2JlbmNoTU9GSGVscGVyIHsKLQkKLQlwdWJsaWMgRndrTm9CdWlsZFRlc3RIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQlyZWdpc3Rlck1vZGVsKEZ3a1Rlc3RWYWxpZGF0b3IuQUxMX0ZJTEVTLCAibG9hZEFsbEZpbGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJNb2RlbChGd2tUZXN0VmFsaWRhdG9yLkpBVkFIRUxQRVJTLCAibG9hZEphdmFIZWxwZXJzIiwgbmV3IENsYXNzW117SUZpbGVEZWx0YS5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMudmFsaWRhdGUuSVdvcmtiZW5jaEhlbHBlciNnZXRUYXJnZXRPYmplY3ROYW1lKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCBhcmcwKSB7Ci0JCS8vIE5vIHRhcmdldCBvYmplY3RzIG91dHNpZGUgb2YgYW4gSVJlc291cmNlIGFyZSB1c2VkLCB0aGVyZWZvcmUgbm8gdGFyZ2V0IG9iamVjdCBuYW1lcyBhcmUgbmVlZGVkLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUZpbGVEZWx0YVtdIGxvYWRBbGxGaWxlcygpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLQkJCi0JCWZpbmFsIFNldCBmaWxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlSZXNvdXJjZVZpc2l0b3IgdmlzaXRvciA9IG5ldyBJUmVzb3VyY2VWaXNpdG9yKCkgewotCQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlIHJlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCWlmKCFyZXMuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBpZiB0aGUgcmVzb3VyY2UgaXNuJ3QgYWNjZXNzaWJsZSB0aGVuIG5laXRoZXIgYXJlIGl0cyBjaGlsZHJlbgotCQkJCX0KLQkJCQkKLQkJCQlpZigocmVzIGluc3RhbmNlb2YgSUZpbGUpICYmIChyZXMuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscygiamF2YSIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVdvcmtiZW5jaEZpbGVEZWx0YSBuZXdGaWxlRGVsdGEgPSBuZXcgV29ya2JlbmNoRmlsZURlbHRhKHJlcy5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIElGaWxlRGVsdGEuQ0hBTkdFRCwgcmVzKTsKLQkJCQkJZmlsZXMuYWRkKG5ld0ZpbGVEZWx0YSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRydWU7IC8vIHZpc2l0IHRoZSByZXNvdXJjZSdzIGNoaWxkcmVuIGFzIHdlbGwKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCB0cnVlKTsgLy8gdHJ1ZSBtZWFucyBpbmNsdWRlIHBoYW50b20gcmVzb3VyY2VzCi0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJSUZpbGVEZWx0YVtdIHJlc3VsdCA9IG5ldyBJRmlsZURlbHRhW2ZpbGVzLnNpemUoKV07Ci0JCWZpbGVzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIEphdmFIZWxwZXJzIGxvYWRKYXZhSGVscGVycyhJRmlsZURlbHRhIGRlbHRhKSB7Ci0JCVdvcmtiZW5jaEZpbGVEZWx0YSBmZCA9IChXb3JrYmVuY2hGaWxlRGVsdGEpZGVsdGE7Ci0JCUlSZXNvdXJjZSByZXN1bHQgPSBmZC5nZXRSZXNvdXJjZSgpOwotCQlpZihyZXN1bHQgIT0gbnVsbCl7Ci0JCQlpZihyZXN1bHQgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCXJldHVybiBKRFRVdGlsaXR5LmdldEphdmFIZWxwZXJzKChJRmlsZSlyZXN1bHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBUaGlzIHZhbGlkYXRvciB2YWxpZGF0ZXMgb25seSAuamF2YSBmaWxlcywgc28gdGhpcwotCQkJLy8gbXVzdCBiZSBhbiBpbnN0YW5jZW9mIEphdmFDbGFzcy4KLQkJCXJldHVybiAoSmF2YUhlbHBlcnMpZmQuZ2V0T2JqZWN0KCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5JV29ya2JlbmNoSGVscGVyI2dldFJlc291cmNlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUlSZXNvdXJjZSByZXN1bHQgPSBzdXBlci5nZXRSZXNvdXJjZShvYmplY3QpOwotCQlpZigocmVzdWx0ICE9IG51bGwpICYmIChyZXN1bHQuZXhpc3RzKCkpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgSmF2YUhlbHBlcnMpIHsKLQkJCS8vIElmIHRoZSBtZXNzYWdlIHdhcyBhZGRlZCB0byBhIEphdmFIZWxwZXJzLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZC4KLQkJCXJldHVybiBKRFRVdGlsaXR5LmdldFJlc291cmNlKGdldFByb2plY3QoKSwgKEphdmFIZWxwZXJzKSBvYmplY3QpOwotCQl9Ci0JCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgV29ya2JlbmNoRmlsZURlbHRhKSB7Ci0JCQkvLyBJZiB0aGUgd29ya2JlbmNoIGlzIHJlbW92aW5nIG1lc3NhZ2VzIGZyb20gZmlsZXMsIGFuZCB0aGUgb2JqZWN0IGlzIHNldAotCQkJLy8gaW5zdGVhZCBvZiB0aGUgSVJlc291cmNlLCBuZWVkIHRvIHByb2Nlc3MgdGhlIGRlbHRhJ3Mgb2JqZWN0IGluc3RlYWQgb2YKLQkJCS8vIGl0cyByZXNvdXJjZS4KLQkJCXJldHVybiBKRFRVdGlsaXR5LmdldFJlc291cmNlKGdldFByb2plY3QoKSwgKEphdmFIZWxwZXJzKSgoV29ya2JlbmNoRmlsZURlbHRhKW9iamVjdCkuZ2V0T2JqZWN0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRlLkFXb3JrYmVuY2hIZWxwZXIjZ2V0TGluZU5vKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lTm8oT2JqZWN0IG9iamVjdCkgewotCQlpbnQgbGluZU5vID0gc3VwZXIuZ2V0TGluZU5vKG9iamVjdCk7Ci0JCWlmKGxpbmVObyA9PSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQpIHsKLQkJCS8vIE5vIGFkYXB0ZXJzLCBzbyBmdWRnZSB0aGUgbGluZSBudW1iZXIgYnkgYWRkaW5nIHRoZSBtZXNzYWdlIHRvIHRoZSBmaXJzdCBsaW5lIGluIHRoZSBmaWxlLgotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcmV0dXJuIGxpbmVObzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrTm9CdWlsZFRlc3RWYWxpZGF0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrTm9CdWlsZFRlc3RWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyNDJmMC4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a05vQnVpbGRUZXN0VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Mb2NhbGl6ZWRNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgRndrTm9CdWlsZFRlc3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfRklMRVMgPSAiQUxMX0ZJTEVTIjsgLy8gTG9hZCBhbGwgSUZpbGVEZWx0YXMgZm9yIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgcHJvamVjdC4gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFIRUxQRVJTID0gIkpBVkFIRUxQRVJTIjsgLy8gVGhlIEphdmFDbGFzcyB0aGF0IHRoZSBJRmlsZURlbHRhIG1hcHMgdG8uIC8vJE5PTi1OTFMtMSQKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVZhbGlkYXRvciNjbGVhbnVwKGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVJlcG9ydGVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIE5vdGhpbmcgaXMgY2FjaGVkLCBzbyBub3RoaW5nIHRvIGRvLgotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVZhbGlkYXRvciN2YWxpZGF0ZShjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklIZWxwZXIsIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSVJlcG9ydGVyLCBjb20uaWJtLmV0b29scy52YWxpZGF0aW9uLklGaWxlRGVsdGFbXSkKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLQkJSUZpbGVEZWx0YVtdIGRlbHRhID0gbnVsbCA7Ci0JCWlmKChkZWx0YSA9PSBudWxsKSB8fCAoZGVsdGEubGVuZ3RoID09MCkpIHsKLQkJCS8vIEZ1bGwgVmFsaWRhdGUKLQkJCWRlbHRhID0gKElGaWxlRGVsdGFbXSloZWxwZXIubG9hZE1vZGVsKEFMTF9GSUxFUyk7Ci0JCX0KLQkJCi0JCWlmKGRlbHRhID09IG51bGwpIHsKLQkJCS8vIFByb2JsZW0gbG9hZGluZyB0aGUgZmlsZXMKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJZm9yKGludCBpPTA7IGk8ZGVsdGEubGVuZ3RoOyBpKyspIHsKLQkJCUphdmFIZWxwZXJzIHRhcmdldCA9IChKYXZhSGVscGVycyloZWxwZXIubG9hZE1vZGVsKEpBVkFIRUxQRVJTLCBuZXcgT2JqZWN0W117ZGVsdGFbaV19KTsKLQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgIlRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UgZm9yIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yaywgcmVwb3J0ZWQgYnkgVkYgTm9CdWlsZCBUZXN0IFZhbGlkYXRvci4gUGxlYXNlIGlnbm9yZS4iLCB0YXJnZXQpOyAvLyROT04tTkxTLTEkCi0JCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RGd2svb3JnL2VjbGlwc2UvanN0L3ZhbGlkYXRpb24vdGVzdC9md2svdmFsaWRhdG9yL0Z3a1Rlc3RIZWxwZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrVGVzdEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjc0ZTU1Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrVGVzdEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2sudmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnZhbGlkYXRpb24uQVdvcmtiZW5jaE1PRkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLklGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hGaWxlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIEZ3a1Rlc3RIZWxwZXIgZXh0ZW5kcyBBV29ya2JlbmNoTU9GSGVscGVyIHsKLQkKLQlwdWJsaWMgRndrVGVzdEhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCXJlZ2lzdGVyTW9kZWwoRndrVGVzdFZhbGlkYXRvci5BTExfRklMRVMsICJsb2FkQWxsRmlsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlyZWdpc3Rlck1vZGVsKEZ3a1Rlc3RWYWxpZGF0b3IuSkFWQUhFTFBFUlMsICJsb2FkSmF2YUhlbHBlcnMiLCBuZXcgQ2xhc3NbXXtJRmlsZURlbHRhLmNsYXNzfSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5JV29ya2JlbmNoSGVscGVyI2dldFRhcmdldE9iamVjdE5hbWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE9iamVjdE5hbWUoT2JqZWN0IGFyZzApIHsKLQkJLy8gTm8gdGFyZ2V0IG9iamVjdHMgb3V0c2lkZSBvZiBhbiBJUmVzb3VyY2UgYXJlIHVzZWQsIHRoZXJlZm9yZSBubyB0YXJnZXQgb2JqZWN0IG5hbWVzIGFyZSBuZWVkZWQuCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJRmlsZURlbHRhW10gbG9hZEFsbEZpbGVzKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQkKLQkJZmluYWwgU2V0IGZpbGVzID0gbmV3IEhhc2hTZXQoKTsKLQkJSVJlc291cmNlVmlzaXRvciB2aXNpdG9yID0gbmV3IElSZXNvdXJjZVZpc2l0b3IoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2UgcmVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJaWYoIXJlcy5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGlmIHRoZSByZXNvdXJjZSBpc24ndCBhY2Nlc3NpYmxlIHRoZW4gbmVpdGhlciBhcmUgaXRzIGNoaWxkcmVuCi0JCQkJfQotCQkJCQotCQkJCWlmKChyZXMgaW5zdGFuY2VvZiBJRmlsZSkgJiYgKCAocmVzLmdldEZpbGVFeHRlbnNpb24oKSAhPSBudWxsKSAmJiByZXMuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscygiamF2YSIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVdvcmtiZW5jaEZpbGVEZWx0YSBuZXdGaWxlRGVsdGEgPSBuZXcgV29ya2JlbmNoRmlsZURlbHRhKHJlcy5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIElGaWxlRGVsdGEuQ0hBTkdFRCwgcmVzKTsKLQkJCQkJZmlsZXMuYWRkKG5ld0ZpbGVEZWx0YSk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRydWU7IC8vIHZpc2l0IHRoZSByZXNvdXJjZSdzIGNoaWxkcmVuIGFzIHdlbGwKLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCB0cnVlKTsgLy8gdHJ1ZSBtZWFucyBpbmNsdWRlIHBoYW50b20gcmVzb3VyY2VzCi0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQkKLQkJSUZpbGVEZWx0YVtdIHJlc3VsdCA9IG5ldyBJRmlsZURlbHRhW2ZpbGVzLnNpemUoKV07Ci0JCWZpbGVzLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIEphdmFIZWxwZXJzIGxvYWRKYXZhSGVscGVycyhJRmlsZURlbHRhIGRlbHRhKSB7Ci0JCVdvcmtiZW5jaEZpbGVEZWx0YSBmZCA9IChXb3JrYmVuY2hGaWxlRGVsdGEpZGVsdGE7Ci0JCUlSZXNvdXJjZSByZXN1bHQgPSBmZC5nZXRSZXNvdXJjZSgpOwotCQlpZihyZXN1bHQgIT0gbnVsbCl7Ci0JCQlpZihyZXN1bHQgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCXJldHVybiBKRFRVdGlsaXR5LmdldEphdmFIZWxwZXJzKChJRmlsZSlyZXN1bHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBUaGlzIHZhbGlkYXRvciB2YWxpZGF0ZXMgb25seSAuamF2YSBmaWxlcywgc28gdGhpcwotCQkJLy8gbXVzdCBiZSBhbiBpbnN0YW5jZW9mIEphdmFDbGFzcy4KLQkJCXJldHVybiAoSmF2YUhlbHBlcnMpZmQuZ2V0T2JqZWN0KCk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLmV0b29scy52YWxpZGF0ZS5JV29ya2JlbmNoSGVscGVyI2dldFJlc291cmNlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShPYmplY3Qgb2JqZWN0KSB7Ci0JCUlSZXNvdXJjZSByZXN1bHQgPSBzdXBlci5nZXRSZXNvdXJjZShvYmplY3QpOwotCQlpZigocmVzdWx0ICE9IG51bGwpICYmIChyZXN1bHQuZXhpc3RzKCkpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYob2JqZWN0IGluc3RhbmNlb2YgSmF2YUhlbHBlcnMpIHsKLQkJCS8vIElmIHRoZSBtZXNzYWdlIHdhcyBhZGRlZCB0byBhIEphdmFIZWxwZXJzLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZC4KLQkJCXJldHVybiBKRFRVdGlsaXR5LmdldFJlc291cmNlKGdldFByb2plY3QoKSwgKEphdmFIZWxwZXJzKSBvYmplY3QpOwotCQl9Ci0JCWVsc2UgaWYob2JqZWN0IGluc3RhbmNlb2YgV29ya2JlbmNoRmlsZURlbHRhKSB7Ci0JCQkvLyBJZiB0aGUgd29ya2JlbmNoIGlzIHJlbW92aW5nIG1lc3NhZ2VzIGZyb20gZmlsZXMsIGFuZCB0aGUgb2JqZWN0IGlzIHNldAotCQkJLy8gaW5zdGVhZCBvZiB0aGUgSVJlc291cmNlLCBuZWVkIHRvIHByb2Nlc3MgdGhlIGRlbHRhJ3Mgb2JqZWN0IGluc3RlYWQgb2YKLQkJCS8vIGl0cyByZXNvdXJjZS4KLQkJCXJldHVybiBKRFRVdGlsaXR5LmdldFJlc291cmNlKGdldFByb2plY3QoKSwgKEphdmFIZWxwZXJzKSgoV29ya2JlbmNoRmlsZURlbHRhKW9iamVjdCkuZ2V0T2JqZWN0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRlLkFXb3JrYmVuY2hIZWxwZXIjZ2V0TGluZU5vKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lTm8oT2JqZWN0IG9iamVjdCkgewotCQlpbnQgbGluZU5vID0gc3VwZXIuZ2V0TGluZU5vKG9iamVjdCk7Ci0JCWlmKGxpbmVObyA9PSBJTWVzc2FnZS5MSU5FTk9fVU5TRVQpIHsKLQkJCS8vIE5vIGFkYXB0ZXJzLCBzbyBmdWRnZSB0aGUgbGluZSBudW1iZXIgYnkgYWRkaW5nIHRoZSBtZXNzYWdlIHRvIHRoZSBmaXJzdCBsaW5lIGluIHRoZSBmaWxlLgotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJcmV0dXJuIGxpbmVObzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvRndrVGVzdFZhbGlkYXRvci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9Gd2tUZXN0VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMWZhYmQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9Gd2tUZXN0VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QuZndrLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS5qYXZhLkphdmFIZWxwZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSUZpbGVEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Mb2NhbGl6ZWRNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgRndrVGVzdFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTF9GSUxFUyA9ICJBTExfRklMRVMiOyAvLyBMb2FkIGFsbCBJRmlsZURlbHRhcyBmb3IgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgY3VycmVudCBwcm9qZWN0LiAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQUhFTFBFUlMgPSAiSkFWQUhFTFBFUlMiOyAvLyBUaGUgSmF2YUNsYXNzIHRoYXQgdGhlIElGaWxlRGVsdGEgbWFwcyB0by4gLy8kTk9OLU5MUy0xJAotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5JVmFsaWRhdG9yI2NsZWFudXAoY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5JUmVwb3J0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gTm90aGluZyBpcyBjYWNoZWQsIHNvIG5vdGhpbmcgdG8gZG8uCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5JVmFsaWRhdG9yI3ZhbGlkYXRlKGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSUhlbHBlciwgY29tLmlibS5ldG9vbHMudmFsaWRhdGlvbi5JUmVwb3J0ZXIsIGNvbS5pYm0uZXRvb2xzLnZhbGlkYXRpb24uSUZpbGVEZWx0YVtdKQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlJRmlsZURlbHRhW10gZGVsdGEgPSBudWxsOwotCQlpZigoZGVsdGEgPT0gbnVsbCkgfHwgKGRlbHRhLmxlbmd0aCA9PTApKSB7Ci0JCQkvLyBGdWxsIFZhbGlkYXRlCi0JCQlkZWx0YSA9IChJRmlsZURlbHRhW10paGVscGVyLmxvYWRNb2RlbChBTExfRklMRVMpOwotCQl9Ci0JCQotCQlpZihkZWx0YSA9PSBudWxsKSB7Ci0JCQkvLyBQcm9ibGVtIGxvYWRpbmcgdGhlIGZpbGVzCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWZvcihpbnQgaT0wOyBpPGRlbHRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlKYXZhSGVscGVycyB0YXJnZXQgPSAoSmF2YUhlbHBlcnMpaGVscGVyLmxvYWRNb2RlbChKQVZBSEVMUEVSUywgbmV3IE9iamVjdFtde2RlbHRhW2ldfSk7Ci0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksICJUaGlzIGlzIGEgdGVzdCBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmssIHJlcG9ydGVkIGJ5IFZGIFRlc3QgVmFsaWRhdG9yLiBQbGVhc2UgaWdub3JlLiIsIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgbWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdEZ3ay9vcmcvZWNsaXBzZS9qc3QvdmFsaWRhdGlvbi90ZXN0L2Z3ay92YWxpZGF0b3IvSkRUVXRpbGl0eS5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9KRFRVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczOTZmMWMuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0RndrL29yZy9lY2xpcHNlL2pzdC92YWxpZGF0aW9uL3Rlc3QvZndrL3ZhbGlkYXRvci9KRFRVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LmZ3ay52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0uaW50ZXJuYWwucGx1Z2luLkphdmFFTUZOYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YUhlbHBlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLmphdmEuSmF2YVJlZkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwubG9nZ2VyLnByb3h5LkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0LkJWVFZhbGlkYXRpb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5md2suVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5CVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC5pbnRlcm5hbC5yZWdpc3RyeS5WYWxpZGF0b3JUZXN0Y2FzZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgc29tZSB1dGlsaXR5IG1ldGhvZHMgdXNlZCB0byAKLSAqIGFjY2VzcywgbWFuaXB1bGF0ZSwgZXRjLiBqZHQgdHlwZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKRFRVdGlsaXR5IHsKLQlwcml2YXRlIEpEVFV0aWxpdHkoKSB7Ci0JCS8vIERvIG5vdCBuZWVkIGFueSBpbnN0YW5jZXMgb2YgdGhpcyBjbGFzcy4KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluZXJzIGluIHRoZSBnaXZlbiBwcm9qZWN0IHRoYXQgY29udGFpbiBlaXRoZXIKLQkgKiAuamF2YSBzb3VyY2UgZmlsZXMgb3IgLmNsYXNzIGJpbmFyeSBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250YWluZXJbXSBnZXRKYXZhQ29udGFpbmVycyhJSmF2YVByb2plY3QganApIHsKLQkJaWYgKGpwID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IGpwLmdldFByb2plY3QoKTsKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNsYXNzcGF0aCA9IGpwLmdldFJlc29sdmVkQ2xhc3NwYXRoKHRydWUpOyAvLyB0cnVlIG1lYW5zIGlnbm9yZSB1bnJlc29sdmVkIChtaXNzaW5nKSB2YXJpYWJsZXMsIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uCi0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKGNsYXNzcGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIFRyYXZlcnNlIHRoZSBjbGFzc3BhdGgsIGFuZCBjYWxjdWxhdGUgYSBsaXN0IG9mIGp1c3QgdGhlIAotCQkvLyBJRm9sZGVycyBhbmQgSVByb2plY3RzIChpLmUuLCBJQ29udGFpbmVycykgdGhhdCBjb250YWluIHNvdXJjZQotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUNvbnRhaW5lcltdIGljb250YWluZXJzID0gbmV3IElDb250YWluZXJbY2xhc3NwYXRoLmxlbmd0aF07Ci0JCWludCB2YWxpZENvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjbGFzc3BhdGgubGVuZ3RoOyBpKyspIHsKLQkJCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IGNsYXNzcGF0aFtpXTsKLQkJCWlmIChlbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCUlSZXNvdXJjZSByZXMgPSByb290LmZpbmRNZW1iZXIoZW50cnkuZ2V0UGF0aCgpKTsKLQkJCQlpZihyZXMgPT0gbnVsbCkgewotCQkJCQkvLyBub3QgaW4gdGhlIHdvcmtzcGFjZQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZighcmVzLmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpIHsKLQkJCQkJLy8gaW4gYSBkaWZmZXJlbnQgcHJvamVjdAotCQkJCQljb250aW51ZTsKLQkJCQl9CQkJCQotCi0JCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCQkJaWNvbnRhaW5lcnNbdmFsaWRDb3VudCsrXSA9IChJQ29udGFpbmVyKSByZXM7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJdHJ5IHsKLQkJCUlDb250YWluZXIgb3V0cHV0Q29udGFpbmVyID0gKElDb250YWluZXIpcm9vdC5maW5kTWVtYmVyKGpwLmdldE91dHB1dExvY2F0aW9uKCkpOwotCQkJSUNvbnRhaW5lcltdIGNvbnRhaW5lcnMgPSBudWxsOwotCQkJaWYob3V0cHV0Q29udGFpbmVyID09IG51bGwpIHsKLQkJCQljb250YWluZXJzID0gbmV3IElDb250YWluZXJbdmFsaWRDb3VudF07Ci0JCQl9Ci0JCQllbHNlIGlmKG91dHB1dENvbnRhaW5lci5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKSB7Ci0JCQkJY29udGFpbmVycyA9IG5ldyBJQ29udGFpbmVyW3ZhbGlkQ291bnQrMV07Ci0JCQkJY29udGFpbmVyc1t2YWxpZENvdW50XSA9IG91dHB1dENvbnRhaW5lcjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNvbnRhaW5lcnMgPSBuZXcgSUNvbnRhaW5lclt2YWxpZENvdW50XTsKLQkJCX0KLQkJCVN5c3RlbS5hcnJheWNvcHkoaWNvbnRhaW5lcnMsIDAsIGNvbnRhaW5lcnMsIDAsIHZhbGlkQ291bnQpOwotCQkJcmV0dXJuIGNvbnRhaW5lcnM7Ci0JCX0KLQkJY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJVHlwZSB0aGF0IHJlcHJlc2VudHMgdGhpcyBmaWxlLCBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVR5cGUgZ2V0VHlwZShJQ29udGFpbmVyW10gamF2YUNvbnRhaW5lcnMsIElGaWxlIGZpbGUpIHsKLQkJaWYoZmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJU3RyaW5nIGZpbGVFeHRlbnNpb24gPSBmaWxlLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJaWYoZmlsZUV4dGVuc2lvbiA9PSBudWxsKSB7Ci0JCQkvLyBub3QgYSAuamF2YSBvciBhIC5jbGFzcyBmaWxlCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaWYoIShmaWxlRXh0ZW5zaW9uLmVxdWFscygiamF2YSIpIHx8IGZpbGVFeHRlbnNpb24uZXF1YWxzKCJjbGFzcyIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCUlKYXZhUHJvamVjdCBqcCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJaWYoanAgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXRyeSB7Ci0JCQlJUGF0aCByZWxhdGl2ZVBhdGggPSBnZXRSZWxhdGl2ZVBhdGgoamF2YUNvbnRhaW5lcnMsIGZpbGUpOwotCQkJaWYocmVsYXRpdmVQYXRoID09IG51bGwpIHsKLQkJCQkvLyBOb3QgYSBtZW1iZXIgb2YgYSBzb3VyY2Ugb3Igb3V0cHV0IGNvbnRhaW5lcgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlJUGF0aCBwYWNrYWdlUGF0aCA9IHJlbGF0aXZlUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBwYWNrYWdlUGF0aC50b1N0cmluZygpLnJlcGxhY2UoSVBhdGguU0VQQVJBVE9SLCAnLicpOwotCQkJU3RyaW5nIHR5cGVOYW1lID0gcmVsYXRpdmVQYXRoLmxhc3RTZWdtZW50KCk7Ci0JCQl0eXBlTmFtZSA9IHR5cGVOYW1lLnN1YnN0cmluZygwLCB0eXBlTmFtZS5sZW5ndGgoKSAtIGZpbGVFeHRlbnNpb24ubGVuZ3RoKCkgLSAxKTsKLQkJCVN0cmluZyBxdWFsaWZpZWROYW1lID0gbnVsbDsKLQkJCWlmIChwYWNrYWdlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlxdWFsaWZpZWROYW1lID0gcGFja2FnZU5hbWUgKyAiLiIgKyB0eXBlTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlxdWFsaWZpZWROYW1lID0gdHlwZU5hbWU7Ci0JCQl9Ci0JCQlyZXR1cm4ganAuZmluZFR5cGUocXVhbGlmaWVkTmFtZSk7Ci0JCX0KLQkJY2F0Y2goSmF2YU1vZGVsRXhjZXB0aW9uIGV4YykgewotCQkJZXhjLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBJUGF0aCBvZiB0aGUgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIGZpcnN0IGNvbnRhaW5lciB0aGF0IHRoZQotCSAqIHJlc291cmNlIGlzIGZvdW5kIGluLiBJZiB0aGUgcmVzb3VyY2UgaXMgY29udGFpbmVkIGluIG1vcmUgdGhhbiBvbmUgY29udGFpbmVyCi0JICogaW4gdGhlIGFycmF5LCByZXR1cm4gdGhlIGZpcnN0IElQYXRoIGZvdW5kLiBJZiB0aGUgcmVzb3VyY2UgaXMgbm90IGEgbWVtYmVyCi0JICogb2YgYW55IG9mIHRoZSBjb250YWluZXJzLCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldFJlbGF0aXZlUGF0aChJQ29udGFpbmVyW10gY29udGFpbmVycywgSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWZvcihpbnQgaT0wOyBpPGNvbnRhaW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCUlQYXRoIHBhdGggPSBnZXRSZWxhdGl2ZVBhdGgoY29udGFpbmVyc1tpXSwgcmVzb3VyY2UpOwotCQkJaWYocGF0aCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHBhdGg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIElQYXRoIG9mIGEgcmVzb3VyY2UgcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5lci4KLQkgKiBJZiB0aGUgSVJlc291cmNlIGlzIG5vdCBhIG1lbWJlciBvZiB0aGUgY29udGFpbmVyLCByZXR1cm4gbnVsbC4gCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRSZWxhdGl2ZVBhdGgoSUNvbnRhaW5lciBjb250YWluZXIsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAoKHJlc291cmNlID09IG51bGwpIHx8IChjb250YWluZXIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gSXMgdGhlIHBhdGggcGFydCBvZiB0aGUgSUNvbnRhaW5lcj8KLQkJaW50IG1hdGNoaW5nRmlyc3RTZWdtZW50cyA9IGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpLm1hdGNoaW5nRmlyc3RTZWdtZW50cyhyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKTsKLQkJaWYobWF0Y2hpbmdGaXJzdFNlZ21lbnRzID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnJlbW92ZUZpcnN0U2VnbWVudHMobWF0Y2hpbmdGaXJzdFNlZ21lbnRzKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyBnZXRKYXZhSGVscGVycyhJRmlsZSBmaWxlKSB7Ci0JCUlUeXBlIHR5cGUgPSBnZXRUeXBlKGZpbGUpOwotCQlpZih0eXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gZ2V0SmF2YUhlbHBlcnModHlwZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVR5cGUgZ2V0VHlwZShJRmlsZSBmaWxlKSB7Ci0JCUlKYXZhUHJvamVjdCBqcCA9IEphdmFDb3JlLmNyZWF0ZShmaWxlLmdldFByb2plY3QoKSk7Ci0JCUlDb250YWluZXJbXSBqYXZhQ29udGFpbmVycyA9IChqcCA9PSBudWxsKSA/IG51bGwgOiBKRFRVdGlsaXR5LmdldEphdmFDb250YWluZXJzKGpwKTsKLQkJaWYoamF2YUNvbnRhaW5lcnMgIT0gbnVsbCkgewotCQkJcmV0dXJuIEpEVFV0aWxpdHkuZ2V0VHlwZShqYXZhQ29udGFpbmVycywgZmlsZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBKYXZhSGVscGVycyBnZXRKYXZhSGVscGVycyhJVHlwZSB0eXBlKSB7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZ2V0UmVzb3VyY2VTZXQodHlwZSk7Ci0JCWlmKHJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBKYXZhUmVmRmFjdG9yeS5lSU5TVEFOQ0UucmVmbGVjdFR5cGUodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgcmVzb3VyY2VTZXQpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KElUeXBlIHR5cGUpIHsKLQkJSmF2YUVNRk5hdHVyZSBuYXR1cmUgPSBnZXROYXR1cmUodHlwZSk7Ci0JCWlmKG5hdHVyZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbmF0dXJlLmdldFJlc291cmNlU2V0KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBKYXZhRU1GTmF0dXJlIGdldE5hdHVyZShJVHlwZSB0eXBlKSB7Ci0JCUlKYXZhUHJvamVjdCBqcCA9IHR5cGUuZ2V0SmF2YVByb2plY3QoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGpwLmdldFByb2plY3QoKTsKLQkJCi0JCXRyeSB7Ci0JCQlKYXZhRU1GTmF0dXJlIG5hdHVyZSA9IEphdmFFTUZOYXR1cmUuY3JlYXRlUnVudGltZShwcm9qZWN0KTsKLQkJCXJldHVybiBuYXR1cmU7Ci0JCX0KLQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSVByb2plY3QgcHJvamVjdCwgSmF2YUhlbHBlcnMgY2xhenopIHsKLQkJSVR5cGUgdHlwZSA9IGdldFR5cGUocHJvamVjdCwgY2xhenopOwotCQlyZXR1cm4gdHlwZS5nZXRSZXNvdXJjZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVR5cGUgZ2V0VHlwZShJUHJvamVjdCBwcm9qZWN0LCBKYXZhSGVscGVycyBjbGF6eikgewotCQlpZihjbGF6eiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSA9IGNsYXp6LmdldEphdmFOYW1lKCk7Ci0JCUlKYXZhUHJvamVjdCBqcCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJdHJ5IHsKLQkJCXJldHVybiBqcC5maW5kVHlwZShmdWxseVF1YWxpZmllZE5hbWUpOwotCQl9Ci0JCWNhdGNoKEphdmFNb2RlbEV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0aHJlZSB2YWxpZGF0b3IgdGVzdCBjYXNlcyB1c2VkIHRvIHRlc3QgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmFsaWRhdG9yVGVzdGNhc2VbXSBnZXRWRlRlc3RzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2plY3QgcHJvamVjdCkgewotCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHRtZHMgPSBCVlRWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0QWxsVmFsaWRhdG9yVGVzdHMobW9uaXRvciwgcHJvamVjdCk7Ci0JCWlmKCh0bWRzID09IG51bGwpIHx8ICh0bWRzLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIG5ldyBWYWxpZGF0b3JUZXN0Y2FzZVswXTsKLQkJfQotCQkKLQkJVmFsaWRhdG9yVGVzdGNhc2UgZndrTm9idWlsZFRlc3RUTUQgPSBudWxsOwotCQlWYWxpZGF0b3JUZXN0Y2FzZSBmd2tUZXN0VE1EID0gbnVsbDsKLQkJVmFsaWRhdG9yVGVzdGNhc2UgcHJvcFRNRCA9IG51bGw7Ci0JCVZhbGlkYXRvclRlc3RjYXNlW10gcmVzdWx0ID0gbmV3IFZhbGlkYXRvclRlc3RjYXNlWzNdOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IoaW50IGk9MDsgaTx0bWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWYWxpZGF0b3JUZXN0Y2FzZSB0bWQgPSB0bWRzW2ldOwotCQkJaWYodG1kLmdldFZhbGlkYXRvckNsYXNzKCkuZXF1YWxzKFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLkZXS19URVNUX1ZBTElEQVRPUl9DTEFTUykpIHsKLQkJCQlmd2tUZXN0VE1EID0gdG1kOwotCQkJCXJlc3VsdFtjb3VudCsrXSA9IHRtZDsKLQkJCX0KLQkJCWVsc2UgaWYodG1kLmdldFZhbGlkYXRvckNsYXNzKCkuZXF1YWxzKFRlc3RPcENvbnN0cklucHV0T3BlcmF0aW9uLlBST1BFUlRJRVNfVkFMSURBVE9SX0NMQVNTKSkgewotCQkJCXByb3BUTUQgPSB0bWQ7Ci0JCQkJcmVzdWx0W2NvdW50KytdID0gdG1kOwotCQkJfQotCQkJZWxzZSBpZih0bWQuZ2V0VmFsaWRhdG9yQ2xhc3MoKS5lcXVhbHMoVGVzdE9wQ29uc3RySW5wdXRPcGVyYXRpb24uRldLX05PQlVJTERfVEVTVF9WQUxJREFUT1JfQ0xBU1MpKSB7Ci0JCQkJZndrTm9idWlsZFRlc3RUTUQgPSB0bWQ7Ci0JCQkJcmVzdWx0W2NvdW50KytdID0gdG1kOwotCQkJfQotCQkJCi0JCQlpZigoZndrVGVzdFRNRCAhPSBudWxsKSAmJiAocHJvcFRNRCAhPSBudWxsKSAmJiAoZndrTm9idWlsZFRlc3RUTUQgIT0gbnVsbCkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJaWYoY291bnQgIT0gcmVzdWx0Lmxlbmd0aCkgewotCQkJLy8gT24gdGhpcyBwcm9qZWN0LCBub3QgYWxsIG9mIHRoZSB0ZXN0IHZhbGlkYXRvcnMgYXJlIHVzZWQuCi0JCQlWYWxpZGF0b3JUZXN0Y2FzZVtdIHIgPSBuZXcgVmFsaWRhdG9yVGVzdGNhc2VbY291bnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShyZXN1bHQsIDAsIHIsIDAsIGNvdW50KTsKLQkJCXJldHVybiByOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QXV0b0J1aWxkKGJvb2xlYW4gYXV0b0J1aWxkRW5hYmxlZCkgewotCQl0cnkgewotCQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWRlc2Muc2V0QXV0b0J1aWxkaW5nKGF1dG9CdWlsZEVuYWJsZWQpOwotCQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNldERlc2NyaXB0aW9uKGRlc2MpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIgbG9nZ2VyID0gQlZUVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCWlmKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZXhjKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdElucHV0L0ZXSy9CVlQvb3BDb25zdHIuamFyIGIvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0SW5wdXQvRldLL0JWVC9vcENvbnN0ci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNGIwMzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2UuanN0LnZhbGlkYXRpb24udGVzdC90ZXN0SW5wdXQvRldLL0JWVC9vcENvbnN0ci5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS5qc3QudmFsaWRhdGlvbi50ZXN0L3Rlc3RJbnB1dC9Qcm9wZXJ0aWVzL2FQcm9wZXJ0aWVzLmphciBiL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdElucHV0L1Byb3BlcnRpZXMvYVByb3BlcnRpZXMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTZmNGNlLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLmpzdC52YWxpZGF0aW9uLnRlc3QvdGVzdElucHV0L1Byb3BlcnRpZXMvYVByb3BlcnRpZXMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgo=